Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#1

BindingServices.AddMenuCommand

  Alt 11. Apr 2020, 22:35
Hallo zusammen,

ich habe einen IDE-Experten erstellt, der ein Untermenü unter dem Tools-Menüeintrag erstellt und über Shortcuts einige Funktionen aufrufen kann.

Jetzt möchte ich eine solche Funktion auch über einen Menüklick aufrufen, was mir nicht gelingt.

Kann mir jemand helfen?


So ist der Stand:

Die erste Unit wird bei der Installation zuerst ausgeführt (siehe unten im Codesite-Report).
Dort wird das Untermenü generiert.

Danach werden die Bindings innerhalb der zweiten Unit ausgeführt (diese werden übrigens auch bei jedem Shortcut ausgeführt, was aber vermutlich egal ist).
Die Shortcuts funktionieren, nicht aber der Menüklick.

Ich bin davon ausgegangen, dass die Verknüpfung zwischen dem MenueItem.Name und der Funbktion hier erfolgen müsste:
BindingServices.AddMenuCommand(mcUOOptimize, Optimize, nil);
Das ist aber offenbar falsch oder nicht ausreichend.

Über Shortcut wird die Funktion korrekt aufgerufen.

Delphi-Quellcode:
===================================================================================================

  const

    mcUOOptimize = 'UnitOptimizer_Optimize';

...

  procedure Initialize(Sender: TObject);
  begin
    if Supports(BorlandIDEServices, INTAServices, NTAServices) then
      begin
// aMethodContainer := TMethodContainer.Create;

        StahliSoft_MenuItem := TMenuItem.Create(nil);
        StahliSoft_MenuItem.Name := 'StahliSoftMenuItem';
        StahliSoft_MenuItem.Caption := 'UnitOptimizer (StahliSoft)';
        NTAServices.AddActionMenu('ToolsMenu', nil, StahliSoft_MenuItem, False, True);

        StahliSoft_UnitOptimizer_Optimize_MenuItem := TMenuItem.Create(nil); // <---------- aufrufender Menüeintrag
        StahliSoft_UnitOptimizer_Optimize_MenuItem.Name := mcUOOptimize; // <--- ID
        StahliSoft_UnitOptimizer_Optimize_MenuItem.Caption := 'Optimize';
// StahliSoft_UnitOptimizer_Optimize_MenuItem.OnClick := aMethodContainer.UnitOptimizer_Optimize_Click;
        StahliSoft_UnitOptimizer_Optimize_MenuItem.ShortCut := ShortCut(Word('O'), [ssCtrl, ssShift]);
        NTAServices.AddActionMenu(StahliSoft_MenuItem.Name, nil, StahliSoft_UnitOptimizer_Optimize_MenuItem, True, 
          True); // <--- Erzeugen des Menüeintrages

        Codesite.Send(TimeToStr(Now) + ' AddActionMenu'); // <--- erster Eintrag
        Sleep(2000);
      end;
  end;

===================================================================================================

    TOptimizeBinding = class(TNotifierObject, IOTAKeyboardBinding)
    protected
      procedure GetBookmarks(const aSL: TStringList; const aEditView: IOTAEditView);
      procedure GetBreakpoints(const aSL: TStringList; const aBreakPointList: TList<IOTASourceBreakpoint>; const 
        aUnitFileName: String);
      procedure GetCursorPos(const aSL: TStringList; const aEditView: IOTAEditView);
      procedure RestoreBookmarks(const BookmarkPosList: TList<TBookmarkPos>; const aEditView: IOTAEditView);
      procedure RestoreBreakpoints(const BreakpointPosList: TList<TBreakpointPos>);
      procedure RestoreCursorPos(var aEditPos: TOTAEditPos; var aEditView: IOTAEditView);
      procedure ScanBookmarks(const BookmarkPosList: TList<TBookmarkPos>);
      procedure ScanBreakpoints(const aBreakPointList: TList<IOTASourceBreakpoint>; const BreakpointPosList: 
        TList<TBreakpointPos>);
      procedure ScanCursorPos(var aEditPos: TOTAEditPos);
      procedure Work(const aSL, aResultSL: TStringList);
    public
      function GetBindingType: TBindingType;
      function GetDisplayName: string;
      function GetName: string;
      procedure BindKeyboard(const BindingServices: IOTAKeyBindingServices);
      procedure Optimize(const Context: IOTAKeyContext; KeyCode: TShortcut; var BindingResult: TKeyBindingResult);
      procedure OptimizeCleanUpCode(const Context: IOTAKeyContext; KeyCode: TShortcut; var BindingResult: 
        TKeyBindingResult);
      procedure Optimize_RemoveOutCommentedCode(const Context: IOTAKeyContext; KeyCode: TShortcut; var BindingResult: 
        TKeyBindingResult);
    end;

  procedure TOptimizeBinding.BindKeyboard(const BindingServices: IOTAKeyBindingServices);
  begin
    BindingServices.AddKeyBinding([Shortcut(Ord('O'), [ssShift, ssCtrl])], Optimize, nil); // <------ funktionierende Shortcut-Registrierung
    BindingServices.AddKeyBinding([Shortcut(Ord('D'), [ssCtrl])], Optimize, nil);
    BindingServices.AddMenuCommand(mcUOOptimize, Optimize, nil); // <============================== DAS BZW KLICK AUF MENÜEINTRAG HAT KEINE AUSWIRKUNG
    BindingServices.AddKeyBinding([Shortcut(Ord('O'), [ssAlt, ssShift, ssCtrl])], OptimizeCleanUpCode, nil);
    BindingServices.AddKeyBinding([Shortcut(Ord('O'), [ssAlt, ssCtrl])], Optimize_RemoveOutCommentedCode, nil);

    Codesite.Send(TimeToStr(Now) + ' BindKeyboard'); // <--- zweiter Eintrag
    Sleep(2000);
  end;

===================================================================================================

22:06:37 AddActionMenu
22:06:39 BindKeyboard
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat