![]() |
Feststellen ob Kontextmenü offen ist
Hallo,
wie kann ich feststellen, ob in einem Formular das Kontext(PopUp) Menü noch geöffnet ist? Ein OnClose gibts beim TPopUpMenu ja leider nicht :( |
Re: Feststellen ob Kontextmenü offen ist
Hallo Heiko,
alle Nachrichten deiner Kontextmenüs gehen an das globale Objekt PopupList. Du könntest dort den message loop erweitern und auf WM_EXITMENULOOP lauschen. Nur eine Idee. Grüße vom marabu |
Re: Feststellen ob Kontextmenü offen ist
Ich hab ehrlich gesagt noch nie mit der PopUpList gearbeitet. Hast Du mal nen Beispiel, wie ich auf WM_EXITMENULOOP lausche/reagiere?
|
Re: Feststellen ob Kontextmenü offen ist
Ich auch nicht, aber was solls:
Delphi-Quellcode:
Wie du siehst warte ich auf die beiden Nachrichten WM_ENTERMENULOOP und WM_EXITMENULOOP. Die Zeit zwischen diesen beiden Nachrichten ist ziemlich genau die Zeit, während der ein Kontextmenü sichtbar ist. Du musst dann nur noch in deinem Projekt die globale Variable Menus.PopupList austauschen:
unit PopLst;
interface uses Menus, Messages; type TPopupListEx = class(TPopupList) private procedure WndProc(var Message: TMessage); override; public PopupMenu: TPopupMenu; MenuLoop: Boolean; end; implementation procedure TPopupListEx.WndProc(var Message: TMessage); begin case Message.Msg of WM_ENTERMENULOOP: MenuLoop := true; WM_EXITMENULOOP: MenuLoop := false; end; inherited WndProc(Message); end; end.
Delphi-Quellcode:
Im Ereignis OnPopup deiner Kontextmenüs kannst du dann noch vermerken, welches Menü geöffnet wurde:
program Demo;
uses Forms, Menus, DemoFrm in 'DemoFrm.pas' {DemoForm}, PopLst in 'PopLst.pas'; {$R *.res} begin PopupList.Free; PopupList := TPopupListEx.Create; Application.Initialize; Application.CreateForm(TDemoForm, DemoForm); Application.Run; end.
Delphi-Quellcode:
Theoretisch weißt du jetzt immer, welches PopupMenu zuletzt benutzt wurde, und ob es noch aktiv ist. Da der menu loop aber modal ist, weiß ich nicht so recht, wann du auf diese Information zugreifen willst - und warum.
procedure TDemoForm.PopupMenuPopup(Sender: TObject);
begin TPopupListEx(PopupList).PopupMenu := Sender as TPopupMenu; end; marabu |
Re: Feststellen ob Kontextmenü offen ist
Hallo,
evt möchte HeikoAdams auch reagieren, wenn das Popup geschlossen wurde ohne das ein Menüpunkt ausgewählt wurde. Das habe ich mal folgendermaßen gelöst.
Delphi-Quellcode:
TForm1 = class(TForm)
Label1: TLabel; PopupMenu1: TPopupMenu; Test1: TMenuItem; Memo1: TMemo; PopupMenu2: TPopupMenu; Memo2: TMenuItem; ApplicationEvents1: TApplicationEvents; procedure PopupMenu1Popup(Sender: TObject); procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean); procedure Test1Click(Sender: TObject); private { Private-Deklarationen } FActivePopup : TPopupmenu; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.PopupMenu1Popup(Sender: TObject); // alle Popup's auf dem Formular brauchen denselben OnPopup Handler ! begin FActivePopup:=TPopupmenu(Sender); end; procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean); begin If Assigned(FActivePopup) then begin // wird aufgerufen wenn das Popup verlassen wird. // Auch wenn außerhalb des Popups mit der Maus geklickt wurde // Hat den Effekt eines OnClose Events Label1.Caption:=IntToStr(StrToInt(Label1.Caption)+1); FActivePopup:=Nil; end; end; procedure TForm1.Test1Click(Sender: TObject); begin Case FActivePopup.PopupComponent.Tag of 0 : Memo1.Lines.Add('Form Popup wurde benutzt'); 1 : Memo1.Lines.Add('Memo Popup wurde benutzt'); end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 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 by Thomas Breitkreuz