Zavěšený (hung) formulář a co s tím.

Tento problém je též popsán v MSDN - Q221740.

Již se vám to patrně stalo. Zavěšený formulář. Ne a ne ho sundat dolů.

Zavěšený formulář se projevuje tím, že se nechce ukončit,button "Close" ("Zavřít") je zakázaný a probíhají pouze dvě události - QueryUnload() nebo Release() (dle způsobu ukončení formuláře).

Příčiny zavěšeného formuláře se dají dělit buď do dvou skupin (způsobem zavinění) nebo do třech (kdy se to projevuje).

1) Způsob zavinění:

2) Kdy se to projevuje:

Co s tím ?
Nejjednodušší je zjistit a odstranit odkazy uvnitř samotného formuláře (1a), nejlépe v událostech QueryUnload() nebo Release() (přece víte kam co zapisujete, ne ?).

Pro situaci (1b) je nutno se vyspat, v supermarketu nakoupit asi 100 hl trpělivosti a natáhnout čas. Nu teď vážně.

Pro tuto situaci platí následné pravidlo - hledejte, kde se nachází kód např. IF PEMSTATUS(...) AND cokoliv.
Pokud někde tento kód najdete ihned ho nahraďte následující konstrukcí:

IF PEMSTATUS(...)
   IF cokoliv
   ENDIF
ENDIF

Totéž platí pro IIF() či CASE.

Tím by se vám mělo podařit zlikvidovat asi 95% potíží.

Pokud i nadále dochází k zavěšení, pak nastupuje mnohem delší způsob zjišťování.

Izolace problémové procedury probíhá tak, že se vyblokovávají postupně kusy kódu ve třídách formuláře nebo samotném formuláři až to přestane blbnout. Může se však stát, že zavěšení mohou způsobit dvě nebo i více volaných metod/procedur po sobě. V případě, že jde o (2b), to znamená po každé úpravě kompilaci.

Přeji mnoho úspěchů při odtraňování chyb tohoto kalibru. Naposled jsem tím strávil asi 10 hodin.

PS: Zavěšené formuláře dokáže odstranit jedině příkaz CLEAR ALL.