02.10.2020, Vladimír Klaus, navštíveno 1338x
Každý, kdo programuje v Delphi už nějakou dobu, spíše delší dobu (ano, je to tam od začátku), tak asi ví, že může nastavit formuláři vlastnost:
MyForm.FormStyle:=fsStayOnTop;
Tím se zajistí, že formulář/okno bude nad všemi ostatními. To je samozřejmě skvělé, ale jen to do té doby, než třeba dalšímu vašemu formuláři nastavíte totéž. A pak se budou o to prát, zvláště, když něco z toho bude modální dialog atd. No zkrátka docela velká pakárna...
Co s tím? Po nějaké době pátrání najdete, že stačí nastavit danému formuláři jisté parametry a díky nim se zobrazí vždy nad jakýmkoli formulářem, i když tento má také natavené StayOnTop. Klasický příklad je ten, že máte hlavní formulář aplikace, kterému nastavíte StayOnTop a pak z něj chcete zobrazovat další modální dialogy/formuláře. A vážně nechcete, aby se zobrazily pod hlavním formulářem. 😁
Pak je tedy vhodné si připravit další speciální metodu, kterou budete tento dialog zobrazovat - místo ShowModal() - si nadefinujeme třeba ShowModalTop() a v něm se nastaví vše potřebné.
function TMyForm.ShowModalTop: integer;
begin
//případně dynamicky formulář, který toto okno opravdu volá
PopupParent:=MainForm;
PopupMode:=pmAuto;
result:=ShowModal;
end;
Co je na tomto opravdu zarážející je to, že tyto vlastnosti nemůžete nastavit danému formuláři v design modu. Jedna vlastnost "vyresetuje" druhou nebo nějak přenastaví. Zkrátka kombinace "odkaz na hlavní formulář + Auto" nejde nastavit. 🤪
Není to žádná katastrofa, ale podivné to tedy je, zvláště pokud to jde nastavit v kódu, funguje to a dělá přesně to, co potřebujete.
Závěr:
Pokud plánujete, že hlavnímu formuláři umožníte "StayOnTop", tak je nejlepší všem podřízeným formulářům a dialogům nadefinovat metodu ShowModalTop() a pak je přes ni zobrazovat, ať už "StayOnTop" hlavního formuláře využijete či nikoliv.