<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blog.vyvojar.cz/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Vlko napísal ...</title><link>http://blog.vyvojar.cz/vlko/default.aspx</link><description>.. mostly harmless ...</description><dc:language /><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Uff, ja a MVP?</title><link>http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx</link><pubDate>Thu, 01 Oct 2009 14:25:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:235245</guid><dc:creator>vlko</dc:creator><slash:comments>18</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/235245.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=235245</wfw:commentRss><description>&lt;p&gt;Nejak sa z toho stále neviem spamätať, ale do môjho mailboxu dnes prišiel mail so subjectom: &lt;b&gt;Congratulations Microsoft MVP!&lt;/b&gt; a text začínal:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;Dear Marian Vlcak,&lt;br&gt;&lt;br&gt;
Congratulations! We are pleased to present you with the 2009 Microsoft® MVP Award! &lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aby som predišiel pochybnostiam, skontroloval som občiansky a Marián Vlčák je skutočne moje meno.&lt;/p&gt;
&lt;h3&gt;Čo teraz?&lt;/h3&gt;
&lt;p&gt;Vo filmoch je to vždy chvíľa, keď nasleduje dojemná scéna ďakovania. Nuž ďakujem najmä svojej manželke, bez ktorej podpory, lásky a varenia by som to určite tak ďaleko nedotiahol, ďalej mojím dvom drobcom (tato vás ľúbi) a najmä mojím čitateľom. Viem, že tu v českej komunite až taký známy nie som, ale pravdepodobne som posledný blogujúci slovák na blog.vyyojar.cz a v najbližšej dobe to určite neplánujem zmeniť, pretože si stále myslím (aj keď už to možno nie je pravda), že český a slovenský programátori majú k sebe blízko a možno aj k sebe patria.&lt;/p&gt;
&lt;p&gt;A tak najmä ďakujem tebe ty môj slovenský čitateľ, ktorý má pravdepodobne poznáš z fóra, alebo správičiek na portáli&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.aspnet.sk/"&gt;http://www.aspnet.sk/ &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;kde sa snažím informovať pekne po slovensky o novinkách, tipoch, overených postupoch, radách zo sveta .net (pravda viac ma priťahuje asp.net a asp.mvc). A v poslednej dobe pribudli ako doplnok k týmto informáciam tzv twitterky na&lt;/p&gt;
&lt;p&gt;&lt;a href="http://twitter.com/vlkodotnet"&gt;http://twitter.com/vlkodotnet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nesmiem zabudnúť ani na ostatných. Spigiho, ktorý sa dal ukecať na správičky a vytvoril na aspnet.sk podporu pre ich zadávanie. Ľudom z MS, že si na mňa spomenuli. A aj ďalším ľuďom z našej malej slovenskej komunity, s ktorými sa mimochodom stretneme už túto nedeľu (&lt;a href="http://www.aspnet.sk/News-DP-DEVELOPER-PARTY-STRETNUTIE-LUDi-z-ASPNET.SK-NEDELA-4.10.2009-o-1900-v-QIN-DAO-Cinska-restauracia-Trnavska-23a-83104-Bratislava-101118.aspx"&gt;DP (DEVELOPER PARTY) STRETNUTIE ĽUDí z ASPNET.SK&lt;/a&gt;), za to, že sa neokúňajú, prispievajú správičkami a tak za tých 20 mesiacov sa môžme pochváliť momentálne 1090 kusmi správičiek.&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;Plány do budúcnosti&lt;/h3&gt;
&lt;p&gt;Ako je stále mozog človeka zaplavený endorfínom, človek má chuť toho nasľubovať..., ale s tým už mám zlé skúseností, tak sa radšej budem držať pri zemi. Som predsalen pracujúci freelancer a k tomu bývam na Orave zašitý pred svetom uponáhľanej civilizácie, ale minimálne o správičky a twitterky neprídete a všetko naviac bude už len príjemným plusom:)&lt;/p&gt;&lt;p&gt;Ešte raz vďaka všetkým a dúfam, že som si to zaslúžil, inak by ma to veru mrzelo, bo viem, že existujú stovky, ba až tisíce ľudí, ktorý by si tento titul zasúžili oveľa viac, len sa boja prejaviť, preto sa netreba hanbiť, treba zozbierať odvahu a možno to budeš práve ty, kto môže nabudúci rok patriť medzi MVP.&lt;br&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx&amp;amp;;title=Uff%2c+ja+a+MVP%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx&amp;amp;;title=Uff%2c+ja+a+MVP%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx&amp;amp;;title=Uff%2c+ja+a+MVP%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx&amp;amp;title=Uff%2c+ja+a+MVP%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx&amp;amp;;title=Uff%2c+ja+a+MVP%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx&amp;amp;;title=Uff%2c+ja+a+MVP%3f&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx&amp;amp;;subject=Uff%2c+ja+a+MVP%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/10/01/uff-ja-a-mvp.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=235245" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/MVP/default.aspx">MVP</category></item><item><title>ExpressionEval Two - the lambda case</title><link>http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx</link><pubDate>Tue, 28 Apr 2009 13:40:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:230127</guid><dc:creator>vlko</dc:creator><slash:comments>10</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/230127.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=230127</wfw:commentRss><description>&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Zdrojové kódy: &lt;a href="http://vlko.zilina.net/dwn/blog/ExpressionEval.zip"&gt;http://vlko.zilina.net/dwn/blog/ExpressionEval.zip&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Intermezzo&lt;/h3&gt;
&lt;p&gt;Zaregistrovaním ExpressionEval do súťaže &lt;a href="http://www.microsoft.com/cze/opensource/soutez/default.mspx"&gt;„UKAŽ SE A VYHRAJ (Vyvíjej open-source s Microsoftem)“&lt;/a&gt; som si vyrobil rest, ktorý hádam týmto blog príspevkom napravím. &lt;/p&gt;

&lt;p&gt;Takže čo stojí v popise projektu &lt;a href="http://www.microsoft.com/cze/opensource/soutez/detail.mspx?ID=1024"&gt;ExpressionEval&lt;/a&gt;?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Popis projektu:&lt;/b&gt;
                            Cieľom
projektu je serializacia a deserializacia expression stromu do/z
textovej podoby.
Súčasťou projektu bude aj vzorovy linq provide, ktorú umožní vzdialené
vykonávanie linq výrazov (zatiaľ v zjednodušenej forme bez podpory
anonymných objektov) cez http protokol.
Initial verzia je popísana na
&lt;a href="http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx"&gt;http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx &lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&amp;nbsp;Je preto čas pokročiť a ponúknuť niečo viac ako popis a &lt;a href="http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx"&gt;initial verziu&lt;/a&gt; a trošku sa rozpísať, pretože odteraz sa pod ExpressionEval zastrešujú 3 podprojekty:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;span style="font-weight:bold;"&gt;ExpressionEval &lt;/span&gt;- pomocou ktorého je možno z textového zápisu expression výrazu dostať funkčný expresion výraz, jednoducho ide o spôsob ako deserializovať expression výraz&lt;/li&gt;

&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Evalizer &lt;/span&gt;- je zasa naopak spôsob ako z expression výrazu získať jeho textovú podobu, ktorá môže byť následne pomocou ExpressionEval-u prevedená späť na expression výraz&lt;/li&gt;

&lt;li&gt;&lt;span style="font-weight:bold;"&gt;RemoteLinq &lt;/span&gt;- toto je hlavný dôvod, prečo vznikli oba dva predchadzájuce projekty a to preniesť zo serveru linq podporu na klienta, opäť zjednodušene povedané, na klientovy používať komfort linq-u, ktorý sa ale reálne bude vykonávať na vzdialenom servere&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;ExpressionEval verzia Two&lt;/h3&gt;
&lt;p&gt;Oproti prvotnej verzii sa nám podpora parsera rozšírila a tak k pôvodnýmvlastnostiam:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;statické funkcie, properties a fieldy&lt;/li&gt;

&lt;li&gt;funkcie, properties a fieldy parametra&lt;/li&gt;

&lt;li&gt;string reťazce bez obmedzenia, teda viacriadkové a s úvodzovkami definovanými po C#ovsky: \"&lt;/li&gt;

&lt;li&gt;numerické
konštanty okrem toho že číslo s bodkou je desattinný float a bez bodky
Int32 je umožnené definovať typy pomocou končiaceho textu, teda
(posledné tri som si vymyslel, možno v budúcnosti pridam automatickú
konverziu typov):&lt;/li&gt;

&lt;ul&gt;
&lt;li&gt;12.1 - float&lt;/li&gt;

&lt;li&gt;12.1f - float&lt;/li&gt;

&lt;li&gt;12.1d - double&lt;br&gt;&lt;/li&gt;

&lt;li&gt;12 - Int32&lt;/li&gt;

&lt;li&gt;12u - UInt32&lt;/li&gt;

&lt;li&gt;12l - Int64&lt;/li&gt;

&lt;li&gt;12ul - UInt64&lt;/li&gt;

&lt;li&gt;12s - Int16&lt;/li&gt;

&lt;li&gt;12us - UInt16&lt;/li&gt;

&lt;li&gt;12b - Byte&lt;/li&gt;
&lt;/ul&gt;

&lt;li&gt;indexery&lt;/li&gt;

&lt;li&gt;operátory (*,/,%,+,-,&amp;gt;,&amp;lt;.&amp;lt;=,&amp;gt;=,==,!=,|,^,&amp;amp;,||,&amp;amp;&amp;amp;, ...)&lt;/li&gt;

&lt;li&gt;vytváranie inštancii pomocou new keywordu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;pribudli&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bugfixy chýb predchadzajúcich vlastností&lt;/li&gt;

&lt;li&gt;podpora záporných čísel (zaujímavé, že si na ne človek spomenie až, keď sa s nimi reálne stretne)&lt;/li&gt;

&lt;li&gt;negácia pomocou ! operátora&lt;/li&gt;

&lt;li&gt;konštanty null, true, false&lt;/li&gt;

&lt;li&gt;lambda výrazy&lt;/li&gt;

&lt;li&gt;extensions metódy (s tým súvisi nutnosť explicitne zadeklarovať typ pre aký sa majú extensions metódy deklarovať cez ExpressionEval.AddExtension funkciu)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Lambda výrazy a extension metódy&lt;/h3&gt;
&lt;p&gt;Myslím si, že tieto dve vlastnosti stoja za osobitnú odbočku, pretože implementovať ich bol ten najtvrdší oriešok, pretože v rámci zachovania, čo najvyššej rýchlosti vytvárania Expression stromu nezisťujem cez reflexiu metódu dopredu. Pri lambda výrazoch je toto ale nutné, pretože musíme dopredu vedieť typ parametru, z ktorého následne môžeme ďalej budovať expression tree, takže treba rátať s tým, že lambda výrazy môžu negatívne ovplyvniť rýchlosť.&lt;/p&gt;

&lt;p&gt;K tomu pridajme problém s extension metód a nutnosť preskakovať prvý parameter funkcie. Ono extension metódy sú celkom problematická vec pre reflexiu. Vo visual studiu to máme jednoduché, pridáme using namespace-u a prekompiler sa o všetko sám postará. V skutočnosti sú ale namespace len doplnková informácia, ktorú pomocou expression nie je možné jednoducho queryovať. Jedinou možnosťou je proste prebehnúť všetky načítané assembly a v nich všetky typy a až potom je možné nájsť potrebnú extension metódu.&lt;/p&gt;

&lt;p&gt;Najlepšie je uviesť príklad, teda pre vyhľadanie všetkých IQueryable&amp;lt;T&amp;gt; rozšírení z System.Linq namespacu
&lt;/p&gt;
&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;Evaluator&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;AddExtension&lt;/span&gt;(&lt;span style="color:yellow;"&gt;"System.Linq"&lt;/span&gt;, &lt;span style="color:yellow;"&gt;"IQueryable`1"&lt;/span&gt;);&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;je potrebné&lt;/p&gt;

&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// search all assemblies for extension methods &lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (&lt;span&gt;Assembly&lt;/span&gt; &lt;span style="color:white;"&gt;assembly&lt;/span&gt; in &lt;span&gt;AppDomain&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;CurrentDomain&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetAssemblies&lt;/span&gt;())&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// choose only methods extensions methods and method with defined type and assembly&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var &lt;span style="color:white;"&gt;query&lt;/span&gt; = from &lt;span style="color:white;"&gt;type&lt;/span&gt; in &lt;span style="color:white;"&gt;assembly&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetTypes&lt;/span&gt;()&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;&lt;/span&gt;&lt;span style="color:silver;"&gt;// only sealed not generics and not nested types contains extensions method&lt;/span&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; where &lt;span style="color:white;"&gt;type&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;IsSealed&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span style="color:white;"&gt;type&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;IsGenericType&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span style="color:white;"&gt;type&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;IsNested&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// so take only static methods&lt;br&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; from &lt;span style="color:white;"&gt;method&lt;/span&gt; in &lt;span style="color:white;"&gt;type&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetMethods&lt;/span&gt;(&lt;span&gt;BindingFlags&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Static&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; | &lt;span&gt;BindingFlags&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Public&lt;/span&gt; | &lt;span&gt;BindingFlags&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;NonPublic&lt;/span&gt;)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// and finally check ExtensionAttribute (in C# it is this keyword in first parameter)&lt;br&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; where &lt;span style="color:white;"&gt;method&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;IsDefined&lt;/span&gt;(typeof(&lt;span style="color:white;"&gt;System&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Runtime&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;CompilerServices&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span&gt;ExtensionAttribute&lt;/span&gt;), false)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// now compare if type name and namespace is as specified&lt;/span&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; where &lt;span style="color:white;"&gt;extensionsToLoad&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Any&lt;/span&gt;(&lt;span style="color:white;"&gt;exInfo&lt;/span&gt; =&amp;gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;Type&lt;/span&gt; &lt;span style="color:white;"&gt;paramType&lt;/span&gt; = &lt;span style="color:white;"&gt;method&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetParameters&lt;/span&gt;()[&lt;span style="color:fuchsia;"&gt;0&lt;/span&gt;].&lt;span style="color:white;"&gt;ParameterType&lt;/span&gt;;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return (&lt;span style="color:white;"&gt;paramType&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Name&lt;/span&gt; == &lt;span style="color:yellow;"&gt;"IQueryable`1"&lt;/span&gt;&lt;span style="color:white;"&gt;&lt;/span&gt;)&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;&amp;amp; (&lt;span style="color:white;"&gt;method&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;DeclaringType&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Namespace&lt;/span&gt; == &lt;span style="color:yellow;"&gt;"System.Linq"&lt;/span&gt;);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; })&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; select &lt;span style="color:white;"&gt;method&lt;/span&gt;;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Brrr, ide o pekne výpočtovo náročnú operáciu a preto sú všetky resolvnuté typy ukladané do statickej cache, takže na to myslíte pri svojich performance testoch a pridajte viac ako jednu iteráciu:)&lt;/p&gt;
&lt;h3&gt;Evalizer&lt;/h3&gt;
&lt;p&gt;To, že úlohou evalizeru je vytvoriť z expression výrazu textový ekvivalent je vám už jasné a osobne som to na začiatku pokladal za tú najjednoduchšiu úlohu, proste sa zavolá Expression.ToString() a je vystarané.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Akurát, že:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;čísla sú formatované s v aktuálnej kódovej stránke&lt;/li&gt;

&lt;li&gt;extension metódy neobsahujú definíciu typu a to ide o statické metódy, ich textová reprezentácia sa ale tvári, že ide o metódy normálne, čo sa celkom dobre číta, ale bohužiaľ zle serializuje&lt;/li&gt;

&lt;li&gt;typ new a teda NewExpression obsahuje iba meno, nijakú informáciu o namespace, prípadne assembly&lt;/li&gt;

&lt;li&gt;converzia typov (napr. byte-&amp;gt;int) sa proste volá Convert, nikde nie je informácia o tom na aký typ by sa mala konvertnúť&lt;/li&gt;

&lt;li&gt;a najlepšie nakoniec, ak použijete vonkajšiu premennú, tak tá sa automaticky neresolvne, ale je buď odkazovaná priamo, v prípade privátnej premennej je vytvorená pomocná trieda, ktorá zapuzdruje túto hodnotu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Všetky tieto problémy ale musel Evalizer vyriešiť. V prvých troch bodoch rozpísať serializačnú funkciu pre každý mysliteľný &lt;a href="http://msdn.microsoft.com/en-us/library/bb361179%28loband%29.aspx"&gt;typ Expression&lt;/a&gt; a &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx"&gt;triedu&lt;/a&gt; som bol príliš lenivý, použil som fintu a potrebné informácie odpĺňam pomocou Regex-u. Convert zasa nahrádzam patričnou Convert.To&amp;lt;Typ&amp;gt;(hodnota) funkciou, čo na základné typy bohate stačí.&lt;/p&gt;

&lt;p&gt;A nakoniec to najzložitejšie a to náhrada zapuzdrených hodnôt. Tá je nazaujímavejšia a funguje tak, že dokiaľ nejde o ExpressionParameter, tak sa snaží compilovať expression, dokiaľ nedostane návratový typ, ktorý je zo namespace System.&lt;/p&gt;

&lt;p&gt;A čo je dôležité, všetko krásne funguje a tak &lt;/p&gt;
&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int &lt;span style="color:white;"&gt;x&lt;/span&gt; = &lt;span style="color:fuchsia;"&gt;3&lt;/span&gt;;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int &lt;span style="color:white;"&gt;y&lt;/span&gt; = &lt;span style="color:fuchsia;"&gt;3&lt;/span&gt;;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; double &lt;span style="color:white;"&gt;z&lt;/span&gt; = &lt;span style="color:fuchsia;"&gt;2.2&lt;/span&gt;;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bool &lt;span style="color:white;"&gt;boolValue&lt;/span&gt; = false;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; string &lt;span style="color:white;"&gt;stringValue&lt;/span&gt; = &lt;span style="color:yellow;"&gt;"Test"&lt;/span&gt;;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;span&gt;Func&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;int&amp;gt; () =&amp;gt; &lt;/span&gt;&lt;span style="color:fuchsia;"&gt;5&lt;/span&gt; * &lt;span style="color:white;"&gt;x &lt;/span&gt;&lt;span style="color:silver;"&gt;// sa evalizuje na (5 * 3)&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;&lt;/span&gt;&lt;span&gt;Func&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;int&amp;gt; () =&amp;gt; &lt;/span&gt;&lt;span style="color:fuchsia;"&gt;5&lt;/span&gt; * &lt;span style="color:white;"&gt;x&lt;/span&gt; / &lt;span style="color:white;"&gt;y&lt;/span&gt; &lt;span style="color:silver;"&gt;// na ((5 * 3) / 3)&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:white;"&gt;&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;span&gt;Func&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;double&amp;gt; () =&amp;gt; &lt;/span&gt;&lt;span style="color:fuchsia;"&gt;5&lt;/span&gt; * &lt;span style="color:white;"&gt;x&lt;/span&gt; / &lt;span style="color:white;"&gt;y&lt;/span&gt; * &lt;span style="color:white;"&gt;z&lt;/span&gt; &lt;span style="color:silver;"&gt;// na (System.Convert.ToDouble(((5 * 3) / 3)) * 2.2)&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:white;"&gt;&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;span&gt;Func&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;bool&amp;gt; () =&amp;gt; (&lt;/span&gt;&lt;span style="color:white;"&gt;stringValue&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;IndexOf&lt;/span&gt;(&lt;span style="color:yellow;"&gt;"T"&lt;/span&gt;) == &lt;span style="color:fuchsia;"&gt;0&lt;/span&gt;) == &lt;span style="color:white;"&gt;boolValue &lt;/span&gt;&lt;span style="color:silver;"&gt;// na ((0 = 0) = False)&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;pre zaujímavejšie konštrukcie odporúčam unit testy v projekte.&lt;/p&gt;
&lt;h3&gt;RemoteLinq&lt;br&gt;&lt;/h3&gt;
&lt;p&gt;Je vyvrcholenie celého projektu a jeho cieľ, aj keď sa zdá, že ide počtom riadkov o jeho nepodstatnú časť. Trošku ma zamrzí, že Microsoft mi pomocou &lt;a href="http://msdn.microsoft.com/en-us/data/bb931106.aspx"&gt;ADO.NET Data Services (project Astoria)&lt;/a&gt;, vlastne vytvorili niečo veľmi podobné a najmä sofistikovanejšie, ale majú proste k dispozícii viac ľudí, takže je to pre nich o to jednoduchšie, čo už len môže zmôcť jednoduchý slovenský programátor?:) Mňa aspoň môže potešiť, že umožnujem serializovať aj tie extension metódy, pomocou ktorých môžete definovať fetching funkčnosť, prípadne iné špecifické veci, bez ktorých by ste sa neradi zaobišli.&lt;/p&gt;

&lt;p&gt;Takže späť k projektu, pretože ten si určite každý bude chcieť vyskúšať a overiť či to o čom je celý tento príspevok nie je len prázdne mlátenie hubou. Aby ste ho teda mohli spustiť a otestovať je potrebné poznať štruktúru projektov, z ktorých sa skladá:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;RemoteLinqBase &lt;/b&gt;- základná knižnica, ktorá obsahuje popis modelu a základné triedy pre server časť a client časť (celý remote linq je len taký nadstrel ako by taky remote linq mal vyzerať)&lt;/li&gt;

&lt;li&gt;&lt;b&gt;RemoteLinqServer&lt;/b&gt; - server časť, ktora pomocou &lt;a href="http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=18830"&gt;REST starter kitu&lt;/a&gt; zprístupňuje cez http protokol dáta (zmienil som sa už že príklad používa REST?)&lt;/li&gt;

&lt;li&gt;&lt;b&gt;RemoteLinqClient&lt;/b&gt; - client časť je jednoduchá konzolová aplikácia, ktorá ukazuje ako pomocou normálnych linq queries ukazuje, že to proste funguje, kto neverí, nech localhost nahradí za fiddler a sám sa presvedčí&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ako RemoteLinq v skutočnosti funguje už normálne nemam po toľkom texte ani chuť ani silu, okrem toho ide o takú oklieštenú verziu implementácie pre LLBLGen na strane servera (LLBLGen by asi priniesol do projektu projektu závislosť na komerčnej knižnici a to ja nerád, kto ale má záujem, vždy sa môžme dohodnúť, v predprodukčnom nasadení to už funguje;).&lt;/p&gt;

&lt;p&gt;Nuž v skratke teda:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ako som už písal vyššie na komunikáciu na strane servera používam REST starter kit, ktorý zasa využíva WCF&lt;/li&gt;

&lt;li&gt;používam DataContract serializáciu, s priamo definovanými podporovanými typmi pre serializáciu, takže si môžem odpustiť nutnosť definovať DataContract atribúty na triedov modelu&lt;/li&gt;

&lt;li&gt;a pretože model na klientovi a servere je rovnaký, nerobí to problém, vy ale na to musíte myslieť&lt;/li&gt;

&lt;li&gt;z linq funkčnosti mam otestované Where, Order, Count, Skip, Take, teoreticky nie sú problém aj iné, ale to už v nejakom ďalšom release, nápady sú a tieto by mali pre väčšinu prípadov postačovať&lt;br&gt;&lt;/li&gt;

&lt;li&gt;na strane klienta je použitý jednoduchý linq provider na základe inšpirácie z článku &lt;a href="http://blogs.msdn.com/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx"&gt;LINQ: Building an IQueryable Provider - Part &lt;br&gt;&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;a na strane servera je IQueryable simulované jednoduchým List&amp;lt;T&amp;gt;.ToQueryable()&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nechcem vás ale obrať o radosť povŕtať sa v zdrojových kódoch a tak sa do toho puste sami, nie je to zatial žiadna sláva, zopár review kód ešte bude musieť prekonať, dôležité ale je, že to funguje, no nie?&lt;/p&gt;
&lt;h3&gt;Performance&lt;/h3&gt;
&lt;p&gt;Na tú som prihliadal pri návrhu najviac a tak na prvotny parsing je použitý regex, potom sú výsledky prehnané cez stavový automat, ktorý vytvorí prvotnú stromovú štruktúru na základe ktorej sa vytvorí samotný expression tree. Aj keď som to na začiatku nepredpokladal, nie som sám:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;od Microsoft je tu &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx"&gt;Dynamic Query Library&lt;/a&gt;, ktorá je súčasťou samples vo visual studiu&lt;/li&gt;

&lt;li&gt;&lt;span id="PreviewBody"&gt;&lt;a href="http://www.codeplex.com/metalinq"&gt;MetaLinq&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;

&lt;li&gt;&lt;span id="PreviewBody"&gt;tie predchádzajúce sa dostali do performance testu, potom tu je napr Mono.Cecil, ale ten je už o troška niečom inom a hlavne asi vyžaduje vyššie právomoci, v prípade ak máte nejaké ďalšie zaujímavé knižnice na porovnanie, dajte vedieť do komentárov&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Súčasťou projektu je aj ExpressionEvalPerformanceTest projekt, ktorý je jednoduchá konzolová aplikácia na základne porovnanie výkonnosti. V porovnaní je teda ExpressionEval, DQL a MetaLinq a pre zaujímavosť aj serializácia cez Evalizer a jeho spätný prevod cez ExpressionEval.&lt;/p&gt;

