![]() |
tForm ähnlich wie ein "Popup-Menü" verwenden
Hallo!
ich habe folgendes Problem und komme nicht so recht weiter: In meinem Programm möchte ich ein Fenster anzeigen, wenn der User auf einen Button klickt. Danach kann der User in diesem Fenster eine Option auswählen und anschließend soll dieser Wert als Rückgabewert zurückgegeben und das Fenster geschlossen werden. Prinzipiell ist das ganze ja nicht so schwierig und ich hab' mir das ganze so gedacht: Das "Hauptfenster" ruft eine Funktion des "Popupfensters" auf und mittels dieser Funktion wird der Rückgabewert als Result zurückgeliefert. Damit das "Hauptfenster" nicht gleich weiterrödelt, rufe ich das "Popupfenster" als modales Fenster auf. Also so in etwa:
Code:
Soweit, so gut. Nur sollte das "Popupfenster" sich schließen, wenn der User neben das Fenster klickt und dann als Result einen leeren String zurückliefern. Und genau hier ist das Problem: Wenn ich mit ShowModal erzwingen will, dass das Hauptprogramm auf den Rückgabewert wartet, dann wird z.B. onDeactivate des "Popupfensters" nicht mehr ausgelöst (Modale Dialoge können den Fokus nicht verlieren). Wenn ich das Fenster nur mit "Show" anzeige, dann funktioniert zwar onDeactivate aber das Hauptprogramm wartet nunmal nicht auf die Beendigung des "Popupfensters".
Teil der Prozedur im "Hauptfenster":
DesiredObject := frm_browser_navigation.GetNavigationPath(Popup_Left, Popup_Top); ... und die entsprechende Funktion im "Popupfenster": Function Tfrm_browser_navigation.GetNavigationPath(WindowLeft, WindowTop: Integer ): String; Begin Left := WindowLeft; Top := WindowTop; ShowModal; Result := 'c:\'; End; Der Rückgabewert ist hier nur zu Testzwecken fest hinterlegt Vielleicht hab' ich auch nur nen Denkfehler aber ich komm bei dem Problem nicht so recht weiter und würd mich freuen, wenn jemand eine Idee hätte. Greetings Gerald P.S. Ich hab' auch schonmal geschaut, ob ich irgendwie das Problem per Windows Messages beheben könnte und hab' die Messageqeue des "Popupfensters" überwacht. Nur wenn ich z.B. neben das Fenster klicke, um es zu deaktivieren, kommt bei einem Modal-Window scheinbar auch keine Message an. Einzig wenn ich den Fokus komplett zu einer anderen Anwendung wechsle werden diverse auswertbare Messages verschickt - nur kann ich nicht immer die komplette Anwndung wechseln ... |
Re: tForm ähnlich wie ein "Popup-Menü" verwenden
vielleicht ne blöde Frage, aber wieso nimmst Du dann dafür nicht einfach ein Popup-Menue ??
Wenn Du es so machen willst wie beschrieben, dann könntest Du ja als Trick einfach das drunterliegende Fenster disablen (Enabled := false) und dein "Popup-Fenster" nicht modal anzeigen (evtl. auch mit FormStyle = StayOnTop). Kann mir vorstellen, daß das drunterliegende Fenster dann immer noch Maus-Events bekommt, obwohl es nicht Enabled ist..... Müßte man aber ausprobieren (und ich geh jetzt gleich ins Bett...... :wink:) Roderich |
Re: tForm ähnlich wie ein "Popup-Menü" verwenden
Wenn du die Methode MouseMove des "PopupForm" der folgenden
überschreibst, schließt das "PopupForm" beim Klicken außerhalb dessen Clientrect. Das "PopupForm"(Form2) mit Form2.Show aufrufen.
Delphi-Quellcode:
procedure TForm2.MouseMove( Shift : TShiftState; X, Y : Integer);
begin if ( ( ssLeft in Shift) or ( ssRight in Shift) or ( ssMiddle in Shift) or ( ssDouble in Shift)) and not PtInRect( ClientRect, Point( X, Y)) then begin SetCaptureControl( nil); Close; end; inherited MouseMove( Shift, X, Y); end; procedure TForm2.MouseUp( Button : TMouseButton; Shift : TShiftState; X, Y : Integer); begin if GetCaptureControl = nil then SetCaptureControl( self); inherited MouseUp( Button, Shift, X, Y); end; procedure TForm2.FormShow(Sender: TObject); begin SetCaptureControl( self); end; |
Re: tForm ähnlich wie ein "Popup-Menü" verwenden
Hab' die Idee gerade getestet. Leider bringt das nicht das gewünschte Ergebnis. Zum einen bekomme ich einen Stack-Overflow nach kurzer Zeit und da das zweite Fenster mit 'Show' aufgerufen wird, rennt die aufrufende Routine munter weiter und wartet nicht, bis ein Rückgabewert kommt.
Zitat:
|
Re: tForm ähnlich wie ein "Popup-Menü" verwenden
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz