vložil Radek Červinka
27. dubna 2013 00:55
Příběhů z praxe není nikdy dost. Narazil jsem na problém, že v některých případech kdy zobrazuji modální dialog z modálního dialogu a ještě do toho připletu jiný styl okna (WS_POPUP), někdy nastane problém, že Windows ztrácí informaci o pořadí modálních oken.
Klíčové slovo je "ghosting windows" a projevuje se to (asi) do Windows Vista, tj. okno je vytvářeno bez informace explicitní informace o tom, které okno je jeho nadřízeným oknem (neplést s Owner - což je objekt odpovědný za jeho uvolnění).
Naštěstí jsem zjistil, že v Delphi 2009 (pravděpodobně, možná i dříve) byly do TForm přidány dvě property:
PopupMode může nabývat třech hodnot:
- pmNone (staré chování)
- pmAuto (Screen.ActiveForm se stává aktivním otcem okna)
- pmExplicit (otec okna je definován via PopupParent)
Vtip je v tom, že pokud uděláte ShowModal, tak se automaticky použije pmAuto, ale díky tomu se zavolá RecreateWindow. Pokud tomu chcete zobránit, tak jednoduše nastavte popmode na pmAuto před voláním.
Zdálo by se, že to je výjimečná situace, ale jak zjišťuji není to tak úplně pravda.
Pokud máte starší Delphi, tak pokud se nepletu je řešení přes CreateParams.
9cd964b0-d63f-4291-a08f-f2c74d8dcbd7|5|3.4
Tagy: VCL
Praxe