使用ToolsAPI在Delphi IDE中将菜单项添加到单位的选项卡上下文菜单

埃里克·福尔铁

我正在寻找要在Delphi IDE中将项目添加到源文件的右键菜单中所需的服务/接口。

例如,如果我右键单击某个设备的选项卡,则该设备的项目包括“关闭页面”,“关闭所有其他页面”,“属性”等。如果可能,我想向该菜单添加自定义项目。

我查看了ToolsAPI单元,但不知道从哪里开始。我假设有一个可以用来枚举项目和添加项目的界面,但是我不知道从哪里开始寻找。

如果那不可能,我将选择代码编辑器的上下文菜单。

也许网上有一些样品,但是我还在寻找,但没有发现。

任何帮助表示赞赏。

马丁·A

雷米·勒博(Remy Lebeau)链接到GExperts指南,为您指明了正确的方向。

如果您以前没有做过这种事情,那么开始编写自己的IDE加载项仍然会有一些性能,因此,我在下面提供了一个如何向其中添加项的最小示例。代码编辑器的弹出菜单。

显然,您要做的是创建一个新程序包,向其添加下面的单元,然后在IDE中安装该程序包。Register单元中对的调用完成了在编辑器弹出菜单中安装新项所需的操作。

在安装软件包时,请确保代码编辑器已打开。如您所见,原因是该代码检查当时是否有活动的编辑器。我留下了如何确保即使当前没有活动的代码编辑器也要添加弹出项的方法。提示:如果查看所使用的任何版本的Delphi的ToolsAPI.Pas单元,您会发现它包含各种通知程序,并且您可以使用至少其中之一的通知来推迟检查是否存在是活跃的编辑器,直到有可能成为可能为止。

顺便说一句,该代码将菜单项添加到上下文菜单,该上下文菜单弹出编辑器窗口本身而不是活动选项卡。IDE加载项的乐趣之一是尝试查看是否可以完全获得所需的乐趣。我自己还没有尝试过,但是我怀疑将菜单项添加到一个编辑器选项卡的上下文菜单中会很困难-鉴于Delphi IDE是Delphi应用程序,如下面的代码所示,您可以使用FindComponent(或仅遍历Components集合)来查找所需的内容。但是,如果可以的话,最好通过ToolsAPI接口定位。请参阅下面的更新

interface

uses
  Classes, Windows, Menus, Dialogs, ToolsAPI;

type

   TIDEMenuItem = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)
     function GetName: string;
     function GetIDString: string;
     function GetMenuText: string;
     function GetState: TWizardState;
     procedure Execute;
   end;

   TIDEMenuHandler = class(TObject)
     procedure HandleClick(Sender: TObject);
   end;

procedure Register;

implementation

var
  MenuItem: TMenuItem;
  IDEMenuHandler: TIDEMenuHandler;
  EditorPopUpMenu : TPopUpMenu;

procedure TIDEMenuItem.Execute;
begin
  ShowMessage('Execute');
end;

function TIDEMenuItem.GetIDString: string;
begin
  Result := 'IDEMenuItemID';
end;

function TIDEMenuItem.GetMenuText: string;
begin
  Result := 'IDEMenuItemText';
end;

function TIDEMenuItem.GetName: string;
begin
  Result := 'IDEMenuItemName';
end;

function TIDEMenuItem.GetState: TWizardState;
begin
  Result := [wsEnabled];
end;

procedure TIDEMenuHandler.HandleClick(Sender: TObject);
begin
  ShowMessage(TIDEMenuItem(Sender).GetName + ' Clicked');
end;

procedure AddIDEMenu;
var
  NTAServices: INTAServices40;
  EditorServices: IOTAEditorServices;
  EditView: IOTAEditView;
begin
  NTAServices := BorlandIDEServices as INTAServices40;

  EditorServices := BorlandIDEServices as IOTAEditorServices;
  EditView := EditorServices.TopView;

  if Assigned(EditView) then begin
    EditorPopUpMenu := TPopUpMenu(EditView.GetEditWindow.Form.FindComponent('EditorLocalMenu'));
    Assert(EditorPopUpMenu <>Nil);

    IDEMenuHandler := TIDEMenuHandler.Create;
    MenuItem := TMenuItem.Create(Nil);
    MenuItem.Caption := 'Added IDE editor menu item';
    MenuItem.OnClick := IDEMenuHandler.HandleClick;
    EditorPopUpMenu.Items.Add(MenuItem)
  end
  else
    ShowMessage('Code editor not active');
end;

