Chceš se vypracovat až k výdělku 160.000 Kč/měsíc? Důležité je začít. Staň se programátorem díky rekvalifikačnímu kurzu! Začni dnes!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
matesax
Tvůrce
Avatar
matesax:13.9.2012 6:27

Dobrý den,
snažím se dostat html kód z webových stránek do richtextboxu (v textboxu to byla katastrofa :) ), ovšem mnoho znaků zobrazených v tom richtextboxu ani náhodou neodpovídá skutečnosti. Zřejmý problém - české znaky... :) Ovšem ať dělám, co dělám, nedaří se mi dostat to správně. Zkusil jsem DataFormat - ale problém asi bude při stažení, či netuším kde... :) Jeli problém v tom richtextboxu, tak mi to nevadí - potřebuji to mít správně hlavně ve stringu - do kterého stahuji - ovšem nevím, jak zjistit, kde je problém...

new WebClient().DownloadString(url)

Rovnou se zeptám - není rychlejší cesta - respektive - jaká je nejrychlejší cesta dostat html z url? Děkuji...

 
Odpovědět
13.9.2012 6:27
Avatar
David Čápka Hartinger
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka Hartinger:13.9.2012 12:14

Myslím, že rychlost bude vždy stejná, záleží na tom webu, ze kterého to stahuješ. Pokud je kódování UTF8, naměl by to být problém. Pokud ne, musí se převést. Zkus webklientovi nastavit Encoding na System.Text.En­coding.UTF8.

Nahoru Odpovědět
13.9.2012 12:14
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
matesax:13.9.2012 16:37

JJ - jede to - děkuji. Mám ale menší zápletku - dělám html parser - tedy encoding se dozvím až po stáhnutí html z url. Jak bych to tedy měl řešit? Děkuji.

 
Nahoru Odpovědět
13.9.2012 16:37
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:13.9.2012 16:47

Přečti si hlavičky HTTP spojení.

Nahoru Odpovědět
13.9.2012 16:47
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:13.9.2012 17:06

Zde jsou:

X-AspNetMvc-Version, Content-Length, Cache-Control, Content-Type, Date, Server, X-AspNet-Version, X-Powered-By

Proto sem píši...

 
Nahoru Odpovědět
13.9.2012 17:06
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:13.9.2012 17:22

Už ses podíval, co se nachází v Content-Type?

Nahoru Odpovědět
13.9.2012 17:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:13.9.2012 17:37

To netuším - jak na to - já mám k dispozici jen stringové pole, které jsem vložil hoře...

 
Nahoru Odpovědět
13.9.2012 17:37
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:13.9.2012 17:50

Content-Type je jen klíč, ke kterému bývá i hodnota. Například
text/html; charset=UTF-8.

Nahoru Odpovědět
13.9.2012 17:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:13.9.2012 18:07

Ano - to vím, ale mě to ukazuje prázdný string...

HttpWebRequest.Create(new Uri("http://www.devbook.cz")).ContentType
 
Nahoru Odpovědět
13.9.2012 18:07
Avatar
matesax
Tvůrce
Avatar
matesax:13.9.2012 19:24

Vyřešeno - zatím nemohu ověřit - někde budu mít asi botu - jen není hlášen žádný error.

private void GetHtml(string urlWithCode)
{
    var charSet = ((HttpWebResponse)((HttpWebRequest)WebRequest.Create(urlWithCode)).GetResponse()).CharacterSet;
    Encoding pageEncoding;

    if (String.IsNullOrEmpty(charSet))
        pageEncoding = Encoding.Default;
    else
        pageEncoding = Encoding.GetEncoding(charSet);

    htmlCode = new WebClient() { Encoding = pageEncoding } .DownloadString(urlWithCode);
}
 
Nahoru Odpovědět
13.9.2012 19:24
Avatar
matesax
Tvůrce
Avatar
matesax:13.9.2012 20:19

Kód se zdá být OK - do poslední chvíle dostávám odezvu - co jsem zadal se stalo. Ovšem když má dojít na stáhnutí html, najednou se vše zastaví...

První metodu máte o něco výše, hlavní činitel:

private void SetUrl(string adjustmentUrl = null)
{
    var valid = true;
    var index = tabControl1.SelectedIndex;

    string url = tabControl1.TabPages[index].Controls[0].Text;

    if (url != "" || adjustmentUrl != null)
    {
        if (adjustmentUrl == null)
            adjustmentUrl = url;

        if (!UrlExist(adjustmentUrl))
            if (UrlExist("http://www." + adjustmentUrl))
                adjustmentUrl = "http://www." + adjustmentUrl;
            else if (UrlExist("https://www." + adjustmentUrl))
                adjustmentUrl = "https://www." + adjustmentUrl;
            else if (UrlExist("http://" + adjustmentUrl))
                adjustmentUrl = "http://" + adjustmentUrl;
            else if (UrlExist("https://" + adjustmentUrl))
                adjustmentUrl = "https://" + adjustmentUrl;
            else valid = false;

        if (valid)
        {
            GetHtml(adjustmentUrl);
            textboxes[index].Text = htmlCode;
            MessageBox.Show(htmlCode);
        }
        else
            MessageBox.Show("Stránka nenalezena!");
    }
}

Podotýkám, že url se mi skutečně daří dát dohromady - v to problém není... :)

Editováno 13.9.2012 20:22
 
Nahoru Odpovědět
13.9.2012 20:19
Avatar
David Čápka Hartinger
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka Hartinger:13.9.2012 21:27

Pokud není problém v URL, pak nechápu, proč nám dáváš tu 2. metodu.

Nahoru Odpovědět
13.9.2012 21:27
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
matesax:13.9.2012 21:33

No protože toto není jediný způsob získání URL - tedy někdy znám přesnou URL - tak dám rovnou GetHtml... Jak píši - do poslední chvíle vše běží jak má - jakmile dojde na stáhnutí stringu, tak se to zasekne... Zkoušel jsem i nastavit kódování pevně...

 
Nahoru Odpovědět
13.9.2012 21:33
Avatar
David Čápka Hartinger
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka Hartinger:13.9.2012 21:34

No tak to zkus s pevnými URL. Koukal bych se tam, kde to padá, vůbec bych neřešil generování URL.

Nahoru Odpovědět
13.9.2012 21:34
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
matesax:13.9.2012 21:39

No toto funguje:

new WebClient() { Encoding = Encoding.UTF8 } .DownloadString(urlWithCode)

Ale GetHtml již ne... A proměnná pageEncoding má správný obsah... Jak píši - do poslední chvíle je to OK...

 
Nahoru Odpovědět
13.9.2012 21:39
Avatar
David Čápka Hartinger
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka Hartinger:13.9.2012 21:45

Psal jsem abys zkusil pevné URL, tedy dát je přímo té GetHtml("pevne­url.cz")

Nahoru Odpovědět
13.9.2012 21:45
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:13.9.2012 21:46

Aha - je to tak - posílá se mi špatná URL - děkuji.

Editováno 13.9.2012 21:49
 
Nahoru Odpovědět
13.9.2012 21:46
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
matesax:13.9.2012 21:51

Tak ne - dal jsem si pomocí MessageBox vyjet URL a byla OK... :)

Toto mi vyjelo v GetHtml - z parametru urlWithCode:

http://www.devbook.cz

Editováno 13.9.2012 21:54
 
Nahoru Odpovědět
13.9.2012 21:51
Avatar
David Čápka Hartinger
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka Hartinger:13.9.2012 22:57

MessageBox? Používej BreakPointy, potom jen najedeš na proměnnou a vidíš její obsah. Zkus tu funkci s pevnými URL po jednom, takhle se nikam nedostaneš, když to budeš ladit jako celek.

Nahoru Odpovědět
13.9.2012 22:57
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
matesax:14.9.2012 5:57

Je třeba uzavřít spojení...

private void GetHtml(string urlWithCode)
{
    var response = ((HttpWebResponse) HttpWebRequest.Create(urlWithCode).GetResponse());
    var charSet = response.CharacterSet;
    response.Close();

    Encoding pageEncoding;

    if (String.IsNullOrEmpty(charSet))
        pageEncoding = Encoding.Default;
    else
        pageEncoding = Encoding.GetEncoding(charSet);

    htmlCode = new WebClient() { Encoding = Encoding.UTF8 } .DownloadString(urlWithCode);
}

Jakto, že se mi zobrazuje, že devbook je na ISO-8859-1. Jako zobrazuje se to správně - české znaky - ale němělo by to být UTF-8?

