Ich bekomme hier eine kleine Krise mit der Z-Reihenfolge von Fenstern einer Anwendung (Windows, VCL).
Grundsätzlich ist das Verhalten in neueren Delphi-Versionen ja so, dass Nebenfenster vor der MainForm angezeigt werden, auch wenn sie nicht den Fokus haben. Das ist manchmal sinnvoll, manchmal aber auch nicht - da möchte man durchaus, dass eine offene Nebenform wieder in den Hintergrund rückt, wenn man in die MainForm klickt.
Dieses alte Verhalten kann man ja erreichen mit
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TMyOtherForm.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.WndParent := Application.Handle; end; |
Jetzt möchte ich dem User aber zur Laufzeit die Wahl lassen, ob er diese Nebenform vor dem Hauptformular festpinnt, oder eben nicht. Das probiere ich mit
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if WantStayOnTop then FormStyle := fsStayOnTop else FormStyle := fsNormal; |
Beides funktioniert nicht, wie gewünscht.
Mit StayOnTop bzw. HWND_TOPMOST
- MyOtherForm liegt auch über allen anderen Anwendungen. Es soll aber nur über der MainForm liegen.
- MyOtherForm liegt auch über einem OpenDialog, der von MyOtherForm aus geöffnet werden soll. Da der OpenDialog (wie üblich) Modal ist, kann man z.B. die Checkbox für "StayOnTop" in MyOtherForm auch nicht deaktivieren. D.h. ich habe MainForm->OpenDialog(modal, aber ganz oder teilweise verdeckt)->OtherForm(deaktiviert, aber im Vordergrund)
Interessanterweise bewirkt auch fsStayOnTop, dass das Fenster vor allen Anwendungen liegt. Ich dachte eigentlich, dass das mal nur "Top der Application" war ...
Zumindest mit der modifizierten CreateParams ist das so. Ohne die Modifizierung hat auch mein StayOnTop-Code keinerlei Auswirkungen mehr.
Ohne StayOnTop
- Beim öffnen des OpenDialoges rutscht MyOtherForm in den Hintergrund, d.h. OtherForm->MainForm->OpenDialog statt (wie eigentlich logisch) MainForm->OtherForm->OpenDialog
Bekomme ich das ohne irgendwelche Hampeleien (im OnDeactivate etc.) hin, dass eine Form vor der Mainform bleibt (auch wenn die MainForm den Eingabefokus bekommt), aber hinter eventuell zusätzlich geöffneten Dialogen? Oder aber (zur Laufzeit umstellbar) eben nicht?
We are, we were and will not be.