Jarda Jirava

Vývojář a architekt řešení postavených na technologii .net framework. Zabývám se jak vývojem webových aplikací za pomoci asp.net, tak také desktopových aplikací winform. Při návrhu řešení a samotném vývoji pak využívám dlouholetých zkušeností se zpracováním obchodní logiky a pravidel aplikací získaných z vývoje komerčních aplikací pro finanční a bankovní instituce.

Microsoft MVP

Microsoft MVP - Client App dev

Silverlight minesweeper

Get Microsoft Silverlight

Navrhi COOL design a vyhraj zkušební let po Evropě!

Poslední příspěvky

.net technology

30
VII

Another day, another asp.net web system

Už je to tak, nastal nový den a s ním i loučení se starým community serverem. Nebylo to špatné, ale chtěl jsem něco víc. Navíc moje touha po novém poznání přerostla v potřebu si vše vyzkoušet na vlastní kůži.

A tak vznikl .net web system, který pohání tento blog nejen o .netu, ale také úvodní stránku, stejně jako stránky s fotografiemi a soubory ke stažení.

Ze zákulisí

Chtěl bych se podělit o postřehy ze zákulisí takového vývoje, které jsou určitě zajímavé a každý je rád slyší nebo čte. Je to už nějaký ten pátek, co jsem se začal porozhlížet po něčem novém, kam se posunout a jakým směrem obohatit svoje znalosti. Docela mi v rozhledu pomohl tým kolem patterns & practices, který v té době vydával nové a zlepšené verze software factories pro kde co.

Právě tam se nejspíše urodila myšlenka toho, že opustím community server a zkusím si napsat něco svého, co nemusí pohánět jenom tento blog, ale třeba použiji i jinde, na komerčních projektech - pokud víte o někom, kdo by spolupráci uvítal, určitě mi dejte vědět.

Co bylo důležité dodržet, je stejné chování pro okolí, jaké měl již zmíněny community server. Ovšem jen navenek, uvnitř jsem chtěl větší volnost a modularitu. A tak jak jsem se jal studovat a prokousával se novými informacemi, zjišťoval jsem, jak jde vše řešit ještě více jednoduše a elegantněji.

V té době jsem měl navíc za sebou již několik sezení s Petrem, kterému jsem vysvětloval principy fungování .net frameworku a s tím spojené výhody a také nástrahy tvorby asp.net aplikací. Petr následně z těchto rad a zapojením své invence stvořil web pro pomoc ostatním. A já tak měl možnost srovnání, na straně jedné, ten klasický, již dobře známý princip tvorby asp.net aplikace, událostního modelu stránky, web controlů a všech těch vychytávek, které si pro nás pánové z MS přichystali a poznáním, že existuje pro dané účely jiná možnost jak aplikaci pod .net napsat a přitom si zachovat možnost využít výhod .netu.

Proč ta tajemnost?

Určitě si říkáte, proč jsem opět tak tajemný, podobně jako třeba v minulém příspěvku, a neřeknu jak jsem tenhle systém navrhnul a napsal? Tentokrát je to z mé strany záměrné a hnedka prozradím proč. Rozhodl jsem se totiž jednoho z aktivních čtenářů odměnit. A když už říkám aktivního, tak to znamená, že od vás budu nejspíše něco také chtít. Tak trochu to mohou být znalosti, ale třeba jenom náhoda při procházení tohoto blogu, kdo ví, nechám to jen na vás.  Mnou napsaný .net web systém je postaven na několika zajímavých projektech, které mi usnadnily spoustu práce a nabídly volnost a snadnou konfigurovatelnost a rozšiřitelnost. Na vás je, odhalit co nejvíce, alespoň však čtyři projekty a napsat mi do komentářů jejich názvy - jako malou nápovědu přidám, že někteří, kdo mě znají více mohou být maličko překvapeni. A co za to? Doma mám ještě zabalenou krabici se hrou Age of Empires III a tu rád osobně předám jeho výherci tady v Praze, případně zašlu i do nejzazšího místa této malé, ale naší, země.

Takže neváhejte, doufám, že cena je lákavá a brzy se budu moci podělit o více zážitků jak jsem tento web systéme navrhnul a nakonec implementoval a také otestoval. A vlastně to nebude jenom o web systému, ale také o těch projektech.

A ještě jedna nápověda závěrem, pro generování obsahu do Vaší oblíbené RSS čtečky, ze které jste sem nejspíše zavítali, jsem použil projekt RSS.NET.

