2012-10-07 36 views
1

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

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. 

所以,我的第一个问题是菜单项测试每个德尔福开始时展示了如何获得..还有,我想下一个图标添加到菜单项的测试。任何方向?

谢谢

编辑: 我刚刚发现我的包被延迟加载。读互联网的人说应该调用ForceDemandLoadState(dlDisable)。但是,这也不能帮助我......

+0

OTA插件必须实现为被安装到IDE和每个IDE运行时加载的包。假设你确实创建了一个包,你是否验证了该包是否在下一次IDE重启时被加载? –

+0

我没有检查它,它正在加载。问题是 - 即使手动添加包(bpl),菜单项也不会显示。只有当我重新编译包时,菜单项才会显示。 – Tracer

+0

Delphi的哪个版本是这样的? –

回答

1

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; 
+0

这不适合我...问题是菜单项不显示下次启动Delphi。 – Tracer

+0

它为我工作。尝试调试以查看您的情况出了什么问题。 –