<?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>Pragmatik</title><link>http://blog.vyvojar.cz/pragmatik/default.aspx</link><description>Vezmu to zkratkou. Je to sice dál, ale zato horší cesta.</description><dc:language /><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>OT: Prázdninové počasí</title><link>http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx</link><pubDate>Fri, 22 Jul 2011 07:39:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:238711</guid><dc:creator>tomas.berny</dc:creator><slash:comments>16</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/238711.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=238711</wfw:commentRss><description>&lt;ul&gt;&lt;li&gt;Polovina prázdnin proprší.&lt;/li&gt;&lt;li&gt;Předchozí příznivé portugalské přímořské proudění přeruší přes Polsko postupující příliv parami přesyceného pobaltského povětří přinášejícího početné přeháňky.&lt;/li&gt;&lt;li&gt;Pivovary pocítí prudký pokles poptávky.&lt;/li&gt;&lt;li&gt;Prodejci plaveckých pomůcek poznají potíže.&lt;/li&gt;&lt;li&gt;Pláže plováren přestanou poskytovat příjemné poležení.&lt;/li&gt;&lt;li&gt;Průtok potoků povážlivě poroste.&lt;/li&gt;&lt;li&gt;Počítače předpovídají povodně.&lt;/li&gt;&lt;li&gt;Převozníci preventivně přeruší plavbu.&lt;/li&gt;&lt;li&gt;Půjčovny plavidel připravují pramice.&lt;/li&gt;&lt;li&gt;Policie plánuje povolat posily.&lt;/li&gt;&lt;li&gt;Penzisté podléhají podvodným praktikám podomních prodavačů protipovodňových postelí.&lt;/li&gt;&lt;li&gt;Politici protestují proti plánovanému přerušení poslaneckých prázdnin.&lt;/li&gt;&lt;li&gt;Počet potopených pozemků překvapí pojišťovny.&lt;/li&gt;&lt;li&gt;Postižené průmyslové podniky propustí polovinu pracovníků.&lt;/li&gt;&lt;li&gt;Pražané pytlují písek.&lt;/li&gt;&lt;li&gt;Potopené Podolí potřebuje pomoc.&lt;/li&gt;&lt;li&gt;Pražský primátor pláče.&lt;/li&gt;&lt;li&gt;Pesimisté prchají.&lt;/li&gt;&lt;li&gt;Pomoz pánbůh.&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/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx&amp;amp;;title=OT%3a+Pr%26%23225%3bzdninov%26%23233%3b+po%c4%8das%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.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/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx&amp;amp;;title=OT%3a+Pr%26%23225%3bzdninov%26%23233%3b+po%c4%8das%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx&amp;amp;;title=OT%3a+Pr%26%23225%3bzdninov%26%23233%3b+po%c4%8das%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx&amp;amp;title=OT%3a+Pr%26%23225%3bzdninov%26%23233%3b+po%c4%8das%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx&amp;amp;;title=OT%3a+Pr%26%23225%3bzdninov%26%23233%3b+po%c4%8das%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.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/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx&amp;amp;;title=OT%3a+Pr%26%23225%3bzdninov%26%23233%3b+po%c4%8das%26%23237%3b&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx&amp;amp;;subject=OT%3a+Pr%26%23225%3bzdninov%26%23233%3b+po%c4%8das%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2011/07/22/ot-pr-zdninov-po-as.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=238711" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/pragmatik/archive/tags/OT/default.aspx">OT</category></item><item><title>VS2010 a ladění externě spouštěných dll knihoven</title><link>http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx</link><pubDate>Wed, 16 Jun 2010 20:20:50 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:236707</guid><dc:creator>tomas.berny</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/236707.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=236707</wfw:commentRss><description>&lt;p&gt;Potřeboval jsem opravit jeden bug ve starším projektu, dělaném ješte v .NET 2.0. Jedná se o dll knihovnu s COM rozhraním, která je volána z Excelu. V projektu mám už od dob VS2005 nastavenu záložku Debug takto:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Start external program: C:\Program Files\Microsoft Office\Office12\EXCEL.EXE &lt;/li&gt;    &lt;li&gt;Command line arguments: C:\Projekty\Pragmatik\Pragmatik.xla &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Pragmatik.xla je soubor typu “Doplněk aplikace MS Excel” a obsahuje v podstatě jen makro, které zavolá Pragmatik.DLL, vytvoří z ní instanci hlavního objektu aplikace Pragmatik a předá jí odkaz na Excel, aby tato aplikace mohla Excel ovládat. Veškerý další kód Pragmatiku je už v té DLL knihovně a s výše uvedeným nastavením se dal vždy bez problémů debugovat.&lt;/p&gt;  &lt;p&gt;Po přechodu na VS2010 jsem však zjistil, že aplikace se v debug modu sice spustí a funguje, ale nezastavuje se na Breakpointech. Nebudu zbytečně popisovat, co vše jsem marně zkusil, nabídnu rovnou vysvětlení a řešení, které jsem našel na &lt;a href="http://blogs.msdn.com/b/debugger/archive/2010/04/30/can-t-hit-breakpoints-in-a-plug-in-or-can-t-debug-net-2-0-3-0-3-5-from-a-mixed-mode-exe-project-with-visual-studio-2010.aspx"&gt;Visual Studio Debugger Team Blog&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;Ve stručnosti jde o to, že pokud DLL knihovnu psanou v .NET 2.0 nebo 3.5 spouštíme pomocí externího EXE, nepozná VS2010 spávně cílový framework a použije debug engine z .NET 4.0. A ten pak nedebuguje. Řešením je udělat pro spouštěcí exe program extra konfigurační soubor a v něm explicitně určit, jaká verze frameworku se má pro debugování použít.&lt;/p&gt;  &lt;p&gt;V mém případě stačilo udělat soubor &lt;strong&gt;Excel.exe.config &lt;/strong&gt;a do něj napsat:&lt;/p&gt;  &lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;    &lt;br /&gt;&amp;lt;configuration&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;startup&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;supportedRuntime version=&amp;quot;v2.0.50727&amp;quot; /&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/startup&amp;gt;     &lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/p&gt;  &lt;p&gt;Netýká se to zdaleka jen Excelu, tak se to třeba bude někomu hodit… &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/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx&amp;amp;;title=VS2010+a+lad%c4%9bn%26%23237%3b+extern%c4%9b+spou%c5%a1t%c4%9bn%26%23253%3bch+dll+knihoven" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.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/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx&amp;amp;;title=VS2010+a+lad%c4%9bn%26%23237%3b+extern%c4%9b+spou%c5%a1t%c4%9bn%26%23253%3bch+dll+knihoven" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx&amp;amp;;title=VS2010+a+lad%c4%9bn%26%23237%3b+extern%c4%9b+spou%c5%a1t%c4%9bn%26%23253%3bch+dll+knihoven" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx&amp;amp;title=VS2010+a+lad%c4%9bn%26%23237%3b+extern%c4%9b+spou%c5%a1t%c4%9bn%26%23253%3bch+dll+knihoven" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx&amp;amp;;title=VS2010+a+lad%c4%9bn%26%23237%3b+extern%c4%9b+spou%c5%a1t%c4%9bn%26%23253%3bch+dll+knihoven" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.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/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx&amp;amp;;title=VS2010+a+lad%c4%9bn%26%23237%3b+extern%c4%9b+spou%c5%a1t%c4%9bn%26%23253%3bch+dll+knihoven&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx&amp;amp;;subject=VS2010+a+lad%c4%9bn%26%23237%3b+extern%c4%9b+spou%c5%a1t%c4%9bn%26%23253%3bch+dll+knihoven" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2010/06/16/vs2010-a-lad-n-extern-spou-t-n-ch-dll-knihoven.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=236707" width="1" height="1"&gt;</description></item><item><title>Jde to i bez generik</title><link>http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx</link><pubDate>Mon, 20 Jul 2009 16:59:10 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:234095</guid><dc:creator>tomas.berny</dc:creator><slash:comments>4</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/234095.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=234095</wfw:commentRss><description>&lt;p&gt;K jednodušší řešením občas vede cesta přes ty složitější, takže problém popsaný v minulém příspěvku lze udělat i jednodušeji a bez generik:&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;     &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;p style="margin:0px;"&gt;&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Class&lt;/span&gt; OsobaService&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetByID(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ID &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; Osoba&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; O &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Osoba&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Open(O, ID)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; O&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Friend&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Open(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; O &lt;span style="color:blue;"&gt;As&lt;/span&gt; Osoba, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ID &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; O.Jmeno = &lt;span style="color:#a31515;"&gt;&amp;quot;Jan&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; O.Prijmeni = &lt;span style="color:#a31515;"&gt;&amp;quot;Novák&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&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:blue;"&gt;Class&lt;/span&gt; ZamestnanecService&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; OsobaService&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Overloads&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetByID(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ID &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; Zamestnanec&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; Z &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Zamestnanec&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Open(Z, ID)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; Z&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Friend&lt;/span&gt; &lt;span style="color:blue;"&gt;Overloads&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Open(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Z &lt;span style="color:blue;"&gt;As&lt;/span&gt; Zamestnanec, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; id &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.Open(Z, id)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Z.Funkce = &lt;span style="color:#a31515;"&gt;&amp;quot;prodavač&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Nu což, alespoň jsem si vyzkoušel, jak generika fungují …&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/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx&amp;amp;;title=Jde+to+i+bez+generik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.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/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx&amp;amp;;title=Jde+to+i+bez+generik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx&amp;amp;;title=Jde+to+i+bez+generik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx&amp;amp;title=Jde+to+i+bez+generik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx&amp;amp;;title=Jde+to+i+bez+generik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.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/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx&amp;amp;;title=Jde+to+i+bez+generik&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx&amp;amp;;subject=Jde+to+i+bez+generik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/jde-to-i-bez-generik.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=234095" width="1" height="1"&gt;</description></item><item><title>Využití vlastních generických tříd</title><link>http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx</link><pubDate>Mon, 20 Jul 2009 13:57:04 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:234092</guid><dc:creator>tomas.berny</dc:creator><slash:comments>3</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/234092.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=234092</wfw:commentRss><description>&lt;p&gt;Při uvažování nad architekturou business vrstvy jsem narazil na zajímavý problém v implementaci dědičnosti, který mě nakonec přivedl až k použití vlastních generických tříd. Protože si myslím, že to není masově známá problematika, rozhodl jsem se o tom napsat tento článek. &lt;/p&gt;  &lt;h3&gt;Výchozí situace&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;mám třídu Osoba s vlastnostmi Jmeno a Prijmeni &lt;/li&gt;    &lt;li&gt;jejím dědicem je třída Zamestnanec, která navíc přidává vlastnost Funkce &lt;/li&gt;    &lt;li&gt;pro obě třídy potřebuji mít někde metody Open a Save, tak aby i v těchto metodách bylo využito dědičnosti. &lt;/li&gt;    &lt;li&gt;pro účely tohoto příkladu postačí, když metoda Open naplní třídu konkrétní hodnotou a metoda Save zobrazí data v MsgBoxu &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Nejjednodušší řešení, které ale nechci&lt;/h3&gt;  &lt;p&gt;Nejjednodušší učebnicový postup přikládám jen pro úplnost a pro to, abych řekl, proč se mi nehodí. Pro potřeby mé zamýšlené architektury bych totiž metody Open a Save raději neměl uvnitř objektů Osoba a Zaměstnanec, ale někde venku. Takže takto to nechci:&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;     &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; Osoba&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _jmeno &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _prijmeni &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Jmeno() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _jmeno&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _jmeno = value&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Prijmeni() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _prijmeni&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _prijmeni = value&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Open(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ID &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Jmeno = &lt;span style="color:#a31515;"&gt;&amp;quot;Jan&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Prijmeni = &lt;span style="color:#a31515;"&gt;&amp;quot;Novák&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Save()&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MsgBox(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Jmeno)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MsgBox(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Prijmeni)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; Zamestnanec&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; Osoba&lt;/p&gt;&lt;p style="margin:0px;"&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _funkce &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Funkce() &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _funkce&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _funkce = value&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Open(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ID &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.Open(ID)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Funkce = &lt;span style="color:#a31515;"&gt;&amp;quot;prodavač&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Save()&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.Save()&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MsgBox(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;.Funkce)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Řešení, které chci, ale které nefunguje&lt;/h3&gt;

