AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Wie im IOTA-Package rauskriegen, ob die IDE gerade ein KontextMenü anzeigt?

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

Ein Thema von r29d43 · begonnen am 30. Jul 2021 · letzter Beitrag vom 1. Aug 2021
Antwort Antwort
r29d43

Registriert seit: 18. Jan 2007
276 Beiträge
 
Delphi 10.4 Sydney
 
#1

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

  Alt 30. Jul 2021, 10:49
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
...
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.820 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 30. Jul 2021, 13:33
Sowas gibt es meines Wissens nicht mal in der VCL, geschweige denn in der OTAPI.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.236 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 30. Jul 2021, 13:43
Vielleicht geht es über so etwas wie FocusedEditor (=nil)?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
276 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 1. Aug 2021, 17:38
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

Geändert von r29d43 ( 1. Aug 2021 um 17:48 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf