Začínáme s ASP.NET 2.0 – 4. díl: základní principy ASP.NET

V dnešní čtvrté části se podíváme alespoň trochu pod povrch technologie ASP.NET. Vysvětlíme si, proč nám v předchozím díle aplikace „Hello world“ fungovala podle našich předpokladů. Pokud by vám některé věci v tomto díle připadaly složité a zbytečné, můžete klidně dnešní díl přeskočit a připojit se k nám v příštím díle.

Objektový model webových stránek

Do příchodu ASP.NET byl velký rozdíl mezi vývojem aplikací pro desktop a pro web. ASP.NET přineslo v tomto směru velkou změnu – vývoj webových a desktopových aplikací je založen na podobných principech.

Rozdíl mezi tradičním vývojem pro desktop a pro web

Desktopové aplikace se posledních 10-15 let vyvíjejí velmi snadno. K dispozici jsou moderní prostředí, jako je Visual Basic anebo Delphi. Aplikace se skládají z navazujících formulářů. Každý formulář je složen z ovládacích prvků – tlačítek, rozbalovacích seznamů, stromů, kalendářů apod. Vývojáři vytvářejí formuláře „přetahováním“ jednotlivých prvků z palety dostupných prvků. Každý nástroj jich obsahuje omezené množství – pokud vám nabídka ovládacích prvků nestačí, můžete si za peníze či zadarmo sehnat další ovládací prvky a komponenty, anebo si je dokonce můžete napsat sami.

V pozadí ovládacích prvků je vyspělý objektový model. Každý ovládací prvek je po softwarové stránce objektem. Jeho vzhled a chování je určováno vlastnostmi (výška, šířka, barva pozadí, zobrazený text apod.). Prvky též na základě akcí uživatele vyvolávají události (stisknutí tlačítka, výběr prvku ze seznamu, změna textu v editačním poli apod.). Vlastní vývoj uživatelského rozhraní pak spočívá z velké části ve vytváření obslužného kódu událostí, např. při výběru prvku z rozbalovacího seznamu se aktualizují některá editační pole, při stisknutí tlačítka se zavolá zpracování právě prováděné úlohy apod.

Jednoduchost vývoje desktopových aplikací vedla k jejich velké popularitě, neboť vývoj uživatelského rozhraní byl pohodlný a rychlý. Také z hlediska koncových uživatelů jsou desktopové aplikace velmi příjemné – nabízejí velký komfort ovládání (klávesové zkratky, drag&drop myší apod.), skvěle využívají dostupný hardware a periférie, umožňují uložení dat na lokálním počítači apod. Naopak správci sítí desktopové aplikace nemilovali – instalace, podpora a aktualizace desktopových aplikací byla jejich noční můrou. A přestože Java i .NET dnes nabízejí technologie pro bezpracnou aktualizaci a údržbu desktopových aplikací, určitá averze vůči nim stále přetrvává.

Pracnost správy desktopových aplikací vedla v posledních cca 10 letech k velkému rozmachu webových aplikací, vyžadujících na straně klienta pouze jakýkoliv prohlížeč s podporou HTML. Množství webových intranetových i internetových aplikací tehdy rostlo geometrickou řadou. Ne každý si však plně uvědomoval negativa tohoto přístupu. Webové aplikace mají svoje limity pokud jde o komfort uživatelského rozhraní a využívání možností lokálního počítače. Například pokud chcete z webové aplikace používat nějakou periférii, musíte stejně na klienta nainstalovat nějakou komponentu (Java applet nebo ActiveX prvek), čímž do ní vnesete závislost na prostředí koncového uživatele a noční můra administrátorů je zpět.