&lt;p&gt;Ako si v porovnaní ExpessionEval stojí? Po prvom rune je beznádejne posledný, ale akonáhle je knižnica v pamäti poráža všetkých súperov o hlavu, veď sa presvedčte sami tú sú výsledky (nie su testované lamba, extensions a niektoré ďalšie črty, ktoré ostatným knižniciam proste chýbaju:():&lt;/p&gt;


&lt;blockquote style="font-size:75%;"&gt;Run number: 0&lt;br&gt;Normal lambda expression creation finished in 3 ms.&lt;br&gt;Expression eval creation finished in 150 ms.&lt;br&gt;Dynamic Library creation finished in 74 ms.&lt;br&gt;Deserialization finished in 133 ms.&lt;br&gt;Expression eval through evalizer creation finished in 56 ms.&lt;br&gt;Run number: 1&lt;br&gt;Normal lambda expression creation finished in 0 ms.&lt;br&gt;Expression eval creation finished in 1 ms.&lt;br&gt;Dynamic Library creation finished in 13 ms.&lt;br&gt;Deserialization finished in 11 ms.&lt;br&gt;Expression eval through evalizer creation finished in 14 ms.&lt;br&gt;Run number: 2&lt;br&gt;Normal lambda expression creation finished in 0 ms.&lt;br&gt;Expression eval creation finished in 1 ms.&lt;br&gt;Dynamic Library creation finished in 16 ms.&lt;br&gt;Deserialization finished in 12 ms.&lt;br&gt;Expression eval through evalizer creation finished in 12 ms.&lt;br&gt;Run number: 3&lt;br&gt;Normal lambda expression creation finished in 0 ms.&lt;br&gt;Expression eval creation finished in 1 ms.&lt;br&gt;Dynamic Library creation finished in 11 ms.&lt;br&gt;Deserialization finished in 11 ms.&lt;br&gt;Expression eval through evalizer creation finished in 11 ms.&lt;br&gt;&lt;/blockquote&gt;
&lt;pre&gt;Myslím si, že výsledky netreba nijak komentovať.&lt;/pre&gt;&lt;h3&gt;TODO&lt;/h3&gt;&lt;p&gt;A úplne nakoniec, čo nás čaká v najbližšej budúcnosti&lt;/p&gt;&lt;ul&gt;&lt;li&gt;vybratie licencie (tej najmenej reštriktívnej, takže sa nemusíte báť už teraz použiť knižnicu niekde v svojich projektoch)&lt;/li&gt;&lt;li&gt;uverejniť projekt na codeplexe, aby som splnil podmienky súťaže, bohužiaľ sa mi do anglického popisu dvakrát nechce&lt;/li&gt;&lt;li&gt;podpora pre anonymous triedy&lt;/li&gt;&lt;li&gt;vytvoriť RemoteLinq pre NHibernate, tak aby mal čo najviac blížil plnohodnotnému linq provideru&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Možno súťaž nevyhrám, najmä keď pozerám na konkurenciu a hlavne neviem či sa nájde niekto, kto okrem mňa tento projekt aj reálne použije, ale išlo o hádam tu najzábavnejšiu prácičku v mojom poslednom období (najmä keď na začiatku som vôbec nedúfal, že je takéto niečo možné, ešteže tu máme agile) a tak nemám srdce nechať projekt hniť na jednom mieste, keď stovky betatesterov sa nemôže dočkať až ma zaplavia kopou chýb;)&lt;br&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx&amp;amp;;title=ExpressionEval+Two+-+the+lambda+case" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx&amp;amp;;title=ExpressionEval+Two+-+the+lambda+case" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx&amp;amp;;title=ExpressionEval+Two+-+the+lambda+case" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx&amp;amp;title=ExpressionEval+Two+-+the+lambda+case" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx&amp;amp;;title=ExpressionEval+Two+-+the+lambda+case" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx&amp;amp;;title=ExpressionEval+Two+-+the+lambda+case&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx&amp;amp;;subject=ExpressionEval+Two+-+the+lambda+case" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/28/expressioneval-two-the-lambda-case.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=230127" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/coding/default.aspx">coding</category><category domain="http://blog.vyvojar.cz/vlko/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>VSWindowManager2008 - urobte si v oknách konečne poriadok</title><link>http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx</link><pubDate>Thu, 23 Apr 2009 08:25:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:229720</guid><dc:creator>vlko</dc:creator><slash:comments>5</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/229720.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=229720</wfw:commentRss><description>&lt;p&gt;Zdrojové kódy:&lt;a href="http://vlko.zilina.net/dwn/blog/VSWM2008-src.zip"&gt; http://vlko.zilina.net/dwn/blog/VSWM2008-src.zip&lt;/a&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;Binárky:&lt;a href="http://vlko.zilina.net/dwn/blog/VSWM2008-bin.zip"&gt; http://vlko.zilina.net/dwn/blog/VSWM2008-bin.zip&lt;/a&gt; &lt;/p&gt;&lt;h3&gt;Intermezzo&lt;/h3&gt;&lt;p&gt;Tak ako velí tradícia, aj dnes si neodpustím posťažovať sa na dôvod, prečo tento prototyp vznikol. Pretože na svojom pracovnom notebooku, ktorý je v práci bežne pripojený k HD monitoru, mám natívne rozlíšenie len 1280x800, čo by až tak nevadilo, ale občas si po večeroch zapnem visual studio aj bez externého monitoru a to potom sa medzi tymi všetkými tool oknami, okienko s kódom stráca.&lt;/p&gt;&lt;p&gt;Jedno je jasne, management tool okien vo Visual Studiu by potreboval nejakého pomocníka. No a pretože vo Visual Studiu 2005 som už tento problém riešil a čoho výsledkom bol &lt;a href="http://vlko.zilina.net/index.php?page=VSWindowManager%20"&gt;VSWindowManager pre Visual Studio 2005&lt;/a&gt;. Ktorý bol zase inšpirovaný projektom zo zaniklého GotDotNet a teraz už na codeplexe: &lt;a href="http://vswindowmanager.codeplex.com/"&gt;VSWindowManager&lt;/a&gt; (mimochodom verzia pre VS 2008 sa nachadza v source code časti, preto ak vám moja verzia nevyhovuje, odporúčam siahnuť po tejto).&lt;/p&gt;&lt;h3&gt;O VSWindowManager-i&lt;br&gt;&lt;/h3&gt;&lt;p&gt;Toľko k histórii, k teórii sa dostaneme neskôr, teraz poďme k features. Takže po inštalácii nám v Tool menu pribudne nové menu VSWindowManager:&lt;/p&gt;&lt;p&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/vswm-toolbar.png"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;a pre užívateľský komfort aj lišta do toolbaru:&lt;/p&gt;&lt;p&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/vswm-toolbar2.png"&gt;&lt;/p&gt;&lt;p&gt;Prvé štyri sú default, teda prepínajú sa podľa toho v akom režime sa visual studio nachádza (nie je umožnené ich pomocou addinu vymazať) a máte možnosť si vytvoriť neobmedzené množstvo vlastných window konfigurácii (viac o window konfiguráciach v technickej časti nižšie).&lt;/p&gt;&lt;p&gt;Takže vlastnosti v bodoch:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;položka menu &lt;b&gt;View config names&lt;/b&gt; - zobrazi zoznam všetkých konfigurácii&lt;/li&gt;&lt;li&gt;položka menu/toolbaru &lt;b&gt;Save config&lt;/b&gt; - vyvolá dialóg v ktorom môžete buď zadať meno novej konfigurácie, alebo z comboboxu si vybrať existujúcu a tú aktuálnou konfiguráciou okien prepísať&lt;/li&gt;&lt;li&gt;položka menu &lt;b&gt;Delete config&lt;/b&gt; - vyvolá dialóg v ktorom si môžete vybrať užívateľskú konfiguráciu, ktorú si želáte vymazať&lt;/li&gt;&lt;li&gt;položky menu &lt;b&gt;[názov_konfigurácie]&lt;/b&gt; - vybraným nastavením nahradí aktuálnu konfiguráciu okien (aktuálna konfigurácia sa nemení)ň&lt;/li&gt;&lt;li&gt;položka toolbaru &lt;b&gt;Choose config [názov_konfigurácie]&lt;/b&gt; - zobrazuje aktuálnu systémovú konfiguráciu vybraným nastavením nahradí aktuálnu konfiguráciu okien (aktuálna konfigurácia sa nemení)&amp;nbsp;&lt;/li&gt;&lt;li&gt;pre každú konfiguráciu si je možné cez Tools-&amp;gt;Options položka Enviroments-&amp;gt;Keyboard a pre zjednodušenie zadajte filter VSWindowManager zadefinovať klávesovú skratku&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Rada na záver: Konfigurácia je uložená v užívateľských nastaveniach visual studia, takže je ich možné ľubovoľne exportovať a importovať cez Tools-&amp;gt;Import and Export Settings a v strome je to All Settings-&amp;gt;General Settings-&amp;gt;Window Layouts.&lt;/p&gt;&lt;h3&gt;Inštalácia&lt;/h3&gt;&lt;p&gt;V binárkach sa nachádza okrem inštalačky, ktorá okrem application adresára (ktorý je ale úplne zbytočný) nakopíruje addin do&amp;nbsp; %user_documents%\Visual Studio 2008\Addins\, takže ak nie ste lenivý a dokážete to urobiť sami, tak si súbory VSWindowManager2008.dll aVSWindowManager2008.AddIn môžete nakopírovať sami:)&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Technológia na pozadí&lt;br&gt;&lt;/h3&gt;&lt;p&gt;Aj keď funkčnosť addinu môže vyzerať na prvý pohľad implementačne komplikovaná, opak je pravdou. Pre ukladanie pozície okien nie je potrebné žiadne prechádzanie štruktúrov zobrazených okien, ale všetko podstatné už má &lt;a href="http://msdn.microsoft.com/en-us/library/envdte._dte.aspx"&gt;DTE interface&lt;/a&gt; v sebe (začal som takto rovno na vec, pretože predpokladám, že do tohto textu sa začítajú len tí ľudia, čo si aspoň jeden addin skúšobne vygenerovali a Connect objekt aspoň okom prelistovali), konkrétne to je property &lt;a href="http://msdn.microsoft.com/en-us/library/envdte._dte.windowconfigurations.aspx"&gt;_DTE&lt;span class="cs"&gt;.&lt;/span&gt;&lt;span class="vb"&gt;&lt;/span&gt;WindowConfigurations&lt;/a&gt;, čo je opäť interface &lt;a href="http://msdn.microsoft.com/en-us/library/envdte.windowconfigurations.aspx"&gt;WindowConfigurations&lt;/a&gt;, ktorý zaobaľuje kolekciu jednotlivých &lt;a href="http://msdn.microsoft.com/en-us/library/envdte._dte.windowconfigurations.aspx"&gt;WindowConfiguration&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Kolekcia &lt;a href="http://msdn.microsoft.com/en-us/library/envdte.windowconfigurations.aspx"&gt;WindowConfigurations&lt;/a&gt; obsahuje property &lt;a href="http://msdn.microsoft.com/en-us/library/envdte.windowconfigurations.activeconfigurationname.aspx" id="ctl00_mainContentContainer_ctl46"&gt;ActiveConfigurationName&lt;/a&gt;, čo nie je nič iné ako aktuálna konfigurácia okien a indexer funkciu &lt;a href="http://msdn.microsoft.com/en-us/library/envdte.windowconfigurations.item.aspx" id="ctl00_mainContentContainer_ctl27"&gt;Item&lt;/a&gt;, pomocou ktorého sa viete dostať ku konkrétnej inštancii &lt;a href="http://msdn.microsoft.com/en-us/library/envdte._dte.windowconfigurations.aspx"&gt;WindowConfiguration&lt;/a&gt;. Pretože ako vstupný objekt do funkcie &lt;a href="http://msdn.microsoft.com/en-us/library/envdte.windowconfigurations.item.aspx" id="ctl00_mainContentContainer_ctl27"&gt;Item&lt;/a&gt; vstupuje objekt je možné ku konkrétnej inštancii sa dostať buď pomocou jej mena, alebo indexu pozície (pozor index začína od 1, asi ide o wrapper nad nejakou visual basic implementáciou, inak si to vysvetliť neviem:). &lt;br&gt;&lt;/p&gt;&lt;p&gt;Nuž a keď už nejakú tú window konfiguráciu máte vybratú, tak pomocou funkcii:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/envdte.windowconfiguration.apply.aspx" id="ctl00_mainContentContainer_ctl18"&gt;Apply&lt;/a&gt; - nastavíte danú konfiguráciu ako aktívnu, tu by som upozornil na to, že neodporúčam meniť aktuálnu konfiguráciu, ale urobiť nova.Apply(), aktualna.Update() a&amp;nbsp; aktualna.Apply(), pretože inak sa každa zmena na aktuálnych oknách, dokiaľ neurobíte zmenu režimu automaticky aj ukladá a tym pádom sa zmysel uloženej konfigurácie vytráca, to je aj rozdiel oproti addinu na codeplexe&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/envdte.windowconfiguration.delete.aspx" id="ctl00_mainContentContainer_ctl21"&gt;Delete&lt;/a&gt; - danú konfiguráciu zmaže&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/envdte.windowconfiguration.update.aspx" id="ctl00_mainContentContainer_ctl24"&gt;Update&lt;/a&gt; - pretože ako píšem v poznámke pri Apply, každá zmena sa automaticky ukladá do aktuálnej konfigurácie, tak Update je len skopírovanie aktuálnej konfigurácie do danej inštancie&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Visual Studio ma 4 default window konfigurácie, ktoré mení podľa toho v akom režime sa akurát nachádzate&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Design - štandardny coding užívateľský mód&lt;/li&gt;&lt;li&gt;Debug - visual studio debugguje nejakú aplikáciu&lt;/li&gt;&lt;li&gt;FullScreen - špeciálny mód po stlačení klávesy F11&lt;/li&gt;&lt;li&gt;NoToolWin - nemám ani potuchy, kedy sa tento mód používa, ak viete, podeľte sa v komentároch&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Oproti verzii Visual Studia 2005 je ale &lt;a href="http://msdn.microsoft.com/en-us/library/envdte._dte.windowconfigurations.aspx"&gt;_DTE&lt;span class="cs"&gt;.&lt;/span&gt;&lt;span class="vb"&gt;&lt;/span&gt;WindowConfigurations&lt;/a&gt; vo verzii 2008 inicializovaná až po plnom startupe visual studia. Pretože ale takýto event vám addin neposkytne, budete musieť byť odkázany na určitú lazy logiku, takže určite ak sa rozhodnete pre vlastnú implementáciu, inšpirujte sa mojim kódom, inak budete pár hodin rozmýšlať, prečo dostávate com exception (ja osobne som si už myslel, že táto property vo vs2008 proste nebola implementovaná).&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Záver&lt;/h3&gt;&lt;p&gt;Dúfam, že tento malý addin sa vám stane dobrým pomocníkom, veď tým ako visual studio priberá nové a nové funkčnosti a vám sa hromadí počet vyskakovacích okien, niečo podobné sa pomaly stáva nutnosťou. Možno by ešte stálo za to zvážiť nejaké automatické prepínanie na základe typu aktuálne otvoreného okna, ale taká automatická funkčnosť býva občas viac na škodu ako na úžitok, veď nakoniec klávesová skratka a automaticke prepínanie window layoutu, ktoré už v sebe visual studio má, by malo úplne postačovať.&lt;br&gt;&lt;/p&gt;&lt;br&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx&amp;amp;;title=VSWindowManager2008+-+urobte+si+v+okn%26%23225%3bch+kone%c4%8dne+poriadok" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx&amp;amp;;title=VSWindowManager2008+-+urobte+si+v+okn%26%23225%3bch+kone%c4%8dne+poriadok" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx&amp;amp;;title=VSWindowManager2008+-+urobte+si+v+okn%26%23225%3bch+kone%c4%8dne+poriadok" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx&amp;amp;title=VSWindowManager2008+-+urobte+si+v+okn%26%23225%3bch+kone%c4%8dne+poriadok" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx&amp;amp;;title=VSWindowManager2008+-+urobte+si+v+okn%26%23225%3bch+kone%c4%8dne+poriadok" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx&amp;amp;;title=VSWindowManager2008+-+urobte+si+v+okn%26%23225%3bch+kone%c4%8dne+poriadok&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx&amp;amp;;subject=VSWindowManager2008+-+urobte+si+v+okn%26%23225%3bch+kone%c4%8dne+poriadok" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/04/23/vswindowmanager2008-urobte-si-v-okn-ch-kone-ne-poriadok.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=229720" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/FastFood/default.aspx">FastFood</category><category domain="http://blog.vyvojar.cz/vlko/archive/tags/coding/default.aspx">coding</category><category domain="http://blog.vyvojar.cz/vlko/archive/tags/Rie_6101_enia+be_7E01_n_26002300_253_3B00_ch+probl_26002300_233_3B00_mov/default.aspx">Riešenia bežn&amp;#253;ch probl&amp;#233;mov</category></item><item><title>[ANN] Správičky po roku: 666 kusov</title><link>http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx</link><pubDate>Wed, 04 Mar 2009 21:30:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:229086</guid><dc:creator>vlko</dc:creator><slash:comments>4</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/229086.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=229086</wfw:commentRss><description>&lt;p&gt;Čas pomaly ale isto beží a je tomu už pomaly rok, čo na aspnet.sk vznikli krátke správičky: &lt;a href="http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx"&gt;[ANN] Správičky na aspnet.sk&lt;/a&gt;.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Úprimne sa hneď na začiatok priznám, že cieľ tohto príspevku nie je len informatívny, ale aj agitačný. Proste získať nejakého toho nového čitateľa, alebo v lepšom prípade nového prispievateľa.&lt;/p&gt;&lt;p&gt;Takže, čo sa za ten rok vlastne podarilo? &lt;/p&gt;&lt;ul&gt;&lt;li&gt;V čase písania tohto článku sa ukazovateľ počtu zastavil na čísle 666, čo za dané obdobie dáva v priemere 1.79 správičky na deň a to vrátane sviatkov a víkendov. &lt;br&gt;&lt;/li&gt;&lt;li&gt;Informačnú hodnotu jednotlivých správičiek necham radšej na čitateľa, ale povedzme, že je snaha, aby tam nejaká bola a okrem najnovších informácii sa tu nachádzajú aj bežné témy, ktoré by nás mohli trápiť.&lt;br&gt;&lt;/li&gt;&lt;li&gt;Raz za čas sa objaví správička s tagom [Polemika], čo nie je nič iné ako slovenský názov pre flame (samozrejme flame intel vs amd, opera vs ff radsej nevedieme, ale témy ako &lt;a href="http://www.aspnet.sk/Polemika-Co-vas-na-.net-srdi-100611.aspx"&gt;[Polemika] Čo vás na .net srdí?&lt;/a&gt; alebo &lt;a href="http://www.aspnet.sk/News-Polemika-O-SOLID-a-tak-podobne-100660.aspx" id="ctl00_ContentPlaceHolder1_DataListArticles_ctl09_HyperLinkAName"&gt;[Polemika] O SOLID a tak podobne&lt;/a&gt; môžu poskytnúť zaujímavé myšlienky)&lt;/li&gt;&lt;li&gt;Štýl. K nemu môžem hovoriť len za seba, no a ja miesto striktne informačného preferujem striktne osobno-názorový, čo môže v niekom spôsobiť penenie krvi v tele:) Okrem toho je takto informácia určite lepšie stráviteľná (aspoň podľa mňa).&lt;br&gt;&lt;/li&gt;&lt;li&gt;Informačný zdroj v slovenskom jazyku (bohužial z neznámeho dôvodu je nepísaným pravidlom, že česi na slovenské portály nechodia), čo určite ocenia všetci, komu slovenský jazyk je príjemnejší ako anglický.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Tak či onak, správičky sú niečo medzi mikroblogingom a inteligentnými bookmarkami a je len na Vás, či si vyberiete:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;sekciu správičky: &lt;a href="http://www.aspnet.sk/News.aspx"&gt;http://www.aspnet.sk/News.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;vstupný bod portálu, kde je správičkam venovaný ľavý stĺpec a v pravom sú blogy a zaujímavosti zo sveta: &lt;a href="http://www.aspnet.sk/"&gt;http://www.aspnet.sk/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;rss feed: &lt;a href="http://www.aspnet.sk/rss.ashx?w=news"&gt;http://www.aspnet.sk/rss.ashx?w=news&lt;/a&gt;&lt;/li&gt;&lt;li&gt;webslice pre IE8: &lt;a href="http://www.aspnet.sk/webslice.ashx?w=news"&gt;http://www.aspnet.sk/webslice.ashx?w=news&lt;/a&gt;&lt;/li&gt;&lt;li&gt;alebo ignore, ale v tom prípade by ste sa nedočítali až tu, že ano?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;No a nakoniec zaujímavosť, prípadne námet na diskusiu:&lt;/p&gt;&lt;p&gt;Neviem, či ste si všimli ale v súčastnosti som na blog.vyvojar.cz posledný aktívne blogujúci slovák (aj keď to "aktívne" sa dá asi brať s rezervou:). To ma privádza k otázkam: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ako ďaleko sa vzdialila CZ komunita tej SK?&lt;/li&gt;&lt;li&gt;Navštevujú vôbec česi nejaké slovenské portály?&lt;/li&gt;&lt;li&gt;Pretože u nás programy po česky ešte bežne bežia, tak koľko bude trvať až bude pre CZ komunitu slovenčina cudzí jazyk?&lt;/li&gt;&lt;li&gt;A vlastne rozumie mi po slovensky ešte niekto?&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx&amp;amp;;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+po+roku%3a+666+kusov" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx&amp;amp;;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+po+roku%3a+666+kusov" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx&amp;amp;;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+po+roku%3a+666+kusov" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx&amp;amp;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+po+roku%3a+666+kusov" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx&amp;amp;;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+po+roku%3a+666+kusov" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx&amp;amp;;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+po+roku%3a+666+kusov&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx&amp;amp;;subject=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+po+roku%3a+666+kusov" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/03/04/ann-spr8vi-ky-po-roku-666-kusov.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=229086" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/Pozastavenie/default.aspx">Pozastavenie</category><category domain="http://blog.vyvojar.cz/vlko/archive/tags/announce/default.aspx">announce</category></item><item><title>Ako narvať generické triedy do kolekcie</title><link>http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx</link><pubDate>Wed, 07 Jan 2009 22:10:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228846</guid><dc:creator>vlko</dc:creator><slash:comments>2</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/228846.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=228846</wfw:commentRss><description>&lt;h3&gt;Intermezzo&lt;/h3&gt;&lt;p&gt;&lt;i&gt;Verím tomu, že časť kódu v tomto prispevku dostanem veľkú prednášku o typovej bezbečnosti, ale na druhu stranu za splnenia určitých podmienok je to použiteľné riešenie.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Ale pekne po poriadku. Na tom mojom počiatku pri riešení jednej zaujímavej úlohy (&lt;i&gt;zatiaľ s kódovým názvom REST repository, o ktorom určite až ho dovediem z prototypu do použiteľnej podoby čoskoro napíšem (BTW serializacia lambda výrazov pomocou na vianoce publikovaného ExpressionEval je proste božia:)&lt;/i&gt;)&amp;nbsp; vyvstala potreba vytvorenia kolekcie generických tried, teda niečo ako List&amp;lt;Generics&amp;lt;Parent&amp;gt;&amp;gt;, kde by šlo vkladať všetky generika, ktoré majú špecifického parenta. &lt;/p&gt;&lt;p&gt;Nech som ale premýšlal ako som chcel schodnú cestu som nenašiel, je sice možné vytvoriť interface, ktorý bude negenerický, ale to by ma nútilo siahnuť do generickej triedy a mať v nej vlastne dve funkcie. Jednu vracajúcu generický a druhý nejaky parent typ.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ďalším riešením je generické triedy vkladať ako objekty a pred každým použitím ich pretypovať, ale nejak rozumne by som si potom musel uchovávať typ na aký to mám pretypovať a veru nič rozumné som neobjavil. &lt;br&gt;&lt;/p&gt;&lt;p&gt;A pritom čarovným slovičkom je variácia, presnejšie covariáncia [viď správička &lt;a href="http://www.aspnet.sk/C-4.0-Co-je-to-ten-Variance-a-ako-to-je-s-fintou-zvanou-default-parameter-100452.aspx"&gt;&lt;span id="ctl00_ContentPlaceHolder1_DataListArticle_ctl00_ArticleName" class="ListArticleHeader"&gt;C# 4.0: Čo je to ten Variance a ako to je s fintou zvanou default parameter?&lt;/span&gt;&lt;/a&gt;], ale kto bude čakať na .net 4.0, preto som sa vydal cestou skúmania a zistil, som že vlastne delegáty covarianciu už dávno majú (&lt;a href="http://msdn.microsoft.com/en-us/library/ms173174%28VS.80%29.aspx"&gt;Covariance and Contravariance in Delegates (C# Programming Guide)&lt;/a&gt;) a dala by sa ľahko znásilniť nasledovne:&lt;/p&gt;&lt;h3&gt;Simulujeme Covarianciu generík&lt;/h3&gt;&lt;p&gt;Najskôr teda majme generickú triedu&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span&gt;GenericsClass&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TItem&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; where &lt;/span&gt;&lt;span style="color:white;"&gt;TItem&lt;/span&gt; : class&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private &lt;span style="color:white;"&gt;TItem&lt;/span&gt; &lt;span style="color:white;"&gt;_Item&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public &lt;span style="color:white;"&gt;GenericsClass&lt;/span&gt;(&lt;span style="color:white;"&gt;TItem&lt;/span&gt; &lt;span style="color:white;"&gt;item&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;_Item&lt;/span&gt; = &lt;span style="color:white;"&gt;item&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public &lt;span style="color:white;"&gt;TItem&lt;/span&gt; &lt;span style="color:white;"&gt;GetItem&lt;/span&gt;()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;_Item&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;i&gt;Podmienku, že TItem je trieda hádam netreba komentovať, o primitívne typy mi nejde.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Takže hneď z úvodu je vidieť, že bez nejakej tej barličky to nepôjde, musíme si preto najskôr vytvoriť delegáta pre funkciu GetItem()&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public delegate &lt;span style="color:white;"&gt;TItem&lt;/span&gt; &lt;span&gt;GetItemDelegate&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TItem&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;A o to podstatné sa postará pomocná trieda:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; where &lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt; : class&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public &lt;span&gt;GetItemDelegate&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;GetItem&lt;/span&gt; { get; set; }&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public static &lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;GetWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TItem&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;(&lt;/span&gt;&lt;span&gt;GenericsClass&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TItem&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;source&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; where &lt;span style="color:white;"&gt;TItem&lt;/span&gt; : class, &lt;span style="color:white;"&gt;TParent&lt;/span&gt; &lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;wrapper&lt;/span&gt; = new &lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;wrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetItem&lt;/span&gt; = &lt;span style="color:white;"&gt;source&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetItem&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;wrapper&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Je dôležité si všimnúť where podmienku, ktorá nám zabezpečí typovú bezpečnosť a bezproblémovú covarianciu.&lt;/p&gt;&lt;p&gt;Za predpokladu, že máme na začiatku tieto triedy:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span&gt;Parent&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public string &lt;span style="color:white;"&gt;Value&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { get; set; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span&gt;Item1&lt;/span&gt; : &lt;span&gt;Parent&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {}&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span&gt;Item2&lt;/span&gt; : &lt;span&gt;Parent&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {}&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;potom môžeme vytvoriť nasledujúci kód:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-weight:bold;"&gt;static void &lt;/span&gt;&lt;span style="color:white;"&gt;Main&lt;/span&gt;(string[] &lt;span style="color:white;"&gt;args&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// create generics class for type Item1&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var &lt;span style="color:white;"&gt;item1Gen&lt;/span&gt; = new &lt;span&gt;GenericsClass&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Item1&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;(new &lt;/span&gt;&lt;span&gt;Item1&lt;/span&gt;{&lt;span style="color:white;"&gt;Value&lt;/span&gt; = &lt;span style="color:yellow;"&gt;"Item1"&lt;/span&gt;});&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// create generics class for type Item2&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var &lt;span style="color:white;"&gt;item2Gen&lt;/span&gt; = new &lt;span&gt;GenericsClass&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Item2&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;(new &lt;/span&gt;&lt;span&gt;Item2&lt;/span&gt;{&lt;span style="color:white;"&gt;Value&lt;/span&gt; = &lt;span style="color:yellow;"&gt;"Item2"&lt;/span&gt;});&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// create generics class for base type Parent&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var &lt;span style="color:white;"&gt;collection&lt;/span&gt; = new &lt;span&gt;List&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Parent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// fill collection with wrappers to generics classes&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;collection&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Add&lt;/span&gt;(&lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Parent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetWrapper&lt;/span&gt;(&lt;span style="color:white;"&gt;item1Gen&lt;/span&gt;));&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;collection&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Add&lt;/span&gt;(&lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Parent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetWrapper&lt;/span&gt;(&lt;span style="color:white;"&gt;item2Gen&lt;/span&gt;));&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// and do simple test&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var &lt;span style="color:white;"&gt;wrapper&lt;/span&gt; in &lt;span style="color:white;"&gt;collection&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;Console&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;WriteLine&lt;/span&gt;(&lt;span style="color:yellow;"&gt;"type: {0}, Value:{1}"&lt;/span&gt;, &lt;span style="color:white;"&gt;wrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetItem&lt;/span&gt;().&lt;span style="color:white;"&gt;GetType&lt;/span&gt;(), &lt;span style="color:white;"&gt;wrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetItem&lt;/span&gt;().&lt;span style="color:white;"&gt;Value&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;Console&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;ReadKey&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Je síce potrebné pre každú funkciu vytvoriť delegáta (prácu si môžme zjednodušiť pomocou Action a Func) a potrebný kód okolo. Každa sranda niečo stojí ale bez zásahov do kódu pôvodnej generickej triedy sme dostali celkom peknú funčnosť.&lt;/p&gt;&lt;h3&gt;Dirty full variance&lt;/h3&gt;&lt;p&gt;Z predchádzajúceho kódu určite každý pochopil, že takto je možné riešiť aj contravarianciu, ja ale v mojej generickej triede mám aj funkcie, ktoré generikami definovaný typ používajú ako parametre. Teda ešte raz varujem &lt;b&gt;plná&amp;nbsp; variancia nie je typovo bezpečná!!!&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Tak si teda poďme rozšíriť našu generickú triedu o novú funkciu AddItem, ktorá berie generikou definový typ ako parameter:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span&gt;GenericsClass&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TItem&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; where &lt;/span&gt;&lt;span style="color:white;"&gt;TItem&lt;/span&gt; : class&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private &lt;span style="color:white;"&gt;TItem&lt;/span&gt; &lt;span style="color:white;"&gt;_Item&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public &lt;span style="color:white;"&gt;TItem&lt;/span&gt; &lt;span style="color:white;"&gt;AddItem&lt;/span&gt;(&lt;span style="color:white;"&gt;TItem&lt;/span&gt; &lt;span style="color:white;"&gt;item&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;_Item&lt;/span&gt; = &lt;span style="color:white;"&gt;item&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;_Item&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public &lt;span style="color:white;"&gt;TItem&lt;/span&gt; &lt;span style="color:white;"&gt;GetItem&lt;/span&gt;()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;_Item&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Zadefinujeme si nového delegáta&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public delegate &lt;span style="color:white;"&gt;TItem&lt;/span&gt; &lt;span&gt;AddItemDelegate&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TItem&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;(&lt;/span&gt;&lt;span style="color:white;"&gt;TItem&lt;/span&gt; &lt;span style="color:white;"&gt;item&lt;/span&gt;);&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;A rozšírime wrapper triedu&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; where &lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt; : class&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public &lt;span&gt;AddItemDelegate&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;AddItem&lt;/span&gt; { get; set; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public &lt;span&gt;GetItemDelegate&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;GetItem&lt;/span&gt; { get; set; }&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public static &lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;GetWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TItem&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;(&lt;/span&gt;&lt;span&gt;GenericsClass&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TItem&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;source&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; where &lt;span style="color:white;"&gt;TItem&lt;/span&gt; : class, &lt;span style="color:white;"&gt;TParent&lt;/span&gt; &lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;wrapper&lt;/span&gt; = new &lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:white;"&gt;TParent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;wrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetItem&lt;/span&gt; = &lt;span style="color:white;"&gt;source&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetItem&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;wrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;AddItem&lt;/span&gt; = delegate(&lt;span style="color:white;"&gt;TParent&lt;/span&gt; &lt;span style="color:white;"&gt;item&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;source&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;AddItem&lt;/span&gt;((&lt;span style="color:white;"&gt;TItem&lt;/span&gt;)&lt;span style="color:white;"&gt;item&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;wrapper&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Opäť je jasné, že AddItem delegáta zo source.AddItem nijak nejde dostať, preto si pomôžeme anonymným delegátom a malým pretypovaním.&lt;/p&gt;&lt;p&gt;Pre test pridajme ešte dve pomocné triedy&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span&gt;Item3&lt;/span&gt; : &lt;span&gt;Parent&lt;/span&gt; {}&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span&gt;differentItem&lt;/span&gt; {}&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;A máme finálny kód:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; static void &lt;span style="color:white;"&gt;Main&lt;/span&gt;(string[] &lt;span style="color:white;"&gt;args&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// create generics classes&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var &lt;span style="color:white;"&gt;item1Gen&lt;/span&gt; = new &lt;span&gt;GenericsClass&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Item1&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var &lt;span style="color:white;"&gt;item2Gen&lt;/span&gt; = new &lt;span&gt;GenericsClass&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Item2&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var &lt;span style="color:white;"&gt;item3Gen&lt;/span&gt; = new &lt;span&gt;GenericsClass&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;differentItem&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// create generics list&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var &lt;span style="color:white;"&gt;collection&lt;/span&gt; = new &lt;span&gt;List&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Parent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;collection&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Add&lt;/span&gt;(&lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Parent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetWrapper&lt;/span&gt;(&lt;span style="color:white;"&gt;item1Gen&lt;/span&gt;));&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;collection&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Add&lt;/span&gt;(&lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Parent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetWrapper&lt;/span&gt;(&lt;span style="color:white;"&gt;item2Gen&lt;/span&gt;));&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// add generics class without reference&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;collection&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Add&lt;/span&gt;(&lt;span&gt;GenericsWrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Parent&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetWrapper&lt;/span&gt;(new &lt;span&gt;GenericsClass&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Item3&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;()));&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// try to call gc if generics class for type Item3 will persist&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;GC&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Collect&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// this will fails on compile time&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;//collection.Add(GenericsWrapper&amp;lt;Parent&amp;gt;.GetWrapper(item3Gen));&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;collection&lt;/span&gt;[&lt;span style="color:fuchsia;"&gt;0&lt;/span&gt;].&lt;span style="color:white;"&gt;AddItem&lt;/span&gt;(new &lt;span&gt;Item1&lt;/span&gt;{&lt;span style="color:white;"&gt;Value&lt;/span&gt; = &lt;span style="color:yellow;"&gt;"Item1"&lt;/span&gt;});&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;collection&lt;/span&gt;[&lt;span style="color:fuchsia;"&gt;1&lt;/span&gt;].&lt;span style="color:white;"&gt;AddItem&lt;/span&gt;(new &lt;span&gt;Item2&lt;/span&gt;{&lt;span style="color:white;"&gt;Value&lt;/span&gt; = &lt;span style="color:yellow;"&gt;"Item2"&lt;/span&gt;});&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;collection&lt;/span&gt;[&lt;span style="color:fuchsia;"&gt;2&lt;/span&gt;].&lt;span style="color:white;"&gt;AddItem&lt;/span&gt;(new &lt;span&gt;Item3&lt;/span&gt;{&lt;span style="color:white;"&gt;Value&lt;/span&gt; = &lt;span style="color:yellow;"&gt;"Item3"&lt;/span&gt;});&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// this will fails on runtime&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// collection[1].AddItem(new Item1{Value = "Item1"});&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var &lt;span style="color:white;"&gt;wrapper&lt;/span&gt; in &lt;span style="color:white;"&gt;collection&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;Console&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;WriteLine&lt;/span&gt;(&lt;span style="color:yellow;"&gt;"type: {0}, Value:{1}"&lt;/span&gt;, &lt;span style="color:white;"&gt;wrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetItem&lt;/span&gt;().&lt;span style="color:white;"&gt;GetType&lt;/span&gt;(), &lt;span style="color:white;"&gt;wrapper&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetItem&lt;/span&gt;().&lt;span style="color:white;"&gt;Value&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;Console&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;ReadKey&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;A teraz je už len na Vás aby ste ma pekne sprznili v diskusii, prípadne ponúkli svoj vlastný nápad ako by ste problém riešili.&lt;br&gt;&lt;/p&gt;&lt;p&gt;PS: Celý kód nájdete v prílohe tohto článku.&lt;br&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx&amp;amp;;title=Ako+narva%c5%a5+generick%26%23233%3b+triedy+do+kolekcie" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx&amp;amp;;title=Ako+narva%c5%a5+generick%26%23233%3b+triedy+do+kolekcie" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx&amp;amp;;title=Ako+narva%c5%a5+generick%26%23233%3b+triedy+do+kolekcie" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx&amp;amp;title=Ako+narva%c5%a5+generick%26%23233%3b+triedy+do+kolekcie" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx&amp;amp;;title=Ako+narva%c5%a5+generick%26%23233%3b+triedy+do+kolekcie" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx&amp;amp;;title=Ako+narva%c5%a5+generick%26%23233%3b+triedy+do+kolekcie&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx&amp;amp;;subject=Ako+narva%c5%a5+generick%26%23233%3b+triedy+do+kolekcie" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2009/01/07/ako-narva-generick-triedy-do-kolekcie.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228846" width="1" height="1"&gt;</description><enclosure url="http://blog.vyvojar.cz/vlko/attachment/228846.ashx" length="29801" type="application/x-zip-compressed" /><category domain="http://blog.vyvojar.cz/vlko/archive/tags/coding/default.aspx">coding</category><category domain="http://blog.vyvojar.cz/vlko/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/vlko/archive/tags/Rie_6101_enia+be_7E01_n_26002300_253_3B00_ch+probl_26002300_233_3B00_mov/default.aspx">Riešenia bežn&amp;#253;ch probl&amp;#233;mov</category></item><item><title>ExpressionEval coding story [Update]</title><link>http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx</link><pubDate>Wed, 24 Dec 2008 00:00:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228818</guid><dc:creator>vlko</dc:creator><slash:comments>8</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/228818.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=228818</wfw:commentRss><description>&lt;p&gt;&lt;span style="font-style:italic;"&gt;Ako obyčajne začínam hneď zdrojovými kódmi, nech záujemcov o code review nemusím zdržiavať zbytočnými rečmi:)&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Zdrojové kódy: &lt;a href="http://vlko.zilina.net/dwn/blog/ExpressionEval.zip"&gt;http://vlko.zilina.net/dwn/blog/ExpressionEval.zip&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;Update č. 1&lt;/h3&gt;&lt;p&gt;Ospravedlňujem sa, nejak som zverejnil zlú linku, už je to opravené. &lt;/p&gt;&lt;h3&gt;Intermezzo&lt;/h3&gt;&lt;p&gt;Pretože tu máme vianoce, rád by som vám aj ja dal od ježiška jeden malý darček a tým je knižnica, ktorá z predaného textu a pár ďalších informácii vygeneruje patričnú lambda expression. Síce by som tieto zdrojové kódy zverejnil tak, či tak, ale takto je z toho cítiť krásnu myšlienku. Ten pragmaticky dôvod je ako pri každom oos projekte užívateľský unittesting a možný ďalší rozvoj komunitou, pretože táto malá knižnička narozdiel od ostatných proof of concept coding stories pôjde do production.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Do intermezza tradične patria nejaké tie pohnútky:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;V administračnej sekcii sme pre jeden typ problému potrebovali zakomponovať užívateľský filter. V podstate by stačila iba jednoduchá funkčnosť, na základe id urobiť and a or operácie plus vyhodnotenie priorít podľa zátvoriek.&lt;/li&gt;&lt;li&gt;No keď som sa už mal do toho pustiť koncept som troška rozšíril a ďalšia funkčnosť by bol bezpečnostný filter nad DAL entitami, teda aby užívateľ videl len to čo treba.&lt;/li&gt;&lt;li&gt;A pretože by sme radi na komunikáciu server-client použili REST, toto by sa dalo ideálne použiť na serializáciu/deserializáciu Expression, kde by sa po ceste tak nejak stratila typová závislosť, teda na rovnaký Expression pre rôzne triedy s rovnakými properties.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Čo je načrtnuté v bode 2, z bodu 3 je jasne vidieť. Expression je tá správna vec, čo potrebujem, pretože:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;môžeme ho kompilovať a cachovať v tejto kompilovanej podobe&lt;/li&gt;&lt;li&gt;umožnuje používať premenlivé parametre&lt;br&gt;&lt;/li&gt;&lt;li&gt;cez linq provider je prevediteľný do sql tvaru&lt;/li&gt;&lt;li&gt;a jednoducho sa mi zdá ako praktickejšie riešenie oproti kompilácii z C# kódu [&lt;a href="http://blog.vyvojar.cz/ControlPanel/Blogs/Evaluate%20C#%20Code%20%28Eval%20Function%29"&gt;Evaluate C# Code (Eval Function)&lt;/a&gt;] alebo čokoľvek iné, čo sa mi podarilo vygoogliť, tak týmto aspoň zatmelím dieru na trhu:)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Kto číta moje &lt;a href="http://www.aspnet.sk/News.aspx"&gt;správičky na aspnet.sk&lt;/a&gt; určite vie, že ma proste takéto veci zaujímaju a keďže som to potreboval do jedného projektu a najmä dostal týždňové pracovné okno, nebolo inej voľby ako sa do toho pustiť. No uznajte pri takýchto úlohach musí človek milovať svoju prácu:)&lt;/p&gt;&lt;h3&gt;Ako používať&lt;/h3&gt;&lt;p&gt;Po nalinkovaní knižnice stačí vytvoriť inštanciu ExpressionEval, nastaviť jej patričný kód, zaregistrovať patričné parametre, namespaces pre vyhľadávanie typov, niečo ako using v C# a pretože to veru nie je žiaden kompilátor pre získanie typu je potrebné registrovať meno assembly. Vše ukončíte volaním funkcie Eval so špecifikovaním typu delegáta. Všetko pekne vo fluent formáte. A takto nejak to mam v unitteste:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span&gt;TestMethod&lt;/span&gt;]&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public void &lt;span style="color:white;"&gt;SimpleLambda&lt;/span&gt;()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;Expression&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Func&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;int, int&amp;gt;&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;lambda&lt;/span&gt; = new &lt;span&gt;ExpressionEval&lt;/span&gt;(&lt;span style="color:yellow;"&gt;"Convert.ToInt32(String.Concat(\"3\", x.ToString()&lt;/span&gt;&lt;span style="color:yellow;"&gt;.ToString()&lt;/span&gt;&lt;span style="color:yellow;"&gt;))"&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .&lt;span style="color:white;"&gt;AddParam&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;int&amp;gt;(&lt;/span&gt;&lt;span style="color:yellow;"&gt;"x"&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .&lt;span style="color:white;"&gt;AddLookupAssembly&lt;/span&gt;(&lt;span style="color:yellow;"&gt;"ExpressionEvalTest"&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .&lt;span style="color:white;"&gt;AddLookupNamespace&lt;/span&gt;(&lt;span style="color:yellow;"&gt;"ExpressionEvalTest"&lt;/span&gt;, &lt;span style="color:yellow;"&gt;"ExpressionEvalTest"&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .&lt;span style="color:white;"&gt;Eval&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Func&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;int, int&amp;gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int &lt;span style="color:white;"&gt;result&lt;/span&gt; = &lt;span style="color:white;"&gt;lambda&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Compile&lt;/span&gt;().&lt;span style="color:white;"&gt;Invoke&lt;/span&gt;(&lt;span style="color:fuchsia;"&gt;1&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;Assert&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;AreEqual&lt;/span&gt;(&lt;span style="color:fuchsia;"&gt;31&lt;/span&gt;, &lt;span style="color:white;"&gt;result&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Síce tie AddLookup funkcie sú tam len kvôli efektu, ale to je teraz nepodstatné, dôležité je vedieť čo podporujeme:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;statické funkcie, properties a fieldy&lt;/li&gt;&lt;li&gt;funkcie, properties a fieldy parametra&lt;/li&gt;&lt;li&gt;string reťazce bez obmedzenia, teda viacriadkové a s úvodzovkami definovanými po C#ovsky: \"&lt;/li&gt;&lt;li&gt;numerické konštanty okrem toho že číslo s bodkou je desattinný float a bez bodky Int32 je umožnené definovať typy pomocou končiaceho textu, teda (posledné tri som si vymyslel, možno v budúcnosti pridam automatickú konverziu typov):&lt;/li&gt;&lt;ul&gt;&lt;li&gt;12.1 - float&lt;/li&gt;&lt;li&gt;12.1f - float&lt;/li&gt;&lt;li&gt;12.1d - double&lt;br&gt;&lt;/li&gt;&lt;li&gt;12 - Int32&lt;/li&gt;&lt;li&gt;12u - UInt32&lt;/li&gt;&lt;li&gt;12l - Int64&lt;/li&gt;&lt;li&gt;12ul - UInt64&lt;/li&gt;&lt;li&gt;12s - Int16&lt;/li&gt;&lt;li&gt;12us - UInt16&lt;/li&gt;&lt;li&gt;12b - Byte&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;indexery&lt;/li&gt;&lt;li&gt;operátory (*,/,%,+,-,&amp;gt;,&amp;lt;.&amp;lt;=,&amp;gt;=,==,!=,|,^,&amp;amp;,||,&amp;amp;&amp;amp;, ...)&lt;/li&gt;&lt;li&gt;vytváranie inštancii pomocou new keywordu&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ak vás to viac zaujíma, pozrite si priložené unittesty.&lt;/p&gt;&lt;h3&gt;Performance&lt;/h3&gt;&lt;p&gt;Súčasťou projektu je aj program pre porovnanie výkonnosti. Tá je niekde na úrovni 60 násobku natívne zapísaného lambda výrazu. Poteší aspoň, že evaluácia je predsa len o trošku rýchlejšia ako deserializovanie pomocou &lt;a href="http://www.codeplex.com/metalinq"&gt;MetaLinq&lt;/a&gt;.&lt;br&gt;&lt;/p&gt;&lt;h3&gt;A coding príbeh?&lt;/h3&gt;&lt;p&gt;Pretože sú už dnes vianoce, veľa hodín a online budem až o pár dni, rád by som tento príspevok zverejnil už dnes. Inak by som bol nútený meniť úvod a pokaziť vám tento darček a to by ja nerád. Pre dnes aspoň načrtnem:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;prvý na rad prichádza tokenizer, čo je jednoduchy regex výraz&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;
&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private const string &lt;span style="color:white;"&gt;cTextRegexPart&lt;/span&gt; = &lt;span style="color:yellow;"&gt;@"""((?:(?:\\"")|[^""])*)"""&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private const string &lt;span style="color:white;"&gt;cExecutableRegexPart&lt;/span&gt; = &lt;span style="color:yellow;"&gt;@"(\w+)"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private const string &lt;span style="color:white;"&gt;cDelimiterRegexPart&lt;/span&gt; = &lt;span style="color:yellow;"&gt;@"([\(\)\[\]\.,])"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private const string &lt;span style="color:white;"&gt;cOperatorRegexPart&lt;/span&gt; = &lt;span style="color:yellow;"&gt;@"([^\w\(\)\[\]\.,\s]+)"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private const string &lt;span style="color:white;"&gt;cCodeParserRegex&lt;/span&gt; = &lt;span style="color:white;"&gt;cTextRegexPart&lt;/span&gt; + &lt;span style="color:yellow;"&gt;"|"&lt;/span&gt; + &lt;span style="color:white;"&gt;cExecutableRegexPart&lt;/span&gt; + &lt;span style="color:yellow;"&gt;"|"&lt;/span&gt; + &lt;span style="color:white;"&gt;cDelimiterRegexPart&lt;/span&gt; + &lt;span style="color:yellow;"&gt;"|"&lt;/span&gt; + &lt;span style="color:white;"&gt;cOperatorRegexPart&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;

