Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Feststellen ob Kontextmenü offen ist

  Alt 26. Jan 2006, 19:43
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
  Mit Zitat antworten Zitat