Xabatcha blog - Henselmanuv seznam IT otázek pro pohovory IV.
Dnes se podíváme trochu na Assembly. Pod pojmem Assembly si lze představit jakoukoliv knihovnu, fyzicky tedy soubor s příponou dll nebo exe soubory. Podrobnější definici můžete na najít na Wikipedii po heslem .Net Assembly.16. Používá metoda Assembly.Load(...) statickou či dynamickou referenci?Metoda Load() používá dynamické reference. Rozdíl mezi statickou a dynamickou referencí je, že statické reference jsou uložené v metadatech během kompilace a zde jsou pak dostupné. Dynamické reference se zjišťují během běhu aplikace, tzv. Run-Time.Referencí se zde myslí třeba odkaz na metodu definovanou v dané Assembly.17. Kde je vhodnější použít Assembly.LoadFrom() a kde Assembly.LoadFile()?- metoda Load() ... metoda používá vlastní metodu pro prohledávání. Dle zadaného jména assembly prohledá GAC nebo Bin adresář aplikace a pokud assembly nalezne, tak ji nahraje.- metoda LoadFrom() ... metoda používá vlastní metodu pro prohledávání. Dle zadaného parametru se snaží najít danou assembly v GAC nebo Bin adresář nebo zadané cestě- metoda LoadFile() ... metoda nepoužívá vlastní metodu a nahraje assembly jen dle vstupního parametru, tedy plné cesty k assembly.Odpověď tedy je, že v případě, kdy jsme si jisti cestou k assembly, můžeme ušetřit cenný čas použitím metody LoadFile, která nespouští vnitřní mechanismus vyhledávání.Z téhle otázky nejsem moc chytrý, ale našel jsem pěkný přehled na tomto blogu. V případě nejasností doporučuji prozkoumat.18. Co je to Assembly Qualified Name?Assembly Qualified Name je řetězec, který jednoznačně identifikuje Assembly a obsahuje minimálně tyto informace:- assembly jméno- culture - standardně nastavena na culture neutral (specifické Culture by měla být definována jen pro satellite assemblies)- verze assembly (major, minor, build a revision)- veřejný klíč, kterým je assembly podepsánaPříklad:CODESystem.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089Odkaz na msdn článěk vysvětlující jak získat Assembly Qualified Name. Kód pro získání Assembly Qualified Name pro DataSet objekt:CODE Type t = typeof(System.Data.DataSet); string s = t.Assembly.FullName.ToString(); Console.WriteLine("The fully qualified assembly name containing the specified class is: {0}.", s); 19. Je toto použití správné? Assembly.Load("foo.dll");Ne, není. "foo.dll" není Assembly Qualified Name. 20. Jaký je rozdíl mezi podepsanou a nepodepsanou assembly?Hlavním rozdílem je že podepsaná knihovna může být nahrána do GAC.Dále také podepsaná knihovna je jednoznačně identifikovaná pomocí hash klíče a proto nemůže být zaměněna za knihovnu se stejným jménem s rozdílným hashem či rozdílnou verzí.Podepsaná assembly dovoluje nahrát do GACu knihovny se stejným jménem ale rozdílnou verzí.Jednoduchý příklad pro práci s Assembly:
AssemblyPouziti.zip ( 21.61k )
Počet stažení: 0
Dnes se podíváme trochu na Assembly. Pod pojmem Assembly si lze představit jakoukoliv knihovnu, fyzicky tedy soubor s příponou dll nebo exe soubory. Podrobnější definici můžete na najít na Wikipedii po heslem .Net Assembly.16. Používá metoda Assembly.Load(...) statickou či dynamickou referenci?Metoda Load() používá dynamické reference. Rozdíl mezi statickou a dynamickou referencí je, že statické reference jsou uložené v metadatech během kompilace a zde jsou pak dostupné. Dynamické reference se zjišťují během běhu aplikace, tzv. Run-Time.Referencí se zde myslí třeba odkaz na metodu definovanou v dané Assembly.17. Kde je vhodnější použít Assembly.LoadFrom() a kde Assembly.LoadFile()?- metoda Load() ... metoda používá vlastní metodu pro prohledávání. Dle zadaného jména assembly prohledá GAC nebo Bin adresář aplikace a pokud assembly nalezne, tak ji nahraje.- metoda LoadFrom() ... metoda používá vlastní metodu pro prohledávání. Dle zadaného parametru se snaží najít danou assembly v GAC nebo Bin adresář nebo zadané cestě- metoda LoadFile() ... metoda nepoužívá vlastní metodu a nahraje assembly jen dle vstupního parametru, tedy plné cesty k assembly.Odpověď tedy je, že v případě, kdy jsme si jisti cestou k assembly, můžeme ušetřit cenný čas použitím metody LoadFile, která nespouští vnitřní mechanismus vyhledávání.Z téhle otázky nejsem moc chytrý, ale našel jsem pěkný přehled na tomto blogu. V případě nejasností doporučuji prozkoumat.18. Co je to Assembly Qualified Name?Assembly Qualified Name je řetězec, který jednoznačně identifikuje Assembly a obsahuje minimálně tyto informace:- assembly jméno- culture - standardně nastavena na culture neutral (specifické Culture by měla být definována jen pro satellite assemblies)- verze assembly (major, minor, build a revision)- veřejný klíč, kterým je assembly podepsánaPříklad:CODESystem.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089Odkaz na msdn článěk vysvětlující jak získat Assembly Qualified Name. Kód pro získání Assembly Qualified Name pro DataSet objekt:CODE Type t = typeof(System.Data.DataSet); string s = t.Assembly.FullName.ToString(); Console.WriteLine("The fully qualified assembly name containing the specified class is: {0}.", s); 19. Je toto použití správné? Assembly.Load("foo.dll");Ne, není. "foo.dll" není Assembly Qualified Name. 20. Jaký je rozdíl mezi podepsanou a nepodepsanou assembly?Hlavním rozdílem je že podepsaná knihovna může být nahrána do GAC.Dále také podepsaná knihovna je jednoznačně identifikovaná pomocí hash klíče a proto nemůže být zaměněna za knihovnu se stejným jménem s rozdílným hashem či rozdílnou verzí.Podepsaná assembly dovoluje nahrát do GACu knihovny se stejným jménem ale rozdílnou verzí.Jednoduchý příklad pro práci s Assembly:
AssemblyPouziti.zip ( 21.61k )
Počet stažení: 0
Související články
Po nějaké době se vracím k seriálu o tématům, které by měl znát, alespoň všeobecně, každý Net programátor pro úspešný průběh pohovoru. Tady je dnešní dávka.11. Popište rozdíl mezi výrazy Class a InterfaceInterface definuje seznam dostupných metod a proměnných, které budou dostupné pro všechny zděděné implementace. Mimo tuto definici neobsahuje žádný jiný kód. Class neboli třída, obsahuje implementaci tříd a proměnných definovaných na základě zděděného Interface nebo vlastní implementace. Třída tedy obsahuje vlastní kód, který provádí vlastní provedení instrukcí.12. Co je to reflection neboli reflexeReflection je proces při kterém dochází během Runtimu k dynamickému vytváření tříd. Objekty lze vytvářet dle předem známých jmen tříd včetně verze a klíče nebo dynamicky pomocí načtení dat přímo z požadované knihovny.Assembly nebo-li knihovny obsahující vytvářené objekty musí být podepsány pomocí strong-name. Například jako je tato knihovna z Enterprise library:CODEtype="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=e5eb9380e8d00457"Příklad použití reflexe:
ReflectionEx.zip ( 19.71k )
Počet stažení: 013. Jaký je rozdíl mezi XML Web Service používající ASMX a Net Remoting používající SOAP?Základním rozdílem je interoperabilita. Synonymum Interoperability je přenosnost a použitelnost objektu mezi různými systémy. Net remoting lze použít pouze pro komunikaci mezi Net komponentami. WebService je nezávislé na systému a podporuje komunikaci mezi všemi systémy. Realita však trochu kulhá, jelikož při použití většího množství prvků zabezpečení dochází k nekompatibilitě některých technologií. Ale toto je problém implementace, né definice.Je zde ještě jeden rozdíl a to, že Net remoting v tomto případě používá SoapFormatter, kdežto WebService používá XmlFormatter.14. Jsou systémové typy reprezentující XmlSchema a CLS isomorfické?Předně to chce znát význam slova Isomorfní. Synonymem by mohla být slova: totožné, kompatibilní, přenositelné.Pojem XmlSchema je snad dostatečně znám, ale přesto krátce : jedná se o skupinu pravidel, jež definují strukturu a typy jednotlivých kořenů a elementů v XML dokumentu.Pojem CLS představuje zkratku pro jazyk, na kterém beží všechny Dot.Net jazyky (C#, VB.Net, C++.Net).Odpověď na otázku je Ano, jsou isomorfní. Názvy se liší, ale interpretace je stejná. Pro porovnání je zde ukázka:xs:boolean == bool, System.Booleanxs:string == string, System.Stringxs:decimal == decimal, System.Decimal15. Jaký je rozdíl mezi early-binding a late-binding?Rozdíl je v tom, kdy je známa hodnota proměnné. V případě early binding je hodnota známá již v době kompilace. V případě late binding je hodnota přiřazena až během běhu aplikace.Late binidng se používá hlavně kvůli tomu, aby se nezatěžoval systém informacemi, které momentálně nepotřebuje. Ušetříme tak čas a paměť. Ideálním příkladem jsou kolekce, které jsou většinou datově náročné a je nutné je nahrát online a případně i filtrovat dle vstupních kritérií.CODEclass Example { //příklad na Early binding private string _name = "MojeJmeno";//hodnota je nastavena public string Name { get { return _name; } } //příklad na Late bindind private string _title; //hodnota je prázdná a je načtena až po prvnim přístupu k proměnné public string Title { get{ if (System.String.IsNullOrEmpty(_title)){ _title = "Muj titul"; } return _title; } } }
a máme tu další díl seriálu věčné nevědomosti....aneb tohle nikdy neskončí. 21. Může být DateTime null? Nemůže, jelikož to není třída (class), ale struktura (struct). 22. Co je to JIT? Co je to NGEN? Jaké jsou výhody a nevýhody obou? JIT - Just In Time - JIT je zkratka označující způsob zpracování kodu. Hlavním účelem JIT kompilace je docílení optimalizované kompilace, která se provádí až těsně před spuštěním kódu. To má za následek celkově delší dobu spuštění, tzv. startup time delay. Tento nedostatek však plně vyváží optimalizovaný kód, který je kompilován s ohledem na prostředí, procesor či paměť a který urychlí běh aplikace oproti statické kompilace během vývoje.
Dneska bude trochu změna, jelikož když jsem si projížděl další otázky z Henselmanova seznamu, tak jsem shledal některé naprosto nezajímavé. Netvrdím, že nejsou důležité, ale kdo se dnes ještě vrtá v COMech? Moc lidí to nebude. Takže otázky týkající se COM jsou z kola venku. Spíše se zaměřím na otázky, které jsou zajímavé z hlediska přijímacích pohovorů. Takže to bude teď trochu na přeskáčku.26. Co je špatně na DateTime.Parse(myString);?V podstatě nic, pokud je vám jedno v jakém formátu bude string převeden na datum. Pokud nespecifikujete formát datumu v řetězci, tak hrozí třeba záměna měsíců a dnů viz. US formátování MM/dd/yyy oproti českému formátování dd/MM/yyy. Pak samozřejmě dojde k nekorektnímu výstupu a padne to na vyjímku, když se bude snažit formátovat 13 den jako měsíc.Ideálně použijte DateTime.ParseExact() místo DateTime.Parse().
Druhá část dosti dlouho očekávaného checklistu přináší zbývající otázky potřebné k zodpovězení, pokud chcete svůj webový projekt dovést k úspěšnějšímu konci než jenom k stále poměrně běžnému bezduchému vystavení stránek na internetu, které okamžikem svého vystavení „umírají“.

16. listopadu 07, 12:11
Weblogy.cz
Které CSS techniky, jaký font používají, co čtou a co upřednostňují při tvorbě www "nejlepší" webdesigneři světa? Na pět základních otázek odpovídalo 35 předních světových designerů.

14. května 07, 12:05
Weblogy.cz
Firma jež zaměstnává guru of CSLA, Rockforda Lhotku, hledá nové zaměstnance. Hádám, že nic pro našince, jelikož všechny její pobočky jsou v USA, ale určitě je zajímavý jejich vstupní test, který je online dostupný na internetu. Kriterium pro možnost přijetí je dosažení 70 bodů ze 100. Obsahem testu jsou v podstatě elementární otázky týkajicí se Net frameworku. Nic o CSLA, jen základy. Teoreticky, ten kdo pilně studoval celý Henselmanuv seznam otázek by neměl mít větší problémy dosáhnout velmi vysokého hodnocení. Určitě je zajímavé zjistit, jak na tom jsme....osobně jsem dosáhl 50 bodů a test jsem vyplnil behěm 10 minut bez toho abych se vracel zpět. Tak co, jak dobří jste?]

28. listopadu 07, 03:11
megaBLOG.cz Seznam blogů
Některé věci jsou opravdu mimo mé chápání.Můj tchán je tak trochu samorost a beran a některé věci prostě řeší tak nějak po svém....ale co je moc to je moc....jeden příklad za všechny.V baráku máme v obývacím pokoji krb. Krb bohužel nemá záklopku a tak jsem ustí komína vrazil takovou ucpávku, kterou lze v případě potřeby šlo vyndat. Můj tchán je vášnivý pyromen a snílek, rád pálí ohníčky. A tak zatím co jsem uspával ratolesti, tak se jal pálit ohýnek. Když jsem se ho později zeptal, kam že to dal tu ucpávku, odpověděl mi z dětským výrazem ve tváři, že ji spálil. A tohle prostě nechápu. Ta vycpávka byla specificky vyrobena za účelem nahrazení záklopky. Primitivní, ale funkční. A on to spálí jako by se nechumelilo. Opravdu tohle přichází z věkem na každého? Budu taky takový?????]
Tak se postupně snažím pochopit smysl všech těch pro mě nových výrazů v programování, např. MVP, MVC, Dependency injection, Smart parts a mnoho dalších. Musím říci, že to není vůbec jednoduché a pokud to člověk nepotřebuje během své normální pracovní doby, tak se do toho člověk dostává dost těžko, alespoň takhle po večerech.Tento příspěvek píší ze záměrem pomocí případným zájemcům o SCSF implementaci usnadnit pátrání po případné dokumentaci, příkladům či průvodcům.Ačkoli by člověk předpokládal, že největším informačním zdrojem budou stránky SCSF, tak podle mě nejvíce začátečníkovi pomůže seriál jež na svém blogu zveřejňuje Rich Newman. Pokud se rozhodnete použít SCSF pro svůj budoucí projekt, určitě se budete muset seznámit s Composite Application Block, což je vlastně podstata věci.Dle svých zkušeností bych doporučil tyto dostupné zdroje: (Seznam seřazen dle priorit)1 . seriál od Riche Newmana2. Cabpedia - wiki dokumentace shrnující dostupné informace k SCSF, plus pár tipů k vývoji3. SCSF - officiální stránky Smart klienta (za pozornost určitě stojí nově otevřená znalostní databáze)Za zmínku stojí určitě i pár blogů, například #2782, David Hayden, Tom Hollander a již zmiňovaný Rich NewmanCo se týče příkladů s použitím SCSF, tak bych doporučil mimo příkladů dostupných přímo od SCSF týmu těchto pár implementací:1. kombinace CSLA a SCSF - použití SCSF u příkladu distribuovaného s CSLA2. Example ke knize o SCSF od Davida Platta3. třetím implementací je Petshop od Szymona KobalczykaOsobně shledávám problém v pochopení, a to hlavně v roztřístřeností možných řešení implementace. Zatím pro mne není zřejmé, kdy a kde co použít pro docílení nejoptimálnějšího řešení. Když na to musí člověk přicházet sám, tak to vždy trvá, zase na druhou stranu tomu bude plně rozumět. Hlavně vytrvat...P.S. pokud budete mít nějaké další tipy, nerozpakujte se a přidejte je do diskuze.
Sasha Barber, jeden z mnoha MVP používá usměvnou poznámku pod čarou:Originál:Your best friend is you.I"m my best friend too. We share the same views, and hardly ever argueNeoriginální překlad:Ty jsi svůj nejlepší přítel.Já jsem můj nejlepší přátel také. Máme stejný názor na věc a nikdy se nepřeme.
Již nějakou dobu používám CSLA.Net pro business objekty. Za tu dobu jsem si vytvořil pár templates, které by se mohli případně hodit i někomu jinému. Originály jsou z šablon, které se dodávají volně s frameworkem. Templates kombinují CSLA objekty s Enterprise Library data block, Pro získání dat z database se volají stored procedure. Pro C# kód jsem dříve používal jen princip Copy, Past, Replace. Teď používám ReSharper, tak to jde jednodušeji přes templates, které tam jsou zabudované. Pro začátek začneme jedním z nejvíce používaných objektů a to je RootEditable object.
Přiložené soubory
Pro ty kdo ještě neví co je to SCSF alias Smart Client Software Factory nechť následují bílého králíka.Začal jsem se seznamovat s tímto programovacím modelem a narazil jsem na pár záludných chyb.První byl problém po instalaci při vytváření nového SCSF projektu ve VS2005, kdy celý proces spadl a zahlásil chybu, že nemůže vytvořit nové solution a v error message byl odkaz na nějaké chybějící VB soubory. Dle informaci na stránkách projektu jde o dnes již vyřešený bug a to buď nutnou doinstalací Visual Basicu nebo s modifikací instalačního balíčku případně nainstalované verze.Druhý bug je docela legrační, protože si myslím, že mohl dost lidem přivodit pár neradostných okamžiků. Při použití recipe Add Event Publication nad View docházelo k padání generování kódu s nějakou nesmyslnou chybou. Ale co mě fakt dostalo je řešení. Stačí zapnout odřádkování složených závorek na nový řádek pro formátování metod. Tedy něco jako toto:public void CloseView(....){}Fakt jsem obdivoval toho borce co na to přišel.]
Při použití vnitrofiremní knihovny pro logování v Net aplikacích jsem se dostal do problému, kdy se zpráva logovala do databáse. V tomto případě SQL Server 2000. Při hledání řešení jsem narazil na několik chyb. Zde musím říci, že je mimo mou moc něco změnit v této knihovně. Což mě nečiní moc šťastným, spíše naopak.Chybou bylo, že pokud byla nějaká vstupní hodnota rovna null, v mém případě StackTrace z Exception objektu, tak to padalo jemně na pusu. Důvodem je, že SQL Server neakceptuje null hodnotu tak jak ji interpretuje Dot.Net. Musí se provést test hodnoty na null hodnotu a pokud je object roven null, musí se přiřadit jiná null hodnota, které SQL Server rozumí. V tomto případě System.DBNull.Value.Tento problém se dal ještě řešit na úrovni SQL serveru a to přiřazením default NULL hodnoty pro vstupní parametr v insertovací stored proceduře. Pak to projde i bez změn v logovací knihovně. Tedy něco jakoCREATE PROCEDURE dbo.insert_errorlog @errormessage nvarchar(500) = NULL, @errorsource nvarchar(100) = NULL, @stacktrace nvarchar(300) = NULL, as ...Zajímavostí, které mě ale nejvíce zaujala jest zjištění, že na to aby se naplnil StackTrace v Exception musí být sama Exception vyhozena (vyhozena ... legrační, že). Tedy nestačí ji jen vytvořit pomocí new konstrukce ale musí se použít navíc i throw konstrukce. Viz příklad.CODEstatic void Main(string[] args){ UserFriendlyException exc = new UserFriendlyException("test"); Console.WriteLine("1. Exception created"); Console.WriteLine(string.Format("Reading Stacktrace: {0}",exc.StackTrace)); try { Console.WriteLine("2. Exception thrown"); throw exc; } catch (UserFriendlyException ex) { Console.WriteLine("3. Exception caught as UserFriendlyException"); Console.WriteLine(string.Format("Reading Stacktrace: {0}",ex.StackTrace)); } catch(Exception ex) { Console.WriteLine("4. Exception caught as Exception"); Console.WriteLine(string.Format("Reading Stacktrace: {0}",ex.StackTrace)); } Console.WriteLine("**************************"); Console.WriteLine("Press any key to close it."); Console.ReadLine();}Věc se má vlastně tak, že jsem se snažil přijít na to, jak bych mohl nastavit nějakou hodnotu do StackTrace vlastnosti. Bohužel StackTrace má pouze Getter a nelze ho vložit jako input parametr do konstruktoru, takže zde není šance jak ho nastavit z venku.Btw. podobná situace je s další Exception vlastností a to je Source, ale ten jde naštěstí nastavit, jelikož má i Setter.Source:
ExceptionTest.zip ( 17.07k )
Počet stažení: 0]
Na Codesqueeze jsem narazil na skvělý článek, akorát nevím jestli je k smíchu nebo pláči.Osobně jsem nemohl udržet smích v rozumných mezích. :-)]
Ten kdo má, měl možnost potýkat se s klonováním objektů v Net aplikacích jistě řešil jak správně a jak hluboko :-) se má klonovat. Mým problémem je, že chci do svých Base objektů implementovat metodu, která vrátí Deep copy objektu v nové instanci. Tedy, že v paměti vzniknou dva různé avšak identické objekty.Pod tlakem událostí jsem to řešil né příliš efektivní cestou o to tím, že jsem metodu implementoval až na úrovni zděděných objektů, přičemž jsem ovšem porušil pravidlo viditelnosti Base objektů a zpřístupnil jsem některé privátní proměnné jako protected tak aby šli nastavit. Spokojený s tím moc nejsem, takže se mi snad podaří prosadit změnu ve smyslu implementace na úrovni Base objektů a navrácení viditelnosti změněných vlastností.Na toto téma jsem trochu googloval a našel jsem velmi vydařený článek, který obsahuje i praktické příklady.]
Ten kdo má, měl možnost potýkat se s klonováním objektů v Net aplikacích jistě řešil jak správně a jak hluboko :-) se má klonovat. Mým problémem je, že chci do svých Base objektů implementovat metodu, která vrátí Deep copy objektu v nové instanci. Tedy, že v paměti vzniknou dva různé avšak identické objekty.Pod tlakem událostí jsem to řešil né příliš efektivní cestou o to tím, že jsem metodu implementoval až na úrovni zděděných objektů, přičemž jsem ovšem porušil pravidlo viditelnosti Base objektů a zpřístupnil jsem některé privátní proměnné jako protected tak aby šli nastavit. Spokojený s tím moc nejsem, takže se mi snad podaří prosadit změnu ve smyslu implementace na úrovni Base objektů a navrácení viditelnosti změněných vlastností.Na toto téma jsem trochu googloval a našel jsem velmi vydařený článek, který obsahuje i praktické příklady.[Update]Tak jsem si vyzkoušel jak to funguje a nakonec jsem použil verzi s metodou MemberwiseClone(). Tady se můžete podívat na zdrojáky:
CLone.zip ( 76.29k )
Počet stažení: 12
Velmi rád čtu blog Johna Vanhara. Jméno zní dost agnlicky, ale jde o našince, který žije dlouhodobě v US. Pan Vanhara zde píše o svých zkušenostech s podnikáním v US a jde o velmi poutavé a inspirující čtení. Velmi mě zaujal jeden z jeho posledních článků. Řeč je o placení daní.Nejvíce mě zaujal tento odstavec, dovolím si citovat: "Kdyby každý vložil stejné usilí do rozvoje svých podnikání, tak garantuji, že vydělá více než přemýšlením jak ušetřit na daních.". Parafrází je další vyřčená myšlenka z blogu Miroslava Macka, bohužel jsem nenašel originální text, ale dovolím si vyjádřit podstatu myšlenky: "Je lepší přemýšlet nad tím jak vydělat než kde ušetrit."
Na světě jsou lidi, kteří mají dar. Rudolf Havlík je jedním z nich. Každý nový článek na jeho blogu je jak záblesk z čistého nebe. Prostě Vás dostane. Mě alespoň jo.
Pokud se alespoň trochu zajímáte o věci jako je Dependency Injection, Model-View-Presenter nebo SCSF doporučuji se ponořit do série článků od Jeremiho Millera. Jeho obšírné články o tom proč nepoužít CAB je velmi poučný a obsahují mnoho informací, jež pomohou pochopit jak implementovat MVC nebo MVP patterns ve vašich skvělých aplikacích.
Při použití toolbaru v MDI aplikaci je častým cílem, v tomto případě i mým, měnit sestavu jednotlivých položek toolbaru dle zobrazeného (aktivního) okna. Klasická konstrukce použitá v SCSF předpokládá využití v podstatě statického toolbaru, který je nahrán při načtení business modulu. Tj. v třídě ModuleController v metodě. Tento přístup nelze tedy použít v případě MDI. Jak tedy na to?
Přiložené soubory