PS: a pro ty, kteří mi chtějí jen popřát ke kulatému výročí, jsou komentáře samozřejmě také otevřeny :-)

Publikováno pod: .net technology
15
VII

Když se nevlezete do škatulky

přijde vám to v první chvíli docela líto. Vzápětí si však uvědomíte, že je to něco, co vás odlišuje od ostatních, že jste něčím výjimeční a že takovým vlastně chcete být. A něco takového jsem si mohl uvědomit i já na začátku tohoto měsíce.

Při té příležitosti si vzpomínám na dobu před více jak půl rokem, kdy jsem v Microsoftu seděl u kulatého stolu, kam jsem byl přizván, ještě s dalšími diskutujícími a celým tím blokem se vynula otázka: "Jak přilákat více vývojářů k .net frameworku?" Já se v té době, a i poté, již šestým rokem snažil přispět svojí troškou tím, že jsem odpovídal a pomáhal na serveru builder.cz ve fóru o .netu. Převážně začátečníkům, kteří se rozhodují zda u .netu zůstanou, ale i těm pokročilejším. A že těch otázek i odpovědí není málo, vždyť si jistě samy vzpomenete nejen na své začátky, kolik jste měli otázek - i já ještě zjišťuji, že jich je přede mnou spousta nezodpovězených.

Jednou z nich je, po začátku měsíce, i další. "Mám se raději zaškatulkovat a nepomoci tak, v konkrétním případě, asi 60% dotazujících se?" Vždyť .net framework je komplexní a pokrývající široké spektrum možností vývoje software a to od asp.net webových aplikací, přes winform desktopové aplikace, webové služby a ... takhle bych ještě chvilku mohl pokračovat. Každý začátečník má pak svůj cíl a cestu, kterou se chce vydat. Moje rozhodnutí je tedy celkem jasné, raději budu mít dobrý pocit z toho, že pomohu a ostatním ukážu .net framework z pohledu, který znám, i to že se dá .netem dobře bavit a vytvářet různorodé aplikace a vlastně nejen to, byť zřejmě přijdu o nějaké ty výhody.

Teď se určitě všichni ptáte - nejspíše skutečně všichni, až na jednoho, proč tohle vlastně píšu? Je to tak trošku proto, abych vyjádřil odeznělé pocity ze zklamání, a třeba za půl roku, za rok se dočtete a dozvíte víc. Ale spíše ne, protože se jen nerad škatulkuju.

Všem pak přeji krásné prázdniny a dovolené a zůstaňte výjimeční. :-)

12
VI

Lepší je se ptát

než odpovídat, potom to alespoň nevypadá jako, že jste blbec, když neznáte odpověď. Mimochodem, to mi lehce připomělo báječnou hru Blbec k večeři v nastudování divadla Bez zábradlí.

Ale zpátky k tomu, o čem jsem se chtěl rozepsat. Jak jistě víte, již dlouhou dobu jsem členem komunity kolem serveru builder.cz a jeho fóra o .net. Nedávno jsem dokonce uspořádal i první neformální setkání přispěvatelů tohoto fórá, ale to už opět odcházím od tématu.

Proč je tedy lepší se ptát? Nejste totiž limitováni ničím, nejspíše řešíte problém, který zrovna pálí vás a nikoho jiného a v hlavě máte nějakou ideu. Tuto ideu se potom snažíte s větším či menším úspěchem přetransformovat v otázku a pak už jenom čekáte a říkáte si: Milé fórum, poper se s tím jak umíš. Samozřejmě je tu i druhá strana, kdy se ptáte, protože se snažíte někoho zkoušet a odpověď už dávno znáte, ale to není zrovna náš případ.

Ač nemám zrovinka rád různá přirovnání, k některým otázkám z poslední doby bych jedno takové, lehce kulhající, měl. Otázka vypadá asi následovně.

Mám dvě kola, řídítka, nějaký morot a kousek drátu se špagátem. Milé fórum, slyšel jsem, že z toho udělám auto. Bude mi stačit francouzský klíč nebo mám použít hever?

Ne ne, tohle není problém jenom u otázek, týkajících se .netu, ono se stačí podívat i do ostatních diskuzí a přijdete na ještě větší perly. O těch zase někdy příště.

Jak se také zeptat?

Některé určitě napadne otázka, jak je tedy lepší se zeptat, co je na takové otázce špatně a jak ji zlepšit. Vždyť co, vyjmenoval jsem snad vše, co bylo možné a co vím a znám.

