DELPHIのIDEにOpenToolsAPIでツールバーを追加するには

解決


takana  2011-06-12 04:51:44  No: 40651

DelphiのIDEにMS_OfficeのVBAエディタのブックマーク機能っぽいのを実装しようとして
OpenToolsAPIを使用し、ToolBarの追加を行ったところ、ToolButtonが正しく表示されません。
お分かりになる方がおられれば、改善個所を指摘いただければ幸いです。

環境
DELPHI2005 update3
WindowsXP SP3

やったこと
パッケージの新規作成を選択
パッケージのソースを表示し、Requiresに  designide, vclを追加
プロジェクトに新規データモジュールを追加
データモジュールに以下に示すソースコードを記述
プロジェクトの右クリックからインストールを選択

結果
ツールバーが追加されたことは確認できた
ツールバーにボタンが3つあって、それぞれクリックイベントが設計通り実行された

問題
1つ目のボタン以外、正しく表示されない
ボタンが小さかったり、Dividerのままだったり
2つ目3つ目のボタンが、いろいろ試してみましたが正しく表示されません。
改善する方法がお分かりの方がいましたら、よろしくお願いします。

unit Unit1;
interface

uses
  SysUtils, Classes, Controls, ToolsAPI, Dialogs, ComCtrls;

procedure Register;

const
  TOOLBAR_NAME = 'TEST';

type
  TDataModule1 = class(TDataModule)
    procedure DataModuleDestroy(Sender: TObject);
    procedure DataModuleCreate(Sender: TObject);
  private
    { Private 宣言 }
    procedure OnTestClick(Sender: TObject);
  public
    { Public 宣言 }
  end;

var
  DataModule1: TDataModule1;

implementation

{$R *.dfm}

procedure TDataModule1.DataModuleCreate(Sender: TObject);
var
  IDEServices: INTAServices;
  ToolBar: TToolBar;
  ToolButton: TToolButton;
begin
  IDEServices := (BorlandIDEServices as INTAServices);
  ToolBar := IDEServices.NewToolbar(TOOLBAR_NAME, '編集(ユーザ定義)');
  Assert(Assigned(Toolbar), 'ユーザ定義のツールバーの作成に失敗しました');

  //第4引数をTrueにすればStyle=tbsDividerとなるが、第3引数の設定が不要になる
  //第4引数をFalseにするとTSpeedButtonが作成され、第3引数にTActionを設定しなければいけない
  ToolButton := IDEServices.AddToolButton(TOOLBAR_NAME,'SetBookmark',nil ,True) as TToolButton;
  ToolButton.Style := tbsButton;
  ToolButton.OnClick := OnTestClick;

  ToolButton := IDEServices.AddToolButton(TOOLBAR_NAME,'NextBookmark',nil ,True) as TToolButton;
  ToolButton.Style := tbsButton;
  ToolButton.OnClick := OnTestClick;

  ToolButton := IDEServices.AddToolButton(TOOLBAR_NAME,'PrevBookmark',nil ,True) as TToolButton;
  ToolButton.Style := tbsButton;
  ToolButton.OnClick := OnTestClick;

  ToolBar.Visible := True;
end;

procedure TDataModule1.OnTestClick(Sender: TObject);
begin
  ShowMessageFmt('Name:%s, ClassName:%s',[TControl(Sender).name, Sender.ClassType.ClassName]);
end;

procedure Register;
begin
  DataModule1 := TDataModule1.Create(nil);
end;

procedure TDataModule1.DataModuleDestroy(Sender: TObject);
var
  IDEServices: INTAServices;
  EditToolBar: TToolBar;
begin
  IDEServices := (BorlandIDEServices as INTAServices);
  EditToolbar := IDEServices.ToolBar[TOOLBAR_NAME];
  if Assigned(EditToolbar) then EditToolBar.Free;
end;

procedure UnRegister;
begin
  DataModule1.Free;
end;

initialization
finalization
  UnRegister;
end.


takana  2011-06-12 14:25:20  No: 40652

自己レスです

OnTestClickを以下に変えて実行したところ
表示がおかしいボタンのStyleはちゃんとtbsButtonに
なっていることが分かりました。

あと、ボタンの数を増やしたところ、たえず最後の2つのボタンがおかしく
なるようです。

当方には、Delphi2005しかないのですが、ほかのバージョンではどうなのでしょうか?
お分かりの方がいましたら、情報お願いします。

procedure TDataModule1.OnTestClick(Sender: TObject);
begin
  ShowMessageFmt('Name:%s'#13'ClassName:%s'#13'Style:%s',
   [TControl(Sender).name, Sender.ClassType.ClassName,
   GetEnumName(TypeInfo(TToolButtonStyle), Ord(TToolButton(Sender).Style))]);
end;


takana  2011-06-20 01:12:45  No: 40653

自己レスです

とりあえず一番最後に1つ余計にダミーのボタンを追加し、すぐに開放すれば正しくボタンが表示されるようになりました。

具体的には、以下の2行を
ToolBar.Visible := True;
の前に追加

  ToolButton := IDEServices.AddToolButton(TOOLBAR_NAME,'Dummy',nil ,True) as TToolButton;
  ToolButton.Free;


takana  2011-07-17 09:13:40  No: 40654

おかけさまで完成しました。

http://www.vector.co.jp/soft/winnt/prog/se491992.html


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加