Open Tools API その1:"Hello,World!"を表示してみる

プロジェクトの作成

IDEへのアドオンは、パッケージを作成してそれをIDEに「登録」することで実装される。RAD Studioの場合、[ファイル|新規作成|パッケージ-Delphi]で新規プロジェクトを作成する。Open Tools APIのクラスやインスタンスは通常のプロジェクトでは参照しないので、それらを含んでいるパッケージであるdesignide.dcpをプロジェクトに明示的に含めなければならない。プロジェクトマネージャーで[参照の追加]を選択。$(BDS)\lib\win32\release\designide.dcpを選択すれば、designide.dcpがプロジェクトに含まれる。

「ウイザード」の実装

ウイザードを実装するには、ToolsAPI.pasで定義してあるウィザードインターフェースとノーティファイアインターフェースを継承したサブクラスを定義し、必要に応じたメソッドを実装する必要がある。「本当に」簡単な実装は以下のコード。

unit uMain;
interface
procedure Register;

implementation
uses
  ToolsAPI, Dialogs;

// ヘルプメニューに項目を追加するウイザードクラスの定義
type THelloWorldMenuWizard = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)
  function GetIDString: string;
  function GetName: string;
  function GetState: TWizardState;
  procedure Execute;
  function GetMenuText: string;
end;

function THelloWorldMenuWizard.GetIDString: string;
begin
  Result := 'THelloWorldMenuWizard.1.0';
end;
function THelloWorldMenuWizard.GetName: string;
begin
  Result := 'Delphi Hello World Wizard';
end;
function THelloWorldMenuWizard.GetState: TWizardState;
begin
  Result := [wsEnabled];
end;
procedure THelloWorldMenuWizard.Execute;
begin
  ShowMessage('Hello, world!');
end;
function THelloWorldMenuWizard.GetMenuText: string;
begin
  Result := 'Hello World Demo Wizard';
end;

// ウイザードの登録
procedure Register;
begin
  RegisterPackageWizard(THelloWorldMenuWizard.Create);
end;
end.

継承元クラスのうち、IOTAWizardはウイザードインターフェースの基本となるクラス。IDEのアドオンは必ずIOTAWizardを継承しなければならない。TNotifierObjectクラスはノーティファイアインターフェースの基本となるIOTANotifierのうち最低限のメソッドのみを実装したクラス。IOTAMenuWizardクラスは、IDEの[ヘルプ]メニューに項目を自動的に登録してくれるクラス。IDEにアクセス可能なウイザードクラスで一番実装が楽。

Open Tools APIのクラスやインスタンスはToolsAPI.pasで定義されているので、Delphiではuses節にToolsAPIを記述する。

サブクラスで記述しなければならないメソッドは以下の5つ。

メソッド 役割
GetIDString IDEがウイザードを識別するためのユニークな名前
GetName ユーザーが任意につけるウイザードの名前
GetMenuText [ヘルプ]メニューに追加する項目のタイトル
GetState メニュー項目の状態(有効、無効など)
Execute メニュー項目が選択された場合に呼び出される

サブクラスを定義したら、サブクラスのインスタンスIDEに登録しなければならない。それを行うのがパッケージで定義するRegister関数。インスタンスIDEがこのRegister関数を呼び出すことによって生成されるので管理は必要なし。*1

作成したパッケージをプロジェクトマネージャーからインストールすると、ヘルプに「Hello World Demo Wizard」なる項目が追加される。これを選択すると、お馴染みのメッセージボックスで「Hello, world!」が表示される。

[メッセージ]ビューに"Hello,World!"を表示してみる

上記のコードは普通にShowMessageで"Hello,World!"を表示するだけ。これは単純すぎて面白くないので、IDE下部の[メッセージ]ビューに"Hello,World!"を表示してみる。これは、アドオンを昔ながらのprintfデバッグデバッグするときも有効なので、この方法を最初に紹介。

IDEのメッセージビューへのアクセスは、メッセージビューを取り扱うサービスであるIOTAMessageServicesを取得してAddTitleMessageメソッドを呼び出せば任意の文字列を取得できる。また、AddMessageGroupメソッドで任意のタブを追加できる。

先ほどのExecuteメソッドを以下の内容に差し替えて、再ビルドする。

procedure THelloWorldMenuWizard.Execute;
var
  IMessageServices: IOTAMessageServices;
  MessageGroup: IOTAMessageGroup;
begin
  // メッセージビューに関するサービスを取得する。
  IMessageServices := BorlandIDEServices as IOTAMessageServices;
  // メッセージビューにタブを追加する。
  MessageGroup := IMessageServices.AddMessageGroup('メッセージ出力テスト');
  // メッセージビューに文字列を表示する。
  IMessageServices.AddTitleMessage('こんにちは、世界!', MessageGroup);
end;

これで、IDEのメッセージビューに「メッセージ出力テスト」というタブが追加されて、「こんにちは、世界!」という文字列が表示される。

*1:TNotifierObjectが参照カウントによるメモリ管理をしてくれるため。