Co mi však na takové otázce schází, možná jenom mě, je cíl, dílčí nebo konečný výsledek, našeho snažení. Tazatel vesměs všechno má, jenom neví jak to dát dohromady. Nezabývá se již otázkou, zda mu něco neschází, zda je možné se takto k výsledku dobrat, řeší už jenom konkrétní způsob a pokud možno konkrétní implementaci.

Odpovídající na straně druhé chvíli přemýšlí a snaží se podané informace napasovat někam do svých současných znalostí, takříkajíc čte mezi řádky ta nevyřčená slova a hledá za nimi hlubší smysl a význam takového snažení a nutnosti položit takto koncipovanou otázku, jenže ve většíně případů je o pověstný chlup vedle. Potom si připadá skutečně jak ten blbec.

4
III

WPF Photo organizer I

WPF aplikace jistě začnou v dohledné době okupovat naše PC miláčky. Několik takových aplikací se již pomalu začíná objevovat, jedná se jak o čtečky novinových článků, tak i ostatní neméně zajímavé aplikace. Ostatně, ty zajímavé můžete nalézt v přehledu na channel 9.

Co však u takové aplikace, uvedené ve zmíněném přehledu chybí, je popis jak ji vytvořit. Ano, takový jednoduchý, srozumitelný návod, pro nás vývojáře, kteří se chceme zabývat vývojem aplikací pro WPF, tedy tvorbou UI v jazyce XAML. Někdo jistě může namítnout, že příkladů na netu existuje dostatek, ale přiznám se, že popsaný vývoj jedné aplikace jsem nikde nenašel, vždy se jednalo jenom o samostatné části, vytvoření nebo nastylování Buttonu, případně seriál o WPF jako takovém, třeba jako ten na vývojáři. Jelikož je WPF zajímvavá technologie, pustil jsem se do tvorby jednoduchého organizátoru fotografií. Jelikož jsem si říkal, že pro vývojáře není důležitý jen výsledný efekt, ale i postup, jak se k cíly dostat, rozhodl jsem se s Vámi podělit a v několika příspěvcích tak představit tvorbu takové aplikace.

Cíl mého snažení

Samozřejmě, že je možné stáhnout si nejrůznější organizátory fotografií, tak proč jsem se rozhodl zrovna pro aplikaci takového typu? Jedním z kriterií bylo, že pro takovou aplikaci není třeba příliš programování ve vrstvě aplikační a také databázové logiky. Zato je možné představit nejrůznější možnosti, které nabízí WPF, takže většina kódu může být deklarována za pomoci XAML. Na druhou stranu jsem nechtěl, aby byla aplikace přeplácána různými efekty, jako je reflexe apod. to u mě určitě nenajdete.

Jako jedno z vylepšení, které se příliš u podobných aplikací nevidí a které si myslím využiji, je možnost označit fotografii k tisku a uvedení počtu kopií. Jistě to znáte, chcete si některé své digitální fotografie nechat vytisknout a tápete, jak si je označit a poznamenat k nim, v kolika kopiích je chcete mít (obzvláště důležité v současné chvíli, kdy nechávám tisknout fotky Davídka ;-) ).

Co všechno aplikace umí

Pojďme se tedy podívat na to, jakou funkčností jsem tento organizátor fotografií vybavil.

Import fotografií
  • k importu fotografií do aplikace dojde pomocí výběru adresáře na disku
  • zároveň s tím, se daný import pojmenuje a tak vznikne sada obrázků
Informace k fotografii

v průběhu importu se z fotografie zjišťují některé základní informace a EXIF informace jako:

název, datum pořízení, iso, clona, čas, model fotoaparátu ...

Fotografii je možné označit popiskem a také ji přiřadit tagy.

Základní pohledy
  • pohled na fotografie podle složky importu - vzniklé sady
  • pohled na fotografie podle jejich doby pořízení - zajištěno pomocí stromového menu
  • pohled na fotografie podle definovaných tagů - tagy je možné přiřazovat obrázkům během importu, tak i v průběhu prohlížení
  • pohled na jednotlivou fotografii dle výběru
  • tzv. paper tray pohled, kdy se zobrazují pouze fotografie k tisku

Aplikace během importu vytváří malé náhledy na obrázky a tyto ukládá do aplikačního adresáře. Zároveň jsou veškeré zjištěné informace k fotografii ukládány do databáze. Pro tyto účely jsem zvolil databázi SQL Server Compact edition, která by měla svým výkonem dostačovat pro všechny případy a zároveň je velice jednoduchá na instalaci.