Ještě větším problémem tradičně vyvíjených webových aplikací je neefektivita a nákladnost jejich vývoje. V prohlížeči jsou jednotlivé stránky zobrazovány na základě HTML značek v textovém souboru. Pomocí HTML lze snadno zobrazit pouze jednoduché vizuální prvky, k vytvoření složitějších prvků jako jsou kalendáře, menu nebo rozbalovací stromy, je již třeba velmi pokročilých znalostí. Vlastní vývoj webových aplikací v tradičních technologiích (PHP, ASP, Perl, JSP apod.) spočívá v míchání HTML značek s kódem v programovacím jazyce či skriptu. Výsledkem je velmi špatně čitelný kód (tzv. špagety kód), který se velmi pracně udržuje a mění, je velmi těžké sdílet ho mezi více projekty, vytvářet v týmu apod. Chybějící objektový model je důvodem pro chybějící kvalitní vývojové prostředí. Většina „vývojových“ prostředí jsou ve skutečnosti pouze lepšími editory a ke komfortu vývojových prostředí pro desktopové aplikace mají stejně daleko jako Velorex k Mercedesu.

V čem je ASP.NET jiné?

ASP.NET není nic jiného, než přenesení osvědčených principů desktopového vývoje do prostředí vývoje webového. Podobně jako v desktopovém vývoji, ASP.NET stránka se skládá z ovládacích prvků – tlačítek, kalendářů, stromů apod., což jsou čistokrevné objekty na straně serveru. Jejich vzhled a chování je rovněž určováno vlastnostmi (výška, šířka, barva pozadí, zobrazený text apod.). Prvky stejně tak na základě akcí uživatele vyvolávají události (stisknutí tlačítka, výběr prvku ze seznamu, změna textu v editačním poli apod.). Vývojáři rovněž vytvářejí stránky „přetahováním“ jednotlivých prvků z palety dostupných prvků v komfortním vývojovém prostředí. Pokud vám nabídka dostupných ovládacích prvků nestačí, můžete si rovněž za peníze či zadarmo sehnat další ovládací prvky a komponenty, anebo si je dokonce můžete napsat sami.

Na druhou stranu na klientovi je stejně jako u webových aplikací pouze čisté HTML verze 3.2, případně dokonce čisté XHTML. Na klienta se neinstalují žádné objekty – ani Java applety ani ActiveX ani .NET framework ani nic jiného. Jedinou interaktivitou na klientovi jsou jednoduché Java skripty, bez kterých se koneckonců dnes již téměř žádný web neobejde. Webové aplikace napsané v ASP.NET tak fungují v libovolném běžně dostupném prohlížeči s podporou HTML nebo XHTML a Java skriptu.

ASP.NET tedy ideálním způsobem kombinují rychlost a jednoduchost vývoje desktopových aplikací s minimálními požadavky na klientský počítač webových aplikací. Možná jste postřehli určitý rozpor – ASP.NET je na jednu stranu založená na objektech, ale na straně klienta žádné objekty nejsou. Kde jsou tedy objekty?

Vnitřnosti objektového modelu

Objekty v ASP.NET takříkajíc „žijí“ na serveru, nikoliv na klientovi. Objekty jsou definovány v souboru aspx pomocí speciálních značek. Například v našem příkladu „Hello World“ zde můžete najít definici objektu tlačítka vytvářeného na serveru jako:

<asp:Button ID="ButtonSkryjZobraz" runat="server" BackColor="Yellow" OnClick="ButtonSkryjZobraz_Click" Text="Skryj/Zobraz" />

Vztah mezi klientským prohlížečem a serverem s ASP.NET stránkou znázorňuje následující obrázek:

Klepněte pro větší obrázek

Objekty, jako jsou tlačítka či kalendáře, existují v paměti serveru pouze po dobu vykonávání žádosti klienta. Po vykonání celé stránky se na klienta pošle „obraz“ jednotlivých objektů v podobě HTML značek. Například „obraz“ objektu kalendář jsou HTML značky, které nám připomínají kalendář. Obraz žlutého tlačítka (objektu) s nápisem „Skryj/Zobraz“ v předchozím díle byly HTML značky zobrazující žluté tlačítko s příslušným nápisem, což můžeme snadno zjistit zobrazením zdroje v internetovém prohlížeči (View Source):

