[英]Delphi IDE Menu integration - INTAServices
我已使用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。此外,我想在菜單項TEST旁邊添加圖標。 有方向嗎?
謝謝
編輯:我剛剛發現我的包延遲加載。 閱讀互聯網的人說應該調用ForceDemandLoadState(dlDisable)。 但是,這也無濟於事。
當IDE加載其程序包時, NTAServices.MainMenu.Items[9]
可能會在不同的時間返回不同的內容,還有一些菜單項的子項由IDE在運行時管理(例如,Window菜單)。
您可以按名稱查找“幫助”菜單項組件:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.