Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Erkennen, wenn ein TPopupmenu verschwindet (https://www.delphipraxis.net/77057-erkennen-wenn-ein-tpopupmenu-verschwindet.html)

bernau 14. Sep 2006 08:44


Erkennen, wenn ein TPopupmenu verschwindet
 
Tach zusammen,

Die Vorgeschichte:
In meinem Programm ist ein Timer aktiv. In OnTimer, der jede Sekunde durchlaufen wird, soll je nach Programmzustand eine komplexe Berechnung durchgeführt werden. Diese Berechnung dauert dann ca. 10 Sekunden. Weiterhin gibt's in diesem Programm ein Popupmenu, mit dem einige Einstellungen durchgeführt werden können. Wenn aber nun das Popup geöffnet ist, und danach die Berechnung gestartet wird, dann friert das Popupmenu ein. Ich kann hinklicken wohin ich will, das PopupMenu belibt sichtbar, bis die Berechnungsroutine durchgelaufen ist.

Mein Lösungsansatz:
Ist eingendlich ganz einfach. Wenn das Popupmenu aufpoppt, dann Disable ich einfach den Timer. Dazu gibt es ja OnPopup. Damit wird die Berechnung nicht gestartet und für das Popupmenu gibt's keinen Grund einzufrieren.

Mein Problem:
Wenn das PopupMenu verschwindet, soll der Timer wieder enabled werden. Aber wie? Ich habe kein Ereignis oder Eigenschaft gefunden, an der ich sehen kann, ob ein Popup noch sichtbar ist.


Gerd

marabu 14. Sep 2006 13:06

Re: Erkennen, wenn ein TPopupmenu verschwindet
 
Hallo Gerd,

laut MS Windows Platform SDK sendet ein PopupMenu verschiedene Nachrichten an seinen Eigentümer. Unter Delphi ist das PopupList. Wenn du dort die Nachrichtenbehandlung anzapfst, dann hast du was du brauchst. Abschreiben kannst du hier: How to Detect a TPopupMenu's OnClose (OnpupDown) Event

Grüße vom marabu

SirThornberry 14. Sep 2006 13:09

Re: Erkennen, wenn ein TPopupmenu verschwindet
 
ich fände es sinvoller einen Thread zu verwenden denn sonst hat man ja auch den Nachteil das man warten muss bis die Berechnung abgeschlossen ist bevor man das Menü öffnen kann.

RavenIV 14. Sep 2006 13:17

Re: Erkennen, wenn ein TPopupmenu verschwindet
 
Zitat:

Zitat von bernau
Wenn aber nun das Popup geöffnet ist, und danach die Berechnung gestartet wird, dann friert das Popupmenu ein. Ich kann hinklicken wohin ich will, das PopupMenu belibt sichtbar, bis die Berechnungsroutine durchgelaufen ist.

Wenn Du in deiner Berechnung ab-und-zu ProcessMessages aufrusfst, dann kann dein Formular auch seine Anzeige aktualisieren und das Popup bleibt nicht stehen.

bernau 14. Sep 2006 14:01

Re: Erkennen, wenn ein TPopupmenu verschwindet
 
Erst einmal Danke an alle,


marabu hat mir erst mal den Tipp gegeben, den ich wohl ehesten gebrauchen kann.

Ein Thread zu verwenden wäre wohl das besste. Aber mit Threads habe ich noch nicht die grosse Erfahrung, weshalb ich mich voererst mit dem Tip von marabu zufrieden gebe. Wenn ich etwas Zeit habe, werde ich das ganze in Threads umwandeln.

ProcessMessages verwende ich in der Regel, wenn noch was anderes vom Programm gemacht werden muss. Aber in diesem Fall aus diversen Gründen unerwünscht.


Gerd

Bora4d 8. Okt 2006 22:49

Re: Erkennen, wenn ein TPopupmenu verschwindet
 
Ich habe in einer meiner Komponenten das verwendet:
Delphi-Quellcode:
procedure TForm1.PopUpMyDropDownMenu;
var atp:TPoint; Msg:TMsg;
begin
  atp := ClientToScreen(Point(0, Height));
  MyDropDownMenu.Popup(atp.x,atp.y);
  while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) do; //warten damit falls nicht in menü sondern in irgend andere Control geklickt wird, unten gedrückt wieder entfernt wird
  MouseUp(mbLeft,[],1,1);
end;
Erkärung:
MyDropDownMenu ist ein TPopupMenu;
Du rufst einfacht in dein Programm PopUpMyDropDownMenu anstatt MyDropDownMenu.Popup;
Die Prozedur PopUpMyDropDownMenu öffnet das Menü und wartet bis irgendwas gewählt ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:46 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