Windows 2000/Delphi 7 Professional にて
実験用に Main.exe と Plug.dll の2つを作成しました。
Main.exe には、Form1 : TForm の上に ControlBar1 : TControlBar があります。
Plub.dll <--> Main.exe 間で CallBack にて ControlBar1 のハンドルを取得できるようにています。
Exe が起動したら DLL の Show関数を呼び、DLL 側では
procedure Show(); stdcall; export;
begin
BarHnd := CallBackGetHandle(); // ExeにControlBarのハンドルを要求
ToolBar := TToolBar.Create(Application); // 終了時にApplicationに破棄してもらう
ParentWindow := BarHnd; // 親のハンドル(VCL)
Color := clBlue;
Windows.SetParent( ToolBar1.Handle, BarHnd ); // 親のハンドル(Windows)
end;
としてにて、表示することはできました。
しかし、作成されたToolBarにはグリップが表示されません。
Exe内で
Tool := TToolBar.Create(Self);
with Tool do begin
Parent := ControlBar1;
Color := clRed;
Align := alTop;
end;
とするとグリップが表示されることから、DLL からの場合は、
ControlBarが追加されたことを検知できなない為だと思います。
長文にならないようポイント部に絞ってるので伝わるか心配ですが、どのようにしたら
追加されたToolBarにグリップが表示できるかアドバイスをお願いします。
私ならTClassで渡しexe側でcreateします
アドバイスありがとうございます。
>TClassで渡しexe側でcreate
DLLでツールバーを作成するのではなく、Exeに作らせるという手段で、
//ToolBarを作成するCallBack関数をExe側に用意
function CreateToolBar(): THandle; stdcall;
DLL側で、ロードされたタイミングで Panelと配下のボタンのインスタンスを作成
DLLからExeのCreateToolBarをCallBackし、ツールバーのハンドルを取得
Panel.ParentWindow := ツールバーのハンドル;
という手順で、グリップを表示したいという目的は達成できました。
しかし、このままでは、単にToolBarを作るだけとなっています。
EdgeやWrapable等のプロパティを設定するために、引数もしくは構造体なりを受け渡す手段が必要になります。
と、ここまで書いて、
. さんのアドバイスにある、TClass を渡して、ExeでCreateするという手法ではない事に気づきました。思い込みで突っ走ってました
TClass を渡して、ExeでCreate するのは、どのような事でしょうか。
最初の質問時に巧い例えが出ませんでしたが、こんな感じです。
Intenet Explorer のコントロールバーには、ツールバーとアドレスバーがありますが、このツールバーとアドレスバーをDLLで搭載できないかと勉強中です。
(あくまでも画面のレイアウトのネタで、ブラウザを作るわけじゃないのでIEコンポ等の話は無視しちゃってください)
ツイート | ![]() |