Je důležité se zmínit o tom, že se zdrojovou fotografií se nemanipuluje. Fotografie vložené do paper tray je možné vyexportovat pro úpravy, tak aby nebyla dotčena původní fotografie.

Doufám, že jsem Vás naladil a nalákal na pokračování, které již nebude jen o teorii. Zároveň, pokud máte nějakou připomínku nebo dotaz, budu rád za komentář. Díky

Publikováno pod: .net technology , wpf
21
II

RE: ApplicationContext ještě jednou a lépe

Nakonec uveřejňuji následující text do samostatného příspěvku, trošku více jsem se rozepsal na otázku položenou v komentářích k příspěvku ApplicationContext ještě jednou a lépe. A také proto, že autor dotazu na sebe nezanechal kontakt(?) a tak jej nemohu s odpovědí dát lépe vědět.

Skrytí formuláře při startu aplikace

Ač trošku pozdě přicházím s odpovědí, přeci. Property Visible se nastavuje uvnitř vykonávání metody Application.Run() a to vždy na hodnotu true. Tudíž není možné spustit žádný formulář jako neviditelný. Podotýkám, že se stále bavíme o formuláři, nikoliv jen o zobrazení NotifyIcon.

Není však třeba zoufat, i toto má řešení, byť nevede přes ApplicationContext (nebo jsem jej jen nenalezl). V čem vlastně spočívá problém? Ten je v tom, že formulář při všemožném volání metody Hide() na malou chvilku problikne na obrazovce a to i v okamžiku, kdy se budeme snažit přepsat metodu OnShow.

Řešením tak je umístit formulář v události Load na pozice mimo obrazovku a v metodě OnShow jej následně skrýt. Samozřejmě nesmíme zapomenout na to, jej při následném požadavku na zobrazení napozicovat na určené místo. Např. při doubleclick na NotifyIcon. Osobně se mi líbí myšlenka napozicování formuláře na hodnoty

Left = int.MinValue;
Top = int.MinValue;

Snad tyto informace pomohou a dostatečně jsem zodpověděl položenou otázku.

Publikováno pod: .net technology , code snippet
4
II

ADO.NET a AcceptChanges

Fórum o .net na serveru Builder je v současné chvíli poměrně širokou přehlídkou začátečnických chyb a odpovědí  na ně. Nejednomu začínajícímu programátorovi v .net tak může pomoci vstoupit do světa vyspělých technologií. Stačí jen jediné, prohlédnout si ani ne tak vzdálenou historii a většinou by dotazující se získal odpověď, na svoji ještě nepoloženou otázku, téměř okamžitě. Jelikož jsem autorem poměrně značné části odpovědí na nejen tyto otázky, rozhodl jsem se některé z nich vybrat a uveřejnit je zde, jako takové malé FAQ nebo spíše knowledge-base, aby byly přeci jen lépe dostupné. Byť je možné stále si stáhnout historii konference pro offlline prohlížení.

DataSet.AcceptChanges a neukládání dat

Poměrně častým dotazem je, proč se nechtějí ukládat data do datového zdroje, přestože jsou vidět v datasetu a nad tímto je prováděn Update pomocí DataAdapteru, případně ve verzi .net 2.0 pomocí TableAdapteru.

Ona záludnost tkví v tom, že začátečník, snažící se o zapsání všech dat volá všechny metody, na používaných objektech. Tudíž velice správně zavolá metodu EndEdit() pro zapsání editovaných změn do datového objektu většinou DataSetu.

Co je však již špatně, zavolání metody AcceptChanges() nad tímto DataSetem ještě před provedením zapsání změn do datového zdroje. Vykonáním této metody totiž dojde k akceptování všech změn (jak je také patrné z názvu metody) a nastavení stavu všech řádků v jednotlivých tabulkách na hodnotu DataRowState.Unchanged. Následné volání metody Update() nad TableAdapter/DataAdapter potom nemá jak poznat, které řádky má aktualizovat, vložit nebo smazat a neprovede tak žádnou akci.

AcceptChanges tedy není nutné volat

a to v případech, kdy zapisujeme data do datového zdroje, neboť tuto metodu zavolá DataAdapter/TableAdapter sám, po provedení zápisu změn do databáze.

Publikováno pod: .net technology , builder.cz , knowledge base