Remy Lebeau は、GExperts ガイドへのリンクを使用して、正確な方向性を示しています。
この種の作業をこれまでに行ったことがない場合でも、独自の IDE アドインの作成を開始するには少しパフォーマンスが低下する可能性があるため、項目を追加する方法の最小限の例を以下に示しますコード エディタのポップアップ メニュー。
当然のことながら、新しいパッケージを作成し、それに以下のユニットを追加してから、そのパッケージを IDE にインストールします。ユニット内のへの呼び出しRegister
は、エディターのポップアップ メニューに新しい項目をインストールするために必要なことを行います。
パッケージをインストールするときに、コード エディターが開いていることを確認してください。その理由は、後でわかるように、その時点でアクティブなエディターがあるかどうかをコードがチェックするためです。その時点でアクティブなコード エディターがない場合でも、ポップアップ項目が確実に追加されるようにする方法は残しました。ヒント: 使用している Delphi のバージョンに関係なく、ToolsAPI.Pas ユニットを見ると、さまざまな種類のノーティファイアが含まれていることがわかります。そのうちの少なくとも 1 つからの通知を使用して、存在するかどうかのチェックを遅らせることができます。エディターがアクティブになる可能性が高いまで、アクティブなエディターです。
ところで、このコードは、アクティブなタブではなくエディター ウィンドウ自体の上にポップアップするコンテキスト メニューにメニュー項目を追加します。IDE アドインの楽しみの 1 つは、実験して目的のものが正確に得られるかどうかを確認することです。私は自分で試したことはありませんが、エディター タブの 1 つのコンテキスト メニューにメニュー項目を追加するのがそれほど難しいとは思えません。以下のコードからわかるように、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 を検索し、メニュー項目をそのコンテキスト メニューに追加します。ただし、2 つ目のエディタ ウィンドウが開いていることは考慮されていないことに注意してください。
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;