Hallo Leute,
meine Anwendung hat zwei Programmfenster, welche beide in der Taskleiste angezeigt werden. Das eine Fenster ist das Hauptfenster, das andere wird mit Show angezeigt und mit folgendem Code auf die Taskleiste verbogen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TMySecondWindow.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; Params.WndParent := GetDesktopWindow; end; |
Klappt soweit gut. Das Problem beginnt nun, wenn ein modaler Dialog für dieses Fenster geöffnet werden soll, welcher das Hauptfenster
nicht blockieren soll.
Ich habe das ganze nun versucht so zu lösen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TMySecondWindow.WndProc(var Message: TMessage); begin if (WindowState = wsNormal) and Visible and (Message.Msg = WM_ENABLE) then begin if FAllowDisable then inherited else begin Message.Result := -1;
if not IsWindowEnabled(Handle) then EnableWindow(Handle, True); end; end else inherited; end; |
Jeder Dialog in TMySecondWindow setzt nun die Eigenschaft FAllowDisable vorher auf True, wenn die TMySecondWindow Instanz einen Dialog aufruft. Durch die WndProc bleibt das Fenster anklickbar, wenn ein Dialog durch das Hauptfenster aufgerufen wird. Andersrum funktioniert das aber nicht. Außerdem kommt hinzu, dass sowohl das Hauptfenster als auch TMySecondWindow die gleichen Module einbetten kann. Ich habe versucht eine ähnliche Methode in das Hauptfenster zu integrieren. Allerdings funktioniert das so nicht, weil die Logik durch die einzelnen Dialoge gesteuert werden muss.
Kann ich irgendwie feststellen, ob TMySecondWindow oder das Hauptfenster beim öffnen des Dialoges gerade "aktiv" ist? Das Problem ist, die WM_ENABLE Botschaft wird erst gesendet, nachdem das andere Fenster schon offen ist.
Ein weiteres Problem ist das richtige Elternfenster für den Dialog zu finden. Screen.ActiveForm als Parameter beim Create des Dialoges funktioniert aus irgendwelchen Gründen nicht. Ich habe deshalb in der Basisklasse der Dialoge (hab eine eigene Ableitung von TForm gemacht) manuell das ParentWindow umgebogen:
Delphi-Quelltext
1: 2:
| if AOwner is TWinControl then ParentWindow := (AOwner as TWinControl).Handle; |
Das funktioniert in den meisten Fällen, aber leider nicht immer. Zumal Screen.ActiveForm leider nicht immer das richtige Fenster liefert.
Ich habe irgendwie das Gefühl, die VCL ist für diesen Fall nicht vorbereitet. Vielleicht gibt es ja auch einen gangbareren Weg für das Szenario:
Zwei Hauptfenster in einer Anwendung, welche modale Dialoge so behandeln, als wären es 2 getrennte Prozesse. Denn nichts anderes brauche im Grunde genommen. Eine Trennung der Hauptanwendung in zwei Prozesse ist aber absolut ausgeschlossen. Jemand eine Idee dazu?