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