Visual Basic zblφzka


Vytvß°enφ formulß°∙ a jejich ₧ivotnost

Tentokrßt se podφvßme na formulß°e. Sice se jednß ve VB o objekty, ale je to pon∞kud slo₧it∞jÜφ. Pro vytvß°enφ a prßci s formulß°i se pou₧φvß Windows API. Tyto nejsou objektovΘ orientovanΘ a fungujφ ve form∞ procedur Φi funkcφ a odkazujφ se na jednotlivΘ formulß°e s pomocφ handle (hWnd). VB vÜak jednotlivΘ funkce, udßlosti a vlastnosti zapouzd°uje tak, ₧e se zdß, ₧e je formulß° Φist∞ objektovou zßle₧itostφ.

New p°i°adφte odkaz na novou instanci, p°iΦem₧ je vyvolßna udßlost Initialize. V tΘto fßzi se objekt bude nachßzet do tΘ doby, ne₧ se pokusφte p°istoupit k dan²m (jejich existence je automatickß, nejsou poΦφtßny vßmi vytvo°enΘ vlastnosti Φi metody) metodßm Φi vlastnostem formulß°e nebo ne₧ jej nahrajete s pomocφ procedury Load. Po jednΘ z uveden²ch operacφ je s pomocφ API vytvo°en skuteΦn² formulß° a zavolßna udßlost Load.

Nynφ budeme chtφt takto vytvo°en² formulß° zruÜit. Jak jsme si °ekli v minulΘm dφle, staΦφ odstranit odkazy na objekt a o destrukci u₧ je postarßno automaticky. Nastavφte jedinou prom∞nnou, kterß se odkazuje na vßÜ formulß°, na Nothing, ale formulß° je stßle zvesela zobrazen, p°esto₧e prom∞nnß je opravdu nastavena na Nothing. Kde je tedy chyba? Äe by zas n∞jakß zrada jmΘnem MS? Ne, mß to mnohem prozaiΦt∞jÜφ d∙vod. P°i nahrßvßnφ formulß°e, a¥ u₧ je proveden pomocφ Load nebo automaticky, je odkaz na formulß° za°azen do kolekce Forms, ve kterΘ se nalΘzajφ vÜechny nahranΘ formulß°e. A dokud se tento odkaz nachßzφ v kolekci Forms, Φili existuje na n∞j odkaz, neprovede se destrukce objektu. Abyste jej z kolekce odstranili pou₧ijete Unload. Ten se postarß o to, aby byl formulß° odstran∞n z kolekce a provede destrukci formulß°e pomocφ API. Po tΘto akci, p°edtφm ne₧ se v∙bec zaΦne s likvidacφ formulß°e, nastane udßost QueryUnload, ve kterΘ je nejlΘpÜφ obslou₧it nedokonΦenΘ akce Φi zabrßnit u₧ivateli v uzav°enφ formulß°e Φi aplikce. Nejd°φv je toti₧ tato udßlost zavolßna pro vÜechny sovisejφcφ formulß°e (nap°φklad potomci MDI Formulß°e) a je-li v jednom p°φpad∞ nastavena prom∞nnß Cancel na True, je celß tato akce pro vÜechny souvisejφcφ formulß°e zruÜena a vÜe z∙stane v p∙vodnφm stavu. Navφc jste v tΘto udßlosti schopni zabrßnit ukonΦenφ Windows (smoz°ejm∞ odst°elenφ procesu se neubrßnφte) nebo aplikace (nap°φklad pomocφ End). Naproti tomu udßlost Unload takov²mto akcφm nezabrßnφ a formulß° je zruÜen. Navφc, pokusφte-li se zav°φt MDI okno, jsou postupn∞ dotazovßni a zavφrßni potomci a a₧ se narazφ na potomka, kter² se v udßlosti Unload brßnφ uzav°enφ, je zavφrßnφ zastaveno, ale to u₧ m∙₧e b²t Φßst formulß°∙ zbyteΦn∞ uzav°ena.

Co ovÜem Unload neud∞lß je, ₧e nezruÜφ objekt, kter² formulß° zapouzd°uje. O to se postarßte odstran∞nφm odkaz∙ na n∞j, p°iΦem₧ nastane udßlost Terminate.

ZvlßÜtnφ kategoriφ formulß°∙ jsou ty, kterΘ vytvo°φte v nßvrhß°i. S jejich jmΘnem, kterΘ vyplnφte do vlastnosti (Name), m∙₧ete pracovat jako s typem nebo jako s prom∞nnou, kterß se bude chovat stejn∞ jako prom∞nnß deklarovanß s klφΦov²m slovem New (viz minul² dφl), se vÜemi neduhy, kterΘ tento postup p°inßÜφ.