<input type="submit" name="ButtonSkryjZobraz" value="Skryj/Zobraz" id="ButtonSkryjZobraz" style="background-color:Yellow;" />

Obrazem červeného textu s viditelností (vlastnost Visible) nastavenou na False byl „neviditelný text“ – tedy žádné HTML značky.

Pojem PostBack

Dobře, pokud objekty existují pouze na serveru a pouze po dobu vykonávání žádosti klienta, jak je možné, že tyto objekty reagují na událostí, jakými je stisknutí tlačítka nebo změna vybraného data v kalendáři?

Odpovědí je funkce nazvaná PostBack zobrazená na obrázku výše. Pokud dojde ke zmíněným událostem (např. výběr data v kalendáři), je prostřednictvím Java skriptu znovu zavolán server a jsou mu předány informace o proběhlé události. Na straně serveru se znovu vytvoří objektový model stránky (tlačítka, kalendáře apod.) a je zde vyvolána událost příslušného prvku (v případě kalendáře je to událost SelectionChanged). Pokud jste napsali kód obsluhující tuto událost, je tento kód vykonán. Na závěr je obraz celé (někdy aktualizované) stránky odeslán do klientského prohlížeče. V našem příkladě „Hello World“ jsme přesně takto obsluhovali událost tlačítka Click, v jejíž obsluze jsme střídavě přepínali viditelnost – na klienta se tudíž střídavě odesílala stránka bez tlačítka a s tlačítkem.

Některé prvky mají provádění akce PostBack zapnuto, neboť by bez něj postrádaly smysl – typickým příkladem je tlačítko. Jiné prvky mohou mít tuto funkci zapnutou či vypnutou v závislosti na potřebách vývojáře. Typickým příkladem je seznam hodnot, u kterého se generování události při výběru hodnoty řídí nastavením vlastnosti AutoPostBack. Pojďme si toto chování vyzkoušet.

Založme v projektu novou stránku PostBack.aspx a přepněme ji do režimu Design. Myší přetáhneme na stránku prvek typu ListBox a prvek typu Label. ListBox1 přejmenujeme nastavením vlastnosti (ID) na DruhyOvoce, Label1 přejmenujeme stejným způsobem na VybraneOvoce. Pokud zvolíte prvek DruhyOvoce a kliknete na zobrazivším se trojúhelníčku vpravo nahoře, můžete do tohoto prvku pomocí volby Edit Items... přidat některé druhy ovoce jako na následujícím obrázku (stejnou akci lze provést i v okně Properties nastavením vlastnosti Items):

Klepněte pro větší obrázek

Nyní napíšeme kód pro obsluhu události – výběru nové položky ze seznamu hodnot a událost událost SelectedIndexChanged. Stačí dvakrát kliknout na seznamu hodnot a dopsat v editoru kódu tučně zvýrazněný kód ve zvoleném jazyce:

C#:
 protected void DruhyOvoce_SelectedIndexChanged (object sender, EventArgs e)
 {
     VybraneOvoce.Text = DruhyOvoce.SelectedValue;
 }

Visual Basic:
Protected Sub DruhyOvoce_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
     VybraneOvoce.Text = DruhyOvoce.SelectedValue
End Sub

Pokud si nyní stránku uložíme, zobrazíme si ji a vybereme některou z hodnot, nemění se hodnota textu VybraneOvoce – je stále nastavena na původní hodnotu Label. Důvodem je vlastnost AutoPostBack, která je nastavena na hodnotu False – při změně vybrané hodnoty v seznamu tedy nedochází k zavolání serveru a akci PostBack, zkrátka „neděje se nic“. Pokud však změníme u prvku DruhyOvoce v okně Properties anebo ve výše zobrazené rychlé nabídce vlastnost AutoPostBack na True, stránku uložíme a znovu zobrazíme v prohlížeči (musíte v něm dát Refresh), chování se změní. Při jakékoliv změně hodnoty vybrané ze seznamu se zavolá server, na něm se vyvolá námi napsaná obsluha události DruhyOvoce_SelectedIndexChanged, kde dojde k aktualizaci prvku VybraneOvoce s následným odesláním výsledku zpět do klientského prohlížeče.

