3

Delphi IDE のソース ファイルの右クリック メニューに項目を追加するために使用する必要があるサービス/インターフェイスを探しています。

たとえば、ユニットのタブを右クリックすると、「ページを閉じる」、「他のすべてのページを閉じる」、「プロパティ」などの項目があります。可能であれば、そのメニューにカスタム項目を追加したいと考えています。

ToolsAPI ユニットを調べましたが、どこから始めればよいかわかりません。アイテムを列挙してアイテムを追加するために使用できるインターフェイスがあると思いますが、どこから探し始めればよいかわかりません。

それが不可能な場合は、コード エディターのコンテキスト メニューで解決します。

このためのオンラインのサンプルがいくつかあるかもしれませんが、私はまだ探していて、何も見つかりませんでした.

どんな助けでも感謝します。

4

1 に答える 1

4

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;
于 2016-12-08T12:34:12.320 に答える