Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Wie im IOTA-Package rauskriegen, ob die IDE gerade ein KontextMenü anzeigt? (https://www.delphipraxis.net/208448-wie-im-iota-package-rauskriegen-ob-die-ide-gerade-ein-kontextmenue-anzeigt.html)

r29d43 30. Jul 2021 09:49

Wie im IOTA-Package rauskriegen, ob die IDE gerade ein KontextMenü anzeigt?
 
Hallo,

mein IOTA-Package soll mal dies und jenes tun, aber natürlich NICHT dann, wenn die IDE gerade ein KontextMenü anzeigt.

Über welchen Service o. Notifier kann man also rauskriegen, ob die IDE gerade ein KontexMenü anzeigt.

Danke im Voraus
...

Uwe Raabe 30. Jul 2021 12:33

AW: Wie im IOTA-Package rauskriegen, ob die IDE gerade ein KontextMenü anzeigt?
 
Sowas gibt es meines Wissens nicht mal in der VCL, geschweige denn in der OTAPI.

stahli 30. Jul 2021 12:43

AW: Wie im IOTA-Package rauskriegen, ob die IDE gerade ein KontextMenü anzeigt?
 
Vielleicht geht es über so etwas wie FocusedEditor (=nil)?

r29d43 1. Aug 2021 16:38

AW: Wie im IOTA-Package rauskriegen, ob die IDE gerade ein KontextMenü anzeigt?
 
thx.

@UweRaabe, anno 2013 war mal unter http://delphi.about.com/od/adptips20...opuplistex.htm diese kleine Unit downloadbar mit der man das aber für normale Applications ganz gut konnte.

Delphi-Quellcode:
 unit PopupListEx;

// kopiert von: http://delphi.about.com/od/adptips2006/qt/popuplistex.htm

 interface
 
 uses windows,Controls;
 
 const
    CM_MENU_CLOSED = CM_BASE + 1001;
    CM_ENTER_MENU_LOOP = CM_BASE + 1002;
    CM_EXIT_MENU_LOOP = CM_BASE + 1003;

var PopupWinIsUp : boolean = false;           // von mir noch hinzugefügt am 12.04.2013
 
 implementation

 uses Messages, Forms, Menus;
 
 type
    TPopupListEx = class(TPopupList)
    protected
      procedure WndProc(var Message: TMessage) ; override;
    private
      procedure PerformMessage(cm_msg : integer; msg : TMessage) ;
    end;
 
 { TPopupListEx }
 procedure TPopupListEx.PerformMessage(cm_msg: integer; msg : TMessage) ;
 begin
//    if Screen.Activeform <> nil then
//      Screen.ActiveForm.Perform(cm_msg, msg.WParam, msg.LParam) ;
    Application.MainForm.Perform(cm_msg, msg.WParam, msg.LParam) ;     // von mir für die beiden Zeilen darüber eingefügt am 04.04.2013
 end;
 
 procedure TPopupListEx.WndProc(var Message: TMessage) ;
 begin
    case message.Msg of
      WM_ENTERMENULOOP: begin PerformMessage(CM_ENTER_MENU_LOOP, Message); PopupWinIsUp := true; end;
      WM_EXITMENULOOP : begin PerformMessage(CM_EXIT_MENU_LOOP, Message); PopupWinIsUp := false; end;
      WM_MENUSELECT :
      with TWMMenuSelect(Message) do
      begin
        if (Menu = 0) and (Menuflag = $FFFF) then
        begin
          PerformMessage(CM_MENU_CLOSED, Message);
          PopupWinIsUp := false;
        end;
      end;
    end;
    inherited;
 end;
 
 initialization
    Popuplist.Free; //free the "default", "old" list
    PopupList:= TPopupListEx.Create; //create the new one
    // The new PopupList will be freed by
    // finalization section of Menus unit.
 end.
Beim Übertragen auf mein IOTA-Package bekam ich aber leider immer irgendwo ein Exception. Auch wenn ich in der PerformMessage-Proc anstelle von ActiveForm bzw. MainForm dann das Editor-Window angab. Letzteres ist ja (gemäß Post#13 in Link) ein TWinControl dessen WinProc man überschreiben kann und wo ich dann versuchte, diese in obiger Unit dorthin abgeschickten cm_msgs wieder in Empfang zu nehmen bzw. darauf zu regieren. Müsste mal irgendjemand austüfteln, ob und wie das auch bei IOTA-Packages funktionieren kann.


@stahli, geht leider nicht, weil Editor.focused auch dann true ausgibt, wenn gerade das KontextMenü oder auch das Hauptmenü angezeigt wird. Ansonsten funktioniert Editor.focused allerdings normal.

Ich habe das jetzt aber einfach so gelöst, indem ich mit meinem eigenen Spyer die Class des KontextMenü-Wins und die des Hauptmenü-Wins ermittelt habe und jetzt per FindWindow in einer TimerProc einfach danach suche. Also in etwa so:

Delphi-Quellcode:
  aMenuWinIsVisible :=   (FindWindow('TCustomActionPopupMenuEx','') <> 0) // wenn KontextMenü sichtbar
                       or (FindWindow('TIDEStylePopupMenu','') <> 0);     // wenn HauptMenü sichtbar


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