Zároveň si můžete všimnout, že dojde k obnově stránky na klientovi, což se projeví „bliknutím“ stránky v prohlížeči. Narazili jsme na úskálí tohoto postupu – každou takovouto akcí dochází k zatížení serveru a k malému zdržení na klientovi. Máme-li na serveru dostatečnou výkonovou rezervu a síťové spojení mezi serverem a prohlížečem je dostatečně rychlé, nezaznamenáme žádný pozorovatelný problém. Nejsou-li však tyto podmínky splněny, aplikace se může jevit jako pomalu reagující. Při využívání funkce PostBack je proto třeba přemýšlet nad funkcí uživatelského rozhraní a řídit se zásadou „všeho s mírou“.

Pojem ViewState

Bystrý pozorovatel si možná všimnul dalšího rozporu – pokud objekty „žijí“ na serveru pouze krátkodobě, jak server zjistí při příštím požadavku, zda je statický text právě zobrazen či nikoliv? Přesněji řečeno – kde se mezi jednotlivými PostBack události uchovává stav stránky?

Odpověď je jednodušší, než byste čekali. Server na konci zpracování získá od jednotlivých ovládacích prvků jejich stav a pošle ho zakódovaný a digitálně podepsaný ve skrytém vstupním poli prohlížeči. V našem případě „Hello World“ můžete ve zdrojovém kódu najít něco jako:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTE2MjY5MTY1NQ9kFgICAw9kFgICAQ8PFgQeBFRleHQFC0hlbGxvIFdvcmxkHgdWaXNpYmxlaGRkZCCePWo7WfgvTZyzwtsWDEHgrvFY" />

Tento řetězec je pak při PostBack události předán zpět na server, kde slouží k rekonstrukci stavu ovládacích prvků.

Pojďme si nyní význam ViewState pro aplikaci osvětlit na jednoduchém příkladě, při kterém si vyzkoušíme práci s vlastnostmi IsPostBack a EnableViewState. Budeme pokračovat v práci na předchozím příkladu s ovocem. Nejprve vymažte ze seznamu ovoce všechny druhy, které jste tam zapsali (vlastnost Items v okně Properties). Nyní dvakrát klikněte někde na prázdném místě stránky, čímž se dostanete k editaci události Load pro celou stránku. Tato událost se vyvolá vždy na začátku provádění stránky a často se používá pro složitější nastavování vlastností (doplňování položek z databáze apod.). Do této události vepíšeme kód pro vložení dvou položek do seznamu DruhyOvoce:

C#:
protected void Page_Load(object sender, EventArgs e)
{
   DruhyOvoce.Items.Add("Jablko");
   DruhyOvoce.Items.Add("Hruška");
}

Visual Basic:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
   DruhyOvoce.Items.Add("Jablko")
   DruhyOvoce.Items.Add("Hruška")

End Sub

Pokud si nyní vyzkoušíte funkci stránky, budete možná překvapeni. Při prvním zobrazení stránky uvidíte dva druhy ovoce (Jablko, Hruška). Pokud zvolíte některé ovoce, dojde k události PostBack po níž jsou ovšem druhy ovoce již čtyři (Jablko, Hruška, Jablko, Hruška). Po další PostBack události jich bude již šest a tak dále. Důvod je celkem jednoduchý. Obsah seznamu je uchováván jako stav (ViewState) zachovávaný mezi jednotlivými žádostmi a při každé PostBack události jsou do seznamu přidány nové dva druhy ovoce. Tato nežádoucí situace má dvě možná řešení.