Editováno 14.9.2012 6:00
 
Nahoru Odpovědět
14.9.2012 5:57
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
matesax:14.9.2012 6:07

Tak je to problém - v tom kódu nahoře pavně nastavuji encoding - i s proměnnou pageEncoding to jede - ale zde se jak jsem psal zobazuje ISO-8859-1 a české znaky nejdou... Jiné stránky jdou.

 
Nahoru Odpovědět
14.9.2012 6:07
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:14.9.2012 7:14

Pokud česká www stránka používá ISO-8859-1, je to chybně. Toto kódování je určeno pro západní Evropu a neobsahuje písmena s háčky.

Pochopil bych ISO-8859-2, Windows-1250 nebo UTF-8. Jiná kódování nejsou doporučována. Dnes bych použil už jen UTF-8. Nemám důvod používat něco jiného, protože celé PC mi jede na UTF-8, takže nemusím nic konvertovat.

Nahoru Odpovědět
14.9.2012 7:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka Hartinger
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka Hartinger:14.9.2012 7:53

devbook je normálně v UTFku.

Nahoru Odpovědět
14.9.2012 7:53
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
matesax:14.9.2012 9:44

No ale mě to hlásí toto... :) Jak píši, třeba youtube jede bez problému - s českými znaky. Zatím jsem toho moc nezkoušel - ale vše šlapalo... Vím, jakou má devbook znakovou sadu - proto se divím - a ptám se, co s tím...

Editováno 14.9.2012 9:45
 
Nahoru Odpovědět
14.9.2012 9:44
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
matesax:14.9.2012 9:54

Zdá se, že na mé straně chyba není... Ale pokud se to může utnout - nedá se nějak otestovat správnost výsledku? Děkuji.

 
Nahoru Odpovědět
14.9.2012 9:54
Avatar
David Čápka Hartinger
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka Hartinger:14.9.2012 10:44

Napadá mě načíst to vždy jako UTF a případně to potom převést, když bude v hlavičce CP1250. Ale nevím, proč zrovna nás to nemá rádo :)

Nahoru Odpovědět
14.9.2012 10:44
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
matesax:14.9.2012 13:37

No mě jde o to, aby na stránce nebyly nečitelné znaky - když dám utf-8 - půjde to všem?

Jo a z toho co bylo v popisu toho kódování - toho nahoře - jsem pochopil, že to bere znaky zapsané v číselném tvaru - možná to je ten problém. Jak tyto kódy zobrazit jako znaky? Tedy aby mi to dalo nejméně práce. Děkuji.

Editováno 14.9.2012 13:39
 
Nahoru Odpovědět
14.9.2012 13:37
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
Kit:15.9.2012 10:32

Protože v hlavičce HTTP z devbooku není uvedeno použité kódování. Je tam jen

Content-Type: text/html

Nahoru Odpovědět
15.9.2012 10:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:15.9.2012 11:03
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

?

Jako jak jsem psal, na mé straně již žádná chyba není, ale právě že se mi zdá vše vpořádku i zde... :)

Editováno 15.9.2012 11:05
 
Nahoru Odpovědět
15.9.2012 11:03
Avatar
David Čápka Hartinger
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka Hartinger:15.9.2012 11:06

Tím lépe pro matesax, že to už nemusí ladit :D Ono http-equiv stejně není vhodné pro zadání kódování, již je novější způsob:

<meta charset="UTF-8" />
Nahoru Odpovědět
15.9.2012 11:06
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 11:06

To není hlavička z HTTP, ale z HTML.

Editováno 15.9.2012 11:08
Nahoru Odpovědět
15.9.2012 11:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka Hartinger
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka Hartinger:15.9.2012 11:08

A co tedy kde chybí?

Nahoru Odpovědět
15.9.2012 11:08
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
Kit:15.9.2012 11:13

Do té hlavičky Content-Type je potřebné vpašovat kódování. V PHP to vypadá takto:

header('Content-Type: text/html; charset=UTF-8');

V hlavičce HTML to pak už nemusí být.

Nahoru Odpovědět
15.9.2012 11:13
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka Hartinger
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka Hartinger:15.9.2012 11:21

Jo takhle, čili prohlížeč to pochopí, ale tyhle parsery už ne. A dělá se to? Nikdy jsem to neviděl.

Nahoru Odpovědět
15.9.2012 11:21
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Čápka Hartinger
Kit:15.9.2012 11:32

Dělá se to. Dokonce bylo na jednom serveru nastaveno kódování na Windows-1250 a bez této "finty" se mi text napsaný v UTF-8 rozhodil, i když jsem to v http-equiv měl správně.

Dále to úspěšně využívám, pokud potřebuji prezentovat prostý text, třeba logy. Jiný způsob pro uvedení kódování prostého textu už není. Ta hlavička pak samozřejmě vypadá trochu jinak.

header('Content-Type: text/plain; charset=UTF-8');
Nahoru Odpovědět
15.9.2012 11:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Mediel
Tvůrce
Avatar
Odpovídá na matesax
Mediel:15.9.2012 13:23

kod je dobre, oboji, jen bych vice pouzival switch()... ale to je asi jen zvyk, ze me driv jebali za prehlednost

Nahoru Odpovědět
15.9.2012 13:23
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Mediel
matesax:15.9.2012 13:25

Já switch používám všude, kde to má smysl - kam by jsi ho jako chtěl dát zde?? :)

 
Nahoru Odpovědět
15.9.2012 13:25
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 13:44

Tady bych raději v GetHtml použil ternární operátor a v SetUrl bych se snažil vyhnout použití proměnné valid. Také netuším, kam bych dal switch.

Nahoru Odpovědět
15.9.2012 13:44
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:15.9.2012 14:19
private void GetHtml(string urlWithCode)
{
    var response = ((HttpWebResponse) HttpWebRequest.Create(urlWithCode).GetResponse());
    var charSet = response.CharacterSet;
    response.Close();

    Encoding pageEncoding = String.IsNullOrEmpty(charSet) ? Encoding.Default : Encoding.GetEncoding(charSet);

    htmlCode = new WebClient() { Encoding = pageEncoding } .DownloadString(urlWithCode);
}

private void SetUrl(string adjustmentUrl = null)
{
    var index = tabControl1.SelectedIndex;
    var actualUrls = new AutoCompleteStringCollection();

    foreach (Database1DataSet.UrlsMemberRow umr in urlsMemberTableAdapter.GetData().Rows)
        actualUrls.Add(umr.url);

    urlsCollection = actualUrls;

    string url = tabControl1.TabPages[index].Controls[0].Text;

    if (url != "" || adjustmentUrl != null)
    {
        if (adjustmentUrl == null)
            adjustmentUrl = url;

        if (!UrlExist(adjustmentUrl))
            adjustmentUrl = UrlExist("http://www." + adjustmentUrl) ? "http://www." + adjustmentUrl :
                UrlExist("https://www." + adjustmentUrl) ? "https://www." + adjustmentUrl :
                UrlExist("http://" + adjustmentUrl) ? "http://" + adjustmentUrl :
                UrlExist("https://" + adjustmentUrl) ? "https://" + adjustmentUrl :
                null;

        if (adjustmentUrl != null)
        {
            GetHtml(adjustmentUrl);
            textboxes[index].Text = htmlCode;
        }
        else
            MessageBox.Show("Stránka nenalezena!");
    }
}
Editováno 15.9.2012 14:20
 
Nahoru Odpovědět
15.9.2012 14:19
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 18:48

To vypadá zajímavě.

Přemýšlel jsem, jak tu nudli s UrlExist() udělat ještě čistěji. Napadlo mě z těch různých pokusů udělat seznam, ten projít foreach, při úspěšném testu UrlExist() provést GetHtml() a returnem opustit cyklus s návratem výsledku.

Pokud proběhne celý cyklus, hledání bylo neúspěšné. Tím odpadne poslední podmíněný příkaz. Stačí pak už jen vyvolat výjimku, kterou si vyšší vrstvy zachytí dle potřeby.

Nahoru Odpovědět
15.9.2012 18:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:15.9.2012 19:15

S tím cyklem mne napadlo lepší řešení:

private string[] testing = new string[5] { "http://", "https://", "http://www.", "https://www.", "" };
if (!UrlExist(adjustmentUrl))
    for (int Sindex = 0; Sindex < 6; Sindex++)
        if (UrlExist(testing[Sindex] + adjustmentUrl))
        {
            GetHtml(adjustmentUrl = testing[Sindex] + adjustmentUrl);
            textboxes[index].Text = htmlCode;
            break;
        }