&lt;ul&gt;&lt;li&gt;ďalší na rad prichádza stavový automat, ktorý prechádza tokenizovaný text a popritom si vytvára pomocnú tree štruktúru&lt;/li&gt;&lt;li&gt;tretím krokom je vygenerovanie expression tree z pomocnej tree štruktúry&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;TODO&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;ak je záujem tak podrobnejšie rozpísať jednotlivé body, tak dajte vedieť do diskusie&lt;/li&gt;&lt;li&gt;dorobiť podporu pre negáciu [!]&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx&amp;amp;;title=ExpressionEval+coding+story+%5bUpdate%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx&amp;amp;;title=ExpressionEval+coding+story+%5bUpdate%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx&amp;amp;;title=ExpressionEval+coding+story+%5bUpdate%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx&amp;amp;title=ExpressionEval+coding+story+%5bUpdate%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx&amp;amp;;title=ExpressionEval+coding+story+%5bUpdate%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx&amp;amp;;title=ExpressionEval+coding+story+%5bUpdate%5d&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx&amp;amp;;subject=ExpressionEval+coding+story+%5bUpdate%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/12/24/expressioneval-coding-story.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228818" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/Coding+story/default.aspx">Coding story</category><category domain="http://blog.vyvojar.cz/vlko/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Zoomer coding story [update 1]</title><link>http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx</link><pubDate>Wed, 22 Oct 2008 12:30:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228486</guid><dc:creator>vlko</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/228486.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=228486</wfw:commentRss><description>Binárka: &lt;a href="http://vlko.zilina.net/dwn/Zoomer-bin.zip"&gt;http://vlko.zilina.net/dwn/Zoomer-bin.zip&lt;/a&gt;