Prvním je vypnout ViewState pro náš prvek DruhyOvoce, čímž se seznam prvků nebude ukládat do stavu žádosti a zároveň se zmenší velikost komunikace mezi klientem a serverem. Server pak při každé žádosti přidá dva druhy ovoce do prázdného seznamu. Toho dosáhnete snadno – zvolte prvek DruhyOvoce a v okně Properties nastavte vlastnost EnableViewState na hodnotu False (vyzkoušejte). Když nyní stránku vyzkoušíte, měli byste vidět stále pouze dva druhy ovoce. Vypnutí ViewState má ale jeden nepříjemný efekt, který se projeví při volbě některého druhu – prvek si „nepamatuje“ naposledy zvolený druh ovoce a neaktualizuje se tedy hodnota textu pod ním. Přístup lze tedy použít pouze v těch případech, kdy jsou prvky jakoby pasivní a nejsou součástí nějaké pokročilejší funkčnosti.

Druhý přístup je elegantnější a univerzálnější – ViewState znovu zapneme nastavením vlastnosti EnableViewState na hodnotu True (proveďte) a poté provedeme následující úpravu kódu:

C#:
protected void Page_Load(object sender, EventArgs e)

  if( ! IsPostBack)
       DruhyOvoce.Items.Add("Jablko");
       DruhyOvoce.Items.Add("Hruška");
   }
}

Visual Basic:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    If Not IsPostBack Then
      DruhyOvoce.Items.Add("Jablko")
      DruhyOvoce.Items.Add("Hruška")
   End If
End Sub

Nejde tedy o nic složitého – přidání položek do seznamu hodnot jsme podmínili pomocí vlastnosti IsPostBack, která má při prvním zobrazení stránky hodnotu False a při následných PostBack událostech hodnotu True.

Ovládací prvky

Pojďme si nyní udělat malou přehlídku dostupných ovládacích prvků. Nejprve se podíváme na prvky dostupné takříkajíc „v krabici“, které jsou součástí ASP.NET 2.0 a poté alespoň naznačíme, jak vypadá svět vně krabice.

Prvky v krabici

Součástí ASP.NET 2.0 je několik desítek dostupných ovládacích prvků. Pro pohodlí vývojářů jsou ve VWD seskupeny do několika kategorií, které můžete vidět a rozbalovat v okně Toolbox (nevidíte-li, zvolte z nabídky View/Toolbox).

Bezkonkurenčně nejvíce prvků najdete v kategorii Standard. Zde najdete nejčastěji používané ovládací prvky – tlačítka, textové vstupy, rozbalovací seznamy, kalendáře apod. Všechny dosud použité prvky patřily do této kategorie. Jednotlivé prvky si můžeme snadno vyzkoušet jejich přetažením na stránku. Pokud si nejste jisti, jak který z prvků použít, navolte prvek myší a poté zvolte z nabídky Help/Dynamic Help. Otevře se okno, které zobrazí nejpravděpodobnější odkazy z integrované nápovědy (za předpokladu, že jste integrovanou nápovědu MSDN Express nainstalovali). Na obrázku vidíte obsah okna při vybraném ovládacím prvku RadioButton:

Klepněte pro větší obrázek

Druhou skupinou v pořadí (a druhou nejčastěji používanou) skupinou je Data. Zde se nachází ovládací prvky pro práci s daty. S některými z těchto prvků se seznámíme v šestém a sedmém díle seriálu.

Zajímavou a nesmírně užitečnou skupinou jsou validátory v sekci Validators. Validátory slouží ke kontrole zadaných hodnot na stránce. Pojďme se na validátory podívat na malém příkladu – vyrobíme stránku pro zadání věku, což může být pouze celé číslo od 0 do 130 (necháváme si raději rezervu). Vytvořme proto novou stránku v oblíbeném jazyku a nazvěme ji ZadaniVeku.aspx. Na stránku nyní napíšeme „Věk: “, přesuneme prvky TextBox, RequiredFieldValidator a RangeValidator. Stiskneme 2x Enter pro odřádkování a přeneseme myší prvek Button, znovu stiskneme 2x Enter pro odřádkování a vložíme prvek ValidationSummary. Nyní nastavíme některé vlastnosti ovládacích prvků. Vyberte vždy příslušný ovládací prvek a nastavte jeho vlastnosti v okně Properties na nové hodnoty podle uvedené tabulky:

Prvek Vlastnost Původní hodnota Nová hodnota
TextBox1 (ID) TextBox1 Vek
RequiredFieldValidator1 ControlToValidate - Vek
RequiredFieldValidator1 ErrorMessage RequiredFieldValidator Zadejte věk
RequiredFieldValidator1 Display Static Dynamic
RangeValidator1 ControlToValidate - Vek
RangeValidator1 ErrorMessage RangeValidator Zadejte celé číslo
RangeValidator1 Type String Integer
RangeValidator1 MinimumValue - 0
RangeValidator1 MaximumValue - 130
RangeValidator1 Display Static Dynamic
ValidationSummary1 HeaderText - Na stránce jsou následující chyby

Pokud jsme vše udělali podle návodu, měli bychom vidět zhruba následující obrázek:

Klepněte pro větší obrázek

Pokud si nyní zobrazíme stránku v prohlížeči a stiskneme tlačítko, měli bychom na stránce dostat upozornění na nutnost zadání věku. A pokud vyplníme řetězec, který nepředstavuje celé číslo, dostaneme zase upozornění na špatný formát zadaných dat. Dole na stránce je navíc umístěn nepovinný prvek ValidationSummary, který přehledně vypisuje varování ze všech validátorů na stránce. Pokud bychom naopak chtěli zobrazovat pouze tento přehled a nikoliv jednotlivé validátory, můžeme jejich zobrazení potlačit (nastavením vlastnosti Display na None). Povšimněme si rovněž, že nebylo nutné napsat ani jediný řádek kódu. Pozor, validátory nejsou ochranou proti zlovolným uživatelům, kteří mohou vypnutím JavaScriptu validátory vyřadit. Pro kontrolu bychom proto na serveru měli vždy před zpracováním dat zkontrolovat platnost dat (validátorů) pomocí kontroly vlastnosti stránky IsValid.

Další skupinu tvoří prvky v kategorii Navigation. Zde se nachází prvky pro zobrazování hierarchických dat – mapy webu, struktury katalogu zboží, obsahu knihy apod. Se třemi zde zastoupenými prvky – nabídka Menu, rozbalovací strom TreeView a zobrazení cesty SiteMapPath se setkáme v sedmé části v pokročilejší kapitole o práci s daty.

V kategorii Login se setkáme s prvky pracujícími s přihlašovacími účty uživatelů, přihlášení a odhlášení, založení nového účtu, změnu hesla apod. S mnohými z těchto ovládacích prvků se setkáme v deváté části seriálu.

V kategorii WebParts jsou ovládací prvky pro vytváření personalizovaných stránek. Tyto ovládací prvky se nejčastěji používají pro vytváření portálů, u kterých si uživatelé mohou sami do určité míry měnit rozmístění a nastavení jednotlivých webových dílců (web parts). Toto téma je za hranicí našeho seriálu, pokud se chcete dozvědět víc, doporučujeme například tento odkaz. V kategorii HTML jsou prvky pomáhající při převodu existujících stránek do ASP.NET, při běžné práci se zpravidla nepoužívají.

Nenašel jsem prvek...

Co dělat, pokud potřebujeme nějaký ovládací prvek a nenašli jste jej v Toolboxu? Máme v zásadě dvě možnosti: napsat si ho sami anebo se podívat, zda to již neudělal někdo jiný.