&lt;p&gt;Ve třídách Osoba a Zamestnanec nechám jen vlastnosti, metody vyvedu do zvláštních tříd OsobaService a ZamestnanecService, nějak takto: &lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Class&lt;/span&gt; OsobaService&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Save(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; O &lt;span style="color:blue;"&gt;As&lt;/span&gt; Osoba)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MsgBox(O.Jmeno)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MsgBox(O.Prijmeni)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetByID(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Id &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; Osoba&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; O &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; Osoba&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; O.Jmeno = &lt;span style="color:#a31515;"&gt;&amp;quot;Jan&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; O.Prijmeni = &lt;span style="color:#a31515;"&gt;&amp;quot;Novák&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; O&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Až dosud žádný problém. Ten nastane až při pokusu implementovat ZamestnanecService:&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Class&lt;/span&gt; ZamestnanecService&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; OsobaService&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Overloads&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Save(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Z &lt;span style="color:blue;"&gt;As&lt;/span&gt; Zamestnanec)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.Save(Z)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MsgBox(Z.Funkce)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Overloads&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetByID(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ID &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; Zamestnanec&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; Z &lt;span style="color:blue;"&gt;As&lt;/span&gt; Zamestnanec = &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.GetByID(ID)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Z.Funkce = &lt;span style="color:#a31515;"&gt;&amp;quot;prodavač&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; Z&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Možná že rovnou vidíte, proč metoda GetByID nemůže fungovat, já se přiznám, že mě to nejprve nedošlo. Až když jsem při prvním spuštění dostal InvalidCastException “Objekt Osoba nelze přetypovat na Objekt Zamestnanec”, bylo mi to jasné - pokud vytvoření instance nechám na bázové třídě, vytváří se vždy instance třídy Osoba a tu už na zaměstnance nepředělám.&lt;/p&gt;

&lt;p&gt;Mohu se tomu vyhnout třeba takto:&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Class&lt;/span&gt; OsobaService&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Open(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; O &lt;span style="color:blue;"&gt;As&lt;/span&gt; Osoba)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; O.Jmeno = &lt;span style="color:#a31515;"&gt;&amp;quot;Jan&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; O.Prijmeni = &lt;span style="color:#a31515;"&gt;&amp;quot;Novák&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&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:blue;"&gt;Class&lt;/span&gt; ZamestnanecService&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; OsobaService&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Overloads&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Open(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Z &lt;span style="color:blue;"&gt;As&lt;/span&gt; Zamestnanec)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.Open(Z)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Z.Funkce = &lt;span style="color:#a31515;"&gt;&amp;quot;prodavač&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;To bych se ale v podstatě vrátil k prvnímu řešení, jen rozdělenému do 2 tříd. Musím mít nejprve vytvořenou instanci objektu, abych mohl objekt naplnit daty. Původně zamýšlené rozhraní s děditelnými metodami GetByID se mi líbí mnohem víc. Lze ho ale vůbec nějak realizovat? &lt;/p&gt;

&lt;h3&gt;Finální řešení&lt;/h3&gt;

&lt;p&gt;S použitím generických tříd se mi podařilo překonat problém s vytvářením instancí tímto způsobem:&amp;#160; &lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; OsobaService(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; Type &lt;span style="color:blue;"&gt;As&lt;/span&gt; {&lt;span style="color:blue;"&gt;New&lt;/span&gt;, Osoba})
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Save(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Value &lt;span style="color:blue;"&gt;As&lt;/span&gt; Type)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MsgBox(Value.Jmeno)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MsgBox(Value.Prijmeni)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetByID(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ID &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; Type&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; Value = &lt;span style="color:blue;"&gt;New&lt;/span&gt; Type&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;With&lt;/span&gt; Value&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Jmeno = &lt;span style="color:#a31515;"&gt;&amp;quot;Jan&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Prijmeni = &lt;span style="color:#a31515;"&gt;&amp;quot;Novák&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;With&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; Value&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; ZamestnanecService(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; Type &lt;span style="color:blue;"&gt;As&lt;/span&gt; {&lt;span style="color:blue;"&gt;New&lt;/span&gt;, Zamestnanec})&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; OsobaService(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; Type)&lt;/p&gt;&lt;p style="margin:0px;"&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Save(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Value &lt;span style="color:blue;"&gt;As&lt;/span&gt; Type)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.Save(Value)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MsgBox(Value.Funkce)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; GetByID(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ID &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; Type&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; Value = &lt;span style="color:blue;"&gt;MyBase&lt;/span&gt;.GetByID(ID)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Value.Funkce = &lt;span style="color:#a31515;"&gt;&amp;quot;řidič&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; Value&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Třída OsobaService je takto schopna pracovat s jakýmkoli typem přetypovatelným na Osoba, která má&amp;#160; bezparametrický konstruktor. Její metoda GetByID tak nevytváří natvrdo instance typu Osoba, ale typu dle parametru Type.&lt;/p&gt;

&lt;p&gt;Pro potřeby klientské aplikace je ještě vhodné udělat společné rozhraní servisní vrstvy:&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;Class&lt;/span&gt; Service&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _osoba &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; OsobaService(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; Osoba)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Private&lt;/span&gt; _zamestnanec &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; ZamestnanecService(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; Zamestnanec)&lt;/p&gt;&lt;p style="margin:0px;"&gt;
&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Osoba() &lt;span style="color:blue;"&gt;As&lt;/span&gt; OsobaService(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; Osoba)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _osoba&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt; Zamestnanec() &lt;span style="color:blue;"&gt;As&lt;/span&gt; ZamestnanecService(&lt;span style="color:blue;"&gt;Of&lt;/span&gt; Zamestnanec)&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; _zamestnanec&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Get&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Property&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Klientská aplikace pak pro získání objektu Zametnanec s ID=1 použije toto jednoduché volání:&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;p style="margin:0px;"&gt;Z = Service.Zamestnanec.GetByID(1)&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Závěr&lt;/h3&gt;

&lt;p&gt;Kompletní zdrojový kód je k dispozici &lt;a href="http://www.pragmatik.cz/ftp/genericclasses_source.zip"&gt;zde&lt;/a&gt;. Uvítám i všechny alespoň trochu konstruktivní názory a připomínky a pokud jsem snad přehlédl nějaké snadnější řešení, tak sem s ním :)&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/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx&amp;amp;;title=Vyu%c5%beit%26%23237%3b+vlastn%26%23237%3bch+generick%26%23253%3bch+t%c5%99%26%23237%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.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/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx&amp;amp;;title=Vyu%c5%beit%26%23237%3b+vlastn%26%23237%3bch+generick%26%23253%3bch+t%c5%99%26%23237%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx&amp;amp;;title=Vyu%c5%beit%26%23237%3b+vlastn%26%23237%3bch+generick%26%23253%3bch+t%c5%99%26%23237%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx&amp;amp;title=Vyu%c5%beit%26%23237%3b+vlastn%26%23237%3bch+generick%26%23253%3bch+t%c5%99%26%23237%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx&amp;amp;;title=Vyu%c5%beit%26%23237%3b+vlastn%26%23237%3bch+generick%26%23253%3bch+t%c5%99%26%23237%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.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/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx&amp;amp;;title=Vyu%c5%beit%26%23237%3b+vlastn%26%23237%3bch+generick%26%23253%3bch+t%c5%99%26%23237%3bd&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx&amp;amp;;subject=Vyu%c5%beit%26%23237%3b+vlastn%26%23237%3bch+generick%26%23253%3bch+t%c5%99%26%23237%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/07/20/vyu-it-vlastn-ch-generick-ch-t-d.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=234092" width="1" height="1"&gt;</description></item><item><title>Vyhledávání v DataTable z hlediska výkonu</title><link>http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx</link><pubDate>Fri, 29 May 2009 11:29:08 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:230467</guid><dc:creator>tomas.berny</dc:creator><slash:comments>3</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/230467.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=230467</wfw:commentRss><description>&lt;p&gt;V předchozích 2 postech (&lt;a href="http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx"&gt;1&lt;/a&gt; a &lt;a href="http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx"&gt;2&lt;/a&gt;) jsem se věnoval&amp;#160; procházení záznamů z DataTable a ukazoval jsem výsledky testů, které dokazují, jak drastický vliv na výkon může mít nesprávná deklarace typů a následné zbytečné přetypovávání DataRow na Object. Na základě připomínek jsem toto těchto testů přidal ještě vyhledávání záznamů metodou SELECT a zde je výsledek:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/pragmatik/Speed2_48640ACB.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Speed2" border="0" alt="Speed2" src="http://blog.vyvojar.cz/blogs/pragmatik/Speed2_thumb_6AD89986.jpg" width="389" height="499" /&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;a href="http://blog.vyvojar.cz/blogs/pragmatik/Speed3_651D7FE0.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Speed3" border="0" alt="Speed3" src="http://blog.vyvojar.cz/blogs/pragmatik/Speed3_thumb_75B57ACE.jpg" width="400" height="499" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Find0 .. Find3 jsou stejné jako v minulém testu&lt;/li&gt;    &lt;li&gt;Find4 je Find3 vylepšená o použití ANDALSO místo AND&lt;/li&gt;    &lt;li&gt;Find 6 je původní Find4 používající PrimaryKey a metodu Find&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Novinkou je Find5, která vypadá takto:&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;     &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; Find5(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; idr &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; okres &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; R = DT.Select(&lt;span style="color:blue;"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;idr='{0}' and okres='{1}'&amp;quot;&lt;/span&gt;, idr, okres))&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;If&lt;/span&gt; R.Length = 1 &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; R(0).Item(&lt;span style="color:#a31515;"&gt;&amp;quot;nazev&amp;quot;&lt;/span&gt;)&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Else&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Z 1. obrázku je evidentní, že metoda SELECT je velmi efektivní, plně srovnatelná s metodou FIND. Ale co když je to způsobeno jen tím, že “náhodou” vyhledávám podle stejných sloupců, ke kterým jsem ji kvůli možnosti použít metodu FIND udělal primární klíč?&lt;/p&gt;

&lt;p&gt;Vynechal jsem tedy vytvoření primárního klíče (a samozřejmě i spouštění testu Find6) a výsledek je na 2. obrázku. První použití metody SELECT trvalo cca 0,7 s, pak už byla rychlost neměřitelná stejně jako při použití metody FIND. Všimněte si ještě 3. řádku v 1. obrázku – vytvoření primárního indexu trvá 0,7 s, čili stejnou dobu, jako první spuštění metody SELECT ! Aniž bych někde pátral, jak je metoda SELECT implementovaná, dovoluji si odhadnout, že si pro každý dotaz, pro který nemůže použít primární klíč, vytváří nějakou indexovou strukturu. První vyhledání je pak docela pomalé, další už fungují výborně.&lt;/p&gt;

&lt;p&gt;Pokud tedy potřebuji nad DataTable opakovaně vykonávat stejný dotaz, je SELECT výborná volba, která je výkonnostně rovnocenná&amp;#160; FIND a navíc nemá její omezení použití na vyhledávání výhradně dle primárního klíče.&lt;/p&gt;

&lt;p&gt;Pokud bych pouštěl nad DataTable řadu různých dotazů a jejich struktura se neopakovala, mohlo by být vytváření indexů zbytečnou zátěží a jako rychlejší by v tom případě bylo napsat si vlastní cyklus. S tímto závěrem jsem ale opatrný, bylo by nutno vyzkoušet, zda SELECT opravdu při každém novém typu dotazu vytváří nové indexy nebo zda například od nějaké úrovně zaindexování již nepostupuje podle nějakého jiného algoritmu.&lt;/p&gt;

&lt;p&gt;PS: Za zmínku ještě stojí, že oproti očekáváni DirectCast není vždy rychlejší než ToString, někdy je to i obráceně. Zde bych se přikláněl k závěru, že z hlediska výkonu jsou DirectCast a ToString prakticky totožné.&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/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx&amp;amp;;title=Vyhled%26%23225%3bv%26%23225%3bn%26%23237%3b+v+DataTable+z+hlediska+v%26%23253%3bkonu" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.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/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx&amp;amp;;title=Vyhled%26%23225%3bv%26%23225%3bn%26%23237%3b+v+DataTable+z+hlediska+v%26%23253%3bkonu" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx&amp;amp;;title=Vyhled%26%23225%3bv%26%23225%3bn%26%23237%3b+v+DataTable+z+hlediska+v%26%23253%3bkonu" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx&amp;amp;title=Vyhled%26%23225%3bv%26%23225%3bn%26%23237%3b+v+DataTable+z+hlediska+v%26%23253%3bkonu" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx&amp;amp;;title=Vyhled%26%23225%3bv%26%23225%3bn%26%23237%3b+v+DataTable+z+hlediska+v%26%23253%3bkonu" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.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/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx&amp;amp;;title=Vyhled%26%23225%3bv%26%23225%3bn%26%23237%3b+v+DataTable+z+hlediska+v%26%23253%3bkonu&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx&amp;amp;;subject=Vyhled%26%23225%3bv%26%23225%3bn%26%23237%3b+v+DataTable+z+hlediska+v%26%23253%3bkonu" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/29/vyhled-v-n-v-datatable-z-hlediska-v-konu.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=230467" width="1" height="1"&gt;</description></item><item><title>Nepodceňujte režii přetypování II</title><link>http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx</link><pubDate>Thu, 28 May 2009 06:34:29 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:230448</guid><dc:creator>tomas.berny</dc:creator><slash:comments>4</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/230448.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=230448</wfw:commentRss><description>&lt;p&gt;V komentáři pod posledním postem mě S(a)tano upozornil, že jsem ve svém příkladu FindName3 přehlédl ještě jedno (respektive 2) přetypování. Místo:&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;     &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;idr&amp;quot;&lt;/span&gt;) = idr &lt;span style="color:blue;"&gt;And&lt;/span&gt; R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;okres&amp;quot;&lt;/span&gt;) = okres &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;doporučuje S(a)tano použít: &lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;DirectCast&lt;/span&gt;(R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;idr&amp;quot;&lt;/span&gt;), &lt;span style="color:blue;"&gt;String&lt;/span&gt;) = idr &lt;span style="color:blue;"&gt;And&lt;/span&gt; &lt;span style="color:blue;"&gt;DirectCast&lt;/span&gt;(R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;okres&amp;quot;&lt;/span&gt;), &lt;span style="color:blue;"&gt;String&lt;/span&gt;) = okres &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
Když už jsem měl hotový testovací prográmek, rozhodl jsem se že to vyzkouším, navíc jsem zkusil i variantu:&amp;#160; &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;idr&amp;quot;&lt;/span&gt;).ToString = idr &lt;span style="color:blue;"&gt;And&lt;/span&gt; R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;okres&amp;quot;&lt;/span&gt;).ToString = okres &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Výsledek je tento:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/pragmatik/Speed_1D7F3834.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Speed" border="0" alt="Speed" src="http://blog.vyvojar.cz/blogs/pragmatik/Speed_thumb_07491CE2.jpg" width="400" height="423" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Find0&lt;/strong&gt;&lt;/li&gt;

  &lt;ul&gt;
    &lt;li&gt;vyhledávání pomocí cyklu&lt;/li&gt;

    &lt;li&gt;R as Object&lt;/li&gt;

    &lt;li&gt;porovnávání pomocí R.Item(“idr”)&lt;/li&gt;
  &lt;/ul&gt;

  &lt;li&gt;&lt;strong&gt;Find1&lt;/strong&gt;&lt;/li&gt;

  &lt;ul&gt;
    &lt;li&gt;vyhledávání pomocí cyklu&lt;/li&gt;

    &lt;li&gt;R as DataRow&lt;/li&gt;

    &lt;li&gt;porovnávání pomocí R.Item(“idr”)&lt;/li&gt;
  &lt;/ul&gt;

  &lt;li&gt;&lt;strong&gt;Find2&lt;/strong&gt;&lt;/li&gt;

  &lt;ul&gt;
    &lt;li&gt;vyhledávání pomocí cyklu&lt;/li&gt;

    &lt;li&gt;R as DataRow&lt;/li&gt;

    &lt;li&gt;porovnávání pomocí R.Item(“idr”).ToString&lt;/li&gt;
  &lt;/ul&gt;

  &lt;li&gt;&lt;strong&gt;Find3&lt;/strong&gt;&lt;/li&gt;

  &lt;ul&gt;
    &lt;li&gt;vyhledávání pomocí cyklu&lt;/li&gt;

    &lt;li&gt;R as DataRow &lt;/li&gt;

    &lt;li&gt;porovnávání pomocí DirectCast(R.Item(“idr”),String)&lt;/li&gt;
  &lt;/ul&gt;

  &lt;li&gt;&lt;strong&gt;Find4&lt;/strong&gt;&lt;/li&gt;

  &lt;ul&gt;
    &lt;li&gt;vyhledávání metodou Find s využitím PrimaryKey&lt;/li&gt;
  &lt;/ul&gt;
&lt;/ul&gt;

&lt;p&gt;A závěr? Vyhledávání pomocí procházení DataTable se není třeba obávat až tak moc, jak jsem si původně myslel. Samozřejmě že pokud vyhledáváme vždy podle stejné kombinace sloupců, je nejlepší použít PrimaryKey a metodu Find, nicméně často nezbývá jiná možnost než použít cyklus. Pokud se nedopustíme zásadní chyby s přetypováním DataRow na Object jako se to povedlo mě, bude to pro řadu případů výkonnostně plně vyhovovat. &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/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx&amp;amp;;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b+II" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.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/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx&amp;amp;;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b+II" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx&amp;amp;;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b+II" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx&amp;amp;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b+II" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx&amp;amp;;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b+II" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.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/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx&amp;amp;;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b+II&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx&amp;amp;;subject=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b+II" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/28/nepodce-ujte-re-ii-p-etypov-n-ii.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=230448" width="1" height="1"&gt;</description></item><item><title>Nepodceňujte režii přetypování</title><link>http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx</link><pubDate>Wed, 27 May 2009 20:18:41 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:230444</guid><dc:creator>tomas.berny</dc:creator><slash:comments>5</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/230444.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=230444</wfw:commentRss><description>&lt;p&gt;Dostal jsem po kolegovi&amp;#160; k “ladění” zdrojový kód, který fungoval sice dobře, ale příliš pomalu. Pes nebyl zakopaný příliš hluboko, velmi rychle jsem objevil hrůzu typu:&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;     &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; FindName1(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ID &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Okres &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; s = &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;For&lt;/span&gt; &lt;span style="color:blue;"&gt;Each&lt;/span&gt; R &lt;span style="color:blue;"&gt;In&lt;/span&gt; Partners.Rows&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;If&lt;/span&gt; R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;) = ID &lt;span style="color:blue;"&gt;And&lt;/span&gt; R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;okres&amp;quot;&lt;/span&gt;) = Okres &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; s = R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;nazev&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Exit&lt;/span&gt; &lt;span style="color:blue;"&gt;For&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; s&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
Podobných “vyhledávacích” funkcí nad objekty typu DataTable tam bylo nespočet, pracovaly nad tabulkami o 100 000 řádků a co bylo nejhorší, ty funkce se volaly uvnitř cyklů, které měly 10 000 opakování! Náprava je v principu snadná: 

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; FindName2(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ID &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Okres &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; R = Partners.Rows.Find(&lt;span style="color:blue;"&gt;New&lt;/span&gt; &lt;span style="color:blue;"&gt;Object&lt;/span&gt;() {ID, Okres})&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;If&lt;/span&gt; R &lt;span style="color:blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;Nazev&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Else&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
Přičemž samozřejmě do procedury, která plní DataTable Partners je třeba doplnit toto:&amp;#160; &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;Partners.PrimaryKey = &lt;span style="color:blue;"&gt;New&lt;/span&gt; DataColumn() {Partners.Columns(&lt;span style="color:#a31515;"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;), Partners.Columns(&lt;span style="color:#a31515;"&gt;&amp;quot;okres&amp;quot;&lt;/span&gt;)}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Protože tuto opravu bylo třeba provést na mnoha místech, chtěl jsem nejprve otestovat, jak podstatný vliv to bude mít na výslednou rychlost. Udělal jsem si proto jednoduchý testovací prográmek a v něm měřil rychlost funkcí FindName1 a FindName2 na DataTable o 100 000 řádků. Rozdíl byl drastický a samozřejmě úměrně rostl s pozicí hledaného řádku. Zatímco funkce FindName2 trvala při prvním spuštění cca 0,010 s a při každém dalším už méně než 0,001ms (že by se PrimaryKey indexoval až při prvním použití?), FindName1 pro první řádky DataTable běžela 0,02 s a pro řádky z konce tabulky trvala nekonečných 1,8 s.&lt;/p&gt;

&lt;p&gt;I zaradoval jsem se převelice a těšil se, jak pro přepsání všech funkcí typu FindName1 vše 1000x urychlím a pochvala před nastoupenou jednotkou mě nemine. Pak mě ale napadlo spočítat, kolik času celkem ušetřím, když 20 000x zavolám FindName2 místo FindName1. Zhruba 20 000 s, což je 5,5 hodiny.&amp;#160; Jenže tak dlouho původní “pomalý” program neběží, ten na daném vzorku dat pracuje 4 hodiny a to samozřejmě vykonává mnohem více funkcí, včetně ukládání zpracovaných dat do databáze. Jak je to možné?&lt;/p&gt;

&lt;p&gt;Udělal jsem i měření přímo v původním programu a s úžasem jsem zjistil, že v něm probíhá procházení řádky DataTable 100x rychleji, než v mém testovacím příkladu. Nad těmi samými daty, na tom samém stroji. Mohl jsem to nechat být, protože tak jako tak je princip použitý ve FindName2 výrazně lepší, ale asi mi dáte za pravdu, že přijít tomu na kloub bylo otázkou cti. Nebudu Vás déle napínat, řešení je zde:&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, 'Courier New', courier, monospace;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; FindName3(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; ID &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Okres &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;) &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; s = &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;For&lt;/span&gt; &lt;span style="color:blue;"&gt;Each&lt;/span&gt; R &lt;span style="color:blue;"&gt;As&lt;/span&gt; DataRow &lt;span style="color:blue;"&gt;In&lt;/span&gt; Partners.Rows&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;If&lt;/span&gt; R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;) = ID &lt;span style="color:blue;"&gt;And&lt;/span&gt; R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;okres&amp;quot;&lt;/span&gt;) = Okres &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; s = R.Item(&lt;span style="color:#a31515;"&gt;&amp;quot;nazev&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Exit&lt;/span&gt; &lt;span style="color:blue;"&gt;For&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Next&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; s&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;FindName 3 je v mém případě 100x rychlejší, než FindName1. Na vině je přetypovávání objektu DataRow na Object v každém cyklu při jeho přiřazování do R. Opravdu bych nečekal, že to bude mít tak velký vliv.&lt;/p&gt;

&lt;p&gt;Poučení z toho plynoucí je nasnadě: Vyhýbejte se zbytečnému přetypovávání, režie s tím spojená nemusí být zanedbatelná!&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/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx&amp;amp;;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.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/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx&amp;amp;;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx&amp;amp;;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx&amp;amp;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx&amp;amp;;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.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/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx&amp;amp;;title=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx&amp;amp;;subject=Nepodce%c5%88ujte+re%c5%beii+p%c5%99etypov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/05/27/nepodce-ujte-re-ii-p-etypov-n.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=230444" width="1" height="1"&gt;</description></item><item><title>Komponenta pro zvýrazňování syntaxe</title><link>http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx</link><pubDate>Thu, 15 Jan 2009 11:54:42 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228897</guid><dc:creator>tomas.berny</dc:creator><slash:comments>6</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/228897.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=228897</wfw:commentRss><description>&lt;p&gt;Pro aktuální projekt potřebuji textový editor se zvýrazňováním syntaxe. Našel jsem sice pár příkladů, jak o tuto funkci rozšířit RitchTextBox, ale vždy to bylo jen jako ukázka postupu, nikoliv jako hned použitelné řešení. Protože nemám čas se tím hlouběji zabývat, sáhl jsem po první cenově přijatelné komponentě, kterou jsem našel : &lt;a href="http://www.essentialobjects.com/"&gt;EO Syntax Editor Control for Windows Forms&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Umí to parsovat ASM, Batch, CPP, CSharp, CSS, HTML, Java, JavaScript, Pascal, Perl, SQL, VB a XML, ale jdou tam dopsat i vlastní parsery. Je tam podpora pro bookmarky, číslování řádků a zvýrazňování a párování závorek. Zatím používám 30 denní trial a jsem s tím 100% spokojen. Chtějí za to jen $79, takže to nejspíš koupím. Leda že by mi někdo poradil něco jiného ... &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/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx&amp;amp;;title=Komponenta+pro+zv%26%23253%3braz%c5%88ov%26%23225%3bn%26%23237%3b+syntaxe" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.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/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx&amp;amp;;title=Komponenta+pro+zv%26%23253%3braz%c5%88ov%26%23225%3bn%26%23237%3b+syntaxe" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx&amp;amp;;title=Komponenta+pro+zv%26%23253%3braz%c5%88ov%26%23225%3bn%26%23237%3b+syntaxe" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx&amp;amp;title=Komponenta+pro+zv%26%23253%3braz%c5%88ov%26%23225%3bn%26%23237%3b+syntaxe" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx&amp;amp;;title=Komponenta+pro+zv%26%23253%3braz%c5%88ov%26%23225%3bn%26%23237%3b+syntaxe" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.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/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx&amp;amp;;title=Komponenta+pro+zv%26%23253%3braz%c5%88ov%26%23225%3bn%26%23237%3b+syntaxe&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx&amp;amp;;subject=Komponenta+pro+zv%26%23253%3braz%c5%88ov%26%23225%3bn%26%23237%3b+syntaxe" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/15/komponenta-pro-zv-raz-ov-n-syntaxe.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228897" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/pragmatik/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.vyvojar.cz/pragmatik/archive/tags/Components/default.aspx">Components</category></item><item><title>Globální ErrorHandling podruhé</title><link>http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx</link><pubDate>Wed, 14 Jan 2009 11:26:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228889</guid><dc:creator>tomas.berny</dc:creator><slash:comments>5</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/228889.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=228889</wfw:commentRss><description>&lt;P&gt;V komentářích se objevil názor, že pod pojmem Globální Error Handling očekával čtenář něco jiného. Protože má asi pravdu a protože to co jsem popsal byla jen část mého řešení, přidávám toto pokračování.&lt;/P&gt;
&lt;P&gt;Zaprvé je třeba si jasně uvědomit, že i když uvedená technika Application.ThreadException umožňuje udělat jeden globální Try-Catch (ať už pro 1 formulář nebo pro celou aplikaci), rozhodně si tímto jediným Try-Catch nevystačíme. Samozřejmě, že je potřeba dát Try-Catch&amp;nbsp; na každé místo kódu, kde je potřeba a každou možnou výjimku tam hezky lokálně ošetřit. Řekněme, že naše busines&amp;nbsp; vrstva nabízí metodu ImportObjednavky(path as string). V jejím průběhu může dojít k řadě malérů. Soubor Path nemusí vůbec existovat, může být uzamčený, může obsahovat jiná data než očekáváme, identická objednávka&amp;nbsp; už může v systému existovat, … Prostě cokoli vás napadne. Na všechno toto je třeba v kódu té metody myslet a nějak rozumně to ošetřit. Ale má se zde zobrazovat nějaká zpráva uživateli? Rozhodně ne! Tato metoda by poté, co selže, měla vyhodit vlastní exception s popisem, proč selhala. A až tuto exception zachytí náš globální Try-Catch.&lt;/P&gt;
&lt;P&gt;Od tohoto postupného vnořování výjimek se mohu odchýlit v jediném případě. Pokud někde v kódu nižší vrstvě očekávám výjimku, po které není třeba uklízet, mohu se na její zpracování vykašlat a nechat ji rovnou skočit do globálního try-catch. V našem případě by se dala takto odbýt FileNotFound exception. Samozřejmě pouze pokud je někde zkraje metody a nedělal jsem před tím nějaké operace, které by bylo potřeba vzít zpět (např. založení nové objednávky v DB). Jediná nevýhoda takto odbyté výjimky je v tom, že v UI vyskočí pouze univerzální .NETí zpráva.&lt;/P&gt;
&lt;P&gt;Jako ukázku uvedu 2 hlášky vyvolané stejnou chybou – pokusem získat z Dictionary položku s neexistujícím klíčem. &lt;/P&gt;
&lt;P&gt;Pokud s chybou počítám a zpracuji ji, dostane uživatel moji vlastní výstižnou zprávu:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:4px;BORDER-TOP:gray 1px solid;PADDING-LEFT:4px;FONT-SIZE:8pt;PADDING-BOTTOM:4px;MARGIN:20px 0px 10px;OVERFLOW:auto;BORDER-LEFT:gray 1px solid;WIDTH:97.5%;CURSOR:text;LINE-HEIGHT:12pt;PADDING-TOP:4px;BORDER-BOTTOM:gray 1px solid;FONT-FAMILY:consolas, 'Courier New', courier, monospace;BACKGROUND-COLOR:#f4f4f4;"&gt;
&lt;DIV style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:courier new;"&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;If&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Not&lt;/SPAN&gt; pItems.ContainsKey(Key) &lt;SPAN style="COLOR:blue;"&gt;Then&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; &lt;SPAN style="COLOR:blue;"&gt;Throw&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;New&lt;/SPAN&gt; Handlers.Err.Exception(&lt;SPAN style="COLOR:#a31515;"&gt;"Hlavní formulář neobsahuje prvek s klíčem {0}."&lt;/SPAN&gt;, Key)&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;If&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Uvedený příklad nemá přesně tu strukturu jak jsem popisoval výše, místo použití lokálního try-catch jsem té potenciální chybě předešel, což je myslím lepší. Ale ne vždy to jde, tak ještě přidávám klasičtější variantu:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:4px;BORDER-TOP:gray 1px solid;PADDING-LEFT:4px;FONT-SIZE:8pt;PADDING-BOTTOM:4px;MARGIN:20px 0px 10px;OVERFLOW:auto;BORDER-LEFT:gray 1px solid;WIDTH:97.5%;CURSOR:text;LINE-HEIGHT:12pt;PADDING-TOP:4px;BORDER-BOTTOM:gray 1px solid;FONT-FAMILY:consolas, 'Courier New', courier, monospace;BACKGROUND-COLOR:#f4f4f4;"&gt;
&lt;DIV style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:courier new;"&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Try&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; i = pItems(Key)&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Catch&lt;/SPAN&gt; ex &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; KeyNotFoundException&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; &lt;SPAN style="COLOR:blue;"&gt;Throw&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;New&lt;/SPAN&gt; Handlers.Err.Exception(&lt;SPAN style="COLOR:#a31515;"&gt;"Hlavní formulář neobsahuje prvek s klíčem {0}."&lt;/SPAN&gt;, Key)&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Catch&lt;/SPAN&gt; ex &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; Exception&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; &lt;SPAN style="COLOR:blue;"&gt;Throw&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;New&lt;/SPAN&gt; Handlers.Err.Exception(&lt;SPAN style="COLOR:#a31515;"&gt;"Nepodařilo se získat prvek s klíčem {0}."&lt;/SPAN&gt;, Key)&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Try&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Každopádně výsledek bude v obou případech stejný:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://blog.vyvojar.cz/blogs/pragmatik/image_37F99FF0.png"&gt;&lt;IMG title=image height=220 alt=image src="http://blog.vyvojar.cz/blogs/pragmatik/image_thumb_37213A06.png" width=519 border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Pokud na ošetření potenciální chyby zapomenu (a nebo se na ni úmyslně vykašlu, protože zde to nevadí) dostanu se nakonec také do hlavního Try-Catch, jen zpráva vypadá trochu jinak. &lt;/P&gt;&lt;A href="http://blog.vyvojar.cz/blogs/pragmatik/image_04513392.png"&gt;&lt;IMG title=image height=260 alt=image src="http://blog.vyvojar.cz/blogs/pragmatik/image_thumb_74CE21C2.png" width=519 border=0&gt;&lt;/A&gt; 
&lt;P&gt;Tolik tedy k vnořování výjimek. Nemyslím, že to je něco objevného, asi to většina zná, jde jen o to rozlišovat, kdy jsem na úrovni UI a mohu rovnou komunikovat s uživatelem a kdy bych měl raději výjimku poslat dál. Musím ale přiznat, že když jsem před lety přecházel na VB.NET z VB6, dal mi přechod od OnError-GOTO k Try-Catch docela zabrat, zkraje jsem se neuměl obejít bez Resume Next :)&lt;/P&gt;
&lt;P&gt;Ale zpět k pojmu Globální ErrorHandling. Já ho chápu tak, že bez ohledu na to, zda&amp;nbsp; mám na UI vrstvě jeden Try-Catch pro každý formulář nebo zda píšu Try-Catch pod každý UI event, globální je to tehdy, pokud všechny výjimky zpracovávám jednou společnou třídou. Například takto:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:4px;BORDER-TOP:gray 1px solid;PADDING-LEFT:4px;FONT-SIZE:8pt;PADDING-BOTTOM:4px;MARGIN:20px 0px 10px;OVERFLOW:auto;BORDER-LEFT:gray 1px solid;WIDTH:97.5%;CURSOR:text;LINE-HEIGHT:12pt;PADDING-TOP:4px;BORDER-BOTTOM:gray 1px solid;FONT-FAMILY:consolas, 'Courier New', courier, monospace;BACKGROUND-COLOR:#f4f4f4;"&gt;
&lt;DIV style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:courier new;"&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Try&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; &lt;SPAN style="COLOR:blue;"&gt;Catch&lt;/SPAN&gt; ex &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; Exception&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; &lt;SPAN style="COLOR:blue;"&gt;Me&lt;/SPAN&gt;.Kernel.Err.Handle(ex,HandleTypes.Abort)&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Try&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Pak je zajištěno, že ať je to v kódu kde chce a jak chce, každá výjimka projde jednou jedinou globální instancí. Ta pak může zajistit nejen komunikaci s uživatelem, ale i logování chyb, odesílání záznamu o chybě, kontaktování HelpDesku případně cokoli dalšího vás napadne.&lt;/P&gt;
&lt;P&gt;Pokud dám odkaz na tu globální třídu i Bussines vrstvě, mohu i odtud komunikovat s uživatelem. Například pokud uvnitř výše zmiňované metody ImportObjednavky nějaká privátní funkce hodí výjimku, že už tato objednávka jednou v systému je, může Err.Handler umístěný uvnitř metody ImportObjednavky rovnou zjistit od uživatele, zda to vadí a ukončit operaci nebo nevadí a pokračovat dále.&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:4px;BORDER-TOP:gray 1px solid;PADDING-LEFT:4px;FONT-SIZE:8pt;PADDING-BOTTOM:4px;MARGIN:20px 0px 10px;OVERFLOW:auto;BORDER-LEFT:gray 1px solid;WIDTH:97.5%;CURSOR:text;LINE-HEIGHT:12pt;PADDING-TOP:4px;BORDER-BOTTOM:gray 1px solid;FONT-FAMILY:consolas, 'Courier New', courier, monospace;BACKGROUND-COLOR:#f4f4f4;"&gt;
&lt;DIV style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Try&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:courier new;"&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; CheckOrder(ID)&lt;/PRE&gt;&lt;/DIV&gt;
&lt;DIV style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:courier new;"&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Catch&lt;/SPAN&gt; ex &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; Exception&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; &lt;SPAN style="COLOR:blue;"&gt;If&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Me&lt;/SPAN&gt;.Kernel.Err.Handle(ex, HandleTypes.Abort &lt;SPAN style="COLOR:blue;"&gt;Or&lt;/SPAN&gt; HandleTypes.Ignore) = HandleTypes.Abort &lt;SPAN style="COLOR:blue;"&gt;Then&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Exit&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&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; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Try&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;A pokud máme tu třídu Err implementovánu opravdu šikovně, pak bude někde uloženo, že uživatel Pepa v 8:30 zcela vědomě a přes varování importoval duplicitní objednávku.&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/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx&amp;amp;;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.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/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx&amp;amp;;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx&amp;amp;;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx&amp;amp;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx&amp;amp;;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.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/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx&amp;amp;;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling+podruh%26%23233%3b&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx&amp;amp;;subject=Glob%26%23225%3bln%26%23237%3b+ErrorHandling+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/14/glob-ln-errorhandling-podruh.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228889" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/pragmatik/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Globální ErrorHandling</title><link>http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx</link><pubDate>Thu, 08 Jan 2009 06:45:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228847</guid><dc:creator>tomas.berny</dc:creator><slash:comments>7</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/228847.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=228847</wfw:commentRss><description>&lt;P&gt;Chtěl jsem si nedávno trochu ušetřit práci s ošetřením chyb. Mám formulář a v něm řadu výkonných metod, které mohou vyvolat výjimku. Např. takto:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:4px;BORDER-TOP:gray 1px solid;PADDING-LEFT:4px;FONT-SIZE:8pt;PADDING-BOTTOM:4px;MARGIN:20px 0px 10px;OVERFLOW:auto;BORDER-LEFT:gray 1px solid;WIDTH:97.5%;CURSOR:text;LINE-HEIGHT:12pt;PADDING-TOP:4px;BORDER-BOTTOM:gray 1px solid;FONT-FAMILY:consolas, 'Courier New', courier, monospace;BACKGROUND-COLOR:#f4f4f4;"&gt;
&lt;DIV style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:courier new;"&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt; aaa()&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Throw&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;New&lt;/SPAN&gt; Exception(&lt;SPAN style="COLOR:#a31515;"&gt;"pokusná chyba"&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&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; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt; bbb()&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Dim&lt;/SPAN&gt; i = 0&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = &lt;SPAN style="COLOR:#a31515;"&gt;"ahoj"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;Tyto metody jsou spouštěny jednotlivými ovládacími prvky formuláře: 
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:4px;BORDER-TOP:gray 1px solid;PADDING-LEFT:4px;FONT-SIZE:8pt;PADDING-BOTTOM:4px;MARGIN:20px 0px 10px;OVERFLOW:auto;BORDER-LEFT:gray 1px solid;WIDTH:97.5%;CURSOR:text;LINE-HEIGHT:12pt;PADDING-TOP:4px;BORDER-BOTTOM:gray 1px solid;FONT-FAMILY:consolas, 'Courier New', courier, monospace;BACKGROUND-COLOR:#f4f4f4;"&gt;
&lt;DIV style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:courier new;"&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt; Button1_Click(&lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; System.Object, &lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; System.EventArgs) &lt;SPAN style="COLOR:blue;"&gt;Handles&lt;/SPAN&gt; Button1.Click&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; aaa()&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&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; &lt;SPAN style="COLOR:blue;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt; Button2_Click(&lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; System.Object, &lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; System.EventArgs) &lt;SPAN style="COLOR:blue;"&gt;Handles&lt;/SPAN&gt; Button2.Click&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bbb()&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Samozřejmě by bylo záhodno volání těchto metod nějak ošetřit, nejsnadněji takto:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:4px;BORDER-TOP:gray 1px solid;PADDING-LEFT:4px;FONT-SIZE:8pt;PADDING-BOTTOM:4px;MARGIN:20px 0px 10px;OVERFLOW:auto;BORDER-LEFT:gray 1px solid;WIDTH:97.5%;CURSOR:text;LINE-HEIGHT:12pt;PADDING-TOP:4px;BORDER-BOTTOM:gray 1px solid;FONT-FAMILY:consolas, 'Courier New', courier, monospace;BACKGROUND-COLOR:#f4f4f4;"&gt;
&lt;DIV style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:courier new;"&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt; Button1_Click(&lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; System.Object, &lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; System.EventArgs) &lt;SPAN style="COLOR:blue;"&gt;Handles&lt;/SPAN&gt; Button1.Click&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Try&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; aaa()&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Catch&lt;/SPAN&gt; ex &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; Exception&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; MsgBox(ex.Message)&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Try&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Vím, že by mi ruce neupadly, kdybych poctivě napsal Try..Catch blok do každé událostní procedury, ale chtěl jsem zkusit, zda to jde nějak sofistikovaněji. Matně jsem tušil, že existují nějaké události spouštěné při neošetřené výjimce, tak jsem trochu zapátral v dokumentaci a zdálo se to být snadné:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:4px;BORDER-TOP:gray 1px solid;PADDING-LEFT:4px;FONT-SIZE:8pt;PADDING-BOTTOM:4px;MARGIN:20px 0px 10px;OVERFLOW:auto;BORDER-LEFT:gray 1px solid;WIDTH:97.5%;CURSOR:text;LINE-HEIGHT:12pt;PADDING-TOP:4px;BORDER-BOTTOM:gray 1px solid;FONT-FAMILY:consolas, 'Courier New', courier, monospace;BACKGROUND-COLOR:#f4f4f4;"&gt;
&lt;DIV style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:courier new;"&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt; Form1_Load(&lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; System.Object, &lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; System.EventArgs) &lt;SPAN style="COLOR:blue;"&gt;Handles&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;MyBase&lt;/SPAN&gt;.Load&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;AddHandler&lt;/SPAN&gt; Application.ThreadException, &lt;SPAN style="COLOR:blue;"&gt;AddressOf&lt;/SPAN&gt; OnThreadException&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&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; &lt;SPAN style="COLOR:blue;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt; Form1_FormClosed(&lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; System.Windows.Forms.FormClosedEventArgs) &lt;SPAN style="COLOR:blue;"&gt;Handles&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Me&lt;/SPAN&gt;.FormClosed&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;RemoveHandler&lt;/SPAN&gt; Application.ThreadException, &lt;SPAN style="COLOR:blue;"&gt;AddressOf&lt;/SPAN&gt; OnThreadException&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&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; &lt;SPAN style="COLOR:blue;"&gt;Private&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt; OnThreadException(&lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Object&lt;/SPAN&gt;, &lt;SPAN style="COLOR:blue;"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="COLOR:blue;"&gt;As&lt;/SPAN&gt; System.Threading.ThreadExceptionEventArgs)&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox(e.Exception.Message, MsgBoxStyle.Critical, &lt;SPAN style="COLOR:#a31515;"&gt;"OnThreadException"&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR:blue;"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR:blue;"&gt;Sub&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;Jenomže to nefungovalo. Docela dlouho jsem s tím laboroval, zkoušel jsem použít i AppDomain.CurrentDomain.UnhandledException, ale vše marné. Až jsem objevil toto: 
&lt;DIV style="BORDER-RIGHT:gray 1px solid;PADDING-RIGHT:4px;BORDER-TOP:gray 1px solid;PADDING-LEFT:4px;FONT-SIZE:8pt;PADDING-BOTTOM:4px;MARGIN:20px 0px 10px;OVERFLOW:auto;BORDER-LEFT:gray 1px solid;WIDTH:97.5%;CURSOR:text;LINE-HEIGHT:12pt;PADDING-TOP:4px;BORDER-BOTTOM:gray 1px solid;FONT-FAMILY:consolas, 'Courier New', courier, monospace;BACKGROUND-COLOR:#f4f4f4;"&gt;
&lt;DIV style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:courier new;"&gt;&lt;PRE style="MARGIN:0px;"&gt;Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;Teprve tím se vynutí spouštění události OnThreadException při neošetřené výjimce, zatím co jinak to závisí na konfiguraci. Přidal jsem to do kódu před spuštění formuláře a bylo to. Tedy skoro, protože stále mě otravovala jedna “maličkost”: V debug módu mi neošetřenou výjimku nejprve zobrazil debugger, až po odklepnutí Continue došlo na událost OnThreadException a moje programové ošetření&amp;nbsp; výjimky. Hledal jsem tedy, zda lze toto chování debuggeru nějak vypnout. Zjistil jsem, že je třeba v Tools/Options/Debuging disablovat volbu “Enable Just My Code (Managed only)”. Pak už vše funguje k naprosté spokojenosti. 
&lt;P&gt;Mé nadšení z fungujícího testovacího příkládku poněkud opadlo po nasazení do reálné aplikace. Reálný ErrorHandler, použitý místo Msgbox(ex.message), totiž mimo jiné i zobrazuje a loguje CallStack. A ten je v tomto případě mnohem nepřehlednější, protože je v něm zachycena i dost komplikovaná cesta výjimky od původní procedury až do globálního handleru.&lt;/P&gt;
&lt;P&gt;Takto vypadá chybové hlášení reálné aplikace, pokud je výjimka vyvolaná metodou OpenItem ošetřena rovnou ve volající proceduře TreeView_NodeMouseDoubleClick:&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blog.vyvojar.cz/blogs/pragmatik/GEH1_7CE3EE83.png"&gt;&lt;IMG title=GEH1 style="BORDER-RIGHT:0px;BORDER-TOP:0px;DISPLAY:inline;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height=208 alt=GEH1 src="http://blog.vyvojar.cz/blogs/pragmatik/GEH1_thumb_2E6F5C19.png" width=429 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;A takto to vypadá, pokud je použito globální ošetření výjimek:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blog.vyvojar.cz/blogs/pragmatik/GEH2_032AC512.png"&gt;&lt;IMG title=GEH2 style="BORDER-RIGHT:0px;BORDER-TOP:0px;DISPLAY:inline;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height=319 alt=GEH2 src="http://blog.vyvojar.cz/blogs/pragmatik/GEH2_thumb_2E032924.png" width=470 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Nakonec jsem ErrorHandler upravil tak, aby z CallStacku tyto “nadbytečné” řádky vynechal a globální zachytávání výjimek jsem v aplikaci ponechal. Nakolik to je moudré, posuďte sami, já jsem zatím na žádný další problém nenarazil.&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/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx&amp;amp;;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.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/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx&amp;amp;;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx&amp;amp;;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx&amp;amp;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx&amp;amp;;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.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/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx&amp;amp;;title=Glob%26%23225%3bln%26%23237%3b+ErrorHandling&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx&amp;amp;;subject=Glob%26%23225%3bln%26%23237%3b+ErrorHandling" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2009/01/08/Glob_E100_ln_ED00_-errorhandling.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228847" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/pragmatik/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Optimální konfigurace pro VisualStudio 2008 ?</title><link>http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx</link><pubDate>Sun, 19 Oct 2008 19:43:03 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228494</guid><dc:creator>tomas.berny</dc:creator><slash:comments>6</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/228494.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=228494</wfw:commentRss><description>&lt;p&gt;M&amp;#233; Visty 64 po roce spokojen&amp;#233;ho provozu na notebooku DELL (C2Duo T7500 @ 2,2GHz + 4 GB + 60 GB) pomalu ale jistě nazr&amp;#225;vaj&amp;#237; k přeinstalaci. Jsou č&amp;#237;m d&amp;#225;l l&amp;#237;něj&amp;#353;&amp;#237; a nenažraněj&amp;#353;&amp;#237; (22 GB Windows, 9 GB Program Files). Přeinstalace je pro mě vždy př&amp;#237;ležitost k zamy&amp;#353;len&amp;#237;, co za SW opravdu potřebuji a co ne, a tak&amp;#233; jak&amp;#233; udělat HW změny - vět&amp;#353;inou děl&amp;#225;m reinstalaci na nov&amp;#253; (a vět&amp;#353;&amp;#237;) disk. Tentokr&amp;#225;t jsem v poku&amp;#353;en&amp;#237; udělat hned 2 radik&amp;#225;ln&amp;#237; změny:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;poř&amp;#237;dit SSD Disk&lt;/li&gt;    &lt;li&gt;opustit Visty&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Oboj&amp;#237;m m&amp;#225; sv&amp;#233; pro a proti. SSD diskům zajist&amp;#233; patř&amp;#237; budoucnost, ale nen&amp;#237; na ně je&amp;#353;tě brzy? Cca 5000 Kč za 60GB bych i dal, ale vejdu se do 60 GB? Nav&amp;#237;c jsem v někter&amp;#253;ch recenz&amp;#237;ch zaznamenal zm&amp;#237;nky o v&amp;#253;razn&amp;#233;m sn&amp;#237;žen&amp;#237; v&amp;#253;konu při rostouc&amp;#237;m zaplněn&amp;#237; disku. A d&amp;#225;t 9000 Kč za 120 GB? To už se mi moc nechce, zvl&amp;#225;&amp;#353;tě když si představ&amp;#237;m, kolik to bude st&amp;#225;t za rok.&lt;/p&gt;  &lt;p&gt;A Visty? Už jsem si na ně zvykl, ale diskov&amp;#233; operace jsou dle m&amp;#233;ho n&amp;#225;zoru o dost pomalej&amp;#353;&amp;#237;, než byly v XP. A v&amp;#253;hoda 64b? Vět&amp;#353;ina aplikac&amp;#237; je stejně 32b a ovladač pro můj scanner st&amp;#225;le je&amp;#353;tě neexistuje. Takže možnosti jsou:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;zachovat Visty&lt;/li&gt;    &lt;li&gt;vr&amp;#225;tit se k XP (a počkat si na Windows 7)&lt;/li&gt;    &lt;li&gt;zaexperimentovat s Windows Server 2008&lt;/li&gt;    &lt;li&gt;a to v&amp;#353;e 32b nebo 64b&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Co tam budu instalovat?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;VisualStudio 2008&lt;/li&gt;    &lt;li&gt;SQL 2005 + SQL 2008&lt;/li&gt;    &lt;li&gt;Office 2007&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Co na tom budu dělat?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;programovat WinForm datab&amp;#225;zov&amp;#233; aplikace a možn&amp;#225; i WPF XAML aplikace&lt;/li&gt;    &lt;li&gt;honit SQL s datab&amp;#225;zemi &amp;lt; 1GB&lt;/li&gt;    &lt;li&gt;spou&amp;#353;tět Virtual PC (z exterm&amp;#237;ch USB disků)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Zaj&amp;#237;malo by mě, jak&amp;#253; m&amp;#225;te n&amp;#225;zor na volbu OS pro VisualStudio, př&amp;#237;padně zda už m&amp;#225;te někdo zku&amp;#353;enosti s přechodem na SSD. Za v&amp;#353;echny rady a n&amp;#225;zory předem děkuji a pokud se nakonec pro SSD rozhodnu, určitě d&amp;#225;m vědět, jak jsem pochodil.&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/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx&amp;amp;;title=Optim%26%23225%3bln%26%23237%3b+konfigurace+pro+VisualStudio+2008+%3f" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.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/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx&amp;amp;;title=Optim%26%23225%3bln%26%23237%3b+konfigurace+pro+VisualStudio+2008+%3f" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx&amp;amp;;title=Optim%26%23225%3bln%26%23237%3b+konfigurace+pro+VisualStudio+2008+%3f" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx&amp;amp;title=Optim%26%23225%3bln%26%23237%3b+konfigurace+pro+VisualStudio+2008+%3f" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx&amp;amp;;title=Optim%26%23225%3bln%26%23237%3b+konfigurace+pro+VisualStudio+2008+%3f" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.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/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx&amp;amp;;title=Optim%26%23225%3bln%26%23237%3b+konfigurace+pro+VisualStudio+2008+%3f&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx&amp;amp;;subject=Optim%26%23225%3bln%26%23237%3b+konfigurace+pro+VisualStudio+2008+%3f" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/19/optim-ln-konfigurace-pro-visualstudio-2008.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228494" width="1" height="1"&gt;</description></item><item><title>R.I.P Pragmatik</title><link>http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx</link><pubDate>Wed, 15 Oct 2008 11:58:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228485</guid><dc:creator>tomas.berny</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/228485.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=228485</wfw:commentRss><description>&lt;P&gt;Před časem jsem nahrál videoprezentaci předvádějící můj framework Pragmatik na příkladu vývoj jednoduchého interaktivního formuláře napojeného na databázi NorthWind. Babral jsem se s tím do rána, výsledkem je 25 jakžtak souvislých, ale dosti rozvleklých minut. Tehdy jsem s tím příliš spokojen nebyl a rozhodl jsem se to zatím nezveřejňovat a ještě to předělat. Samozřejmě, že pak jsem se k tomu už nevrátil a dnes mi je jasné, že lépe už to nenatočím :) &lt;/P&gt;
&lt;P&gt;Protože momentálně ani nevím, zda budu na tomto projektu pokračovat, zveřejňuji to nyní jako svůj &lt;A href="http://www.pragmatik.cz/screencasts/02.html" target=_blank&gt;videopomník&lt;/A&gt;. Je tam naživo k vidění většina z věcí, o kterých jsem psal v dřívějších postech i něco navíc, takže to snad bude zajímavé. Jen to mělo být tak 2x rychlejší - kdo najde trpělivost to shlédnout celé, má můj dík.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Aktualizováno 8.1.2009:&lt;/STRONG&gt;&lt;BR&gt;Pro Pragmatik jsem žádnou zakázku neschrastil, takže zřejmě opravdu ve stávající podobě končí.&amp;nbsp;Stejně již stagnoval, takže jsem nakonec rád, že jsem&amp;nbsp;se dostal k novému projektu, kde mohu na&amp;nbsp;některé dobré věci z&amp;nbsp;Pragmatiku navázat a naopak některých méně dobrých se vyvarovat. Takže z profesního&amp;nbsp;hlediska je to nová výzva,&amp;nbsp;jen ten Excel už&amp;nbsp;v mé práci nebude&amp;nbsp;hrát tak velkou roli.&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/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx&amp;amp;;title=R.I.P+Pragmatik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.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/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx&amp;amp;;title=R.I.P+Pragmatik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx&amp;amp;;title=R.I.P+Pragmatik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx&amp;amp;title=R.I.P+Pragmatik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx&amp;amp;;title=R.I.P+Pragmatik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.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/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx&amp;amp;;title=R.I.P+Pragmatik&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx&amp;amp;;subject=R.I.P+Pragmatik" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/15/25-minut-sl-vy.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228485" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/pragmatik/archive/tags/Excel/default.aspx">Excel</category></item><item><title>Prasácký kód</title><link>http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx</link><pubDate>Fri, 03 Oct 2008 00:10:15 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228393</guid><dc:creator>tomas.berny</dc:creator><slash:comments>19</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/228393.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=228393</wfw:commentRss><description>&lt;p&gt;Kv&amp;#237;zov&amp;#225; ot&amp;#225;zka - pras&amp;#225;ck&amp;#253; k&amp;#243;d je:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Ve&amp;#353;ker&amp;#253; k&amp;#243;d aplikace &lt;a href="http://www.pragmatik.cz/Products/Pigmatic.aspx" target="_blank"&gt;Pigmatic&lt;/a&gt; - syst&amp;#233;mu pro ř&amp;#237;zen&amp;#237; chovu prasat. &lt;/li&gt;    &lt;li&gt;Tajn&amp;#233; &lt;a href="http://www.emag.cz/tajne-kody-pedofilu/" target="_blank"&gt;k&amp;#243;dy&lt;/a&gt;, kter&amp;#253;mi se po internetu domlouvaj&amp;#237; pedofilov&amp;#233;. &lt;/li&gt;    &lt;li&gt;Zdrojov&amp;#253; k&amp;#243;d psan&amp;#253; v&amp;#253;voj&amp;#225;řen A o kter&amp;#233;m si v&amp;#253;voj&amp;#225;ř B mysl&amp;#237;, že by ho napsal &amp;#250;plně jinak. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Odpovězde si sami a berte tento kv&amp;#237;z jako odlehčen&amp;#253; &amp;#250;vod př&amp;#237;spěvku na t&amp;#233;ma hodnocen&amp;#237; kvality zdrojov&amp;#233;ho k&amp;#243;du. Pod m&amp;#253;m minul&amp;#253;m př&amp;#237;spěvkem se rozeběhla debata, zda př&amp;#237;klad, kter&amp;#253; jsem nab&amp;#237;dl ke stažen&amp;#237;, je či nen&amp;#237; pras&amp;#225;rna. Respektive, zda z faktu, že dekompilac&amp;#237; m&amp;#233;ho exe souboru z&amp;#237;skan&amp;#253; C# k&amp;#243;d je pr&amp;#253; až &amp;quot;neuvěřteln&amp;#225; pras&amp;#225;rna&amp;quot;, lze či nelze vyvozovat, že i origin&amp;#225;l zdrojov&amp;#253; k&amp;#243;d psan&amp;#253; ve VB.NET je nutně tak&amp;#233; pras&amp;#225;rna. Jelikož jsem se problematikou kompilace a dekompilace nikdy nezab&amp;#253;val a jazyk C# zn&amp;#225;m jen velmi zběžně, neum&amp;#237;m posoudit, kdo m&amp;#225; pravdu. Proto jsem tam vystavil i origin&amp;#225;ln&amp;#237; VB.NET zdroj&amp;#225;ky a kdo chce, ať si to porovn&amp;#225;.&lt;/p&gt;  &lt;p&gt;Když ale pominu problematiku dekompilace a tak&amp;#233; tradičn&amp;#237; &amp;quot;multikulturn&amp;#237;&amp;quot; třenice mezi c&amp;#233;čkaři a basic&amp;#225;ři, dostanu se k zaj&amp;#237;mav&amp;#233; ot&amp;#225;zce: Jak hodnotit k&amp;#243;d? A m&amp;#225; to vůbec smysl? Vzpoměl jsem si na př&amp;#237;spěvek na t&amp;#233;ma &lt;a href="http://blogs.vyvojar.cz/minority/archive/2006/10/14/Code-Review.aspx" target="_blank"&gt;Code-Review&lt;/a&gt;, kter&amp;#253; jsem tu před časem četl a když jsem si ho znovu dohledal, potvrdil jsem si, že s n&amp;#237;m naprosto souhlas&amp;#237;m. A mohu to potvrdit i vlastn&amp;#237; zku&amp;#353;enosti, a to dokonce z obou stran barik&amp;#225;dy. &lt;/p&gt;  &lt;p&gt;V posledn&amp;#237;ch 2 letech jsem si z kapacitn&amp;#237;ch důvodů nech&amp;#225;val někter&amp;#233; č&amp;#225;sti sv&amp;#253;ch projektů dělat na zak&amp;#225;zku od extern&amp;#237;ch spolupracovn&amp;#237;ků a při přeb&amp;#237;r&amp;#225;n&amp;#237; jejich pr&amp;#225;ce jsem tak byl v pozici hodnotitele. A mus&amp;#237;m přiznat, že mě často při zkoum&amp;#225;n&amp;#237; dodan&amp;#233;ho k&amp;#243;du napadaly jen sam&amp;#233; neslu&amp;#353;n&amp;#233; v&amp;#253;razy. Někdy to byly zcela zjevn&amp;#233; blbosti, např&amp;#237;klad jeden mladičk&amp;#253; zač&amp;#237;naj&amp;#237;c&amp;#237; program&amp;#225;tor nevěděl, jak pomoc&amp;#237; HasRow a Read zpracovat sqlDataReader. Vyře&amp;#353;il to tedy oklikou: Nejprve si proti DB poslal př&amp;#237;kaz &amp;quot;SELECT Count(*) FROM TableName WHERE ...&amp;quot; a DataReaderem načetl vr&amp;#225;cenou hodnotu do N. Pak teprve zavolal požadovan&amp;#253; př&amp;#237;kaz &amp;quot;SELECT C1,C2 FROM TableName WHERE ...&amp;quot; a n&amp;#225;sledně cyklem FOR i=1 to N zpracoval v&amp;#353;echny vr&amp;#225;cen&amp;#233; ř&amp;#225;dky. No nezabili by jste ho ? &lt;/p&gt;  &lt;p&gt;Jindy jsem se ale rozčiloval jen proto, že to bylo naps&amp;#225;no jinak než jsem oček&amp;#225;val, nebo jin&amp;#253;m stylem, než jsem zvykl&amp;#253;. Je jasn&amp;#233;, že ve funguj&amp;#237;c&amp;#237;m v&amp;#253;vojov&amp;#233;m t&amp;#253;mu by měly b&amp;#253;t definov&amp;#225;ny pravidla, jak m&amp;#225; k&amp;#243;d vypadat. Ale pokud takov&amp;#225; definice chyb&amp;#237;, nelze jednoznačně odsoudit k&amp;#243;d jen proto, že autor m&amp;#225; jin&amp;#253; styl než j&amp;#225;.&lt;/p&gt;  &lt;p&gt;Protože pracuji na voln&amp;#233; noze a u v&amp;#353;ech projektů jsem jedin&amp;#253; ProjectManager a ProjectArchitect a ProjectNev&amp;#237;mCoV&amp;#353;echno, v pozici hodnocen&amp;#233;ho se ocit&amp;#225;m mnohem m&amp;#233;ně často a mus&amp;#237;m přiznat, že to je &amp;#353;koda. Když se po letech d&amp;#237;v&amp;#225;m do sv&amp;#253;ch star&amp;#353;&amp;#237;ch zdroj&amp;#225;ků, tak&amp;#233; mnohdy lom&amp;#237;m rukama a ř&amp;#237;k&amp;#225;m si, proboha, proč mi tehdy nikdo neřekl, jak&amp;#225; to je blbost... Neřekl, protože neměl kdo. Jakkoli si sv&amp;#233; nez&amp;#225;vislosti cen&amp;#237;m, tato absence možnosti porovn&amp;#225;n&amp;#237; m&amp;#233;ho n&amp;#225;zoru s n&amp;#225;zory jin&amp;#253;ch kolegů je asi jej&amp;#237; největ&amp;#353;&amp;#237; nev&amp;#253;hodou. A možn&amp;#225; i př&amp;#237;činou, proč možn&amp;#225; až př&amp;#237;li&amp;#353; často ve sv&amp;#253;ch projektech vol&amp;#237;m sice origin&amp;#225;lni a neobvykl&amp;#225;, ale z&amp;#225;roveň i nestandardn&amp;#237; a pro leckoho &amp;quot;divn&amp;#225;&amp;quot; ře&amp;#353;en&amp;#237;.&lt;/p&gt;  &lt;p&gt;Absenci vnitropodnikov&amp;#233; diskuze si č&amp;#225;stečně kompenzuji t&amp;#237;mto blogem, kde se snažim pr&amp;#225;vě takov&amp;#233;to &amp;quot;originality&amp;quot; prezentovat a vždy se velmi tě&amp;#353;&amp;#237;m na koment&amp;#225;ře, ať už jsou kladn&amp;#233; nebo z&amp;#225;porn&amp;#233;. Jen ta minul&amp;#225; diskuse mě trochu zaskočila, protože jsem zde nikdy neměl v &amp;#250;myslu ře&amp;#353;it problematiku k&amp;#243;du, &amp;#353;lo mi sp&amp;#237;&amp;#353; o věcnou st&amp;#225;nku. A najenou jsem se ocitl v pozici veřejn&amp;#233;ho Code-Review, aniž by mi bylo jasn&amp;#233;, co je mi vlastně vyt&amp;#253;k&amp;#225;no. &lt;/p&gt;  &lt;p&gt;Když už ale bylo toto t&amp;#233;ma nastoleno, využiji toho a zept&amp;#225;m se na V&amp;#225;&amp;#353; n&amp;#225;zor na něco, s č&amp;#237;m si nejsem jist&amp;#253;. Často pracuji s SQL a dlouho jsem hledal optim&amp;#225;ln&amp;#237; způsob, jak to zak&amp;#243;dovat. Nakonec jsem se dobral k n&amp;#237;že uveden&amp;#233; variantě, kter&amp;#225; mi vyhovuje, protože je &amp;#250;sporn&amp;#225; a přehledn&amp;#225;. Jen se to blbě debuguje, protože v&amp;#253;razy uvnitř With - End With nejdou za chodu vyč&amp;#237;slovat a ani nem&amp;#225;m k dispozici proměnnou odkazuj&amp;#237;c&amp;#237; na SqlCommand.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="font-size:10pt;background:white;color:black;font-family:courier new;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; Function&lt;/span&gt; GetSpCmd() &lt;span style="color:blue;"&gt;As&lt;/span&gt; SqlCommand&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; C &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;New&lt;/span&gt; SqlCommand()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C.Connection = &lt;span style="color:blue;"&gt;New&lt;/span&gt; SqlConnection(STRCON)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; C.CommandType = CommandType.StoredProcedure&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Return&lt;/span&gt; C&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Test()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;With&lt;/span&gt; GetSpCmd()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .CommandText = &lt;span style="color:#a31515;"&gt;&amp;quot;spFIFO_recalc&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Parameters.Add(&lt;span style="color:#a31515;"&gt;&amp;quot;@SklKod&amp;quot;&lt;/span&gt;, SqlDbType.VarChar, 15).Value = SklKod&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Parameters.Add(&lt;span style="color:#a31515;"&gt;&amp;quot;@PolKod&amp;quot;&lt;/span&gt;, SqlDbType.VarChar, 15).Value = PolKod&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Connection.Open()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .ExecuteNonQuery()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Catch&lt;/span&gt; ex &lt;span style="color:blue;"&gt;As&lt;/span&gt; Exception&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MsgBox(ex.Message, MsgBoxStyle.Critical, &lt;span style="color:#a31515;"&gt;&amp;quot;Error&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;Finally&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Connection.Close()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Try&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;With&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;Jak to vid&amp;#237;te? Je to dobr&amp;#253; n&amp;#225;pad, &amp;#353;patn&amp;#253; n&amp;#225;pad nebo dokonce pras&amp;#225;rna ?&lt;/p&gt; &lt;/div&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/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx&amp;amp;;title=Pras%26%23225%3bck%26%23253%3b+k%26%23243%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.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/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx&amp;amp;;title=Pras%26%23225%3bck%26%23253%3b+k%26%23243%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx&amp;amp;;title=Pras%26%23225%3bck%26%23253%3b+k%26%23243%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx&amp;amp;title=Pras%26%23225%3bck%26%23253%3b+k%26%23243%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx&amp;amp;;title=Pras%26%23225%3bck%26%23253%3b+k%26%23243%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.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/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx&amp;amp;;title=Pras%26%23225%3bck%26%23253%3b+k%26%23243%3bd&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx&amp;amp;;subject=Pras%26%23225%3bck%26%23253%3b+k%26%23243%3bd" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/10/03/pras-ck-k-d.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228393" width="1" height="1"&gt;</description></item><item><title>Objektový MsgBox</title><link>http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx</link><pubDate>Mon, 29 Sep 2008 13:31:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228366</guid><dc:creator>tomas.berny</dc:creator><slash:comments>14</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/228366.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=228366</wfw:commentRss><description>&lt;P&gt;Snad v každé aplikaci mám situaci, kdy potřebuji komunikovat s uživatelem - něco mu oznámit nebo se ho na něco zeptat. Někdy si vystačím s funkcí MsgBox, ale pokud je potřeba zobrazit strukturovanější informaci či získat složitější odpověď, než jen Ano-NE, je třeba udělat speciální formulář. Abych se tomu vyhnul, rozhodl jsem se už před řadou let udělat vlastní třídu Msg, která by měla metodu Box a která by uměla mnohem více možností než funkce MsgBox.&lt;/P&gt;
&lt;P&gt;Tou dobou jsem také začal dělat prní vážněji míněné věci v Excelu a postupně jsem se dopracovával k první funkčí verzi svého frameworku Pragmatik. Psal se rok 1998, Excel byl ve verzi 97 a objevil se v něm &lt;A href="http://en.wikipedia.org/wiki/Office_Assistant" target=_blank&gt;pan Sponka&lt;/A&gt; se žlutými bublinami. Ještě než se stačil všem zprotivit, zaujal mě svým objektovým modelem umožňujícím měnit barvy, vkládat obrázky, zobrazovat checkboxy a labely a tak jsem se rozhodl (dnes vidím že asi jako jediný) využít ho ve svých programech. Napsal jsem si wraper, který usnadňoval její použití v kódu a&amp;nbsp; tak začalo mých šťastných 10 let s panem Sponkou, Mickou a hlavně Alíkem.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/ObjektovMsgBox_DA4C/18_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT:0px;BORDER-TOP:0px;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height=354 alt=18 src="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/ObjektovMsgBox_DA4C/18_thumb.jpg" width=610 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Trochu jsem sice znejistěl, když se Pomocník vytratil z výchozí instalace Office 2003, ale protože šel snadno doinstalovat, neměl jsem důvod nic měnit. Až s verzí 2007 přišel šok: Objektový model pomocníka sice zůstal zachován, ale nefungoval! Po chvilce pátrání v dokumentaci se mé neblahé tušení změnilo ve strašlivou jistotu - pomocník byl odstraněn a není dále podporován. Zpětná kompatibilita mých aplikací je ohrožena.&lt;/P&gt;
&lt;P&gt;Naštěstí jsem ale pomocníka nikdy nevolal přímo, ale vždy přes výše zmíněný wraper. To byla má spása. Přepsal jsem wrapper tak, aby místo pomocníka používal můj vlastní zobrazovací formulář. Nejprve jsem ho spíchnul jen tak hala bala, ale když začal narůstat počet zákazníků používajících Office 2007, dal jsem si tu práci a vypiplal ho k dokonalosti. Dělal jsem to spíše sobě pro radost, než pro užitek, protože uživatelé takovouto "skrytou krásu" těžko ocení. Proto se s tím chci alespoň touto cestou trochu pochlubit :)&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Takže co to umí:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Texty s barevně zvýrazněnými parametry&lt;/LI&gt;
&lt;LI&gt;Značky &amp;lt;b&amp;gt; &amp;lt;u&amp;gt; &amp;lt;br&amp;gt; &amp;lt;tab&amp;gt; &amp;lt;colorname&amp;gt;&lt;/LI&gt;
&lt;LI&gt;Labely a checkboxy&lt;/LI&gt;
&lt;LI&gt;Obrázky v záhlaví a pod bublinou&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Ukázky kódu a dialogů:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/ObjektovMsgBox_DA4C/19_6.jpg"&gt;&lt;IMG style="BORDER-RIGHT:0px;BORDER-TOP:0px;BORDER-LEFT:0px;BORDER-BOTTOM:0px;" height=857 alt=19 src="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/ObjektovMsgBox_DA4C/19_thumb_2.jpg" width=585 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Ukázkový příklad nabízím ke stažení &lt;A href="http://www.pragmatik.cz/ftp/MsgBox.zip" target=_blank&gt;zde&lt;/A&gt;, zveřejnění zdrojových kódů ještě zvažuji, případným zájemcům je zatím pošlu na vyžádání.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;PS pro estéty:&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;Mírně infantilní ladění grafiky je záměr, navíc dělám programy pro zemědělství, proto to prasátko nebo kachnička ...&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/pragmatik/archive/2008/09/29/objektov-msgbox.aspx&amp;amp;;title=Objektov%26%23253%3b+MsgBox" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.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/pragmatik/archive/2008/09/29/objektov-msgbox.aspx&amp;amp;;title=Objektov%26%23253%3b+MsgBox" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx&amp;amp;;title=Objektov%26%23253%3b+MsgBox" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx&amp;amp;title=Objektov%26%23253%3b+MsgBox" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx&amp;amp;;title=Objektov%26%23253%3b+MsgBox" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.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/pragmatik/archive/2008/09/29/objektov-msgbox.aspx&amp;amp;;title=Objektov%26%23253%3b+MsgBox&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx&amp;amp;;subject=Objektov%26%23253%3b+MsgBox" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/09/29/objektov-msgbox.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228366" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/pragmatik/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Informační systémy v Excelu - Validace dat a TabOrder</title><link>http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx</link><pubDate>Tue, 19 Aug 2008 16:28:17 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228175</guid><dc:creator>tomas.berny</dc:creator><slash:comments>3</slash:comments><comments>http://blog.vyvojar.cz/pragmatik/comments/228175.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/pragmatik/commentrss.aspx?PostID=228175</wfw:commentRss><description>&lt;p&gt;Namalovat nějakou statickou &amp;#353;ablonu typu SmartSheet je v Pragmatiku velmi jednoduch&amp;#233;. Stač&amp;#237; p&amp;#225;r popisků, p&amp;#225;r obrysů a za chv&amp;#237;li můžeme m&amp;#237;t formul&amp;#225;ř jako je třeba tento:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/12_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="530" alt="12" src="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/12_thumb.jpg" width="773" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Zavol&amp;#225;me NamesEditor a jednotliv&amp;#225; editačn&amp;#237; pol&amp;#237;čka pojmenujeme, např&amp;#237;klad takto:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/13_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="241" alt="13" src="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/13_thumb.jpg" width="608" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Nyn&amp;#237; by stačilo doplnit do SheetMenu tlač&amp;#237;tko Save a na něj pověsit vol&amp;#225;n&amp;#237; nějak&amp;#233; procedury typu spNewEmployee a primitnivn&amp;#237; pořizovac&amp;#237; formul&amp;#225;ř by byl na světě. Nicm&amp;#233;ně uživatelům (tedy alespoň těm z nich, co nejsou zvykl&amp;#237; ře&amp;#353;it v&amp;#353;e jen za pomoc&amp;#237; my&amp;#353;i) by nejsp&amp;#237;&amp;#353;e vadilo, že po vyplněn&amp;#237; pol&amp;#237;čka titul jim po kl&amp;#225;vese Enter kurzor odskakuje na pole adresa1, z něj pak na pole jm&amp;#233;no atd. Tak&amp;#233; by nebylo od věci prov&amp;#225;dět nějakou validaci datov&amp;#253;ch typů a zobrazovat k jednotliv&amp;#253;m pol&amp;#237;m nějakou n&amp;#225;povědu. To v&amp;#353;e lze velmi rychle a snadno zař&amp;#237;dit pomoc&amp;#237; dal&amp;#353;&amp;#237;ho z n&amp;#225;strojů Pragmatiku - EventsEditoru.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/14_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="193" alt="14" src="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/14_thumb.jpg" width="984" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;V EventsEditoru se automaticky uk&amp;#225;ž&amp;#237; v&amp;#353;echny pojmenovan&amp;#233; buňky a k nim atributy jako DisplayName, StatusBar, TabOrder, Required, DataType apod. Po vyplněn&amp;#237; a uložen&amp;#237; těchto atributů začne n&amp;#225;&amp;#353; formul&amp;#225;ř fungovat mnohem sofistikovaněji:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Na stavov&amp;#233;m ř&amp;#225;dku se při v&amp;#253;běru dan&amp;#233;ho pol&amp;#237;čka objevuje text ve form&amp;#225;tu DisplayName: StatusBar&lt;/li&gt;    &lt;li&gt;Kl&amp;#225;vesy Enter, Tab a ShistTab funguj&amp;#237; dle TabOrder, přesně jak jsme zvykl&amp;#237; z WinFormAplikac&amp;#237;&lt;/li&gt;    &lt;li&gt;Pol&amp;#237;čka označen&amp;#225; jako Required nejdou opustit, aniž by do nich bylo něco zad&amp;#225;no, u v&amp;#353;ech pol&amp;#237;ček je kontrolov&amp;#225;n datov&amp;#253; typ, chyby jsou ve srozumiteln&amp;#233; podobě zobrazov&amp;#225;ny uživateli&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/16_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="170" alt="16" src="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/16_thumb.jpg" width="558" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Tře&amp;#353;nička nakonec - EventsEditor je prim&amp;#225;rně určen k definov&amp;#225;n&amp;#237; Eventů jednotliv&amp;#253;ch buněk, takže tam můžeme velmi snadno dopsat třeba toto:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/15_6.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="217" alt="15" src="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/15_thumb_2.jpg" width="984" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;T&amp;#237;m bude automaticky zaji&amp;#353;těno, že se po zad&amp;#225;n&amp;#237; PSČ automaticky dopln&amp;#237; město, respektive se po zad&amp;#225;n&amp;#237; neplatn&amp;#233;ho PSČ zobraz&amp;#237; odpov&amp;#237;daj&amp;#237;c&amp;#237; hl&amp;#225;&amp;#353;ka.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pro &amp;#250;plnost je&amp;#353;tě přikl&amp;#225;&amp;#225;dm pohled na XML, do kter&amp;#233;ho EventsEditor v&amp;#353;e ukl&amp;#225;d&amp;#225; a podle kter&amp;#233;ho to pak při běhu programu v&amp;#353;e funguje:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/17_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="417" alt="17" src="http://blog.vyvojar.cz/blogs/pragmatik/WindowsLiveWriter/InformansystmyvExceluValidacedataTabOrde_103A6/17_thumb.jpg" width="958" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Samozřejmě, že tento formul&amp;#225;ř nen&amp;#237; nic mimoř&amp;#225;dn&amp;#233;ho a zrovna snadno a rychle by se dal udělat ve WinForm, nicm&amp;#233;ně tam už se neobejdeme bez psan&amp;#237; k&amp;#243;du. Můj př&amp;#237;stup, odhl&amp;#233;dneme-li od použit&amp;#237; excelu, je odli&amp;#353;n&amp;#253; t&amp;#237;m, že jsem se řadu let snažil eliminovat rutinn&amp;#237; psan&amp;#237; st&amp;#225;le se opakuj&amp;#237;c&amp;#237;ho se k&amp;#243;du a naopak co nejv&amp;#237;ce věc&amp;#237; popsat datově. Bylo to sice d&amp;#225;l a tež&amp;#353;&amp;#237; cesta, ale dnes už d&amp;#237;ky tomu mohu chodit opravdov&amp;#253;mi zkratkami.&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/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx&amp;amp;;title=Informa%c4%8dn%26%23237%3b+syst%26%23233%3bmy+v+Excelu+-+Validace+dat+a+TabOrder" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.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/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx&amp;amp;;title=Informa%c4%8dn%26%23237%3b+syst%26%23233%3bmy+v+Excelu+-+Validace+dat+a+TabOrder" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx&amp;amp;;title=Informa%c4%8dn%26%23237%3b+syst%26%23233%3bmy+v+Excelu+-+Validace+dat+a+TabOrder" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx&amp;amp;title=Informa%c4%8dn%26%23237%3b+syst%26%23233%3bmy+v+Excelu+-+Validace+dat+a+TabOrder" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx&amp;amp;;title=Informa%c4%8dn%26%23237%3b+syst%26%23233%3bmy+v+Excelu+-+Validace+dat+a+TabOrder" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.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/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx&amp;amp;;title=Informa%c4%8dn%26%23237%3b+syst%26%23233%3bmy+v+Excelu+-+Validace+dat+a+TabOrder&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx&amp;amp;;subject=Informa%c4%8dn%26%23237%3b+syst%26%23233%3bmy+v+Excelu+-+Validace+dat+a+TabOrder" target="_blank" title = "Post http://blog.vyvojar.cz/pragmatik/archive/2008/08/19/informa-n-syst-my-v-excelu-validace-dat-a-taborder.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228175" width="1" height="1"&gt;</description></item></channel></rss>