procedure RemoveIDEMenu;
begin
  if MenuItem <> Nil then begin
    EditorPopUpMenu.Items.Remove(MenuItem);
    FreeAndNil(MenuItem);
    IDEMenuHandler.Free;
  end;
end;

procedure Register;
begin
  RegisterPackageWizard(TIDEMenuItem.Create);
  AddIDEMenu;
end;

initialization

finalization
  RemoveIDEMenu;
end.

更新:以下代码找到编辑器窗口的TabControl,并将菜单项添加到其上下文菜单。但是,请注意,这并不意味着打开了第二个编辑器窗口。

procedure AddIDEMenu;
var
  NTAServices: INTAServices40;
  EditorServices: IOTAEditorServices;
  EditView: IOTAEditView;
  TabControl : TTabControl;

  function FindTabControl(AComponent : TComponent) : TTabControl;
  var
    i : Integer;
  begin
    Result := Nil;
    if CompareText(AComponent.ClassName, 'TXTabControl') = 0 then begin
      Result := TTabControl(AComponent);
      exit;
    end
    else begin
      for i := 0 to AComponent.ComponentCount - 1 do begin
        if CompareText(AComponent.Components[i].ClassName, 'TXTabControl') = 0 then begin
          Result := TTabControl(AComponent.Components[i]);
          exit;
        end
        else begin
          Result := FindTabControl(AComponent.Components[i]);
          if Result <> Nil then
            exit;
        end;              
      end;
    end;
  end;

begin
  NTAServices := BorlandIDEServices as INTAServices40;

  EditorServices := BorlandIDEServices as IOTAEditorServices;
  EditView := EditorServices.TopView;

  if Assigned(EditView) then begin
    TabControl := FindTabControl(EditView.GetEditWindow.Form);
    Assert(TabControl <> Nil, 'TabControl not found');
    EditorPopUpMenu := TabControl.PopupMenu;
    Assert(EditorPopUpMenu <> Nil, 'PopUP menu not found');
    //EditorPopUpMenu := TPopUpMenu(EditView.GetEditWindow.Form.FindComponent('EditorLocalMenu'));
    Assert(EditorPopUpMenu <>Nil);

    IDEMenuHandler := TIDEMenuHandler.Create;
    MenuItem := TMenuItem.Create(Nil);
    MenuItem.Caption := 'Added IDE editor menu item';
    MenuItem.OnClick := IDEMenuHandler.HandleClick;
    EditorPopUpMenu.Items.Add(MenuItem)
  end
  else
    ShowMessage('No editor active');
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Delphi的IDE上下文菜单中添加菜单项

使用示例页面将自定义菜单项添加到 magento 2 管理侧栏中的销售菜单选项卡

在WPF中使用单击处理程序动态添加上下文菜单项

如何使用键盘打开编辑器选项卡上下文菜单?

如何使用 p:fileUpload 作为 primefaces 上下文菜单的菜单项?

将“使用Gimp编辑”添加到Windows上下文菜单

将上下文菜单添加到使用 JAVAFX 中的 ObservableMap 设计的 TableView

Android:如何使用浮动上下文菜单项单击获取列表项属性

使用Windows资源管理器的“打印”上下文菜单项

C#-使用foreach循环遍历重复的上下文菜单项

使用Javascript获取浏览器上下文菜单项

从上下文菜单的菜单项中检索选定的项目。我正在使用WPF,MVVM

在20.04中将键盘快捷方式添加到Gnome文件上下文菜单项

如何在Windows 7中将图标添加到自定义上下文菜单项?

在Windows资源管理器中使用上下文菜单将后缀添加到文件

如何使用 PyQt5 添加到 Python 文本框中的默认上下文菜单?

将上下文菜单项添加到特定的文件扩展名

上下文菜单项,例如WinRAR,“添加到FILENAME”

使用JavaSCript将活动类动态添加到动态构建的导航菜单项

使用jQuery动态将活动类添加到菜单项

上下文菜单中缺少“使用IDLE编辑”选项

无法将上下文菜单项添加到mp3文件(通过regedit)

使用上下文菜单添加图形-Eclipse GEF

如何在Windows 10中删除“使用3D Builder进行3D打印”上下文菜单项?

将菜单项添加到Windows上下文菜单中,仅适用于目录而不是包含特定子目录的目录

使用片段将图像添加到选项卡

使用Jquery上下文菜单

如何在上下文菜单中添加“使用VLC播放(无光盘菜单)”?

如何在wxPython中将子菜单项添加到弹出菜单项?