&lt;p&gt;Zdrojové kódy: &lt;a href="http://vlko.zilina.net/dwn/Zoomer-src.zip"&gt;http://vlko.zilina.net/dwn/Zoomer-src.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;!POZOR aplikácia je funkčná len pod zapnutým Aerom, pretože využíva služby &lt;a href="http://msdn.microsoft.com/en-us/library/aa969540.aspx"&gt;Desktop Window Managera&lt;/a&gt; (alebo pod známejším názvom Aero)!&lt;/b&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Na zdrojové kódy, ani obrázky si neuplatňujem žiadne autorské práva.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Ak sa chcete dozvedieť čo to o vyvoji aplikácie preskočte časť Intermezzo, a pustite sa rovno do devel časti.&lt;/i&gt; &lt;br&gt;&lt;/p&gt;&lt;h3&gt;Update č. 1&lt;/h3&gt;&lt;p&gt;Trošku mi to nedalo spávať a tak som sa zamyslel nad problémom toho ako vykresľujem náhľad obrázka a už je tu prvý update. Tento update prináša radikálne zlepšenie výkonu. Ako som toho dosiahol?&lt;/p&gt;&lt;p&gt;V prvej verzii som vždy vykresľoval a registroval pre náhľad celý desktop aj keď v lupe sa vlastne zobrazoval iba jeho malý výrez. Pomocou &lt;a href="http://msdn.microsoft.com/en-us/library/aa969502%28VS.85%29.aspx" id="ctl00_rs1_mainContentContainer_ctl02"&gt;DWM_THUMBNAIL_PROPERTIES&lt;/a&gt;, ktorým updatujeme pozíciu náhľadu a jeho fieldu rcSource je však možné nastaviť len aktuálny výrez z okna, ktorý chceme zoomovať. &lt;/p&gt;&lt;p&gt;Toto riešenie prinieslo také zvýšenie výkonu celej aplikácie, že som pridal podporu zmeny mierky a tak počas stlačenia ľavej CTRL klávesy môžete scrolovacím kolieskom myši meniť mierku od 0.5 do 10 (áno, je možne miesto zoomovania mať opak, teda miniatúru:).&lt;/p&gt;&lt;p&gt;Zdrojové kódy a binárka je updatnutá a preto moje tvrdenia o výkonnosti v pôvodnom článku berte trošku s rezervou;) &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Intermezzo&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/zoomer1.jpg" align="right" width="200" height="95"&gt;Čakať na odpoveď od zákazníka je niekedy ubíjajúce a tak aby som vplnil voľný čas, troška som siahol do zoznamu vecí, ktoré by som rád vytvoril. A veru na prvom mieste je už nejaký ten rok lupa. Samozrejme kopec rôznych druhov rôznych magnifierov nájdete všade možne, moje predstava je ale jednoduchá. Mať lupu, ktorá bude fungovať ako lupa, teda pri pohybe by lupa zvätšovala to čo sa nachadza aktuálne pod kurzorom. A tak ubiehali roky, až prišla Vista a s ňou Aero a ja som čakal, že sa konečne Microsoft rozhýbe a takú poriadnu lupu spraví. Snaha bola, lupa konecne zobrazuje aj obsah pod sebou, ale je tu to ale, pri jej zapnutí niečo obrazovku preblikne a zmení to fonty, okrem toho to nezoomuje dynamicky obsah napr. v&amp;nbsp; media playere. &lt;/p&gt;
&lt;p&gt;Samozrejme, že ma napadlo riešenie ako na to, ale to až neskôr, treba troška čitateľa napínať, preto najskôr popis ako fungujú súčastne lupy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vista Magnifier - nemám šajnu ako na to ide, ale to ako funguje je to najlepšie z lúp, pretože umožňuje pri zoomovaní pracovať, okrem toho zoomuje aj text pod sebou&lt;/li&gt;
&lt;li&gt;screenshot magnifier - odroda lúp, ktorá periodicky robí screenshoty v okolí kurzora a tie zvätšuje, neumožňuje ale zobrazovať obsah pod sebou a tak máte na obrazovke vždy zabratý kúsok miesta&lt;/li&gt;
&lt;li&gt;replace screen magnifier - táto sorta funguje ako normálna lupa, akurát to robí fikane tak, že urobí screenshot celej obrazovky a ten potom umožnuje pomocou pohybu lupy zoomovať, tak ako to robíme napr pri čítaní novín, nevýhodou je, že po takejto lupe nemôžeme klikať a dynamický obsah je freeznutý&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Takže to by sme mali konkurenciu za sebou, pred nami je ten nápad. Neviem prečo to dosiaľ nikoho nenapadlo, ale veď je to také jednoduché, stači použiť &lt;b&gt;náhľady okien (anglicky thumbnail)&lt;/b&gt;. Samozrejme niečo také už bolo v XP, ale tie v aero su dynamické. Viac o teórii nižšie, dôležitá je poznámka, že toto riešenie je &lt;b&gt;Aero only&lt;/b&gt; (tie by mali byť zatiaľ len vo viste a vo server 2007).&lt;/p&gt;
&lt;p&gt;Pre neveriacich aby som dokázal, že to funguje, prikladám screenshot z mediaplayera a jeden zo start menu máte vyššie:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/zoomer2.jpg"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pre tých ktorí si to nevšimli je lupa ten čierny obdĺžnik a skutočne všetko funguje pekne dynamicky, akurát treba rátať s tým, že takáto lupa dáva počítaču dosť zabrať, ale čo sa dá čakať od programu vytvoreného za dva a pol dňa?&lt;/p&gt;
&lt;h3&gt;Ovládanie&lt;/h3&gt;
&lt;p&gt;Aby ste neboli po prvom stlačení stratený, nezabudnite na tieto klávesové skratky&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pravý CTRL alebo Scroll Lock skryje alebo zobrazí lupu&lt;/li&gt;
&lt;li&gt;alebo ak je lupa zobrazená, pri stlačení klávesy ESC sa skryje a jej pustením sa znova zobrazí&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okrem v toho v traybare je taká biela ikonka aplikácie, ktorá má menu, pomocou ktorého program ukončíte.&lt;/p&gt;
&lt;p&gt;Lupa má v sebe nejakú základnu podporu, ktorá simuluje aktivitu myši pod sebou, ale tá je len v prvotnom štádiu a mne funguje iba vo firefoxe a thunderbirde (okrem web obsahu, funguje iba menu), stlačiť sa dá aj start button ale je to úbohe, ak by mal niekto nápad ako pomôcť s týmto problémom, jedna kapitola článku nižšie sa bude tomuto venovať. &lt;br&gt;&lt;/p&gt;
&lt;h3&gt;Krok č. 1 Klonujeme plochu&lt;/h3&gt;
&lt;p&gt;Ako už bolo povedané v úvode, celý trik s lupou je v tom, že používame dynamické náhľady, tak ako prišli s Vistou v novom &lt;a href="http://msdn.microsoft.com/en-us/library/aa969540.aspx"&gt;DWM zvanom Aero&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Na MSDN o náhľadoch nájdete kapitolu &lt;a href="http://msdn.microsoft.com/en-us/library/aa969541%28VS.85%29.aspx"&gt;DWM Thumbnail Overview&lt;/a&gt; a my z nej použijeme úplne všetko. Aj keď som na začiatku, až som začal vytvárať prvý temp projekt, bál. Generátor náhľadov ma prekvapil. Stačilo iba dodržiať poradie (z-order) okien, tak ako sú vo windows a on sa už sám postará o priesvitnosť a prekrývanie okien a tak som mal za pár hodín kópiu celého desktopu hotovú. Použil som teda:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa969521%28VS.85%29.aspx" id="ctl00_rs1_mainContentContainer_ctl01"&gt;DwmRegisterThumbnail&lt;/a&gt; funkciu, ktorá nám zaregistruje okno&amp;nbsp;ako cieľ do ktorého sa bude generovať obsah náhľadu iného okna (náhľady sa dajú generovať iba do okna, na nejaké generovanie do panelu môžte zabudnúť, aj keď možno to je iba vec GDI+, mne a ale z pohodlia C# von nechce:)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa969520%28VS.85%29.aspx" id="ctl00_rs1_mainContentContainer_ctl04"&gt;DwmQueryThumbnailSourceSize&lt;/a&gt;, ktorú použijeme na zistenie skutočnej veľkosti okna z ktorého sa generuje náhľad (samozrejme to sa dá zistiť aj pomocou &lt;a href="http://msdn.microsoft.com/en-us/library/ms633519%28VS.85%29.aspx"&gt;GetWindowRect&lt;/a&gt;, tá ale nejak nefunguje správne pri desktope ak je k PC pripojených viac monitorov)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa969502%28VS.85%29.aspx" id="ctl00_rs1_mainContentContainer_ctl02"&gt;DWM_THUMBNAIL_PROPERTIES&lt;/a&gt; je štruktúra pomocou ktorej nastavíte to ako sa ma generovať náhľad, teda priesvitnosť a podobné veci, my v nej ale urobíme to, že rozmery regiónu, do ktorého sa bude náhľad generovať zdvojnasobíme (alebo aj zviacnasobíme, ja som dal napevno do zdrojáku konštantu 2, pretože čím vyššia hodnota, tým viac dá generovanie náhľadov počítaču zabrať)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa969526%28VS.85%29.aspx" id="ctl00_rs1_mainContentContainer_ctl03"&gt;DwmUpdateThumbnailProperties&lt;/a&gt; nám umožní nastaviť vlastnosti z &lt;a href="http://msdn.microsoft.com/en-us/library/aa969502%28VS.85%29.aspx" id="ctl00_rs1_mainContentContainer_ctl02"&gt;DWM_THUMBNAIL_PROPERTIES&lt;/a&gt; štruktúry&lt;/li&gt;
&lt;li&gt; &lt;a href="http://msdn.microsoft.com/en-us/library/aa969525%28VS.85%29.aspx" id="ctl00_rs1_mainContentContainer_ctl05"&gt;DwmUnregisterThumbnail&lt;/a&gt; a nakoniec treba náhľad odregistrovať, inak sa vám bude zobrazovať defaultný obrázok pre prázdne okno, ktorý nie je nič moc:)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zaujímavé je, ako DWM náhľady zobrazuje. Predpokladám, že to robí priamo do framebuffera na grafickej karte, inak si neviem vysvetliť to, že prekresľuje absolútne všetko čo sa na danom mieste na formulári nachádza. A to je aj dôvod, prečo má moja lupa hranatý tvar. Akýkoľvek pokus o nastavenie vlastného&amp;nbsp; regionu pre orezanie formulara je ignorovaný.&lt;/p&gt;
&lt;p&gt;Toľko teória, pustíme sa do kódu, najskôr musíme zobrať zoznám všetkých okien (ak pod oknami rozumieme všetko čo má handle) a tie testujeme pomocou winapi funkcie &lt;a href="http://msdn.microsoft.com/en-us/library/ms633530%28VS.85%29.aspx"&gt;IsWindowVisible&lt;/a&gt; na viditeľnosť pre užívateľa:&lt;/p&gt;

&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-weight:bold;"&gt;public static &lt;/span&gt;&lt;span&gt;List&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Window&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;GetWindows&lt;/span&gt;()&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;List&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Window&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:white;"&gt;result&lt;/span&gt; = new &lt;span&gt;List&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Window&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;EnumWindows&lt;/span&gt;(delegate (&lt;span&gt;IntPtr&lt;/span&gt; &lt;span style="color:white;"&gt;hwnd&lt;/span&gt;, int &lt;span style="color:white;"&gt;lParam&lt;/span&gt;){&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (&lt;span style="color:white;"&gt;IsWindowVisible&lt;/span&gt;(&lt;span style="color:white;"&gt;hwnd&lt;/span&gt;))&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;Window&lt;/span&gt; &lt;span style="color:white;"&gt;win&lt;/span&gt; = &lt;span style="color:white;"&gt;CreateWindow&lt;/span&gt;(&lt;span style="color:white;"&gt;hwnd&lt;/span&gt;);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;result&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Add&lt;/span&gt;(&lt;span style="color:white;"&gt;win&lt;/span&gt;);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }, &lt;span style="color:fuchsia;"&gt;0&lt;/span&gt;);&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;result&lt;/span&gt;;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;No nie je cool predať do pinvoke funkcie anonymného delegáta?:) Trieda Window obsahuje zopár pomocných premennýh ako zistenie titulu, zistenie štýlov okna, atď, a podobné pozostatky z ranných fáz vývoja, ale hlavné je, že ma Dimensions property, ktorá cez api funkciu &lt;a href="http://msdn.microsoft.com/en-us/library/ms633519%28VS.85%29.aspx"&gt;GetWindowRect&lt;/a&gt; zistí v gettere rozmery okna.&lt;/p&gt;
&lt;p&gt;Dôležitá vec, na ktorú treba myslieť, je že EnumWindows vracia okna podľa ich z-order. Čiže to najvyššie položené okno je prvé a posledná by mala byť plocha desktopu. Ak teda chceme vykresiť kópiu desktopu musíme do DWM zaregistrovať okná v opačnom poradí. Kód tu pastovať nebudem, stačí siahnuť po zdrojákoch. Dôležitá je informácia, že zoznam okien volám raz za sekundu. Pretože napr. kliknutie na menu vlastne vytvára nové okno, tooltipy sú nové okna, atď.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Každé viditeľné okno si registrujem do triedy zdedenej z PictureBox (ThumbPicture) a pridávam medzi controls formulára, jednak takto zisťujem polohu okna pri akcii myši a jednak pomocou neho robim prepočet pre posun výrezu desktopu. A pretože plochu zoomujeme, tak jej rozmery a pozícia su prepočítane podľa hodnoty zvätšenia (zatiaľ hardcoded to hodnoty 2).&lt;/p&gt;&lt;h3&gt;Krok č. 2 Hooking po prvé&lt;/h3&gt;&lt;p&gt;Pre hooking siahneme po overenej triede &lt;a href="http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx"&gt;GlobalCbtHook&lt;/a&gt;, teda dokiaľ si nechcete písať vlastnú v C++ knižnicu, pretože z managed kódu sa ku globálnym hookom nedostanete.&lt;/p&gt;&lt;p&gt;Čo nás teda v hooking zaujíma?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Aktivácia okna (&lt;a href="http://msdn.microsoft.com/en-us/library/ms644959%28VS.85%29.aspx#wh_shellhook"&gt;WH_SHELL&lt;/a&gt; so správou &lt;a href="http://msdn.microsoft.com/en-us/library/ms644991%28VS.85%29.aspx"&gt;HSHELL_WINDOWACTIVATED&lt;/a&gt;) - pre takéto okno musí byť preregistrovaný náhľad aby bolo vykresľované uplne navrchu&lt;/li&gt;&lt;li&gt;Zavretie okna (&lt;a href="http://msdn.microsoft.com/en-us/library/ms644959%28VS.85%29.aspx#wh_cbthook"&gt;WH_CBT&lt;/a&gt; so správou &lt;a href="http://msdn.microsoft.com/en-us/library/ms644977%28VS.85%29.aspx"&gt;HCBT_DESTROYWND&lt;/a&gt;) - a teda odregistovanie náhľadu pre toto okno&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Krok č. 3 Sleduj kurzor&lt;/h3&gt;&lt;p&gt;Takže keďže už máme fungujúcu kópiu plochy, stačí už len presúvať okno tak aby bol kurzor v strede okna. To znamená presunúť okno na novú pozíciu a vyrátať offset pre top a left pozíciu a na základe tejto pozície presunúť náhľady na novú pozíciu pomocou &lt;a href="http://msdn.microsoft.com/en-us/library/aa969526%28VS.85%29.aspx" id="ctl00_rs1_mainContentContainer_ctl03"&gt;DwmUpdateThumbnailProperties&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Pôvodne som to robil v hooku myši. Ten je ale pri pohybe volaný príliš často a tak som toto presunul do timera.&lt;/p&gt;&lt;p&gt;Čo ma trošku sklamalo je výkon presunu náhľadov, teda pri zvätšení, nezvätšený náhľad je super rýchly, ale dvojnásobne zvätšený náhľad robí DWM trošku problémy a tak lupa vyzerá ako keby za kurzorom plávala.&lt;/p&gt;&lt;h3&gt;Krok č. 3 Daj tomu vzhľad&lt;/h3&gt;&lt;p&gt;Vytvorenie overlay okna je z tých najjednoduchších úloh, stačí len vytvoriť správny obrázok a povedať oknu, že určitá farba je priehľadná. Jednoduchá úloha, ale veľká služba pre užívateľa:)&lt;/p&gt;&lt;h3&gt;Krok č. 4 Emuluj myš&lt;/h3&gt;&lt;p&gt;Toto je tá najtažšia úloha a v súčastnosti to funguje len čiastočne, kto by vedel pomôcť, nech sa pozrie do funkcie void Mouse_MouseEvent(IntPtr WParam, IntPtr LParam) v súbore Zoom.cs.&lt;/p&gt;&lt;p&gt;V súčastnosti je to takto. Hookneme sa na myš, zistíme, ktoré okno je na danom miesto topmost (máme na to internú štruktúru pozícii okien). V danom okne zistíme relatívnu pozíciu, tak, že od pozície myši odrátame pozíciu okna.&lt;/p&gt;&lt;p&gt;S relatívnou pozíciou vyhľadáme pomocou API funkcie &lt;a href="http://msdn.microsoft.com/en-us/library/ms633537%28VS.85%29.aspx"&gt;RealChildWindowFromPoint&lt;/a&gt; pozíciu child okna a tomu oknu prepošleme mouse event, akurát nesmieme zabudnúť upraviť jeho pozíciu podľa pozície daného elementu.&lt;/p&gt;&lt;p&gt;Stále to ale nie je ono, niekde to funguje len čiastočne (mozzilla like aplikácie, total commander, ...), niekde vôbec (Visaul Studio). Niečo asi robím zle, akurát ma nenapadá čo.&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Záver&lt;/h3&gt;&lt;p&gt;Uff, pôvodne som mal v pláne použiť veľa code samplov, ale pred ich pastnutím som si uvedomil, že aplikácia je tým ako sa chaoticky vyvýjala za tie dva dni príliš poprepájana a tak bude lepšie popísať koncept, kto má záujem môže si sám siahnuť do priložených zdrojových kódov.&lt;/p&gt;&lt;p&gt;Dúfam, že po zverejnení týchto kódov sa nájde niekto, kto dokáže tento koncept použiť a rozšíriť do výsledku, tak aby som už konečne mal k dispozícii skutočne realistickú lupu. Tiež by možno pomohlo vytvoriť niečo ako window vo window a to posuvať, čo by určite ušetrilo čas spôsobený prekresľovaním výrezu. &lt;/p&gt;&lt;p&gt;Ešte mi nedá zavŕtať do MS. Trošku ma mrzí, že koncept DWM je tak nedotiahnutý a okresaný na minimum &lt;strike&gt;maximum &lt;/strike&gt;a pritom je tu toľko možností viď Combiz a MacOSX. Chápem, že je problém zachovať spätnú kompatibilitu, ale ja si zasa viem predstaviť každé okno ako textúru v kvázi 3D prostredí, to by sa potom dali robiť veci a nech mi nikto nehovorí, že v dnešnej dobe je nejaka grafika, ktorá by to nezvládla. Stačilo by už len prepísať všetky grafické operácie boli presmerované na DirectX. Možno by stačilo urobiť len DirectX verzi DWM, ktovie ale mať tak prístup k zdrojovým kódom windows ... &lt;br&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx&amp;amp;;title=Zoomer+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx&amp;amp;;title=Zoomer+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx&amp;amp;;title=Zoomer+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx&amp;amp;title=Zoomer+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx&amp;amp;;title=Zoomer+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx&amp;amp;;title=Zoomer+coding+story+%5bupdate+1%5d&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx&amp;amp;;subject=Zoomer+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/22/zoomer-coding-story.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228486" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/Coding+story/default.aspx">Coding story</category><category domain="http://blog.vyvojar.cz/vlko/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Lokalizácia textu v databázach</title><link>http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx</link><pubDate>Sat, 18 Oct 2008 20:40:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228492</guid><dc:creator>vlko</dc:creator><slash:comments>33</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/228492.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=228492</wfw:commentRss><description>&lt;h3&gt;Úvod do problematiky&lt;/h3&gt;
&lt;p&gt;Lokalizácia je niečo k čomu sa pri programovaní každý skôr či neskôr
dostane. Tentoraz nebudem rozoberať lokalizáciu formulárov. Na to su
určené resources, resources provider, ... a vlastne sa môžete pozrieť
na správičku &lt;a href="http://www.aspnet.sk/Na-temu-jazykova-lokalizacia-v-ASP.NET-100371.aspx"&gt;&lt;span id="ctl00_ContentPlaceHolder1_DataListArticle_ctl00_ArticleName" class="ListArticleHeader"&gt;Na tému jazyková lokalizácia v ASP.NET&lt;/span&gt;&lt;/a&gt;&lt;span id="ctl00_ContentPlaceHolder1_DataListArticle_ctl00_ArticleName" class="ListArticleHeader"&gt;.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span id="ctl00_ContentPlaceHolder1_DataListArticle_ctl00_ArticleName" class="ListArticleHeader"&gt; &lt;/span&gt;&lt;span id="ctl00_ContentPlaceHolder1_DataListArticle_ctl00_ArticleName" class="ListArticleHeader"&gt;&lt;i&gt;&amp;lt;promo&amp;gt;&lt;a href="http://www.aspnet.sk/News.aspx"&gt;Správičky na aspnet.sk&lt;/a&gt;
su niečo ako moja malá forma mikroblogingu, snažím sa v nich informovať
o novinkách z oblastí .net, ale aj teórii riadenia projektov a vlastne
všetkého okolo programovania. Za 8 mesiacov ako vznikli ich uz je
kopec, teda minulý týždeň sme dosiahli číslo 400. Ak vás zaujali a máte
aj vy čo ostatným povedať, pridávanie nie je nijak obmedzené a
prispievateľom sa môže stať ktokoľvek.&amp;lt;/promo&amp;gt;&lt;br&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;No to bola trošku odbočka, späť k téme. Takže v tomto príspevku
ideme riešiť problematiku lokalizácie databázových textov. Budem sa
snažiť popísať najčastejšie používane riešenia a dúfam, že v diskusii
niekto navrhne nejaké ďalšie prípadne nejaké vylepšenia a ja budem môcť
napísať nejaké to pokračovanie.&lt;/p&gt;
&lt;p&gt;Okrem toho budem hodnotiť výkonnosť každého riešenia v porovnaní s
predchádzajúcim (pomocou jednoduchého selectu s like filtrom pre dve
jazykové verzie) v percentuálnom vyjadrení, tak ako to zobrazí query
plan (na koniec pridám aj porovnanie podľa spustenia príkazu z .net kódu, taký real life test). Samozrejme k tomu potrebujem nejake tie dáta. Na to som použil
generátor dát &lt;a href="http://www.red-gate.com/products/SQL_Data_Generator/index.htm"&gt;RedGate SQL Data Generator&lt;/a&gt; v trial verzii a do každej tabuľky som natlačil 100.000 riadkov dát.&lt;/p&gt;&lt;p&gt;Ako
som už písal, porovnanie výkonnosti je pomocou dvoch selectoch s like
podmienkou, to preto, aby sme videli ako sa dá dostať k dátam v jednom
selecte, teda bez potreby implementácie niekde v kóde, proste simple
SQL. &lt;br&gt;&lt;/p&gt;
&lt;h3&gt;Staticky alebo dynamicky?&lt;/h3&gt;
&lt;p&gt;To je prvotná otázka lokalizácie. Možno to nie je presne podľa
poučiek o lokalizácii a vlastne boli zvolené uplne prvoplánovo, preto
pripájam definície:&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;Staticky&lt;/h4&gt;
&lt;p&gt;Statický znamená, že daný text má práve jeden záznam pre každý
registrovaný jazyk. Statická lokalizácia býva vätšinou veľmi rýchla,
nevýhodou je, že ak chceme pridať nový jazyk, tak sú s tým spojené
zložité úkony, okrem toho pri pridaní nového jazyka je už z definície
potrebné pridať úplne kompletný preklad.&lt;/p&gt;
&lt;h4&gt;Dynamicky&lt;/h4&gt;
&lt;p&gt;Dynamicky znamená, že máme zvolený určitý predvolený jazyk a v
prípade ak pre žiadaný jazyk neexistuje jeho preklad použije sa tá
predvolená verzia. Výhoda je, že preklad môžeme vykonávať postupne,
nevýhodou je, že takéto riešenie stojí vätšinou viac času.&lt;/p&gt;
&lt;h4&gt;Zaujímavosť&lt;/h4&gt;
&lt;p&gt;Najzaujímavejšie na celom probléme lokalizácie je, že z každého
statického riešenia je možné vytvoriť dynamickú verziu. A plne
preložená dynamická verzia je v podstate statickým riešením.&lt;/p&gt;
&lt;h3&gt;Riešenie č. 1 Statická jednotabuľka&lt;/h3&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/LocType1.jpg" align="right" width="215" height="127"&gt;CREATE TABLE &lt;/span&gt;&lt;span style="color:white;"&gt;[dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[LocType1]&lt;/span&gt;(&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[ID] [uniqueidentifier] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;NOT NULL,&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Name_en] [varchar]&lt;/span&gt;(&lt;span style="color:fuchsia;"&gt;50&lt;/span&gt;) NULL,&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Name_sk] [varchar]&lt;/span&gt;(&lt;span style="color:fuchsia;"&gt;50&lt;/span&gt;) NULL,&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;CONSTRAINT &lt;span style="color:white;"&gt;[PK_LocType1] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;PRIMARY KEY CLUSTERED (&lt;/span&gt;&lt;span style="color:white;"&gt;[ID] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ASC)&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;)&lt;/p&gt;
&lt;/div&gt;