if (adjustmentUrl == "")
    MessageBox.Show("Stránka nenalezena!");

Jak jsi myslel - "To vypadá zajímavě." ? :)

Editováno 15.9.2012 19:17
 
Nahoru Odpovědět
15.9.2012 19:15
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 19:34

Ironii v tom nehledej.

Ten první if se mi jeví jako zbytečný, místo for bych určitě použil foreach.

Nahoru Odpovědět
15.9.2012 19:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:15.9.2012 19:38

Coo? Jak bys tam chtěl použít foreach? Přece to nebudu dělat přes list. Toto mi přijde jako dobré řešení. Proč by byl zbytečný? Ať udělám co udělám, kratší to už nebude - maximálně v řádu zanedbatelném...

Editováno 15.9.2012 19:40
 
Nahoru Odpovědět
15.9.2012 19:38
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 19:59

Však testing v principu není pole, ale seznam. Proto by se s ním mělo zacházet jako se seznamem. Řídící proměnnou Sindex přece k ničemu nepotřebuješ. Nebo snad ano?

Teď už nejde o to, aby to bylo ještě kratší, ale aby to bylo správně. Aby se používaly správné datové struktury pro správné účely. Psal jsem, že hledám čisté řešení.

Bude to ještě kratší.

Nahoru Odpovědět
15.9.2012 19:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 20:15

C# neznám, ale napadlo mě, že by se to možná dalo udělat nějak takhle:

foreach (string Prefix in {"", "http://", "https://", "http://www.", "https://www."}) {
   if (UrlExist(Prefix + adjustmentUrl)) {
      GetHtml(Prefix + adjustmentUrl);
      return htmlCode;
   }
}
throw new Exception("Stránka nenalezena!");
Nahoru Odpovědět
15.9.2012 20:15
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:15.9.2012 20:58

Známou část posílám do testování hned po inicializování. Testuji pouze počáteční string. Dále SetUrl vrací bool, zda se vše povedlo.

private bool SetUrl(string adjustmentUrl = null)
{
    var index = tabControl1.SelectedIndex;
    var actualUrls = new AutoCompleteStringCollection();

    foreach (Database1DataSet.UrlsMemberRow umr in urlsMemberTableAdapter.GetData().Rows)
        actualUrls.Add(umr.url);

    urlsCollection = actualUrls;

    relative = adjustmentUrl == null ? tabControl1.TabPages[index].Controls[0].Text : adjustmentUrl;

    foreach (string part in new string[5] { "", "http://", "https://", "http://www.", "https://www."})
        if (UrlExist(part))
        {
            GetHtml(relative);
            textboxes[index].Text = htmlCode;
            return true;
        }

    throw new Exception("Stránka nenalezena!");

    return false;
}
 
Nahoru Odpovědět
15.9.2012 20:58
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:15.9.2012 21:02

Pardon již nemohu editovat - return false jsem vymazal...

 
Nahoru Odpovědět
15.9.2012 21:02
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 21:18

Pokud vracíš true nebo false, tak throw nepotřebuješ.

Naučil jsem se používat výjimky vždy, když dojde k nějaké nestandardní situaci. Můj původní záměr totiž byl volat funkci SetUrl() takto:

try {
   var index = tabControl1.SelectedIndex;
   textboxes[index].Text=SetUrl(adjustmentUrl);
   // další příkazy
}catch (Exception ex){
   MessageBox.Show(ex);
}

Tímto způsobem se vyhneš použití globální proměnné textboxes uvnitř funkce.

Našel jsem i správný zápis inline seznamu:

foreach (string Prefix in new string[] {"", "http://", "https://", "http://www.", "https://www."}) { ... }
Editováno 15.9.2012 21:19
Nahoru Odpovědět
15.9.2012 21:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:15.9.2012 21:25

Tak jsem uložení url do doplňovacího listu dal do testování URL - pokud se nepovede, nemá smysl ukládat zkaženou URL...

No myslím, že bool je lepší než vyvolání vyjímky...:

private bool SetUrl(string adjustmentUrl = null)
{
    relative = adjustmentUrl == null ? tabControl1.SelectedTab.Controls[0].Text : adjustmentUrl;

    foreach (string part in new string[5] { "", "http://", "https://", "http://www.", "https://www."})
        if (UrlExist(part))
        {
            GetHtml(relative);
            return true;
        }

    return false;
}