Méně pracná je druhá možnost. Spousta lidí a firem vytvořila velké množství různých ovládacích prvků, které se od sebe výrazně liší. Některé jsou vysoce kvalitní, jiné méně. Některé podporují řadu prohlížečů, u jiných je to s kompatibilitou horší. Některé jsou zcela zdarma, jiné si musíte koupit (i když zpravidla za cenu v řádu tisíců korun, za kterou je určitě nejste schopní sami napsat). Některé jsou dodávány i se zdrojovým kódem, jiné bez něj. Katalog stovek ovládacích prvků najdete na webu http://www.asp.net (případně http://beta.asp.net) v sekci Control Gallery.

Pokud si chceme napsat ovládací prvek sami, potřebujeme již mírně pokročilé znalosti. Vytváření vlastních ovládacích prvků ale není možné ve VWD edici. Buď musíme mít nějakou vyšší edici Visual Studia 2005 (alespoň Standard) anebo používat kompilátor z příkazové řádky, což je poměrně nepohodlné řešení. Vývoj ovládacích prvků využívá principy objektově orientovaného programování – nové prvky vytváříme pomocí dědičnosti buď z abstraktních základních tříd anebo z některého konkrétního prvku. Více informací o této vývojářské disciplíně naleznete například zde.

Závěrem

V dnešním díle jsme si řekli něco málo o technologických základech, ze kterých ASP.NET vychází. Protože většina aplikací potřebuje nějaká data, jako jsou katalog výrobků, seznam fotek, sportovní výsledky apod., seznámíme se v příštím díle s databázovou platformou SQL Server 2005, konkrétně bezplatnou edicí Express. V přespříštím a přespřespříštím díle pak budeme data z databáze zobrazovat na webových stránkách.

A ještě připomenutí – pokud něco nebude fungovat jak by mělo, zkuste využít možností podpory zmíněných ve druhé části, zejména diskusní skupinu microsoft.public.cs.developer.

Připraveno ve spolupráci s firmou Microsoft

Témata článku: Software, Programování, Apod, Visual Basic, Sami, Hello, Dynamic, Toolbox, Label, Parts

3 komentáře

Nejnovější komentáře

  • LennyCZ 29. 1. 2007 22:29:57
    DD, článek super, jen bych upozornil na malý překlep:

    if( !...
  • Zivan 25. 1. 2007 18:35:40
    "...proti zlovolným uživatelům, kteří mohou vypnutím JavaScriptu...
  • Trupik 13. 11. 2005 20:39:55
    Píšete: "Pokud dojde ke zmíněným událostem (např. výběr data v kalendáři),...
Určitě si přečtěte

Novou superbaterii lze nabít za pár sekund, může prodloužit výdrž telefonu na více než týden

Novou superbaterii lze nabít za pár sekund, může prodloužit výdrž telefonu na více než týden

** Vědci vyvinuli nový nanomateriál pro tvorbu superkondenzátorů ** Ohebná struktura umožňuje použití i u nositelností ** Nová technologie umožní extrémně rychlé nabití a mnohem delší výdrž než současné Li-Ion baterie

26.  11.  2016 | Karel Javůrek | 36

Monitory do 10 tisíc: poradíme, jaké jsou teď nejlepší

Monitory do 10 tisíc: poradíme, jaké jsou teď nejlepší

** Dobrý monitor s kvalitním panelem lze pořídit pod tři tisíce korun ** Pod deset tisíc si můžete koupit pracovní 27" monitor nebo nejlevnější použitelné 4K ** Vybrali jsme také ideální model pro vícemonitorovou konfiguraci

27.  11.  2016 | Stanislav Janů | 13

Sbíječky vyměnili za klávesnice. Nový projekt má za cíl přeučit horníky na programátory

Sbíječky vyměnili za klávesnice. Nový projekt má za cíl přeučit horníky na programátory

** Programátorů je málo a horníků bez práce po uzavření dolu Paskov bude moc ** Problém řeší unikátní projekt ** Pilotní kurz dává naději, že by z horníků mohli být použitelní kodéři

28.  11.  2016 | David Polesný | 75