AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Feststellen ob Kontextmenü offen ist
Thema durchsuchen
Ansicht
Themen-Optionen

Feststellen ob Kontextmenü offen ist

Ein Thema von HeikoAdams · begonnen am 26. Jan 2006 · letzter Beitrag vom 26. Jan 2006
Antwort Antwort
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#1

Feststellen ob Kontextmenü offen ist

  Alt 26. Jan 2006, 14:06
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
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
marabu

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

Re: Feststellen ob Kontextmenü offen ist

  Alt 26. Jan 2006, 14:32
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
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Feststellen ob Kontextmenü offen ist

  Alt 26. Jan 2006, 14:54
Ich hab ehrlich gesagt noch nie mit der PopUpList gearbeitet. Hast Du mal nen Beispiel, wie ich auf WM_EXITMENULOOP lausche/reagiere?
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
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
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Feststellen ob Kontextmenü offen ist

  Alt 26. Jan 2006, 20:03
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.
I come from outer space to save the human race
  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 16:42 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