Použití:

textboxes[tabControl1.SelectedIndex].Text = SetUrl() ?  htmlCode : "Error 404" + Environment.NewLine + "Page no found!" + Environment.NewLine + "Stránka nenalezena!";
 
Nahoru Odpovědět
15.9.2012 21:25
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 21:27

BTW: Kvůli experimentům jsem si před chvílí nainstaloval Mono, abych si mohl předem vyzkoušet, než sem něco pošlu. Ten inline seznam jsem totiž v této podobě nikde nenašel. Teprve po několika pokusech jsem přišel na to, jak to má správně vypadat.

Nahoru Odpovědět
15.9.2012 21:27
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:15.9.2012 21:32

No nejde udělat jen tak výpis bez určení typu - tedy vytvoření instance... new "typ" ["rozměr"] { položky - počtem musí odpovídat rozměru };

Jinak ještě nějaké námitky? :)

 
Nahoru Odpovědět
15.9.2012 21:32
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 21:34

Když použiješ výjimku, nemusíš testovat zkaženou URL.

Podle mne jsou výjimky mnohem lepší, než vracet boolean. Nemusíš prznit návratovou hodnotu funkce, používat globální proměnné a většinou ani předávat parametry odkazem. Errorflow teče jinudy.

Nahoru Odpovědět
15.9.2012 21:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 21:37

Však ten rozměr tam dávat vůbec nemusíš. Proč taky? Není to pole, ale seznam.

Námitky? Diskutujeme přece o tom, jak nejlépe naprogramovat práci se seznamem.

Editováno 15.9.2012 21:38
Nahoru Odpovědět
15.9.2012 21:37
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:15.9.2012 21:39

Samozřejmě - však se to snažím vychytat - nebylo to myšleno jinak, než napsáno...

No zde by to vypadalo úplně stejně - jen bych vyvolal vyjímku - a musel ji chytat v try bloku - to mi nepřijde pěkné. Takto mám přehlednou podmínku. Jako proč by mělo být výhodnější vyvolávat vyjímku, oproti testování v podmínce?

Editováno 15.9.2012 21:41
 
Nahoru Odpovědět
15.9.2012 21:39
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 21:44

Protože výjimky jsou přehlednější.

Ale hlavně: Zavoláš funkci a její výsledek někam uložíš. Pokud dojde k výjimce, uložení se neprovede. V hlavním bloku nemusíš nic testovat, pouze provedeš přiřazení. A takových přiřazení můžeš udělat klidně 10 za sebou bez jakéhokoli testování. Pokud v některém z nich dojde k výjimce, blok je opuštěn a pokračuje větví catch.

Výsledkem funkce není status, zda se povedla, ale hodnota, kterou někde použiješ.

Nahoru Odpovědět
15.9.2012 21:44
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:15.9.2012 21:47

Aha - špatně si mne pochopil - netestuji URL zvlášť - to testu zahrnuji v případě návratu true přidání správné URL do seznamu navšťívených URL... (Mimo jiné do seznamu doplňující právě psanou URL.)

Ano to jsem pochopil, ale nechápu, proč je lepší try blok:

if (bool n = SetUrl()) // uložení výsledku
else
try
{
}
catch
{
}
Editováno 15.9.2012 21:51
 
Nahoru Odpovědět
15.9.2012 21:47
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:15.9.2012 21:52

Pardon - nestihl jsem to:

try
{
SetUrl();
}
catch
{
}
 
Nahoru Odpovědět
15.9.2012 21:52
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 22:02

Protože ses ještě nenaučil výjimky používat. A také ses ještě nenaučil používat funkce. Uvedený příklad try..catch nemá smysl opravovat, protože je celý chybně. Používání globálních proměnných je nešvar, je to tzv. side-effect, který by funkce neměla mít.

Nahoru Odpovědět
15.9.2012 22:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:15.9.2012 22:23

Sám píšeš "přidání správné URL do seznamu navšťívených URL". Použil jsi slovíčko "seznam". Proč s tím tedy nezacházíš jako se seznamem, ale jako kdyby to bylo pole? Položky v seznamu index nemají, používá se iterátor.

Editováno 15.9.2012 22:24
Nahoru Odpovědět
15.9.2012 22:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 59 zpráv z 59.