2012-10-07 38 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

它爲我工作。嘗試調試以查看您的情況出了什麼問題。 –