Avatar
matesax
Redaktor
Avatar
matesax:

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
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

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  +1 13.9.2012 12:14
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:

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
Redaktor
Avatar
matesax:

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
Redaktor
Avatar
matesax:

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
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

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
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

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
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na matesax
matesax:

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
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

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
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

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
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

devbook je normálně v UTFku.

Nahoru Odpovědět 14.9.2012 7:53
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

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
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

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
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

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
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:
<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
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

A co tedy kde chybí?

Nahoru Odpovědět 15.9.2012 11:08
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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
Redaktor
Avatar
Odpovídá na matesax
Mediel:

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
Redaktor
Avatar
Odpovídá na Mediel
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:
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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
matesax:

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

 
Nahoru Odpovědět 15.9.2012 21:02
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
matesax:

Pardon - nestihl jsem to:

try
{
SetUrl();
}
catch
{
}
 
Nahoru Odpovědět 15.9.2012 21:52
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

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
Redaktor
Avatar
Odpovídá na matesax
Kit:

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.