Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DelphiIDE菜单集成-INTAServices_Delphi_Components_Delphi Xe2_Vcl - Fatal编程技术网

DelphiIDE菜单集成-INTAServices

DelphiIDE菜单集成-INTAServices,delphi,components,delphi-xe2,vcl,Delphi,Components,Delphi Xe2,Vcl,我使用INTAServices40成功地在Delphi中安装了我的菜单项,但问题是-下次Delphi启动时菜单缺失?!实际上,安装了两个菜单项;帮助菜单下的一个始终显示(IOTAWizardMenu),但工具菜单(测试菜单项)下的一个在下一次Delphi启动时丢失。如何解决这个问题 unit TESTMENU; interface uses ToolsAPI, Classes, Windows, vcl.Menus, vcl.dialogs; type TCusto

我使用INTAServices40成功地在Delphi中安装了我的菜单项,但问题是-下次Delphi启动时菜单缺失?!实际上,安装了两个菜单项;帮助菜单下的一个始终显示(IOTAWizardMenu),但工具菜单(测试菜单项)下的一个在下一次Delphi启动时丢失。如何解决这个问题

unit TESTMENU;

interface    
uses
   ToolsAPI, Classes, Windows, vcl.Menus, vcl.dialogs;    
type
   TCustomMenuItem = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)
     function GetIDString: string;
     function GetName: string;
     function GetState: TWizardState;
     // Launch the AddIn
     procedure Execute;
     function GetMenuText: string;
   end;

   TCustomMenuHandler = class(TObject)
    // Handle custom menu
     procedure HandleClick(Sender: TObject);
   end;

procedure Register;

implementation    
var
  mnuitem: TMenuItem;
  CustomMenuHandler: TCustomMenuHandler;

procedure TCustomMenuItem.Execute;
begin
  ShowMessage('IOTAWizardMenu based menu item');
end;

function TCustomMenuItem.GetIDString: string;
begin
  Result := 'TMS.MenuSample';
end;

function TCustomMenuItem.GetMenuText: string;
begin
  Result := 'IOTAWizardMenu';
end;

function TCustomMenuItem.GetName: string;
begin
  Result := 'TMSMenuSample';
end;

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

procedure TCustomMenuHandler.HandleClick(Sender: TObject);
begin
  ShowMessage('INTAServices40.MainMenu based menu item');
end;   

procedure AddIDEMenu;
var
  NTAServices: INTAServices40;    
begin
  NTAServices := BorlandIDEServices as INTAServices40;

  // avoid inserting twice
  if NTAServices.MainMenu.Items[9].Find('TEST') = nil then
  begin
    CustomMenuHandler := TCustomMenuHandler.Create;

    mnuitem := TMenuItem.Create(nil);
    mnuitem.Caption := 'TEST';
    mnuitem.OnClick := CustomMenuHandler.HandleClick;
    NTAServices.MainMenu.Items[9].Add(mnuitem)
  end;
end;

procedure RemoveIDEMenu;
var
  NTAServices: INTAServices40;
begin
  if Assigned(mnuitem) then
  begin
    NTAServices := BorlandIDEServices as INTAServices40;
    NTAServices.MainMenu.Items[9].Remove(mnuitem);
    mnuitem.Free;
    if Assigned(CustomMenuHandler) then
      CustomMenuHandler.Free;
  end;
end;

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

initialization
  mnuitem := nil;    
  CustomMenuHandler := nil;    
finalization
  RemoveIDEMenu;
end.
所以,我的第一个问题是如何在每次Delphi启动时显示菜单项测试。。另外,我想在菜单项TEST旁边添加一个图标。有什么方向吗

多谢各位

编辑:
我刚发现我的包裹迟装了。阅读互联网的人说应该称为ForceDemandLoadState(dlDisable)。但是,这对我也没有帮助….

在IDE加载其包时可能会在不同的时间返回不同的内容,还有一些菜单项的子项在运行时由IDE管理(例如,窗口菜单)

您可以按名称查找“帮助”菜单项组件:

procedure AddIDEMenu;
var
  HelpMenu: TComponent;
begin
  HelpMenu := Application.MainForm.FindComponent('HelpMenu');
  if (HelpMenu is TMenuItem) and (TMenuItem(HelpMenu).Find('TEST') = nil) then
  begin
    CustomMenuHandler := TCustomMenuHandler.Create;

    mnuitem := TMenuItem.Create(nil);
    mnuitem.Caption := 'TEST';
    mnuitem.OnClick := CustomMenuHandler.HandleClick;

    TMenuItem(HelpMenu).Add(mnuitem);
  end;
end;

procedure RemoveIDEMenu;
var
  HelpMenu: TComponent;
begin
  if Assigned(mnuitem) then
  begin
    HelpMenu := Application.MainForm.FindComponent('HelpMenu');
    if HelpMenu is TMenuItem then
      TMenuItem(HelpMenu).Remove(mnuitem);
    mnuitem.Free;
    CustomMenuHandler.Free;
  end;
end;

NTAServices.MainMenu.Items[9]
在IDE加载其包时,可能会在不同的时间返回不同的内容,还有一些菜单项的子项在运行时由IDE管理(例如窗口菜单)

您可以按名称查找“帮助”菜单项组件:

procedure AddIDEMenu;
var
  HelpMenu: TComponent;
begin
  HelpMenu := Application.MainForm.FindComponent('HelpMenu');
  if (HelpMenu is TMenuItem) and (TMenuItem(HelpMenu).Find('TEST') = nil) then
  begin
    CustomMenuHandler := TCustomMenuHandler.Create;

    mnuitem := TMenuItem.Create(nil);
    mnuitem.Caption := 'TEST';
    mnuitem.OnClick := CustomMenuHandler.HandleClick;

    TMenuItem(HelpMenu).Add(mnuitem);
  end;
end;

procedure RemoveIDEMenu;
var
  HelpMenu: TComponent;
begin
  if Assigned(mnuitem) then
  begin
    HelpMenu := Application.MainForm.FindComponent('HelpMenu');
    if HelpMenu is TMenuItem then
      TMenuItem(HelpMenu).Remove(mnuitem);
    mnuitem.Free;
    CustomMenuHandler.Free;
  end;
end;

OTA插件必须实现为安装到IDE中的包,并在每次运行IDE时加载。假设您确实创建了一个包,您是否验证了该包在下一次IDE重新启动时是否正在加载?我确实检查了它,它正在加载。问题是-即使手动添加包(bpl),菜单项也不会显示。只有当我重新编译软件包时,菜单项才会显示。这是哪个版本的Delphi?OTA插件必须作为软件包安装到IDE中,并在每次运行IDE时加载。假设您确实创建了一个包,您是否验证了该包在下一次IDE重新启动时是否正在加载?我确实检查了它,它正在加载。问题是-即使手动添加包(bpl),菜单项也不会显示。只有当我重新编译软件包时,菜单项才会显示。这是哪个版本的Delphi?这对我不起作用。。。问题是菜单项在下次Delphi启动时不会显示。它对我很有效。试着调试一下,看看你的情况出了什么问题。这对我不起作用。。。问题是菜单项在下次Delphi启动时不会显示。它对我很有效。尝试调试,看看您的案例中出现了什么问题。