02.10.2020, Vladimír Klaus, navštíveno 1369x

Delphi

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...

Jak v Delphi zajistit správné fungování "StayOnTop"

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.