&lt;p style="clear:both;"&gt;Ako je vidieť pre každú jazykovú verziu existuje jeden sĺpec. &lt;/p&gt;&lt;p style="clear:both;"&gt;Selecty potom sú:&lt;/p&gt;&lt;p style="clear:both;"&gt;
&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;select * from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType1 &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;where &lt;/span&gt;&lt;span style="color:white;"&gt;[Name_en] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;like &lt;/span&gt;&lt;span style="color:yellow;"&gt;'L%'&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;select * from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType1 &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;where &lt;/span&gt;&lt;span style="color:white;"&gt;[Name_sk] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;like &lt;/span&gt;&lt;span style="color:yellow;"&gt;'L%'&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;

&lt;p style="clear:both;"&gt;Toto je to najprimitívnejšie riešenie, po
ktorom siahne hádam každý. Je rýchle, trošku problém vidím pri
implementácii do ORM aby načítavalo jazyk podľa aktuálneho jazyka, ale
nič neriešiteľné.&lt;/p&gt;&lt;p style="clear:both;"&gt;Nevýhodou je pridanie
nového jazyka, je potrebné pridať nový stĺpec. Takto to nevyzerá moc
obtiažne, ale vätšinou je jazykových stĺpcov vätší počet a potom to už
je trošku problém s prehľadnosťou.&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Riešenie č. 2 Statická dvojtabuľka&lt;/h3&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/LocType2.jpg" align="right" width="388" height="279"&gt;CREATE TABLE &lt;/span&gt;&lt;span style="color:white;"&gt;[dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[LocType2]&lt;/span&gt;(&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[ID] [uniqueidentifier] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;NOT NULL,&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Name_id] [int] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;NOT NULL,&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;CONSTRAINT &lt;span style="color:white;"&gt;[PK_LocType2] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;PRIMARY KEY CLUSTERED (&lt;/span&gt;&lt;span style="color:white;"&gt;[ID] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ASC)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;CREATE TABLE &lt;/span&gt;&lt;span style="color:white;"&gt;[dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[LocType2Names]&lt;/span&gt;(&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[ID] [int] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;NOT NULL,&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Language] [nchar]&lt;/span&gt;(&lt;span style="color:fuchsia;"&gt;5&lt;/span&gt;) NOT NULL,&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Names] [nvarchar]&lt;/span&gt;(&lt;span style="color:fuchsia;"&gt;50&lt;/span&gt;) NOT NULL,&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;CONSTRAINT &lt;span style="color:white;"&gt;[PK_LocType2Names_1] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;PRIMARY KEY CLUSTERED (&lt;/span&gt;&lt;span style="color:white;"&gt;[ID] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ASC, &lt;/span&gt;&lt;span style="color:white;"&gt;[Language] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ASC)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;)&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;V tomto riešení namiesto textu ukladáme identifikátor na tabuľku, v ktorej je pre každú jazykovú verziu uložený jeden záznam.&lt;/p&gt;&lt;p&gt;Selectujeme nasledovne &lt;br&gt;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;select * from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType2 L&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;inner join &lt;/span&gt;&lt;span style="color:white;"&gt;LocType2Names LN &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;on (&lt;/span&gt;&lt;span style="color:white;"&gt;L&lt;/span&gt;.&lt;span style="color:white;"&gt;Name_id &lt;/span&gt;= &lt;span style="color:white;"&gt;LN&lt;/span&gt;.&lt;span style="color:white;"&gt;ID &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;and &lt;/span&gt;&lt;span style="color:white;"&gt;LN&lt;/span&gt;.&lt;span style="color:white;"&gt;[Language] &lt;/span&gt;= &lt;span style="color:yellow;"&gt;'en'&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;where &lt;/span&gt;&lt;span style="color:white;"&gt;LN&lt;/span&gt;.&lt;span style="color:white;"&gt;[Names] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;like &lt;/span&gt;&lt;span style="color:yellow;"&gt;'L%'&lt;/span&gt;;&amp;nbsp; &lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;select * from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType2 L&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;inner join &lt;/span&gt;&lt;span style="color:white;"&gt;LocType2Names LN &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;on (&lt;/span&gt;&lt;span style="color:white;"&gt;L&lt;/span&gt;.&lt;span style="color:white;"&gt;Name_id &lt;/span&gt;= &lt;span style="color:white;"&gt;LN&lt;/span&gt;.&lt;span style="color:white;"&gt;ID &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;and &lt;/span&gt;&lt;span style="color:white;"&gt;LN&lt;/span&gt;.&lt;span style="color:white;"&gt;[Language] &lt;/span&gt;= &lt;span style="color:yellow;"&gt;'sk'&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;where &lt;/span&gt;&lt;span style="color:white;"&gt;LN&lt;/span&gt;.&lt;span style="color:white;"&gt;[Names] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;like &lt;/span&gt;&lt;span style="color:yellow;"&gt;'L%'&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;a spomalenie oproti riešeniu 1 je približne štvornásobne, treba ale
brať v úvahu, že v tabuľke LocType2Names je dvojnásobný počet riadkov, teda
200.000 (pre každú jazykovú verziu jeden).&lt;br&gt;&lt;/p&gt;&lt;p&gt; Komu v schéme chýba FK na tabuľku LocType2Names,
tak má dobrý postreh, akurát slabé znalosti z databáz, pretože v
tabuľke LocType2Names je zložený primárny kľúč.&lt;/p&gt;&lt;p style="font-weight:bold;"&gt;Optimalizácia&lt;/p&gt;&lt;p&gt;Stačí preto vytvoriť nad stĺpcom Name_id v tabuľke LocType2 vytvoriť index&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;CREATE NONCLUSTERED INDEX &lt;/span&gt;&lt;span style="color:white;"&gt;[IX_LocType2] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ON &lt;/span&gt;&lt;span style="color:white;"&gt;[dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[LocType2] &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;(&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Name_id] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ASC&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;)&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;A na výsledku to je hneď poznať rozdiel sa znížil na 2.5 násobok.&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Riešenie č. 3 Dynamická dvojtabuľka&lt;/h3&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/LocType3.jpg" align="right" width="372" height="272"&gt;CREATE TABLE &lt;/span&gt;&lt;span style="color:white;"&gt;[dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[LocType3]&lt;/span&gt;(&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[ID] [uniqueidentifier] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;NOT NULL,&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Name_id] [int] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;NOT NULL,&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;CONSTRAINT &lt;span style="color:white;"&gt;[PK_LocType3] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;PRIMARY KEY CLUSTERED (&lt;/span&gt;&lt;span style="color:white;"&gt;[ID] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ASC)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;CREATE TABLE &lt;/span&gt;&lt;span style="color:white;"&gt;[dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[LocType3Names]&lt;/span&gt;(&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[ID] [int] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;NOT NULL,&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Language] [nchar]&lt;/span&gt;(&lt;span style="color:fuchsia;"&gt;5&lt;/span&gt;) NOT NULL,&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Names] [nvarchar]&lt;/span&gt;(&lt;span style="color:fuchsia;"&gt;50&lt;/span&gt;) NOT NULL,&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;CONSTRAINT &lt;span style="color:white;"&gt;[PK_LocType3Names_1] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;PRIMARY KEY CLUSTERED (&lt;/span&gt;&lt;span style="color:white;"&gt;[ID] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ASC, &lt;/span&gt;&lt;span style="color:white;"&gt;[Language] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ASC)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;)&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Tabuľka pri tomto riešení je rovnaká ako v dvojke. Rozdiel je v napĺňaní dátami. Dynamické riešenie predpokladá, že máme vybratý nejaký predvolený jazyk, v našom prípade to je en a pre tento jazyk existuje v tabuľke LocType3Names vždy jeden záznam. Pre každý ďalší jazyk môže, ale nemusí existovať záznam, ak&amp;nbsp; neexistuje, tak by mal byť vybratý text predvoleného jazyka.&lt;/p&gt;&lt;p&gt;Select predvoleného jazyka je jednoduchý: &lt;br&gt;&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;select * from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType3 L&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;inner join &lt;/span&gt;&lt;span style="color:white;"&gt;LocType3Names LN &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;on (&lt;/span&gt;&lt;span style="color:white;"&gt;L&lt;/span&gt;.&lt;span style="color:white;"&gt;Name_id &lt;/span&gt;= &lt;span style="color:white;"&gt;LN&lt;/span&gt;.&lt;span style="color:white;"&gt;ID&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;where &lt;/span&gt;&lt;span style="color:white;"&gt;LN&lt;/span&gt;.&lt;span style="color:white;"&gt;[Names] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;like &lt;/span&gt;&lt;span style="color:yellow;"&gt;'L%' &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;and (&lt;/span&gt;&lt;span style="color:white;"&gt;[Language]&lt;/span&gt;=&lt;span style="color:yellow;"&gt;'en'&lt;/span&gt;);&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;S aktuálnym jazykom je to už zložitejšie, ale nie nemožné:&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;select * from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType3 L&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;inner join &lt;/span&gt;&lt;span style="color:white;"&gt;LocType3Names LN &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;on (&lt;/span&gt;&lt;span style="color:white;"&gt;L&lt;/span&gt;.&lt;span style="color:white;"&gt;Name_id &lt;/span&gt;= &lt;span style="color:white;"&gt;LN&lt;/span&gt;.&lt;span style="color:white;"&gt;ID&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;where &lt;/span&gt;&lt;span style="color:white;"&gt;LN&lt;/span&gt;.&lt;span style="color:white;"&gt;[Names] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;like &lt;/span&gt;&lt;span style="color:yellow;"&gt;'L%' &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;and&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;(&lt;/p&gt;
&lt;p style="margin:0px;"&gt;(&lt;span style="color:white;"&gt;[Language]&lt;/span&gt;=&lt;span style="color:yellow;"&gt;'sk' &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;and EXISTS(select &lt;/span&gt;&lt;span style="color:white;"&gt;ID &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType3Names &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;where &lt;/span&gt;&lt;span style="color:white;"&gt;ID &lt;/span&gt;= &lt;span style="color:white;"&gt;L&lt;/span&gt;.&lt;span style="color:white;"&gt;Name_id &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;and &lt;/span&gt;&lt;span style="color:white;"&gt;[Language]&lt;/span&gt;=&lt;span style="color:yellow;"&gt;'sk'&lt;/span&gt;))&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;or &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;(&lt;span style="color:white;"&gt;[Language]&lt;/span&gt;=&lt;span style="color:yellow;"&gt;'en' &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;and NOT EXISTS(select &lt;/span&gt;&lt;span style="color:white;"&gt;ID &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType3Names &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;where &lt;/span&gt;&lt;span style="color:white;"&gt;ID &lt;/span&gt;= &lt;span style="color:white;"&gt;L&lt;/span&gt;.&lt;span style="color:white;"&gt;Name_id &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;and &lt;/span&gt;&lt;span style="color:white;"&gt;[Language]&lt;/span&gt;=&lt;span style="color:yellow;"&gt;'sk'&lt;/span&gt;))&lt;/p&gt;
&lt;p style="margin:0px;"&gt;);&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;S výkonnosťou default jazyka je to podobné ako s riešením 2, select aktuálneho jazyka je 11 krát pomalší ako riešenie 1 ale len 2,5 krát pomalší ako riešenie dva (bez optimalizácii). V tabuľke LocType3Names sa nachádza 100.000 záznamov pre jazyk en a 60.000 záznamov pre jazyk sk.&lt;span style="color:white;"&gt;&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-weight:bold;"&gt;Optimalizácia&lt;/p&gt;&lt;p&gt;Pre optimalizáciu je rovnaká ako v riešení č.2, teda vytvorenie indexu&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;CREATE NONCLUSTERED INDEX &lt;/span&gt;&lt;span style="color:white;"&gt;[IX_LocType3] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ON &lt;/span&gt;&lt;span style="color:white;"&gt;[dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[LocType3] &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;(&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Name_id] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ASC&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;)&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;a porovnávacie výsledky oproti optimalizovanému riešeniu č. 2 je to približne 3 krát a oproti optimalizovanému riešeniu č. 1 je cca 8,5 krát pomalšie. Samozrejme 8.5 násobne pomalšie neznamená až tak pomaly, presne výsledky porovnávania nájdete v tabuľke na konci článku, okrem toho nesmiete zabudnúť, že to je porovnanie podľa query plan, skutočné výsledky sú niekde inde.&lt;/p&gt;&lt;h3&gt;Riešenie č. 4 Dynamická tabuľka s netypovým XML stĺpcom&lt;br&gt;&lt;/h3&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/LocType4.jpg" align="right" width="361" height="133"&gt;CREATE TABLE &lt;/span&gt;&lt;span style="color:white;"&gt;[dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[LocType4]&lt;/span&gt;(&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[ID] [uniqueidentifier] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;NOT NULL,&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Names] [xml] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;NOT NULL,&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;CONSTRAINT &lt;span style="color:white;"&gt;[PK_LocType4] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;PRIMARY KEY CLUSTERED (&lt;/span&gt;&lt;span style="color:white;"&gt;[ID] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ASC)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;)&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Toto riešenie používa build-in xml podporu v sql serveri (všetky testy su na verzii 2005). Jazykové verziu budeme ukladať v tvare&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;lt;en&amp;gt;&lt;span style="color:green;"&gt;eng verzia text&lt;/span&gt;&amp;lt;/en&amp;gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;lt;sk&amp;gt;&lt;span style="color:green;"&gt;sk verzia text&lt;/span&gt;&amp;lt;/sk&amp;gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Pretože ide o XML treba pri ukladaní textov myslieť na normalizáciu textu, preto je lepšie použiť typový xml. Ale radšej už k selectom pre default jazyk je nasledovný:&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;select * from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType4&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;where &lt;/span&gt;&lt;span style="color:white;"&gt;[Names]&lt;/span&gt;.&lt;span style="color:white;"&gt;value&lt;/span&gt;(&lt;span style="color:white;"&gt;N&lt;/span&gt;&lt;span style="color:yellow;"&gt;'/en[1]'&lt;/span&gt;, &lt;span style="color:yellow;"&gt;'nvarchar(50)'&lt;/span&gt;) like &lt;span style="color:yellow;"&gt;'L%'&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Pre ostatné jazyky použijeme nasledovný select:&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;select * from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType4&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;where &lt;/span&gt;&lt;span style="color:white;"&gt;[Names]&lt;/span&gt;.&lt;span style="color:white;"&gt;value&lt;/span&gt;(&lt;span style="color:white;"&gt;N&lt;/span&gt;&lt;span style="color:yellow;"&gt;'if(/sk[1])&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:yellow;"&gt;then /sk[1]&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:yellow;"&gt;else /en[1]'&lt;/span&gt;, &lt;span style="color:yellow;"&gt;'nvarchar(50)'&lt;/span&gt;) like &lt;span style="color:yellow;"&gt;'L%'&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;i&gt;Ako vidiet v selectoch sa používa xpath verzia v selecte pre iné jazyky mi troška dala zabrať, pretože xpath v sql serveri 2005 nepodporuje union (preto cesta cez (/en[1] | /sk[1])[last()] neviedla a (/en[1],/sk[1])[last()] bol podla query planu pomalý na merge dvoch subqueries, preto verzia s if.&lt;/i&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Takéto riešenie bez optimalizácii ani nemá zmysel porovnávať, proste je to príliš pomalé, preto nasleduje optimalizácia&lt;/p&gt;&lt;p&gt;&lt;b&gt;Optimalizácia&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Optimalizácia XML je jednoduchá stačí vytvoriť xml index&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;CREATE PRIMARY &lt;/span&gt;&lt;span style="color:white;"&gt;XML &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;INDEX &lt;/span&gt;&lt;span style="color:white;"&gt;[XML_IX_LocType4] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ON &lt;/span&gt;&lt;span style="color:white;"&gt;[dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[LocType4] &lt;/span&gt;(&lt;span style="color:white;"&gt;[Names]&lt;/span&gt;)&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;a výsledky sú hneď prijateľnejšie default jazyk cca 90 krát oproti riešeniu č.3 a pri inom jazyku je rozdiel cca 35 násobný. Aj keď divné je, že real life testy hovoria o niečom inom, ale o tom až v závere.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Poznámka&lt;/b&gt;&lt;/p&gt;&lt;p&gt;K riešeniu xml treba dodať, že aj keď sa zdá, že je neefektívne a pomalé, v prípade ak nepotrebujete dáta filtrovať a xml dáta viete rozparsrovať priamo na klientovi tam kde je to potrebne, teda niekde v ORM vrstve ide o veľmi rýchle a efektívne riešenie, problém je prístup k hodnote priamo v sql queries. &lt;br&gt;&lt;/p&gt;&lt;h3&gt;Riešenie č. 5 Dynamická tabuľka s typovým XML stĺpcom&lt;/h3&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/LocType5.jpg" align="right" width="429" height="129"&gt;CREATE TABLE &lt;/span&gt;&lt;span style="color:white;"&gt;[dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[LocType5]&lt;/span&gt;(&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[ID] [uniqueidentifier] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;NOT NULL,&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;[Names] [xml]&lt;/span&gt;(&lt;span style="color:white;"&gt;CONTENT [dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[Languages]&lt;/span&gt;) NOT NULL,&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;CONSTRAINT &lt;span style="color:white;"&gt;[PK_LocType5] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;PRIMARY KEY CLUSTERED (&lt;/span&gt;&lt;span style="color:white;"&gt;[ID] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ASC)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;)&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;a samozrejme nezabudnuť na xml schému´, ktorá sa vytvára ako prvá&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;CREATE &lt;/span&gt;&lt;span style="color:white;"&gt;XML &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;SCHEMA &lt;/span&gt;&lt;span style="color:white;"&gt;COLLECTION [dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[Languages] &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;AS &lt;/span&gt;&lt;span style="color:white;"&gt;N&lt;/span&gt;&lt;span style="color:yellow;"&gt;'&amp;lt;xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:yellow;"&gt;&amp;lt;xsd:element name="en" type="xsd:string" /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:yellow;"&gt;&amp;lt;xsd:element name="sk" type="xsd:string" /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:yellow;"&gt;&amp;lt;/xsd:schema&amp;gt;'&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Dotazy sú samozrejme rovnaké ako v predchádzajúcom prípade&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;select * from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType5&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;where &lt;/span&gt;&lt;span style="color:white;"&gt;[Names]&lt;/span&gt;.&lt;span style="color:white;"&gt;value&lt;/span&gt;(&lt;span style="color:white;"&gt;N&lt;/span&gt;&lt;span style="color:yellow;"&gt;'/en[1]'&lt;/span&gt;, &lt;span style="color:yellow;"&gt;'nvarchar(50)'&lt;/span&gt;) like &lt;span style="color:yellow;"&gt;'L%'&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;a&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;select * from &lt;/span&gt;&lt;span style="color:white;"&gt;LocType5&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;where &lt;/span&gt;&lt;span style="color:white;"&gt;[Names]&lt;/span&gt;.&lt;span style="color:white;"&gt;value&lt;/span&gt;(&lt;span style="color:white;"&gt;N&lt;/span&gt;&lt;span style="color:yellow;"&gt;'if(/sk[1])&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:yellow;"&gt;then /sk[1]&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:yellow;"&gt;else /en[1]'&lt;/span&gt;, &lt;span style="color:yellow;"&gt;'nvarchar(50)'&lt;/span&gt;) like &lt;span style="color:yellow;"&gt;'L%'&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;&lt;b&gt;Optimalizácia&lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;podobne ako v predchádzajúcom prípade:&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;CREATE PRIMARY &lt;/span&gt;&lt;span style="color:white;"&gt;XML &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;INDEX &lt;/span&gt;&lt;span style="color:white;"&gt;[XML_IX_LocType5] &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;ON &lt;/span&gt;&lt;span style="color:white;"&gt;[dbo]&lt;/span&gt;.&lt;span style="color:white;"&gt;[LocType5] &lt;/span&gt;(&lt;span style="color:white;"&gt;[Names]&lt;/span&gt;)&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Podľa query plan je typový dataset efektívnejší ako netypový v xpath queries, a ten indexovaný dotaz pre iný jazyk je podľa neho len 8 krát pomalší ako query pre iný jazyk v riešení č. 3, čo určite nie je zlé.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;ALE &lt;/b&gt;&lt;/p&gt;&lt;p&gt;Je tu však jedno ale, real .net aplication testy hovoria niečo iné a to že tabuľky s xml indexom sú pomalšie ako tie bez indexu. Je to zaujímavé preto, že query plan hovorí niečo iné. Poďme preto k Real life testom.&lt;/p&gt;&lt;h3&gt;Real life testy&lt;/h3&gt;&lt;p&gt;V query plane sú výsledky výkonnosti jednotlivých príkazov označené ako &lt;u&gt;Query cost (relative to batch): xx %&lt;/u&gt;, čo v preklade znamená náklady na vykonanie príkazu relatívne k ostatným príkazom v dávke. A podľa toho som sa chcel v tomto článku orientovať naštastie som si spravil jednoduchý net programček, ktorý otvorí connection na db, vykoná príkaz na select, prejde všetky vrátene riadky a po každom riadku prirátava číslo do výsledku, tak aby som aspoň približne simuloval prácu s dátami. &lt;/p&gt;&lt;p&gt;Výsledky ma ale prekvapili, veď posúdte sami z výsledkov. Pre každý typ testu je vytvorený jedna funkcia vo tvare L&lt;u&gt;ocType[číslo riešenia][i ak nad indexovanou tabuľkou][en/sk značí či ide o default, alebo sk jazyk]&lt;/u&gt; a samozrejme v hlavnej tabuľke je vždy 100.000 záznamov, filter by mal vyfiltrovať pre &lt;u&gt;like 'L%'&lt;/u&gt; približne 6300 riadkov, pretože boli generovane náhodným generátorom, je to číslo vždy niekde okolo.&lt;/p&gt;&lt;p&gt;Prvý výsledok je po reštarte sql servera, keď by mala byť cache čistá:&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType1en&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6328 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;262&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;36 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;1878241 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType1sk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6328 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;47&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;97 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;343433 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType2en&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;646&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;33 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;4627106 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType2sk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;133&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;72 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;957282 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType2ien&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;325&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;30 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;2328850 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType2isk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;84&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;80 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;607070 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType3en&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;385&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;45 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;2759474 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType3sk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;123&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;71 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;885648 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType3ien&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;305&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;38 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;2186215 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType3isk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;120&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;77 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;864580 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType4en&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6280 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;2082&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;24 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;14906973 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType4sk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6329 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;1702&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;58 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;12188952 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-decoration:underline;"&gt;&lt;span style="color:white;"&gt;LocType4ien&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6280 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;4199&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;63 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;30065513 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-decoration:underline;"&gt;&lt;span style="color:white;"&gt;LocType4isk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6329 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;3537&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;15 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;25322760 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType5en&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6280 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;916&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;10 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6558438 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType5sk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6329 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;1110&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;94 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;7953343 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-decoration:underline;"&gt;&lt;span style="color:white;"&gt;LocType5ien&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6280 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;3062&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;26 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;21922991 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-decoration:underline;"&gt;&lt;span style="color:white;"&gt;LocType5isk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6329 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;1720&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;26 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;12315531 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;a tento je&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType1en&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6328 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;154&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;15 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;1103566 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType1sk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6328 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;39&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;30 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;281330 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType2en&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;90&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;11 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;645090 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType2sk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;87&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;05 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;623228 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType2ien&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;81&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;64 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;584478 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType2isk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;79&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;59 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;569803 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType3en&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;79&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;47 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;568954 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType3sk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;114&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;78 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;821738 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType3ien&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;73&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;36 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;525182 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType3isk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6300 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;111&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;61 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;799059 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType4en&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6280 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;1205&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;16 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;8627860 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType4sk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6329 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;1735&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;63 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;12425520 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-decoration:underline;"&gt;&lt;span style="color:white;"&gt;LocType4ien&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6280 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;2445&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;16 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;17505092 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-decoration:underline;"&gt;&lt;span style="color:white;"&gt;LocType4isk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6329 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;3366&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;28 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;24099517 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType5en&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6280 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;559&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;32 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;4004201 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:white;"&gt;LocType5sk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color:fuchsia;"&gt;6329 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;1056&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;06 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;7560451 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-decoration:underline;"&gt;&lt;span style="color:white;"&gt;LocType5ien&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6280 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;1069&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;32 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;7655323 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-decoration:underline;"&gt;&lt;span style="color:white;"&gt;LocType5isk&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style="color:fuchsia;"&gt;6329 &lt;/span&gt;&lt;span style="color:white;"&gt;records &lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;1713&lt;/span&gt;,&lt;span style="color:fuchsia;"&gt;61 &lt;/span&gt;&lt;span style="color:white;"&gt;ms &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:fuchsia;"&gt;12267920 &lt;/span&gt;&lt;span style="color:white;"&gt;ticks&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Samozrejme prvý select treba brať s rezervou, pretože sa vytvára prvé pripojenie do connection poolu, ale ďalšie výsledky sú zaujímave. &lt;/p&gt;&lt;p&gt;Nechápem ako môže byť tabuľka s xml indexom približne 2 krát pomalšia ako tabuľka bez indexu, proste mi to nejde dohlavy, najmä keď query plán hovori niečo úplne iné.&lt;/p&gt;&lt;h3&gt;Zhrnutie&lt;/h3&gt;&lt;p&gt;Dať nejaké globálne odporúčanie sa určite nedá, najmä verím tomu, že mojich päť riešení nepokrýva celé spektrum a preto dúfam, že niekto v diskusii pridá nejaký ten link, prípadne nápad a ja pripravím druhú časť, prípadne tretiu, kde by som mohol pridať ako vybrané riešenia začleniť do ORM (LLBLGEN, s ktorým som núteny pracovať v práci a môjho obľúbenca nHibernate).&lt;/p&gt;&lt;p&gt;Takže tu sú moje subjektívne názory na jednotlivé riešenia:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Riešenie č. 1 je určené pre masochistov, pridanie nového jazyku vás donúti prejsť všetky tabuľky, najmä preto, že verzia jazyka je hardcoded v selectoch ako prípona pre názvy stĺpcov. Teda priznám sa toto som používal v mojích php projektoch:).&lt;/li&gt;&lt;li&gt;Dvojka je už na tom lepšie a ak máte nejaký tool, ktorý vám pre podporu nového jazyka nakopíruje hodnoty z iného jazyka, môže ísť o veľmi efektívne riešenie. Problém je ale, že pri editore takéhoto reťazca musíte nútiť zákazníka vyplniť všetky jazykové verzie (prípadne sa môže nakopírovať jedna hodnota do všetkých jazykov, to však urobí problem pri opätovnej editácii, čo je už zmenená hodnota a čo už nie).&lt;/li&gt;&lt;li&gt;Trojka je velico pekné riešenie ako z pohľadu rýchlosti, tak zo stránky implementácie riešenia.&lt;/li&gt;&lt;li&gt;Štvorka je skôr len prototyp, určite ak xml na sql serveri, tak typový dataset.&lt;/li&gt;&lt;li&gt;Päťka je taký favorit pre priaznivcov moderných technológii. V prípade ak budete hodnotu parsrovať napr pomocou regexu na clientovi a len ak je to potrebné a nebudete potrebovať filtrovať podľa lokalizovanej hodnoty, tak ide o efektívnejšie riešenie ako trojka.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Ako vidieť moji favoriti sú 3 a 5 a pre päťku mám ešte plány do budúcna.&lt;/p&gt;&lt;h3&gt;Čo ďalej alebo čaká nás v druhej časti&lt;/h3&gt;&lt;p&gt;Určite by som koncept xml lokalizácie v 4. a 5. riešení chcel rozšíriť pomocou Regex v storovanej funkcii/procedúre a potom by som sa rád nechal inšpirovať nejakým nápadom z diskusie, tak smelo do toho.&lt;/p&gt;&lt;p&gt;BTW: Samozrejme ak by niekto neveril výsledkom, môžem nejak vymyslieť export real dát nad ktorými som testoval, ale dnes sa mi už nechce, okrem toho nejde o nič, čo by ste si podľa tohto článku nedokázali zreplikovať.&lt;br&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx&amp;amp;;title=Lokaliz%26%23225%3bcia+textu+v+datab%26%23225%3bzach" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx&amp;amp;;title=Lokaliz%26%23225%3bcia+textu+v+datab%26%23225%3bzach" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx&amp;amp;;title=Lokaliz%26%23225%3bcia+textu+v+datab%26%23225%3bzach" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx&amp;amp;title=Lokaliz%26%23225%3bcia+textu+v+datab%26%23225%3bzach" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx&amp;amp;;title=Lokaliz%26%23225%3bcia+textu+v+datab%26%23225%3bzach" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx&amp;amp;;title=Lokaliz%26%23225%3bcia+textu+v+datab%26%23225%3bzach&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx&amp;amp;;subject=Lokaliz%26%23225%3bcia+textu+v+datab%26%23225%3bzach" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/18/lokaliz-cia-textu-v-datab-zach.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228492" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/Rie_6101_enia+be_7E01_n_26002300_253_3B00_ch+probl_26002300_233_3B00_mov/default.aspx">Riešenia bežn&amp;#253;ch probl&amp;#233;mov</category></item><item><title>StringEnum podľa vlka</title><link>http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx</link><pubDate>Wed, 08 Oct 2008 11:29:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228462</guid><dc:creator>vlko</dc:creator><slash:comments>7</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/228462.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=228462</wfw:commentRss><description>&lt;p&gt;Dnes len tak pri bežnom dennom kódení vyvstala z môjho kódu interná potreba textového enumeration typu &lt;i&gt;(ach tá angličtina, vôbec mi do hlavy nejde rozumný slovenský preklad)&lt;/i&gt;. &lt;/p&gt;
&lt;p&gt;Nuž a ako to už bežne býva, keď niečo nie je v systéme&amp;nbsp; na pomoc rýchlo prichádza google a v ňom zopár článkov (&lt;a href="http://www.codeproject.com/KB/cs/stringenum.aspx"&gt;String Enumerations in C#&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/tims/archive/2004/04/02/106310.aspx"&gt;How do you convert a string into an enum?&lt;/a&gt;, &lt;a href="http://weblogs.asp.net/stefansedich/archive/2008/03/12/enum-with-string-values-in-c.aspx"&gt;Enum With String Values In C#&lt;/a&gt;, atď) popisujúci tieto základné spôsoby:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enum s konverziou na string - ja ale potrebujem ukladať pre jednotlive hodnoty kód, čo potom v zdrojákoch nevyzerá najlepšie.&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Konštanty - super použitie, avšak chýba kontrola hodnoty (vlastne pri pretypovaní ju nemá ani enum).&lt;/li&gt;
&lt;li&gt;Static readonly - tu už je možné použiť ako hodnotu triedu aj s kontrolou na hodnotu, nevýhodou ale je nemožnosť použitia v switch.&lt;/li&gt;
&lt;li&gt;Atribúty s extensions metódou - pekné riešenie, akurát reflexia je vždy brzdou aplikácie, extensions metódy mi nikdy nevoňali a pri pretypovaní by teoretický mohli vzniknúť ťažko odhaliteľné chyby.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Všetko to proste viedlo k jednému záveru. Svet potrebuje ešte jedno riešenie a to podľa vlka:). Najskôr teda požiadavky:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;použitie v swith príkaze, teda hodnota musí byť const&lt;br&gt;&lt;/li&gt;
&lt;li&gt;aspoň jednoduchá kontrola na vkladanú hodnotu&lt;/li&gt;
&lt;li&gt;a čo najjednoduchšie použitie&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Základ bude tvoriť trieda obsahujúca hodnoty ako konštanty: &lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-weight:bold;"&gt;public class &lt;/span&gt;&lt;span&gt;StringEnum&lt;/span&gt;&amp;nbsp;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public const string &lt;span style="color:white;"&gt;SomeValue&lt;/span&gt; = &lt;span style="color:yellow;"&gt;"val1"&lt;/span&gt;;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public const string &lt;span style="color:white;"&gt;OtherValue&lt;/span&gt; = &lt;span style="color:yellow;"&gt;"val2"&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&amp;nbsp;a umožňovať by mala nasledujúce konštrukcie: &lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;StringEnum&lt;/span&gt; &lt;span style="color:white;"&gt;value1&lt;/span&gt; = &lt;span&gt;StringEnum&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;OtherValue&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;StringEnum&lt;/span&gt; &lt;span style="color:white;"&gt;value2&lt;/span&gt; = &lt;span&gt;StringEnum&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;SomeValue&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; switch (&lt;span style="color:white;"&gt;value1&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case &lt;span&gt;StringEnum&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;OtherValue&lt;/span&gt;:&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;Console&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;WriteLine&lt;/span&gt;(&lt;span style="color:white;"&gt;value1&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case &lt;span&gt;StringEnum&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;SomeValue&lt;/span&gt;:&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;Console&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;WriteLine&lt;/span&gt;(&lt;span style="color:white;"&gt;value1&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bool &lt;span style="color:white;"&gt;compare&lt;/span&gt; = &lt;span style="color:white;"&gt;value1&lt;/span&gt; == &lt;span style="color:white;"&gt;value2&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;compare&lt;/span&gt; = &lt;span style="color:white;"&gt;value1&lt;/span&gt; == &lt;span&gt;StringEnum&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;OtherValue&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Aby som zabezpečil čo najväčšiu znovupoužiteľnosť, vytvoril som si bázovú triedu, ktorá bude robiť všetko to, čo netreba kopírovať medzi projektami. Teda obsahuje hodnotu inštancie enumu a v protected konštruktore ošetruje vkladanú hodnotu, pomocou výnimky StringEnumValueException a abstraktnej funkcie GetValidValues, ktorá vracia zoznam platných hodnôt &lt;br&gt;&lt;/p&gt;

&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public abstract class &lt;span&gt;BaseStringEnum&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Gets the valid values.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;Should return valid string values for this string enum.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; protected abstract &lt;span&gt;List&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;string&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;GetValidValues&lt;/span&gt;();&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Gets or sets the value.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The value.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public string &lt;span style="color:white;"&gt;Value&lt;/span&gt; { get; private set; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Initializes a new instance of the &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;see cref="StatisticsTypeEnum"/&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt; class.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;param name="value"&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The value.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; protected &lt;span style="color:white;"&gt;BaseStringEnum&lt;/span&gt;(string &lt;span style="color:white;"&gt;value&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// test if value is valid&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (!&lt;span style="color:white;"&gt;GetValidValues&lt;/span&gt;().&lt;span style="color:white;"&gt;Contains&lt;/span&gt;(&lt;span style="color:white;"&gt;value&lt;/span&gt;))&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; throw new &lt;span&gt;StringEnumValueException&lt;/span&gt;(this.&lt;span style="color:white;"&gt;GetType&lt;/span&gt;(), &lt;span style="color:white;"&gt;value&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;Value&lt;/span&gt; = &lt;span style="color:white;"&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Potiaľ je to jednoduché nasleduje pár jednoduchých overridov, prvý na textovú reprezentáciu projektu:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public override string &lt;span style="color:white;"&gt;ToString&lt;/span&gt;()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;Value&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;


&lt;p&gt;a veľmi dôležitá funkcia pre porovnávanie dvoch objektov, ktorá nám zabezpečí, aby sme, keď to je potrebné, porovnávali len textovú podobu objektu&lt;br&gt;&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public override bool &lt;span style="color:white;"&gt;Equals&lt;/span&gt;(object &lt;span style="color:white;"&gt;obj&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// compare with string&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (&lt;span style="color:white;"&gt;obj&lt;/span&gt; is string)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return string.&lt;span style="color:white;"&gt;Equals&lt;/span&gt;(&lt;span style="color:white;"&gt;obj&lt;/span&gt;, &lt;span style="color:white;"&gt;Value&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// compare with same string enum&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else if ((this.&lt;span style="color:white;"&gt;GetType&lt;/span&gt;() == &lt;span style="color:white;"&gt;obj&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetType&lt;/span&gt;()) &amp;amp;&amp;amp; (&lt;span style="color:white;"&gt;obj&lt;/span&gt; is &lt;span&gt;BaseStringEnum&lt;/span&gt;))&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return string.&lt;span style="color:white;"&gt;Equals&lt;/span&gt;((&lt;span style="color:white;"&gt;obj&lt;/span&gt; as &lt;span&gt;BaseStringEnum&lt;/span&gt;).&lt;span style="color:white;"&gt;Value&lt;/span&gt;, &lt;span style="color:white;"&gt;Value&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// call base compare&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return base.&lt;span style="color:white;"&gt;Equals&lt;/span&gt;(&lt;span style="color:white;"&gt;obj&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;a hlavne podstatná finta, ktorá nám zabezpečí implicitnú konverziu nášho string enumu na string&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public static implicit operator string(&lt;span&gt;BaseStringEnum&lt;/span&gt; &lt;span style="color:white;"&gt;stringEnum&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (&lt;span style="color:white;"&gt;stringEnum&lt;/span&gt; == null)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;stringEnum&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Value&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Na základnú triedu to úplne stačí, zostáva nám implementovať potomka, tu je potrebné definovať vlastné hodnoty enumu a abstraktnú funkciu GetValidValues, ktorá vracia povolené hodnoty pre náš enum
&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span&gt;StringEnum&lt;/span&gt; : &lt;span&gt;BaseStringEnum&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public const string &lt;span style="color:white;"&gt;SomeValue&lt;/span&gt; = &lt;span style="color:yellow;"&gt;"val1"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public const string &lt;span style="color:white;"&gt;OtherValue&lt;/span&gt; = &lt;span style="color:yellow;"&gt;"val2"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Gets the valid values.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Should return valid string values for this string enum.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; protected override &lt;span&gt;List&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;string&amp;gt; &lt;/span&gt;&lt;span style="color:white;"&gt;GetValidValues&lt;/span&gt;()&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return new &lt;span&gt;List&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;string&amp;gt; { &lt;/span&gt;&lt;span style="color:white;"&gt;SomeValue&lt;/span&gt;, &lt;span style="color:white;"&gt;OtherValue&lt;/span&gt; };&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;privátny konštruktor, ktorý zabezpečí naplnenie hodnoty a znemožní vytvorenie inštancie z kódu&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private &lt;span style="color:white;"&gt;StringEnum&lt;/span&gt;(string &lt;span style="color:white;"&gt;value&lt;/span&gt;) : base (&lt;span style="color:white;"&gt;value&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;a aby to všetko pekne fungovalo, tak ako má, tak tá najdôležitejší časť celého riešenia a to implicitná konverzia zo stringu na náš StringEnum typ&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public static implicit operator &lt;span&gt;StringEnum&lt;/span&gt;(string &lt;span style="color:white;"&gt;value&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return new &lt;span&gt;StringEnum&lt;/span&gt;(&lt;span style="color:white;"&gt;value&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;To je všetko, takáto trieda sa už potom normálne používa ako enum, možno sa ešte hodí označiť base triedu pomocou Serializable atribúta, ale to už nechám na každého uváženia a potrieb.&lt;/p&gt;&lt;p&gt;A nakoniec zostávajú už len zdrojové kódy &lt;a href="http://vlko.zilina.net/dwn/blog/StringEnum.zip"&gt;StringEnum source&lt;/a&gt; a nevýhody:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Aj keď to simuluje enum funkčnosť enum to nikdy nebude:)&lt;/li&gt;&lt;li&gt;chýba default hodnota, tak ak má niekto nápad ako toto ošetriť, teda konverziu null hodnoty na default hodnotu&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx&amp;amp;;title=StringEnum+pod%c4%bea+vlka" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx&amp;amp;;title=StringEnum+pod%c4%bea+vlka" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx&amp;amp;;title=StringEnum+pod%c4%bea+vlka" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx&amp;amp;title=StringEnum+pod%c4%bea+vlka" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx&amp;amp;;title=StringEnum+pod%c4%bea+vlka" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx&amp;amp;;title=StringEnum+pod%c4%bea+vlka&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx&amp;amp;;subject=StringEnum+pod%c4%bea+vlka" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/10/08/stringenum-pod-a-vlka.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228462" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/zalozka/default.aspx">zalozka</category></item><item><title>MultiScreenSwitcher coding story</title><link>http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx</link><pubDate>Thu, 03 Jul 2008 06:30:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:227847</guid><dc:creator>vlko</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/227847.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=227847</wfw:commentRss><description>Binárka: &lt;a href="http://vlko.zilina.net/dwn/MultiScreensSwitcher-bin.zip"&gt;http://vlko.zilina.net/dwn/MultiScreensSwitcher-bin.zip&lt;/a&gt;

&lt;p&gt;Zdrojové kódy: &lt;a href="http://vlko.zilina.net/dwn/MultiScreensSwitcher-source.zip"&gt;http://vlko.zilina.net/dwn/MultiScreensSwitcher-source.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Na zdrojové kódy, ani obrázky si neuplatňujem žiadne autorské práva, takže môžete s nimi robiť čo len chcete:) &lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Ak sa chcete dozvedieť čo to o vyvoji aplikácie preskočte časť Intermezzo, a pustite sa rovno do devel časti.&lt;br&gt;&lt;/i&gt;&lt;/p&gt;
&lt;h3&gt;Intermezzo&lt;/h3&gt;
&lt;p&gt;Dnes to bude opäť o návykovej veci a to je multi monitor desktop (v preklade hádam viac zobrazovacio-jednotková plocha). Osobne sa priznám, že som pokušeniu mať k notebooku pripojený externý monitor dlho odolával až raz sa tak nejak uvoľnila jeden 20" LCD a po pár dňoch som už patril medzi tých, čo si devel život bez externého monitora nevedia ani prestaviť. Vzhľadom na spôsob vykresľovania vo WinXP je pre vývojara vlastne nevyhnutnosťou &lt;i&gt;(kto nevie, tak starý zobrazovací engine si neukladal vyrenderovanú grafiku do nejakej medzipamäte, ako je v súčastnosti GPU RAM, ale každe prekrytie okna bolo indikované cez InvalidateRect novým prekreslením)&lt;/i&gt; a ak ste teda nemali dosť veľký monitor aby ste mali na rovnakej obrazovke vedľa seba debugovanú aplikáciu a vývojové IDE, pri trošku vätšom zatažení procesora, ste sa proste učakali. Troška z nadsázkou by sa dalo povedať, že externý monitor bol pre mňa niečo ako druhý core na procesore:)&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Nuž a k takémuto multi-screen desktopu patria nejaké tie produktivitu zvyšujúce aplikácie.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://graphics.cs.columbia.edu/projects/m3/index.html"&gt;Multi Monitor Mouse (M&lt;sup&gt;3&lt;/sup&gt;)&lt;/a&gt; - ak stále hľadate kurzor na obrazovke je to určite to pravé pre vás, stači stlačit CTRL a okolo kurzora sa zobrazí animacia kružkov, a len slepý si ho už potom nevšimne, okrem toho je tu klávesová skratka ALT+~, čo prenesie kurzor na rovnakú pozíciu ale na nasledujúcom monitore&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mediachance.com/free/multimon.htm"&gt;MultiArrows&lt;/a&gt;- (treba pohľadať na stránke odkaz na stiahnutie je pekne zašitý) ktorý zobrazil v caption bare tlačítko, po kliknutí na ktoré preniesol okno na susedný monitor, okrem toho to vie robiť aj klávesovou skratkou.&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Určite existuje kopec iných komerčných aplikácii, ale tieto dve free mi úplne postačovali, pretože mám taskbar umiestnený zvisle &lt;i&gt;(aké iné umiestnenie pri widescreene?)&lt;/i&gt;, tak nejaké rozšírenie na ďalšiu obrazovku mi nič neprináša, tak isto ako okno zobrazené cez dve obrazovky alebo vlastný obrázok na každom pozadí. Sice to dobre vyzerá ale prakticke využitie žiadne. A desktop background? Ten vidím akurát tak ráno, keď zapínam počítač, inak po vätšinu času mam okná maximalizované, z toho istého dôvodu vôbec nepoužívam desktop shortcuts.&lt;/p&gt;
&lt;p&gt;Nuž všetko pekne fungovalo, kým som nezmenil počítač a s ním aj operačný systém. &lt;i&gt;Prosím nekameňovať, mne sa Aero páči, najmä pre natívny vzhľad WPF aplikácii, k tomu v dnešnej dobe aj tak programujem iba web aplikácie, takže už ma rozdiely pri designovaní winforms nezaujímajú. &lt;/i&gt;A odvtedy kvôli Aeru som prišiel o buttoniky v caption bare vo MultiArrows, čo ma veľmi ranilo a ako programájtor som sa rozhodol, že zvediem svoj súkromný boj a vrátim tlačítka tam, kde patria, teda do caption baru.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/CaptionBars.jpg" width="140" align="right" height="140"&gt;Skôr ako začnem s tým skutočne zaujímavým, teda samotným skutočným coding story, ešte si prihrejem polievočku tým, že zverejnený kód je tak trochu unikátny, pretože som ešte nenašiel komerčné riešenie, ktoré by zobrazovalo caption buttony aj v Aeru, samozrejme buttoniky fičia aj bez Aera. Ako na to si ukažeme pekne poporiadku.&lt;/p&gt;
&lt;h3 style="clear:both;"&gt;Krok č.1 Caption button&lt;/h3&gt;
&lt;p&gt;Skôr ako začnete očákavať nejaky super extra C++ kód s kopcom hackou, tak vás sklamem. App je napísana v C#. Tak kde je tá finta? &lt;/p&gt;
&lt;p&gt;Základom celej finty je skutočnosť, že do caption baru v Aero proste kresliť nie je možné, teda ak si celý caption bar odznova nenaprogramujete ako v tomto riešení &lt;a href="http://blog.vyvojar.cz/controlpanel/blogs/%3ETake%20Control%20of%20Your%20Non-Client-Area%21"&gt;Take Control of Your Non-Client-Area!.&lt;/a&gt; Je to preto, že caption bar je vykresľovaný priamo do GPU, ak teda nemáte priamy pristup do grafickej karty asi si neškrtnete.&lt;/p&gt;&lt;p&gt;Našťastie google je vševedúci a mne sa podarilo násť riešenie. &lt;a href="http://www.thecodeking.co.uk/2007/09/adding-caption-buttons-to-non-client.html"&gt;Adding caption buttons to the Non-client area on Vista&lt;/a&gt; je to pravé, čo potrebujeme, stačí vytvoriť priesvitný formulár a umiestniť ho vedľa min-max-close tlačidiel a pri akomkoľvek premiestňovaní, resizovaní, minimalizovaní, maximalizovaní a restorovaní pozíciu okna prekresliť. Takýto formular (skôr sa hodí termín okno [window]) nazveme overlay.&lt;br&gt;&lt;/p&gt;
&lt;h3 style="clear:both;"&gt;Krok č.2 Sploď okno a nechaj si ho adoptovať&lt;/h3&gt;&lt;p&gt;Takže spôsob ako zobraziť button v caption buttonu našeho okna máme, teraz zostáva, už len pri štarte zistiť všetky otvorené okna a naše overlay okno nad ním zobraziť. &lt;/p&gt;&lt;p&gt;Na zoznam otvorených okien je ako stvorená WinApi funkcia &lt;a href="http://msdn.microsoft.com/en-us/library/ms682615%28VS.85%29.aspx"&gt;EnumDesktopWindows &lt;/a&gt;nuž a zostáva už len okno zobraziť. Teda nielen zobraziť, okno musí byť childom okna, ktoré prekrývame. To preto aby naše overlay okno bolo za každých okolnosti nad daným oknom a pritom neprekrývalo iné okna, teda nijaky topmost atribút nevyhovuje.&lt;/p&gt;&lt;p&gt;Nedajte sa zlákať &lt;a href="http://msdn.microsoft.com/en-us/library/ms633541%28VS.85%29.aspx"&gt;SetParent &lt;/a&gt;funkciou, tá síce spraví z našeho okna child, ale nie okno, ale niečo ako control, a takýto control nemôže byť vykreslený mimo client areu parent okna. Na prekvapenie na to nepotrebujete žiadnu api funkciu priamo v .net je override show funkcie &lt;a href="http://msdn.microsoft.com/en-us/library/szcefbbd.aspx"&gt;Form&lt;span class="cs"&gt;&lt;/span&gt;&lt;span class="vb"&gt;&lt;/span&gt;&lt;span class="cpp"&gt;.&lt;/span&gt;&lt;span class="nu"&gt;S&lt;/span&gt;how(IWin32Window) &lt;/a&gt;a máme to. Okno je child a pritom je to stále okno. A IWin32Window sa netreba báť implementuje len Handle property&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class &lt;span&gt;WindowWrapper&lt;/span&gt; : &lt;span style="color:white;"&gt;System&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Windows&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Forms&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span&gt;IWin32Window&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public &lt;span style="color:white;"&gt;WindowWrapper&lt;/span&gt;(&lt;span&gt;IntPtr&lt;/span&gt; &lt;span style="color:white;"&gt;handle&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;Handle&lt;/span&gt; = &lt;span style="color:white;"&gt;handle&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public &lt;span&gt;IntPtr&lt;/span&gt; &lt;span style="color:white;"&gt;Handle&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; get;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private set;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;&amp;nbsp;a mi predsa parent handle poznáme, čiže už stačí len:

&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Consolas;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="font-weight:bold;"&gt;this.&lt;/span&gt;&lt;span style="color:white;"&gt;Show&lt;/span&gt;(new &lt;span&gt;WindowWrapper&lt;/span&gt;(&lt;span style="color:white;"&gt;_TargetWindowHandle&lt;/span&gt;));&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Dosiaľ je to stále kúsok koláčika, preto je čas na tu tažkú časť a tou je hooking. A hooking ma zabezpečiť aby sa naše overlay okienko hybalo spolu s jeho rodičom.&lt;/p&gt;&lt;h3 style="clear:both;"&gt;Krok č.3 Sleduj rodiča, nech žiaden jeho čin nie je bez odozvy&lt;/h3&gt;&lt;p&gt;Heslo ako z Orwella, ale jediný spôsob ako zabezpečiť aby sa naše okno hýbalo spolu s jeho rodičom, je zavesiť sa na jeho WndProc a zachytiť každú message, spracovať ju a ak sa okno hýbe, hýbať sa musí aj overlay. &lt;/p&gt;&lt;p&gt;Prvý nápad bol zistiť adresu WndProc okna a nahradiť ju vlastnou. Čo som už kedysi dávno robil, akurát do bolo už asi dosť dávno, podľa dokumentácie &lt;a href="http://msdn.microsoft.com/en-us/library/ms633591.aspx"&gt;SetWindowLong &lt;/a&gt; bolo možné zmeniť &lt;code&gt;GWL_WNDPROC&lt;/code&gt; na cudzom okne naposledy vo verzii win 98. To si už človek uvedomí, že asi už starneme:). Čiže musíme ísť znova cestou &lt;a href="http://msdn.microsoft.com/en-us/library/ms644990.aspx"&gt;Global hooku&lt;/a&gt;.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Bohužiaľ už z predchádajúceho coding story vieme, že s hookmi to v .net nie je jednoduché a svoje som si užil aj ja. Samozrejme je nutne použiť na global hook unmanaged kód v externej knižnici, teda v našom prípade C++. Pár dni som strávil rôznym skušaním a už som si myslel, že vo vistách hádam ani nie je možné urobiť global hook až som bol tak zúfaly, že som sa rozhodol posledný krát použiť google a trafil som tie správne keywordy, teda výsledkom bol &lt;a href="http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx"&gt;Using Window Messages to Implement Global System Hooks in C# na codeproject.com&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A potom mi trklo, kde som robil chybu, použiť moju .net funkciu na globálne zachytávanie windows správ je proste nedostatočné ako z výkonnostného, tak aj z hľadiska bezpečnosti umiestnenia jej pointera v pamäti. Tuto je to ale robené šalamúnsky v dll sa message zachytí a cez &lt;a href="http://msdn.microsoft.com/en-us/library/ms644953%28VS.85%29.aspx"&gt;SendNotifyMessage&lt;/a&gt; poslať do našeho okna, a tam už stačí vo WndProc zachytiť. Čo ma najviac naštvalo je, že presne takto som to robil kedysi v malej delphi aplikácii, na tvorbu &lt;a href="http://vlko.zilina.net/index.php?page=ShortCut"&gt;keyboard shorcutov&lt;/a&gt;. &lt;br&gt;&lt;/p&gt;&lt;p&gt;Koncept preposielania messages do wndproc sa mi zapáčil natoľko, že som ho použil aj priamo na preposielanie správ medzi hlavným správcovským oknom a jednotlivými overlay oknami.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Hodilo by sa pastnuť nejaký ten kód, ale ten je už popísaný v článku na codeproject, a vy si asi budete musieť zvyknúť na to, že tento článok je viac filozofický ako codologický, na to tu je priamo zdrojový kód celého projektu.&lt;/p&gt;&lt;h3 style="clear:both;"&gt;Krok č.4 Tie správne správy pre mňa&lt;/h3&gt;&lt;p&gt;Takže máme globálny hook na všetky window message. A že ich je hŕba upravil som zdrojový kód global hook dll aby filtrovala len tie podstatné, myslíte na to ak budete túto dll niekde používať. A že ktoré správy su pre nás podstatné.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms632626%28VS.85%29.aspx"&gt;&lt;b&gt;WM_GETMINMAXINFO&lt;/b&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Správa je vyvolaná pri menení veľkosti okna a teda je nutné aj overlay premiestniť.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms632646%28VS.85%29.aspx"&gt;&lt;b&gt;WM_SIZE&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Táto správa je volaná pri zmene veľkosti okna, okrem toho je práve táto správa volaná aj pri minimalizácii a restorovaní okna, teda práve v čase, keď náš overlay potrebujeme skryť, alebo zobraziť. Na to slúži parameter wParam.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms632652%28VS.85%29.aspx"&gt;&lt;b&gt;WM_WINDOWPOSCHANGED&lt;/b&gt;&lt;/a&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;Tentoraz je to správa určená na zistenie zmeny pozície okna a možno na vaše prekvapeni, pri minimalizovani v maximalizovanom stave, nie je WM_SIZE správa volaná, ale je volaná práve táto správička. Či je okno minimalizované alebo restorované zistíme z lParam, ktorá obsahuje štruktúru &lt;a href="http://msdn.microsoft.com/en-us/library/ms632612%28VS.85%29.aspx"&gt;WINDOWPOS&lt;/a&gt; v premennej flag. Používam malú fintu a túto flag hodnotu zisťujem už priamo v hook dll, pretože pri preposielaní správy medzi oknami asi handle na túto štruktúru vyprší a dostával som error o prístupe do chránenej pamäte, takže lParam = WINDOWPOS.flag.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms632620%28VS.85%29.aspx"&gt;&lt;b&gt;WM_DESTROY&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Toto je asi jasné každému, proste je to čas zrušiť naše overlay okno. Možno za zaujímavosť stojí informácia, že pri killnutí okna, sa táto správa nezavolá, takže vám možno nejaké overlay zostanú vysieť.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms534847%28VS.85%29.aspx"&gt;&lt;b&gt;WM_DISPLAYCHANGE&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Správa generovaná pri zmene rozlíšenia (to sa stáva pri pridaní nového, alebo odobratí existujúceho monitora), a teda čas vypnúť na chvíľu vytváranie overlay okien, pretože je generované enormné množstvo správ a môže to zahltiť našu app a tým celý systém. Jo a samozrejme je to čas vypnúť hook.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa969230%28VS.85%29.aspx"&gt;&lt;b&gt;WM_DWMCOMPOSITIONCHANGED&lt;/b&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Reakcia aplikácie je taká istá ako pri predchádzajúcej správe, akurát táto je volaná pri zapnutí a vypnutí aera.&lt;/p&gt;&lt;h3 style="clear:both;"&gt;Krok č.5 A nesmieme zabudnúť na nové a zrušené okná&lt;/h3&gt;&lt;p&gt;Pre novovytvorené okná je tiež potrebné vytvoriť nové overlays. Na to použijeme opäť globálny hook, tentoraz &lt;a href="http://msdn.microsoft.com/en-us/library/ms644959%28VS.85%29.aspx#wh_shellhook"&gt;shell hook&lt;/a&gt;, ktorý má &lt;code&gt;HSHELL_WINDOWCREATED a &lt;/code&gt;&lt;code&gt;HSHELL_WINDOWDESTROYED&lt;/code&gt; správy a už sa stačí ne len zavesiť a nový overlay, alebo overlay, ktorého zrušenie sme nezachytili pomocou WM_DESTROY (tak ma teraz napadá, že to bude asi blbosť, že? asi je to teda nejaký pozostatok starého kódu:), jednoducho zrušiť.&lt;/p&gt;&lt;h3 style="clear:both;"&gt;Krok č.6 Finalizujeme&lt;/h3&gt;&lt;p&gt;Takže už nám zostáva len pár vecí do ukončenia (samozrejme v rámci prvého release):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;pozdržať zobrazenie overlay-u pri restorovaní okna za zapnutého aera, z dôvodu animácie&lt;/li&gt;&lt;li&gt;minimálny počet monitorov, pri ktorom zobrazovať overlay, pri jednom monitore nemá asi zmysel zobrazovať tlačítka na prenos na ďalší monitor&lt;/li&gt;&lt;li&gt;pridať kód, ktorý po stlačení prislušného tlačidla prenieslo aplikáciu na ďalší monitor&lt;/li&gt;&lt;li&gt;nejaký ten tuning pretože pozícia overlay-u je troška rozdielna pri aere a bez aera&lt;/li&gt;&lt;li&gt;nastavenia pekne do app.config&lt;/li&gt;&lt;li&gt;tray icon aplikácie s menu pre ukončenie, reinicializáciu overlay-ov a about dialogom, aby si na mňa niekto v zlom spomenul&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="clear:both;"&gt;Záver&lt;/h3&gt;
&lt;p&gt;Uff, napísať tento článok je asi príliš veľká porcia, pretože je toho tak veľa, čo by sa dalo ešte spomenúť. Za prvé som ale vyčerpal všetku chuť a za druhé na to tu máte zdrojáky, z ktorých dúfam vznikne nejaká ta verzia dva, ktorá odstráni nejaké tie bugy a vylepší výkonnosť aplikácie.&lt;br&gt;&lt;/p&gt;&lt;h3 style="clear:both;"&gt;Known bugs&lt;/h3&gt;&lt;p&gt;Táto sekcia sa určite skoro rozrastie, zatiaľ mám jeden na 100% reprodukovateľný:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ak je v ie zapnutá podpora pre debugovanie javascriptu a pri spustení debugu z visual studia, každý druhý krát aplikácia zatuhne, je nutné zavrieť IE okno natvrdo, potom sa všetko rozbehne ako má &lt;br&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx&amp;amp;;title=MultiScreenSwitcher+coding+story" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx&amp;amp;;title=MultiScreenSwitcher+coding+story" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx&amp;amp;;title=MultiScreenSwitcher+coding+story" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx&amp;amp;title=MultiScreenSwitcher+coding+story" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx&amp;amp;;title=MultiScreenSwitcher+coding+story" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx&amp;amp;;title=MultiScreenSwitcher+coding+story&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx&amp;amp;;subject=MultiScreenSwitcher+coding+story" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/07/03/multiscreenswitcher-codding-story.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=227847" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/announce/default.aspx">announce</category><category domain="http://blog.vyvojar.cz/vlko/archive/tags/Coding+story/default.aspx">Coding story</category></item><item><title>WPF OnScreenKeybord coding story [update 1]</title><link>http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx</link><pubDate>Sun, 01 Jun 2008 16:01:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:227759</guid><dc:creator>vlko</dc:creator><slash:comments>11</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/227759.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=227759</wfw:commentRss><description>&lt;p&gt;&lt;i&gt;Dnes nás čaká&amp;nbsp;dosť rozsiahly príspevok (asi som sa nechal uniesť). Preto ak&amp;nbsp;štýl akým píšem, alebo rozsah textu&amp;nbsp;Vás odrádza, odporúčam skok na koniec článku, kde je odkaz na zdrojové kódy ako aj binárku. Nech vašej pozornosti neujde aj varovanie, ktoré je hneď za linkami na stiahnutie, určite schladí vaše nadšenie.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;[update 1] linka na zdrojové kódy bola rovnaká ako na binárku, teraz by už malo byť všetko v poriadku&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;Intermezzo&lt;/h3&gt;
&lt;p&gt;Občas sa človeku pritrafí, taký ten výnimočný deň, keď sa mu splnia také malé detské sny a po mesiacoch práce mu v balíčku príde vysnívaný počítač typu Tablet PC (&lt;i&gt;z antireklamných dôvodov pre uvediem len &lt;/i&gt;&lt;a href="http://www.tabletpcreview.com/default.asp?newsID=1077" class=""&gt;&lt;i&gt;link&lt;/i&gt;&lt;/a&gt;). Dôvodov, prečo som si vybral na vývoj akurát 12.1" riešenie je viacero, ale hlavným asi je to, že až si raz kliknete prstom na obrazovku a kurzor sa tam dokonca aj pohne (&lt;i&gt;s kruhovou toleranicou od 1 do 10 px podľa kvality digitalizera&lt;/i&gt;), tak človek niekde vo vnútri cíti: &lt;a href="http://news.cnet.com/8301-13860_3-9953243-56.html?tag=blogFeed" class=""&gt;"toto je budúcnosť".&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A teraz sa už dostávame k praktickému používaniu. Používanie prsta na ovládanie je proste veľmi návyková záležitosť až tak, že sa časom zabúdate a ťukáte aj na externý monitor a teda handričku musíte mať poruke. Tú samozrejme musíte mať aj na tablet, aj keď momentálne zisťujem, že je lepšie je ho nechať riadne ucapať, to sa už nejaká tá mastnosť stratí, ale to je už hold daň za technológiu.&lt;/p&gt;
&lt;p&gt;A pomaly sa dostávame k jadru problému a tým sú znaky, občas, vlastne dosť často potrebujete zadať nejakú tu sekvenciu znakov. Pretože Vista v sebe už obsahuje Tablet PC extensions, voľba operačného systému bola jednoznačná. Predstavy sa už ale od reality líšili, pôvodná prestava bola, že vista obsahuje takúto UMPC klávesnicu:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.umpc.se/wp-content/uploads/2006/06/asus-umpc-keyboard.jpg" style="width:398px;height:194px;" width="393" height="179"&gt;&lt;/p&gt;
&lt;p&gt;Bohužiaľ dostanete niečo takéto:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/OnScreenKeyboard.jpg" style="width:600px;height:200px;" width="600" height="200"&gt;&lt;/p&gt;
&lt;p&gt;A čo je horšie táto klávesnica sa zobrazuje prejdením kurzora cez cca 5px široký panel schovaný úplne na okraji obrazovky a následným kliknutím na panel, ktorý následne vyskočí:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/HiddenHiddenKeyboard.jpg"&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/HiddenKeyboard.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Pretože vätšina ľudí ma bruška prsta široké od 1 cm do 3 cm, a teda stred od 0.5 cm do 1.5 cm, k tomu treba prirátať zvýšený okraj a teda sa tento úkon dá zaradiť do kategórie &lt;b&gt;nemožné.&lt;/b&gt; Samozrejme vätšina tablet pc umožnuje aj detailny posun kurzora pomocou nejakej pomocnej ikony, ale to už nie je single klik ale klik na max dosažiteľnú pozíciu, klik na pomocnú ikonu, presun a klik.&lt;/p&gt;
&lt;p&gt;Zobrazená klávesnica nie je samozrejme jediným možnosťou vstupu, ďalšou je písaný text, ale na ten už musite držať v ruke pero, ale ja potrebujem pre pracu v tablet režime niečo šikovnejšie. Ale prečo chodiť okolo horúcej kaše, potrebujem niečo takéto:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/MyKeyboard.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Tak toto je to čo chceme dosiahnuť a asi aj to prečo ste začali čítať tento článok. Tak po suchom úvode poďme do práce.&lt;/p&gt;
&lt;h3&gt;KROK č.1 Vzhľad&lt;/h3&gt;
&lt;p&gt;Pretože mám rád nové technológie a všetko v živote treba raz skúšať, voľba padla na &lt;a href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation" class=""&gt;WPF&lt;/a&gt;, vektory sú pekné, dajú sa ľubovoľne resizovať a jednoducho nakresliť.&lt;/p&gt;
&lt;p&gt;Takže stačí spustiť &lt;a href="http://www.inkscape.org/" class=""&gt;Inkscape&lt;/a&gt;&amp;nbsp;urobiť mriežku, vyplniť mriežku, vymazať mriežku a výplňam nastaviť border a po cca 4 hodinách máte grafický základ vo formáte &lt;a href="http://en.wikipedia.org/wiki/Scalable_Vector_Graphics" class=""&gt;.svg&lt;/a&gt;. Na konverziu do xaml stačí už len použiť šikovný programček &lt;a href="http://www.wpf-graphics.com/ViewerSvg.aspx" class=""&gt;ViewerSvg&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Hmm. Hovoríte si, veď to je jednoduché. To áno, ale to nie je všetko, čaká Vás ta horšia časť a to umiestniť nad každé tlačidlo (po svg importe &lt;a href="http://www.longhorncorner.com/UploadFile/mahesh/XamlPath06102005084852AM/XamlPath.aspx" class=""&gt;element Path&lt;/a&gt;) a tieto dva elementy groupnuť do &lt;a href="http://www.longhorncorner.com/UploadFile/mahesh/XamlCanvas06162005170309PM/XamlCanvas.aspx" class=""&gt;elementu Canvas&lt;/a&gt;&amp;nbsp;z dôvodu aby sme nad tlačidlom mohli urobiť hover efekt a bohužial Path nemôže obsahovať child elementy narozdiel od Canvasu. Rutinná práca ale výsledok stojí za to:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://vlko.zilina.net/dwn/blog/WPFLayout.jpg"&gt;&lt;/p&gt;
&lt;p&gt;V tejto fáze som bol nadšený, mam panel pre pravú ruku s pekným hover efektom, je časť zavrieť &lt;a href="http://www.microsoft.com/expression/" class=""&gt;Microsoft Expression Blend 2&lt;/a&gt;&amp;nbsp;a nastáva coding fáza.&lt;/p&gt;
&lt;h3&gt;KROK č.2 Stlačme kláves po prvé&lt;/h3&gt;
&lt;p&gt;Tak a teraz trošku teórie. V podstate sú dve možnosti ako urobiť on screen klávesnicu&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;Pri kliku na klávesu zachytiť aktuálny focus, stlačiť klávesu vrátiť focus a poslať stisk klávesy (viď &lt;span class="ArticleTopTitle" id="ctl00_ArticleTopHeader_ArticleTitle"&gt;&lt;a href="http://www.codeproject.com/KB/cpp/onscreenkeyboard.aspx" class=""&gt;Onscreen Keyboard&lt;/a&gt;&lt;/span&gt;). Ale povedzme si úprimne: toto riešenie je hrozné, pretože ak nenastavíme carret position na koniec, tak nám zmaže input (v prípade štandardného textboxu, ten štandardne pri focuse označí celý text) a k tomu to preblikávanie focusu.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Vo &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx" class=""&gt;WndProc&lt;/a&gt; zachytiť správu WM_MOUSEACTIVATE a vrátiť MA_NOACTIVATE okrem toho ešte pridať v &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.createparams.aspx" class=""&gt;CreateParams&lt;/a&gt; funkcii do StyleEx WS_EX_NOACTIVATE flag.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Toľko teórie, čerpať zaujímavé informácie môžte z článku &lt;a href="http://yortondotnet.blogspot.com/2006/11/on-screen-keyboards.html"&gt;On-screen Keyboards&lt;/a&gt;&amp;nbsp;a pre nás je dôležité, že voľba padla na možnosť č.2.&lt;/p&gt;
&lt;p&gt;Teória robí majstra, bohužiaľ WPF okno nemá ani &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx" class=""&gt;WndProc&lt;/a&gt; ani &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.createparams.aspx" class=""&gt;CreateParams&lt;/a&gt;. Niet sa čomu čudovať, je to nová technológia, ktorá sa snaží vyhýbať balastu starých API funkcií a okrem toho všetko by už malo byť prístupné cez vlastnosti objektu, teda žiadné skryté vlastnosti cez nejaký nepublikovanú flag hodnotu. Teda máme tu atribút &lt;b&gt;Focusable="false"&lt;/b&gt; bohužiaľ to funguje len na text input elementy. &lt;/p&gt;
&lt;p&gt;Musíme isť hlbšie a porozmýšľať. Veď nech sa na to pozriem z akejkoľvek strany, wpf okno je stale postavené na starom jadre a teda musí existovať spôsob ako získať jeho handle&amp;nbsp; a k čomu máme handle, tomu vieme zameniť WndProc aj nastaviť cez API funkcie StyleEx. Pár dobre mierených dotazov do google nám vráti &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.interop.windowinterophelper.aspx" class=""&gt;WindowInteropHelper&lt;/a&gt; triedu. A my sa môžme pustiť konečne do kódu:&lt;/p&gt;
&lt;div style="background:black none repeat scroll 0% 0%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:aqua;font-family:Consolas;"&gt;
&lt;div style="background:black none repeat scroll 0% 0%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:aqua;font-family:Consolas;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private void &lt;span style="color:white;"&gt;Window_Loaded&lt;/span&gt;(object &lt;span style="color:white;"&gt;sender&lt;/span&gt;, &lt;span&gt;RoutedEventArgs&lt;/span&gt; &lt;span style="color:white;"&gt;e&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;WindowInteropHelper&lt;/span&gt; &lt;span style="color:white;"&gt;windowHandle&lt;/span&gt; = new &lt;span&gt;WindowInteropHelper&lt;/span&gt;(this);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// hWnd is the window you want to subclass..., create a new &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// delegate for the new wndproc&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;newWndProc&lt;/span&gt; = new &lt;span&gt;WindowAPI&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span&gt;Win32WndProc&lt;/span&gt;(&lt;span style="color:white;"&gt;OverridedWndProc&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// subclass&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;oldWndProc&lt;/span&gt; = &lt;span&gt;WindowAPI&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;SetWindowLong&lt;/span&gt;(&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;windowHandle&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Handle&lt;/span&gt;, &lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;WindowAPI&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GWL_WNDPROC&lt;/span&gt;,&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;newWndProc&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;//get current window style of child form&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int &lt;span style="color:white;"&gt;style&lt;/span&gt; = &lt;span&gt;WindowAPI&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GetWindowLong&lt;/span&gt;(&lt;span style="color:white;"&gt;windowHandle&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Handle&lt;/span&gt;, &lt;span&gt;WindowAPI&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GWL_STYLE&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;//set new style&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;WindowAPI&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;SetWindowLong&lt;/span&gt;(&lt;span style="color:white;"&gt;windowHandle&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Handle&lt;/span&gt;, &lt;span&gt;WindowAPI&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;GWL_STYLE&lt;/span&gt;, (&lt;span style="color:white;"&gt;style&lt;/span&gt; | &lt;span&gt;WindowAPI&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;WS_EX_NOACTIVATE&lt;/span&gt;));&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;Vo WindowAPI triede sa nachádzaju namapované funkcie (definície možné nájsť na &lt;a href="http://pinvoke.net/" class=""&gt;pinvoke.net&lt;/a&gt;). Overridnut WndProc už potom vyzerá ibá takto:&lt;/p&gt;
&lt;div style="background:black none repeat scroll 0% 0%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:aqua;font-family:Consolas;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private int &lt;span style="color:white;"&gt;OverridedWndProc&lt;/span&gt;(&lt;span&gt;IntPtr&lt;/span&gt; &lt;span style="color:white;"&gt;hWnd&lt;/span&gt;, int &lt;span style="color:white;"&gt;Msg&lt;/span&gt;, int &lt;span style="color:white;"&gt;wParam&lt;/span&gt;, int &lt;span style="color:white;"&gt;lParam&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; switch (&lt;span style="color:white;"&gt;Msg&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case &lt;span&gt;WindowAPI&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;WM_MOUSEACTIVATE&lt;/span&gt;:&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;//System.Windows.Forms.MessageBox.Show("Clicked");&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span&gt;WindowAPI&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;MA_NOACTIVATE&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span&gt;WindowAPI&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;CallWindowProc&lt;/span&gt;(&lt;span style="color:white;"&gt;oldWndProc&lt;/span&gt;, &lt;span style="color:white;"&gt;hWnd&lt;/span&gt;, &lt;span style="color:white;"&gt;Msg&lt;/span&gt;, &lt;span style="color:white;"&gt;wParam&lt;/span&gt;, &lt;span style="color:white;"&gt;lParam&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Nasleduje kompilácia a samozrejme &lt;b&gt;veľké sklamanie&lt;/b&gt;, pretože &lt;u&gt;WPF&amp;nbsp;window&amp;nbsp;pri WS_EX_NOACTIVATE flagu urobí z okna pekný statický obrázok, ktorý nereaguje na žiadne vonkajšie podnety&lt;/u&gt;. Niekde na msdn som našiel príspevok, že možno niekedy v budúcnosti bude wpf také niečo podporovať. Tudy cesta nevedie. Tak to skúsme inak.&lt;/p&gt;
&lt;h3&gt;KROK č.3 Stlačme kláves po druhý krát&lt;/h3&gt;
&lt;p&gt;Pretože máme spravený vzhľad vo WPF a vieme, že onscreen klávesnicu je možné spraviť iba na štandardnom win okne, je potrebné tieto dve technolófie spojiť.&amp;nbsp;Na to už človek nepotrebuje ani google, aby našiel &lt;a href="http://msdn.microsoft.com/en-us/library/ms745781.aspx" class=""&gt;ElementHost control&lt;/a&gt;. Potom už stačí iba použiť našu non activate window techniku:&lt;/p&gt;
&lt;div style="background:black none repeat scroll 0% 0%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:aqua;font-family:Consolas;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private const int &lt;span style="color:white;"&gt;WS_EX_NOACTIVATE&lt;/span&gt; = &lt;span style="color:fuchsia;"&gt;0x08000000&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; protected override &lt;span&gt;CreateParams&lt;/span&gt; &lt;span style="color:white;"&gt;CreateParams&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;CreateParams&lt;/span&gt; &lt;span style="color:white;"&gt;createParams&lt;/span&gt; = base.&lt;span style="color:white;"&gt;CreateParams&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;createParams&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;ExStyle&lt;/span&gt; = &lt;span style="color:white;"&gt;createParams&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;ExStyle&lt;/span&gt; | &lt;span style="color:white;"&gt;WS_EX_NOACTIVATE&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;createParams&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private const int &lt;span style="color:white;"&gt;WM_MOUSEACTIVATE&lt;/span&gt; = &lt;span style="color:fuchsia;"&gt;0x0021&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; private const int &lt;span style="color:white;"&gt;MA_NOACTIVATE&lt;/span&gt; = &lt;span style="color:fuchsia;"&gt;0x0003&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void &lt;span style="color:white;"&gt;WndProc&lt;/span&gt;(ref &lt;span&gt;Message&lt;/span&gt; &lt;span style="color:white;"&gt;m&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;//If we're being activated because the mouse clicked on us...&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (&lt;span style="color:white;"&gt;m&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Msg&lt;/span&gt; == &lt;span style="color:white;"&gt;WM_MOUSEACTIVATE&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;//Then refuse to be activated, but allow the click event to pass through (don't use MA_NOACTIVATEEAT)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;m&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Result&lt;/span&gt; = (&lt;span&gt;IntPtr&lt;/span&gt;)&lt;span style="color:white;"&gt;MA_NOACTIVATE&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; base.&lt;span style="color:white;"&gt;WndProc&lt;/span&gt;(ref &lt;span style="color:white;"&gt;m&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;A na prekvapenie, takto vytvorené okno s WPF&amp;nbsp;user controlom v sebe už&amp;nbsp;pracuje ako má.&amp;nbsp;Teda reaguje na všetky myšie eventy a nekradne focus aktívnej aplikácii. &lt;/p&gt;
&lt;p&gt;Po dlhej dobe konečne&amp;nbsp;dobrá správa už nám&amp;nbsp;iba&amp;nbsp;chýba&amp;nbsp;ľavá časť klávesnice.&lt;/p&gt;
&lt;h3&gt;KROK č.4 Flip it horizontal&lt;/h3&gt;
&lt;p&gt;Dostávam sa do pracovnej horúčky otáčam wpf control pomocou transformácie &amp;lt;ScaleTransform ScaleX="-1" ScaleY="1"/&amp;gt;. Ostáva už len tak isto transformovať všetky textové elementy podobným spôsobom, aby text nebol zobrazený zrkadlovo. A už veselo kompilujeme..&lt;/p&gt;
&lt;p&gt;Išlo to príliš rýchlo, že? Ale tak to v našom živote nechodí a ja narážam na známy WPF bug &lt;a href="http://forums.msdn.microsoft.com/en-US/wpf/thread/40bcfac6-8023-4d42-a019-5a6dcb9f6c6d" class=""&gt;[BUG 3.5 BETA 2] BitmapEffect + RenderTransform = Incorrect clipping&lt;/a&gt;. Našťastie existuje workarround s nastavením Background="Transparent".&lt;/p&gt;
&lt;p&gt;Aj toto sa Vám zdalo moc rýchle &lt;i&gt;(v pozadí je cca&amp;nbsp;4 hodiny zmien kódu a hľadania správneho keywordu do googlu)? &lt;/i&gt;Tak nasleduje ďalší kopanec a to, že canvas elementy, v ktorých su path elementy sú štvorcové a transparent farba zachytáva mouse efekty&amp;nbsp;a keďže sa rôzne prekrývaju. Výsledom&amp;nbsp;je, že&amp;nbsp;celá hover funkčnosť je&amp;nbsp;v háji a my sa môžeme vrátiť k Inkscape otočiť obrázok a manuálne opäť urobiť opäť bod 1.&lt;/p&gt;
&lt;h3&gt;KROK č.5 Make it transparent&lt;/h3&gt;
&lt;p&gt;Tak nejak začínam šípiť, prečo sú programátori tak dobre platený, pretože nastaviť transparentnosť okna určite nestačí aby hostovaný WPF control bol priesvitný. A tak musíme použiť region aby okno aspoň z diaľky vyzeralo ako wpf okno z bodu 1.&lt;/p&gt;
&lt;p&gt;Stačí nastaviť správnu farbu pozadia. Urobiť screenshot okna, trošku screenshot upraviť aby sa niekde vo vnútri neobjavovali rovnaké farby ako tie podľa ktorých okno budeme orezávať a správny kod na vytvorenie &lt;a href="http://vckicks.110mb.com/custom_shape_form_region.html" class=""&gt;Custom Shape Form nájdete tu&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;KROK č.6 A nezabudnúť na užívateľskú príťažlivosť&lt;/h3&gt;
&lt;p&gt;Aj keď mame virtuálnu klávesnícu peknú oblú, priesvitnú a vlastne nech by bola akokoľvek krásna, ak bude stále otravovať na obrazovke určite to užívateľov nepoteší. Musíme teda správiť aktívne zóny, pri kliknutí na ktoré sa naša virtuálna klávesnica zobrazí.&lt;/p&gt;
&lt;p&gt;Na aktívne zóny potrebujeme mouse global&amp;nbsp;hook. A samozrejme až taký v C# napíšete &lt;i&gt;(tak ako ja)&lt;/i&gt;, zistíte, že .net global hook-y v managed kóde nepodporuje. Zostáva nám teda C++ a unmanaged kód. Opäť si pomôžeme opensource zdrojmi a použijeme jeden napr. z &lt;a href="http://www.codeproject.com/KB/system/globalsystemhook.aspx" class=""&gt;Global System Hooks in .NET&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Aby sme opäť neboli len copy'n'paste programátormi, musíme ešte&amp;nbsp;upraviť&amp;nbsp;C++ kód, aby po kliknutí na aktívnu zónu nam bolo umožnené zahodiť všetky nechcené mouse eventy. Pri použití prsta na daný plochu klikneme a ak sa na danom mieste nachádza nejaká aplikácia, dochádza k nechcenému prekliku. &lt;/p&gt;
&lt;h3&gt;KROK č.7 Finalizujeme&lt;/h3&gt;
&lt;p&gt;Ostávaju už len drobnosti ako:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;konfigurácia kláves pomocou XML súboru&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;konfigurácia aplikácie&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;troška kódu aby sa klávesnica po určitej nečinnosti sama schovala&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;štipku medzerníka&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;systray ikonku spolu s menu, aby sme aplikáciu vedeli aj zavrieť&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;zverejniť zdrojový kód&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;A najťažšia časť:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;napísať tento blog príspevok aby sa už nikto nikdy nedopustil podobných omylov&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h3&gt;Výsledok práce&lt;/h3&gt;
&lt;p&gt;Binárka: &lt;a href="http://vlko.zilina.net/dwn/onscreenkeyboard.zip"&gt;http://vlko.zilina.net/dwn/onscreenkeyboard.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Zdrojové kódy: &lt;a href="http://vlko.zilina.net/dwn/onscreenkeyboard-src.zip"&gt;http://vlko.zilina.net/dwn/onscreenkeyboard-src.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Na zdrojové kódy, ani obrázky si neuplatňujem žiadne autorské práva. Ak ma niekto chuť môže aplikáciu umiestniť na codeplex, alebo podobné miesto, aplikácii to určite pomôže.&lt;/p&gt;
&lt;h3&gt;VAROVANIE&lt;/h3&gt;
&lt;p&gt;Pre použitie WPF hostingu sa aplikácia stala žrútom pamäti. 85 MB mi príde na množstvo kódu a to čo má aplikácia robiť fakt prehnané. Tu je každá rada drahá, nenájde sa nejaká po ruke?&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx&amp;amp;;title=WPF+OnScreenKeybord+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx&amp;amp;;title=WPF+OnScreenKeybord+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx&amp;amp;;title=WPF+OnScreenKeybord+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx&amp;amp;title=WPF+OnScreenKeybord+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx&amp;amp;;title=WPF+OnScreenKeybord+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx&amp;amp;;title=WPF+OnScreenKeybord+coding+story+%5bupdate+1%5d&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx&amp;amp;;subject=WPF+OnScreenKeybord+coding+story+%5bupdate+1%5d" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/06/01/wpf-onscreenkeybord-coding-story.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=227759" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/announce/default.aspx">announce</category><category domain="http://blog.vyvojar.cz/vlko/archive/tags/Coding+story/default.aspx">Coding story</category></item><item><title>Zaujímavy TODO hack</title><link>http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx</link><pubDate>Fri, 30 May 2008 08:57:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:227737</guid><dc:creator>vlko</dc:creator><slash:comments>5</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/227737.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=227737</wfw:commentRss><description>&lt;p&gt;Dnes ma pri písaní správičky &lt;a href="http://www.aspnet.sk/News-C-Pre-Processor-direktivy-100168.aspx"&gt;C# Pre Processor direktívy &lt;/a&gt;napadol celkom zaujímavy TODO hack:&lt;/p&gt;&lt;p&gt;&lt;span&gt;#warning&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt;TODO: 
tato sprava sa zobrazi ako warning pri kompilacii a ako polozka v tasklistu ak 
je subor otvoreny&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Teda takýto TODO komentár sa zobrazí v Task Liste ak máte daný súbor otvorený, alebo ako warning pri kompilácii.&lt;/p&gt;&lt;p&gt;Hmmm zaujímave, ale kto vie či aj prakticky využiteľné používať warningy ako todo commenty:) &lt;br&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx&amp;amp;;title=Zauj%26%23237%3bmavy+TODO+hack" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx&amp;amp;;title=Zauj%26%23237%3bmavy+TODO+hack" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx&amp;amp;;title=Zauj%26%23237%3bmavy+TODO+hack" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx&amp;amp;title=Zauj%26%23237%3bmavy+TODO+hack" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx&amp;amp;;title=Zauj%26%23237%3bmavy+TODO+hack" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx&amp;amp;;title=Zauj%26%23237%3bmavy+TODO+hack&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx&amp;amp;;subject=Zauj%26%23237%3bmavy+TODO+hack" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/05/30/zauj-mavy-todo-hack.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=227737" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/coding/default.aspx">coding</category></item><item><title>[ANN] Správičky na aspnet.sk</title><link>http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx</link><pubDate>Wed, 27 Feb 2008 09:05:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:227207</guid><dc:creator>vlko</dc:creator><slash:comments>1</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/227207.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=227207</wfw:commentRss><description>&lt;h2&gt;Intro &lt;br&gt;&lt;/h2&gt;
&lt;p&gt;Kedysi dávno tu na vývojari vychádzala zaujímava séria článkov &lt;a href="http://www.vyvojar.cz/Categories/27-par-komentovanych-odkazu.aspx"&gt;Pár komentovaný odkazov od Slava Furmana&lt;/a&gt;. Zopár pamätníkov si na to určite so slzou v oku spomenie. Mne osobne to trošku pootvorilo dvere do sveta plného tajov zaujímavých technológii, postupov, atď.&lt;/p&gt;
&lt;p&gt;Plný naivného nadšenia, som preto na portáli &lt;a href="http://www.aspnet.sk"&gt;aspnet.sk&lt;/a&gt; minulý rok v októbri vytvoril diskusný thread, kde som začal pastovať linky nájdene pri browsovani rôznymi webmi a rss feedami,&amp;nbsp; spolu so slovenským popisom, čo by sa na nich zaujímave mohlo nachádzať (link: &lt;a href="http://www.aspnet.sk/Forum/Zaujimave-linky-3781.aspx"&gt;Zaujimave linky&lt;/a&gt;). A že sa mi to celkom začalo dariť, tak som inšpiroval &lt;a href="http://www.aspnet.sk/Author.aspx"&gt;Spigiho&lt;/a&gt;, čo je vlastne niečo ako veľký tato tohto portálu, aby vytvoril na správičky osobitnú sekciu.&lt;/p&gt;
&lt;h2&gt;Announce &lt;/h2&gt;&lt;p&gt;A tak si teda dovoľujem do našeho malého česko-slovenského komunitného sveta uviesť tento nový projekt:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.aspnet.sk/News.aspx"&gt;Správičky na aspnet.sk&lt;/a&gt; a k ním priradený &lt;a href="http://www.aspnet.sk/rss.ashx?w=news"&gt;RSS feed&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;PS: Nakoniec by sa možno hodilo niekoľko tych lepých fráz ako &lt;i&gt;"Nech vám to slúži k úžitku."&lt;/i&gt; alebo &lt;i&gt;"Zostáva už dodať, že sa vam obsah a forma zapáči natoľko, že sa na tvorbe obsahu budete spolupodieľať."&lt;/i&gt; alebo naivne povzbudzovacio &lt;i&gt;"Tak načo čakáte hor sa do čítania."&lt;/i&gt; alebo som už videl aj &lt;i&gt;"Nech vás sprevádza sila."&lt;/i&gt;, ale ja osobne ich nemusím takže končím bez nich.&lt;br&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx&amp;amp;;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+na+aspnet.sk" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx&amp;amp;;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+na+aspnet.sk" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx&amp;amp;;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+na+aspnet.sk" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx&amp;amp;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+na+aspnet.sk" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx&amp;amp;;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+na+aspnet.sk" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx&amp;amp;;title=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+na+aspnet.sk&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx&amp;amp;;subject=%5bANN%5d+Spr%26%23225%3bvi%c4%8dky+na+aspnet.sk" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/02/27/ann-spr-vi-ky-na-aspnet-sk.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=227207" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/announce/default.aspx">announce</category></item><item><title>Resolve absolute path from relative</title><link>http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx</link><pubDate>Thu, 03 Jan 2008 15:54:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:226875</guid><dc:creator>vlko</dc:creator><slash:comments>8</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/226875.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=226875</wfw:commentRss><description>&lt;p&gt;&lt;i&gt;Dnes to bude rychlé, ale možno sa tento kód niekomu v buducnosti hod&lt;/i&gt;í.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Mam knižnicu, ktorej ak sa predá relativna cesta k súboru, tak nefunguje spravne, musel som teda vyrobiť kód, ktory ak sa mu preda relativna a aktuálna cesta, vráti absolútnu cestu k danému súboru.&lt;/p&gt;

&lt;p&gt;Jej funkčnosť si možete skontrolovať na týchto výsledkoch:&lt;/p&gt;

&lt;pre&gt;currentPath: c:\Program Files\some application\bin\Release&lt;br&gt;ResolveAbsolutePath("test.pst", currentPath) becomes to:&lt;br&gt;  c:\Program Files\some application\bin\Release\test.pst&lt;br&gt;ResolveAbsolutePath(".\test.pst", currentPath) becomes to:&lt;br&gt;  c:\Program Files\some application\bin\Release\test.pst&lt;br&gt;ResolveAbsolutePath("..\..\test.pst", currentPath) becomes to:&lt;br&gt;  c:\Program Files\some application\test.pst&lt;br&gt;ResolveAbsolutePath(@"D:\level1\level2\level3\test.pst", currentPath) becomes to:&lt;br&gt;  D:\level1\level2\level3\test.pst&lt;br&gt;ResolveAbsolutePath("..\..\test.pst", @"\\vlko\level1\level2") becomes to:&lt;br&gt;  \\vlko\test.pst &lt;br&gt;&lt;/pre&gt;
&lt;p&gt;Nuž a tu nasleduje kód, len tak pre zaujímavosť máte niekto ešte nejaky iný sposob ako dosiahnuť podobného výsledku?&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;div style="background:black none repeat scroll 0% 0%;font-family:Courier New;font-size:10pt;color:aqua;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Resolves the absolute path.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;param name="relativePath"&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The relative path.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;param name="currentPath"&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt;The current path.&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; static string &lt;span style="color:white;"&gt;ResolveAbsolutePath&lt;/span&gt;(string &lt;span style="color:white;"&gt;relativePath&lt;/span&gt;, string &lt;span style="color:white;"&gt;currentPath&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// some constants&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; const string &lt;span style="color:white;"&gt;cParentDir&lt;/span&gt; = &lt;span style="color:yellow;"&gt;".."&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; const string &lt;span style="color:white;"&gt;cThisDir&lt;/span&gt; = &lt;span style="color:yellow;"&gt;"."&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// split relative path&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; string[] &lt;span style="color:white;"&gt;relPath&lt;/span&gt; = &lt;span&gt;Regex&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Split&lt;/span&gt;(&lt;span style="color:white;"&gt;relativePath&lt;/span&gt;, &lt;span style="color:yellow;"&gt;@"\\"&lt;/span&gt;, &lt;span&gt;RegexOptions&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Singleline&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// initialize relative level to zero&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int &lt;span style="color:white;"&gt;relLevel&lt;/span&gt; = &lt;span style="color:fuchsia;"&gt;0&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// if nothing to change return relative path&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if ((&lt;span style="color:white;"&gt;relPath&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Length&lt;/span&gt; &amp;gt; &lt;span style="color:fuchsia;"&gt;1&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;&amp;amp; (&lt;span style="color:white;"&gt;relPath&lt;/span&gt;[&lt;span style="color:fuchsia;"&gt;0&lt;/span&gt;] != &lt;span style="color:white;"&gt;cParentDir&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;&amp;amp; (&lt;span style="color:white;"&gt;relPath&lt;/span&gt;[&lt;span style="color:fuchsia;"&gt;0&lt;/span&gt;] != &lt;span style="color:white;"&gt;cThisDir&lt;/span&gt;))&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;relativePath&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// create string builder for results&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;StringBuilder&lt;/span&gt; &lt;span style="color:white;"&gt;result&lt;/span&gt; = new &lt;span&gt;StringBuilder&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// split current path&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; string[] &lt;span style="color:white;"&gt;curPath&lt;/span&gt; = &lt;span&gt;Regex&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Split&lt;/span&gt;(&lt;span style="color:white;"&gt;currentPath&lt;/span&gt;, &lt;span style="color:yellow;"&gt;@"\\"&lt;/span&gt;, &lt;span&gt;RegexOptions&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Singleline&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// initialize current path level to last item&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int &lt;span style="color:white;"&gt;curLevel&lt;/span&gt; = &lt;span style="color:white;"&gt;curPath&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Length&lt;/span&gt; - &lt;span style="color:fuchsia;"&gt;1&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// if last item empty (curPath ends with backslash)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (&lt;span style="color:white;"&gt;curPath&lt;/span&gt;[&lt;span style="color:white;"&gt;curLevel&lt;/span&gt;] == string.&lt;span style="color:white;"&gt;Empty&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; --&lt;span style="color:white;"&gt;curLevel&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// loop till nothing to shift&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bool &lt;span style="color:white;"&gt;doPathLoop&lt;/span&gt; = true;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while (&lt;span style="color:white;"&gt;doPathLoop&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// depends on relative path level do&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; switch (&lt;span style="color:white;"&gt;relPath&lt;/span&gt;[&lt;span style="color:white;"&gt;relLevel&lt;/span&gt;])&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// if shift to parent decrease current path level and increase relative path level&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case &lt;span style="color:white;"&gt;cParentDir&lt;/span&gt;:&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; --&lt;span style="color:white;"&gt;curLevel&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ++&lt;span style="color:white;"&gt;relLevel&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// if stay on current level increase relative path level&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case &lt;span style="color:white;"&gt;cThisDir&lt;/span&gt;:&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ++&lt;span style="color:white;"&gt;relLevel&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// if all others then end looping&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;doPathLoop&lt;/span&gt; = false;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// correct relative path level&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (&lt;span style="color:white;"&gt;relLevel&lt;/span&gt; &amp;gt; (&lt;span style="color:white;"&gt;relPath&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Length&lt;/span&gt; - &lt;span style="color:fuchsia;"&gt;1&lt;/span&gt;))&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;relLevel&lt;/span&gt; = &lt;span style="color:white;"&gt;relPath&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Length&lt;/span&gt; - &lt;span style="color:fuchsia;"&gt;1&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// correct current path level&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (&lt;span style="color:white;"&gt;curLevel&lt;/span&gt; &amp;lt; &lt;span style="color:fuchsia;"&gt;0&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;curLevel&lt;/span&gt; = &lt;span style="color:fuchsia;"&gt;0&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// add to result path all necessary levels of current path&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (int &lt;span style="color:white;"&gt;i&lt;/span&gt; = &lt;span style="color:fuchsia;"&gt;0&lt;/span&gt;; &lt;span style="color:white;"&gt;i&lt;/span&gt; &amp;lt;= &lt;span style="color:white;"&gt;curLevel&lt;/span&gt;; ++&lt;span style="color:white;"&gt;i&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (&lt;span style="color:white;"&gt;i&lt;/span&gt; &amp;gt; &lt;span style="color:fuchsia;"&gt;0&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;result&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Append&lt;/span&gt;(&lt;span style="color:yellow;"&gt;"\\"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;result&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Append&lt;/span&gt;(&lt;span style="color:white;"&gt;curPath&lt;/span&gt;[&lt;span style="color:white;"&gt;i&lt;/span&gt;]);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// add to result path all necessary levels of relative path &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (int &lt;span style="color:white;"&gt;i&lt;/span&gt; = &lt;span style="color:white;"&gt;relLevel&lt;/span&gt;; &lt;span style="color:white;"&gt;i&lt;/span&gt; &amp;lt; &lt;span style="color:white;"&gt;relPath&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Length&lt;/span&gt;; ++&lt;span style="color:white;"&gt;i&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:white;"&gt;result&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;Append&lt;/span&gt;(&lt;span style="color:yellow;"&gt;"\\"&lt;/span&gt; + &lt;span style="color:white;"&gt;relPath&lt;/span&gt;[&lt;span style="color:white;"&gt;relLevel&lt;/span&gt;]);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:silver;"&gt;// finally return result&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return &lt;span style="color:white;"&gt;result&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;.&lt;/span&gt;&lt;span style="color:white;"&gt;ToString&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx&amp;amp;;title=Resolve+absolute+path+from+relative" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx&amp;amp;;title=Resolve+absolute+path+from+relative" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx&amp;amp;;title=Resolve+absolute+path+from+relative" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx&amp;amp;title=Resolve+absolute+path+from+relative" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx&amp;amp;;title=Resolve+absolute+path+from+relative" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx&amp;amp;;title=Resolve+absolute+path+from+relative&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx&amp;amp;;subject=Resolve+absolute+path+from+relative" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2008/01/03/resolve-absolute-path-from-relative.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=226875" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/zalozka/default.aspx">zalozka</category></item><item><title>OT: Zobereme veľké kladivo na Mono?</title><link>http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx</link><pubDate>Thu, 04 Oct 2007 12:27:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:226456</guid><dc:creator>vlko</dc:creator><slash:comments>9</slash:comments><comments>http://blog.vyvojar.cz/vlko/comments/226456.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/vlko/commentrss.aspx?PostID=226456</wfw:commentRss><description>&lt;p&gt;O zverejnení zdrojových kodov .NET Framework 3.5 pod &lt;a href="https://www.microsoft.com/resources/sharedsource/licensingbasics/referencelicense.mspx"&gt;Microsoft Reference License&lt;/a&gt; (MS-RL) sa hneď objavilo mnoho&amp;nbsp; blog príspevkov oslavujúcich tento akt.&lt;/p&gt;&lt;p&gt;Nie je ale všetko zlato, čo sa bliští a nie je shared source licencia ako open source licencia, táto hovorí:&lt;/p&gt;&lt;p&gt;&lt;i&gt;"Reference use" means use of the software within your company as a
reference, in read only form, for the sole purposes of debugging your
products, maintaining your products, or enhancing the interoperability
of your products with the software, and specifically excludes the right
to distribute the software outside of your company.&lt;/i&gt; &lt;/p&gt;&lt;p&gt;Teda v skrátenej forme môžete do zdrojaku nakuknúť, bohužial, ale nič z neho nemožete použiť, pretože akonáhle tak urobite, porušujete dané licenčne ujednanie.&lt;/p&gt;&lt;p&gt;Nuž a tu začína naše veľké kladivo dostavať reálnu podobu. &lt;a href="http://www.mono-project.com/Main_Page"&gt;Mono&lt;/a&gt; je open-source multiplatformná implementácia .net frameworku. A iste mi dá každý zapravdu, že ak dvaja robia tú istú implementáciu podľa špecifikácie je dosť možné, že sa im podarí napísať podobný, možno aj rovnaký kód. &lt;/p&gt;&lt;p&gt;Teraz keď máme zdrojové kódy pekne na očiach bude ťažké dokázať, či daný kód je, alebo nie je pastnutý a tým pádom porušuje licenciu, alebo je invenciou ducha jednotlivca.&lt;/p&gt;&lt;p&gt;Skôr ako ja úbohy neznalec budem túto tému rozpitvávať, pridám radšej nasledujúce odkazy, kde je táto téma spracovaná lepšie ako to kedykoľvek budem môcť ja zvládnuť:)&lt;br&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cincomsmalltalk.com/blog/blogView?showComments=true&amp;amp;printTitle=Lost_PR&amp;amp;entry=3368934005"&gt;Lost PR&lt;/a&gt; &lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eweek.com/article2/0,1895,2191754,00.asp"&gt;Microsoft's Open-Source Trap for Mono&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Čo poviete, znie to pekne strašidelne a tak sa silne pohrávam s myšlienkou, či sa bez týchto zdrojových kódov nenaučím žiť.&lt;/p&gt;&lt;p&gt;&amp;lt;joke&amp;gt;Čo tak spísať petíciu na uzatvorenie zdrojových kódov k ms produktom?&amp;lt;/joke&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx&amp;amp;;title=OT%3a+Zobereme+ve%c4%bek%26%23233%3b+kladivo+na+Mono%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx&amp;amp;;title=OT%3a+Zobereme+ve%c4%bek%26%23233%3b+kladivo+na+Mono%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx&amp;amp;;title=OT%3a+Zobereme+ve%c4%bek%26%23233%3b+kladivo+na+Mono%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx&amp;amp;title=OT%3a+Zobereme+ve%c4%bek%26%23233%3b+kladivo+na+Mono%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx&amp;amp;;title=OT%3a+Zobereme+ve%c4%bek%26%23233%3b+kladivo+na+Mono%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx&amp;amp;;title=OT%3a+Zobereme+ve%c4%bek%26%23233%3b+kladivo+na+Mono%3f&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx&amp;amp;;subject=OT%3a+Zobereme+ve%c4%bek%26%23233%3b+kladivo+na+Mono%3f" target="_blank" title = "Post http://blog.vyvojar.cz/vlko/archive/2007/10/04/ot-zobereme-ve-k-kladivo-na-mono.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=226456" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/vlko/archive/tags/Pozastavenie/default.aspx">Pozastavenie</category></item></channel></rss>