<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4575995888506380441</id><updated>2011-12-01T10:31:35.299+01:00</updated><category term='c#'/><category term='drobky'/><category term='isnotnull'/><category term='dotnet c# vb.net programming  office interop'/><category term='url'/><category term='cz cze  .net'/><category term='web'/><category term='cze'/><category term='nop'/><category term='cz cze .net'/><category term='programming'/><category term='dotnet c# vb.net programming office interop'/><category term='cz'/><category term='isnull'/><category term='extension method'/><category term='asstring'/><category term='fornotnull'/><title type='text'>tcks press</title><subtitle type='html'>Stejně to tu nikdo nečte :)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tckspress.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tckspress.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>TcKs</name><uri>http://www.blogger.com/profile/04891118457143847305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4575995888506380441.post-8596741710812138210</id><published>2009-03-20T17:47:00.003+01:00</published><updated>2009-03-20T18:35:11.180+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='extension method'/><category scheme='http://www.blogger.com/atom/ns#' term='nop'/><category scheme='http://www.blogger.com/atom/ns#' term='isnull'/><category scheme='http://www.blogger.com/atom/ns#' term='asstring'/><category scheme='http://www.blogger.com/atom/ns#' term='isnotnull'/><category scheme='http://www.blogger.com/atom/ns#' term='drobky'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='fornotnull'/><title type='text'>C# drobky: extension methods - IsNull(), IsNotNull(), ForNotNull(), AsString(), Nop()</title><content type='html'>Rozhodl jsem se, že některé své kusy kódu, které jsou dostatečně malé a jednoduché budu publikovat na blogu, aby je mohl používat taky někdo jiný. V zásadě se nejdná o nic světoborného - každý by to dokázal napsat sám - ale někomu to snad ulehčí práci nebo inspiruje.&lt;br /&gt;&lt;br /&gt;Dnes tu mám pár extension metod, které poměrně často používám. Všechny - až na poslední - mají co do činění s NULL odkazem.&lt;br /&gt;První dvě jsou tyto:&lt;br /&gt;&lt;pre&gt;&lt;font color=blue&gt;public static partial class&lt;/font&gt; ObjectExtensionHelper {&lt;br /&gt;    &lt;font color=blue&gt;public static bool&lt;/font&gt; IsNull( &lt;font color=blue&gt;this object&lt;/font&gt; obj ) {&lt;br /&gt;        &lt;font color=blue&gt;return object&lt;/font&gt;.ReferenceEquals( obj, &lt;font color=blue&gt;null&lt;/font&gt; );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;font color=blue&gt;public static bool&lt;/font&gt; IsNull( &lt;font color=blue&gt;this object&lt;/font&gt; obj ) {&lt;br /&gt;        &lt;font color=blue&gt;return object&lt;/font&gt;.ReferenceEquals( obj, &lt;font color=blue&gt;null&lt;/font&gt; );&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Leckoho napadne k čemu je něco takového dobré, když tu existuje jednoduchý zápis:&lt;pre&gt;variable == null&lt;/pre&gt;&lt;br /&gt;Vysvětlení je jednoduché. Už se mi stalo, že jsem použil třídu třetí strany, kde někoho napadla "skvélá" myšlenka - přepsat operátor "==" a při porovnání s null vracet false. Pro vyvarování se tomuto případu je potřeba používat statickou metodu "object.ReferenceEquals", jenže její použití je při kombinaci s četností kontroly na NULL pro mě příliš zdlouhavá. Tímto způsobem jsem toho všeho ušetřen.&lt;br /&gt;&lt;br /&gt;Další metodu, kterou tu mám je podobného rázu.&lt;br /&gt;&lt;pre&gt;&lt;font color=blue&gt;public static partial class&lt;/font&gt; ObjectExtensionHelper {&lt;br /&gt;    &lt;font color=blue&gt;public static bool&lt;/font&gt; ForNotNull&lt;T&gt;( &lt;font color=blue&gt;this&lt;/font&gt; T obj, Action&lt;T&gt; notNullAction ) {&lt;br /&gt;        &lt;font color=blue&gt;var&lt;/font&gt; ret = obj.IsNotNull();&lt;br /&gt;        &lt;font color=blue&gt;if&lt;/font&gt; ( ret ) {&lt;br /&gt;            notNullAction( obj );&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color=blue&gt;return&lt;/font&gt; ret;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;A k čemu že to je dobré? Občas se stává, že se musím probrat hierarchií několika objektů, než se dostanu ke kýženému cíli.&lt;br /&gt;&lt;br /&gt;Například:&lt;br /&gt;&lt;pre&gt;var address = envelope.Invoice.Header.BuyersParty.Party.Address;&lt;/pre&gt;&lt;br /&gt;To není nic tak strašného, pokud není potřeba každý objekt kontrolovat na null. Takový záspis pak není ani stručný, ani moc přehledný:&lt;br /&gt;&lt;pre&gt;if ( envelope.IsNotNull() ) {&lt;br /&gt;    Address address = null;&lt;br /&gt;    var invoice = envelope.Invoice;&lt;br /&gt;    if ( invoice.IsNotNull() ) {&lt;br /&gt;        var header = invoice.Header;&lt;br /&gt;        if ( header.IsNotNull() ) {&lt;br /&gt;            var buyersParty = header.BuyersParty;&lt;br /&gt;            if ( buyersParty.IsNotNull() ) {&lt;br /&gt;                var party = buyersParty.Party;&lt;br /&gt;                if ( party.IsNotNull() ) {&lt;br /&gt;                    address = party.Address;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;nicméně pomocí metody "ForNotNull()" a lambda výrazům to celé jde celé alespoň trochu zkrátit:&lt;br /&gt;&lt;pre&gt;Address address = null;&lt;br /&gt;envelope.ForNotNull(&lt;br /&gt;    e =&gt; e.Invoice.ForNotNull(&lt;br /&gt;        i =&gt; i.Header.ForNotNull(&lt;br /&gt;            h =&gt; h.BuyersParty.ForNotNull(&lt;br /&gt;                b =&gt; b.Party.ForNotNull(&lt;br /&gt;                    p =&gt; address = p.Address )&lt;br /&gt;                )&lt;br /&gt;            )&lt;br /&gt;        )&lt;br /&gt;    );&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Další z této sady metod je "AsString()". Jestliže někde často používáte volání "ToString()" a vždy předtím kontrolujete zda cíl volání není null, neobejdete se bez ifu či operátoru "?". Tato metoda to má ulehčit:&lt;br /&gt;&lt;pre&gt;&lt;font color=blue&gt;public static partial class&lt;/font&gt; ObjectExtensionHelper {&lt;br /&gt;    &lt;font color=blue&gt;public static string&lt;/font&gt; AsString( &lt;font color=blue&gt;this&lt;/font&gt; object obj ) {&lt;br /&gt;        &lt;font color=blue&gt;if&lt;/font&gt; ( obj.IsNull() ) { &lt;font color=blue&gt;return&lt;/font&gt; obj.ToString(); }&lt;br /&gt;        &lt;font color=blue&gt;return null&lt;/font&gt;;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Na závěr tu mám jednu metodu, která se od těch předchozích liší. Ona se vlastně liší téměř ode všech metod. Má totiž za úkol nedělat vůbec nic.&lt;br /&gt;&lt;pre&gt;&lt;font color=blue&gt;public static partial class&lt;/font&gt; ObjectExtensionHelper {&lt;br /&gt;    [System.Diagnostics.Conditional( "DEBUG" )]&lt;br /&gt;    &lt;font color=blue&gt;public static void&lt;/font&gt; Nop( &lt;font color=blue&gt;this object&lt;/font&gt; obj ) { &lt;font color=green&gt;/* nedela nic */&lt;/font&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A k čemu to je celé dobré? Slouží mi právě při zmíněném ladéní programu. Občas není v metodě žádné vhodné místo, kam bych umístil breakpoint. Vložím tedy to kódu volání "Nop()" kam potřebuji, a aniž bych změnil funkcionalitu metody, mám volné místo pro breakpoint.&lt;br /&gt;&lt;br /&gt;Atributem "[Conditional]" se určuje při jakých přepínačích má kompilátor zahrnout volání označené metody. Jestliže budete volat tuto metodu a zkompilujete zdrojové kódy s přepínačem "DEBUG" (což je téměř vždy, když chcete program ladit), tak její volání zahrne do kompilace. V ostatních případech (například při kompilaci pro zákazníka) její volání nezkompiluje.&lt;br /&gt;&lt;br /&gt;Toť je pro dnešek vše.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4575995888506380441-8596741710812138210?l=tckspress.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tckspress.blogspot.com/feeds/8596741710812138210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4575995888506380441&amp;postID=8596741710812138210' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/8596741710812138210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/8596741710812138210'/><link rel='alternate' type='text/html' href='http://tckspress.blogspot.com/2009/03/c-drobky-extension-methods-isnull.html' title='C# drobky: extension methods - IsNull(), IsNotNull(), ForNotNull(), AsString(), Nop()'/><author><name>TcKs</name><uri>http://www.blogger.com/profile/04891118457143847305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4575995888506380441.post-5464029775685807577</id><published>2008-10-08T19:18:00.003+02:00</published><updated>2008-10-08T19:26:37.057+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cz cze .net'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet c# vb.net programming office interop'/><title type='text'>MS Office for .NET v0.1.2</title><content type='html'>Dnes jsem nauploadoval release v0.1.2. Obsahuje všechny výčtové datové typy ( enum types ) z knihoven office, excelu, wordu a outlooku.&lt;br /&gt;Naštěstí jsem je nemusel psát ručně ( je jich přes tisíckovku ), ale zvládl to generátor kódu za pár vteřin.&lt;br /&gt;&lt;br /&gt;Ten generátor zatím vypadá velmi dobře, chce to ještě dodělat nějaké nastavení, aby se správně generovaly členy tříd. Pak už nebude problém vygenerovat wrapper třídy pro ostatní typy.&lt;br /&gt;&lt;br /&gt;Přemýšlím, jak moc zuniverzálnit ten generátor kódu. Našel jsem totiž pár COM komponent, které by se mi ( a myslím, že nejen mě ) docela hodily a nepoužívám je. Tak bych chtěl proces vygenerování zdrojového kódu pro wrapper assembly co nejvíce zjednodušit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4575995888506380441-5464029775685807577?l=tckspress.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tckspress.blogspot.com/feeds/5464029775685807577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4575995888506380441&amp;postID=5464029775685807577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/5464029775685807577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/5464029775685807577'/><link rel='alternate' type='text/html' href='http://tckspress.blogspot.com/2008/10/ms-office-for-net-v012.html' title='MS Office for .NET v0.1.2'/><author><name>TcKs</name><uri>http://www.blogger.com/profile/04891118457143847305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4575995888506380441.post-2014217997759965405</id><published>2008-10-07T10:15:00.003+02:00</published><updated>2008-10-07T10:21:41.298+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cz cze .net'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet c# vb.net programming office interop'/><title type='text'>MS Office for .NET v0.1.1</title><content type='html'>Včera jsem udělal další release MS Office for .NET. Jedná se o verzi v0.1.1.&lt;br /&gt;Zakomponoval jsem do wrapper tříd vazby, které zajišťují automatické uvolnění COM objektů. Teď už by se tedy měly aplikace uvolňovat z paměti, i když někde zapomenete referenci na wrapper objekt.&lt;br /&gt;&lt;br /&gt;Všechny wrapper třídy nyní implementují rozhraní IDisposable. Při volání metody Dispose se uvolňí reference na COM objekt. Tím se i trochu zjednodušila práce s třídou Application, jelikož ji nyní lze uzavřít do bloku "using( ... ) { ... }".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4575995888506380441-2014217997759965405?l=tckspress.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tckspress.blogspot.com/feeds/2014217997759965405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4575995888506380441&amp;postID=2014217997759965405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/2014217997759965405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/2014217997759965405'/><link rel='alternate' type='text/html' href='http://tckspress.blogspot.com/2008/10/ms-office-for-net-v011.html' title='MS Office for .NET v0.1.1'/><author><name>TcKs</name><uri>http://www.blogger.com/profile/04891118457143847305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4575995888506380441.post-2515665126218005270</id><published>2008-10-01T11:21:00.003+02:00</published><updated>2008-10-01T11:28:51.852+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cz cze .net'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet c# vb.net programming office interop'/><title type='text'>MS Office for .NET na CodePlex.com</title><content type='html'>Založil jsem open-source projekt &lt;a href="http://www.codeplex.com/msofficefornet"&gt;MS Office for .NET&lt;/a&gt; na serveru &lt;a href="http://www.codeplex.com"&gt;CodePlex.com&lt;/a&gt;. Jeho model je/bude stejný jako jsem popsal v &lt;a href="http://tckspress.blogspot.com/2008/09/pouzivani-ms-office-z-prosted-net.html"&gt;minulém příspěvku&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Tak by mělo být všem jasné, jak s MS Office pracovat, a každý si to nebude muset psát sám.&lt;br /&gt;&lt;br /&gt;Jelikož ale vývoj tohoto projektu není žádná zábava, nepočítám, že bych měl moc přispěvatelů :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4575995888506380441-2515665126218005270?l=tckspress.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tckspress.blogspot.com/feeds/2515665126218005270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4575995888506380441&amp;postID=2515665126218005270' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/2515665126218005270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/2515665126218005270'/><link rel='alternate' type='text/html' href='http://tckspress.blogspot.com/2008/10/ms-office-for-net-na-codeplexcom.html' title='MS Office for .NET na CodePlex.com'/><author><name>TcKs</name><uri>http://www.blogger.com/profile/04891118457143847305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4575995888506380441.post-2693744166944894410</id><published>2008-09-25T09:33:00.006+02:00</published><updated>2008-09-25T10:45:45.958+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cz cze  .net'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet c# vb.net programming  office interop'/><title type='text'>Použivani MS Office z prostředí .NET</title><content type='html'>Jedna z častých otázek, která se objevuje na diskuzních fórech, je ovládání MS Office či přístup do jejich souborů. Přestože se to zdá jako jednoduchý úkol, realita je trošku někde jinde.&lt;br /&gt;Máte v zásade tři možnosti, které mají své pro i proti.&lt;br /&gt;&lt;br /&gt;1) OleDB provider pro Excel&lt;br /&gt;2) Visual Studio Tools for Office ( VSTO )&lt;br /&gt;3) Napsat si vlastni wrapper&lt;br /&gt;&lt;br /&gt;Paradoxne nejjednodužší (*) a nejspolehlivějši je třetí možnost.&lt;br /&gt;Když využijete schopnost VB.NET - late binding - tak můžete komunikovoat s COM rozhraním Office s poměrně vysokým (oproti ostatním možnostem) komfortem. V podstatě opisujete to, co vidíte ve VBA u Office a Excelu/Wordu/Outlooku/atd...&lt;br /&gt;&lt;br /&gt;Přiklad:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; Public Class ExcelApplication &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private m_NativeApplication As Object 'COM objekt s aplikaci excelu &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub New(nativeApplication As Object) 'konstruktor &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_NativeApplication = nativeApplication &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Shared Function CreateApplication() As ExcelApplication &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim comObj = CreateObject("Excel.Application") 'vytvori instanci COM objektu excelu &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ret As New ExcelApplication(comObj) 'vytvori wrapper tridu nad COM objektem &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return ret &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Readonly Property WorkBooks() As WorkBooks &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim comObj As Object = m_NativeApplication.WorkBooks 'ziska se COM objekt WorkBooks &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ret As New WorkBooks(comObj) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return ret &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub Quit() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_NativeApplication.Quit() 'za behu aplikace se "samo" zjisti jaka metoda se ma zavolat = late binding &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Sub &lt;br /&gt; End Class &lt;br /&gt; &lt;br /&gt; Public Class WorkBooks &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim m_NativeWorkBooks As Object &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Sub New(nativeWorkBooks as Object) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_NativeWorkBooks = nativeWorkBooks &lt;br /&gt; End Sub &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Default Readonly Property Item(index As Integer) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim comObj as Object = m_NativeWorkBooks(index) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ret As new WorkBook(comObj) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Eeturn ret &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function Open(filename As String) As WorkBook &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim comObj as Object = m_NativeWorkBook.Open(filename) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ret As New WorkBook(comObj) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return ret &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function &lt;br /&gt; &lt;br /&gt; End Class &lt;br /&gt; &lt;br /&gt; ... &lt;br /&gt; ... &lt;br /&gt; ... &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A takto si vytvoříte třídy, jejich metody a property, které potřebujete. Navíc nejste zavislí na konkrétni verzi Office. Toto bude fungovat na Office 2000, xp, 2003, a novejsi, mozna i starsi.&lt;br /&gt;&lt;br /&gt;(*) S příchodem VSTO 2007 SE se situace trochu zlepšila, a už to není tak strašné. Leč, stále mají co vylepšovat.&lt;br /&gt;&lt;br /&gt;P.S.: Pokud chcete těch tříd hodně, zamyslete se nad možnosti automatické generace kódu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4575995888506380441-2693744166944894410?l=tckspress.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tckspress.blogspot.com/feeds/2693744166944894410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4575995888506380441&amp;postID=2693744166944894410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/2693744166944894410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/2693744166944894410'/><link rel='alternate' type='text/html' href='http://tckspress.blogspot.com/2008/09/pouzivani-ms-office-z-prosted-net.html' title='Použivani MS Office z prostředí .NET'/><author><name>TcKs</name><uri>http://www.blogger.com/profile/04891118457143847305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4575995888506380441.post-1277487822798037872</id><published>2008-09-24T11:47:00.003+02:00</published><updated>2008-09-24T11:59:25.072+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='url'/><category scheme='http://www.blogger.com/atom/ns#' term='cz'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='cze'/><title type='text'>StackOverflow</title><content type='html'>Nedávno jsem narazil na server &lt;a href="http://www.stackoverflow.com/"&gt;StackOverflow.com&lt;/a&gt;. Musím přiznat, že mě hned ze začatku chytnul. Mají tam docela pěkný systém bodování odpovědí ( rating ), a ( což je nezvyklé ) i otázek. Kromě toho lze získávat i odznaky, za různé aktivity. Bohužel mi některé připadají docela přízemní - zřejmě mají motivovat, ale dle mého názoru spíš devalvují jejich hodnotu.&lt;br /&gt;&lt;br /&gt;Podle výše získaného ratingu se uživatelům zpřístupňují komunitní funkce. Úplně ze začátku může uživatel jen posílat dotazy či na ně odpovídat. Po získání 15 bodů už může i přidávat komentáře a hodnotit ostatni. Dále se pak nabízí další možnosti, nebudu je tu vypisovat, můžete si je přečíst ve &lt;a href="http://stackoverflow.com/faq"&gt;faq&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Je vidět, že je server ještě mladý, jelikož již po chvíli používání člověku chybí pár užitešných funkcí. Mě osobně například chybí filtrování dotazů podle více tagů - nyní lze jen podle jednoho. Nicméně to vypadá, že vývojový tým ( mimochodem složený z docela známých jmen ) má zájem o odezvu uživatelů, tak se tato funkce snad brzy objeví.&lt;br /&gt;&lt;br /&gt;Zatím jsem dosáhl hodnoceni 267 bodů a mé nadšení ještě neopadlo. Vypadá to, že se StackOverflow stane mým oblíbeným serverem ... a kdo ví, třeba nahradí i moje oblíbené fórum &lt;a href="http://www.builder.cz/"&gt;builder.cz&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://www.stackoverflow.com/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4575995888506380441-1277487822798037872?l=tckspress.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tckspress.blogspot.com/feeds/1277487822798037872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4575995888506380441&amp;postID=1277487822798037872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/1277487822798037872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4575995888506380441/posts/default/1277487822798037872'/><link rel='alternate' type='text/html' href='http://tckspress.blogspot.com/2008/09/stackoverflow.html' title='StackOverflow'/><author><name>TcKs</name><uri>http://www.blogger.com/profile/04891118457143847305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
