AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi tForm ähnlich wie ein "Popup-Menü" verwenden
Thema durchsuchen
Ansicht
Themen-Optionen

tForm ähnlich wie ein "Popup-Menü" verwenden

Ein Thema von gkoeder · begonnen am 30. Dez 2004 · letzter Beitrag vom 30. Dez 2004
Antwort Antwort
gkoeder

Registriert seit: 15. Jun 2004
84 Beiträge
 
Delphi 2010 Professional
 
#1

tForm ähnlich wie ein "Popup-Menü" verwenden

  Alt 30. Dez 2004, 00:33
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:
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
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".
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 ...
  Mit Zitat antworten Zitat
roderich
(Gast)

n/a Beiträge
 
#2

Re: tForm ähnlich wie ein "Popup-Menü" verwenden

  Alt 30. Dez 2004, 01:54
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...... )

Roderich
  Mit Zitat antworten Zitat
Joe24

Registriert seit: 21. Dez 2004
Ort: Berlin
51 Beiträge
 
#3

Re: tForm ähnlich wie ein "Popup-Menü" verwenden

  Alt 30. Dez 2004, 02:04
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;
  Mit Zitat antworten Zitat
gkoeder

Registriert seit: 15. Jun 2004
84 Beiträge
 
Delphi 2010 Professional
 
#4

Re: tForm ähnlich wie ein "Popup-Menü" verwenden

  Alt 30. Dez 2004, 09:23
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 von Joe24:
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;
  Mit Zitat antworten Zitat
gkoeder

Registriert seit: 15. Jun 2004
84 Beiträge
 
Delphi 2010 Professional
 
#5

Re: tForm ähnlich wie ein "Popup-Menü" verwenden

  Alt 30. Dez 2004, 09:43
Zitat von roderich:
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...... )

Roderich
Ein Popup-Menü geht leider nicht, da ich verschiedene Objekte auf dem 'Popup'-Fenster brauche (z.B. ne ShellTreeView um ein Verzeichnis auszuwählen, ...). Die Mausevents sind nicht das hauptsächliche Problem sondern, dass das Hauptprogramm mit der weiteren Ausführung warten muss, bis entweder der User auf dem Popup-Fenster eine Auswahl getroffen hat oder das Popup-Fenster den Fokus verliert. Das 'Warten' im Hauptprogramm läßt sich ja recht einfach dadurch realisieren, dass das Popup-Fenster als Modal aufgerufen wird - nur kann ich dann nicht mehr abfragen, ob das Popup-Fenster den Fokus verliert und das Fenster dann schließen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz