Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Feststellen ob Kontextmenü offen ist (https://www.delphipraxis.net/61797-feststellen-ob-kontextmenue-offen-ist.html)

HeikoAdams 26. Jan 2006 14:06


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 :(

marabu 26. Jan 2006 14:32

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

HeikoAdams 26. Jan 2006 14:54

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?

marabu 26. Jan 2006 19:43

Re: Feststellen ob Kontextmenü offen ist
 
Ich auch nicht, aber was solls:

Delphi-Quellcode:
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.
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:

Delphi-Quellcode:
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.
Im Ereignis OnPopup deiner Kontextmenüs kannst du dann noch vermerken, welches Menü geöffnet wurde:

Delphi-Quellcode:
procedure TDemoForm.PopupMenuPopup(Sender: TObject);
begin
  TPopupListEx(PopupList).PopupMenu := Sender as TPopupMenu;
end;
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.

marabu

Jens Schumann 26. Jan 2006 20:03

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