Aplikacja – zawsze na wierzchu?

0

Witajcie!

Na głównej formie mojej aplikacji znajduje się opcja ‘Stay on top’, dzięki której użytkownik może widzieć tę formę zawsze ponad innymi oknami i łatwo przeciągać pliki z explorera Windows i ładować je do programu.
Kiedy jednak użytkownik chce skorzystać np. z opcji mojego programu (pojawia się wtedy modalna forma), to podczas pojawienia się tej modalnej formy aplikacja traci właściwość StayOnTop. Podobnie dzieje się podczas wywołania funkcji ShowMessage. Oczywiście w takich sytuacjach, kiedy widoczna jest forma modalna, opcja ‘Stay on top’ jest bezużyteczna, bowiem główna forma jest i tak niedostępna i przeciąganie plików z explorera niemożliwe. Tak więc przy otwartych modalnych oknach nie ma znaczenia z punktu widzenia użyteczności opcji czy aplikacja jest na wierzchu czy też nie.
Zastanawiam się jednak jak to wygląda z punktu widzenia poprawności programistycznej. Czy jeśli użytkownik uaktywnia opcję ‘Stay on top’ w oknie głównym aplikacji, to powinien oczekiwać, że aplikacja zawsze będzie na wierzchu – bez względu na rodzaj otwieranych okien?

Dzięki za Wasze opinie i porady!

0

Moim zdaniem nie powinnien tego oczekiwać przy wyświetlaniu ShowMessage. Są różne tego typu programy i okienko pokazuje się NAD formą :)

0

Według mnie nie powinien tego oczekiwać. Opcja Stay on top sprawia, że okno jest zawsze ponad innymi "zwykłymi" oknami, natomiast okna modalne są pod tym względem "bardziej uprzywilejowane". To one w danej chwili oczekują na reakcję użytkownika co wymusza, by były one na samym wierchu.

0

Dzięki koledzy za zabranie głosu w dyskusji.
A może użytkownik będzie oczekiwał, że nie tyle forma główna, co cała aplikacja (forma główna + wszelkie formy modalne i/lub ShowMessage) zawsze będzie na wierzchu. Czyli, że cała aplikacja zawsze będzie na wierzchu ponad innymi aplikacjami? Taki efekt też ciężko osiągnąć, żeby forma główna wraz ze swoimi formami modalnymi były zawsze na wierzchu przy zachowaniu modalności form.

0

Generalnie, okna wywoływane przez formę powinny być umieszczone nad tą formą, zwłaszcza jeśli blokują one tą formę. Tak więc drogą dziedziczenia, jeśli okno jest na wierzchu to okienka pochodne również. Zastosuj dziedziczenie. Fajnie by jeszcze było gdyby podczas przesuwania głównego okna przesuwały się te pochodne.

0

Zamiast ShowMessage, stosuj MessageBox z parametrem MB_SYSTEMMODAL, który powoduje, że komunikat będzie zawsze na wierzchu.

 Application.MessageBox('Kliknij OK, aby kontynuować.', 'Info', MB_SystemModal + MB_Ok + MB_IconStop);
0

Dzięki.

Do wyświetlania powiadomień używam:
MessageBoxW(Main_Form.Handle, PWideChar('Message Text'), PWideChar('My Caption'), MB_TASKMODAL + MB_OK + MB_ICONWARNING);
Kiedy forma główna jest StayOnTop, wtedy rzeczywiście MessageBox dziedziczy po niej tę właściwość i obie znajdują się na wierzchu - ponad innymi aplikacjami.

Jeśli jednak wyświetlę jakąś formę modalną, to cała aplikacja traci właśniwość StayOnTop względem innych aplikacji.
A tak wywołuję formy modalne:

  if Modal_Form = nil then
  Modal_Form := TModal_Form.Create(Main_Form);
  Modal_Form.Showmodal;

Dlatego właśnie założyłem ten temat, bowiem zastanawiałem się w jaki sposób ujednolicić zachowanie się aplikacji w przypadku aktywnej właściwości StayOnTop dla głównej formy.
Z powiadomieniami typu MessageBox nie ma problemu, bo zawsze można odpowiednio dobrać atrybut Handle. Dając Application.Handle spowodujemy, że MessageBox nie odziedziczy własności StayOnTop, zaś podając uchwyt okna głównego, własność zostanie odziedziczona.
Problem mam teraz formami modalnymi, których też sporo wywołuję w programie.
Próbowałem eksperymentować z właściwościami typu PopUpMode oraz PopUpParent, ale udało mi się uzyskać taki efekt, że sama forma modalna zostaje na wierzchu, a główna forma chowa się pod innymi aplikacjami.

0

Cały czas zastanawiałem się dlaczego moje formy modalne nie dziedziczą właściwości StayOnTop.
W trakcie testów okazało się, że w kodzie mojego projektu brakuje:
Application.MainFormOnTaskbar := True;

Chyba wprowadzono to w Delphi 2007.
Po dodaniu tego wpisu zachowanie wydaje się teraz logiczne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1