コントロールバーに乗せてあるツールバーをFloatingさせたときに、×ボタンで消すと自動的にコントロールバーにドッキングさせたいんですが、このとき発生するイベントってどこにあるんでしょうか?
確かに標準イベントではみたいですねぇ。
ツールバーをサブクラス化して
CM_VISIBLECHANGEDを捕まえてみたらどうでしょう。
少し試してみましたがウィンドウの最小化のときは
メッセージが来ずに、ツールバーの×ボタンを
押したときにはくるようです。
>確かに標準イベントではみたいですねぇ。
確かに標準イベントではないみたいですねぇ。
試していなくて申し訳ないんですが
こんな感じで動作しないでしょうか?
interface
TToolDockSite = class(TToolDockForm)
private
procedure WMSysCommand(var Msg: TWMSysCommand);
message WM_SYSCOMMAND;
end;
implementation
procedure TToolDockSite.WMSysCommand(var Msg: TWMSysCommand);
begin
case Msg.CmdType of
SC_CLOSE: begin
//この辺りに処理を書く
//inherited; //閉じたいときはこちら
Msg.Result := 0; //閉じたくないときはこちら
end;
else
inherited;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ToolBar1.FloatingDockSiteClass := TToolDockSite;
end;
このあたりを参考にしています。
[builder:20001] フローティングしたツールバーのクローズボタン
すいません。せっかく教えてもらったのに、処理の記述の仕方がわかりません。
今までTForm下でしか処理書いてこなかったので、イベントの追加の意味がよくわかってません。
どうやったら、TToolbar(Sender)を渡せるんでしょうか。
ちょっと忙しくて返事いただいてたのを気がつきませんでした。スマセン。
えっと、どこを説明すればいいでしょう?
TFormの宣言の下に
上記のTToolDockSite の宣言を書いてください。
あとは、実装部分どこでもいいので
上記のTToolDockSite.WMSysCommandを書いてください。
上記のFormCreateで、ドッキングを制御するクラスを
指定してあげています。
確かに、やや特殊な処理なのでがんばってみてください。
procedure TToolDockSite.WMSysCommand(var Msg: TWMSysCommand);
begin
case Msg.CmdType of
SC_CLOSE:
begin
//この辺りに処理を書く
inherited ManualDock(TWinControl(frmMain.FindComponent('cbrArtBoard')));
inherited BoundsRect := Rect(0,0,Width,Height);
Msg.Result := 0; //閉じたくないときはこちら
end;
else
inherited;
end;
end;
としてみました。
ToolBarはドッキングサイトに戻ったんですが、ToolButtonが宙に浮いてしまって、メインフォームにフォーカスが戻らなくなったんですが、これは何故おこるんでしょう?
ツイート |