コンポーネントメモ・TForm
TFormの覚書。
bsSizeToolWinスタイル
BorderStyleプロパティにbsSizeToolWinを指定するとAutoScrollプロパティの値がオブジェクトインスペクタでFalseにしていても実行時にはTrueになります。
対策:
Falseにする必要があるならフォームのOnCreateイベントでFalseにセットします。
//BorderStyleがbsSizeToolWinのときのみ強制的にTrueになってしまう。
Self.AutoScroll := False;
bsSizeToolWin以外のスタイルではこの問題は起きません。
bsToolWin, bsSizeToolWinスタイル
通常のタイトルバーのときと違いタイトルバーのダブルクリックが拾えません。
通常のタイトルバーのときはマウスダウンの後にダブルクリックのメッセージが拾えるのですがツールウィンドウのときはメッセージが来ません。
private
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
...
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
case Msg.CmdType of
SC_MAXIMIZE
:begin
//最大化。
end;
61490
:begin
//タイトルバーのダブルクリック。
//ツールウィンドウのときはこのメッセージは来ない。
end;
対策:
WM_NCLBUTTONDBLCLKメッセージを拾って対処します。
private
procedure WMNcLButtonDblClk(var Msg: TMessage); message WM_NCLBUTTONDBLCLK;
...
procedure TForm1.WMNcLButtonDblClk(var Msg: TMessage);
type
T_HitTestPos = record
case Integer of
1: (iLParam: LPARAM);
2: (iXPos, iYPos: WORD);
end;
var
lr_HitTest: T_HitTestPos;
lpt_Pos: TPoint;
begin
if (IsZoomed(Self.Handle)) then
begin
//最大化されていたらデフォルトの処理(元のサイズに戻す)を行う。
inherited;
end else
begin
//タイトルバーのダブルクリックかを判定する。
GetCursorPos(lpt_Pos);
lr_HitTest.iXPos := lpt_Pos.X;
lr_HitTest.iYPos := lpt_Pos.Y;
if (SendMessage(Self.Handle, WM_NCHITTEST, 0, lr_HitTest.iLParam) = HTCAPTION)
then
begin
//タイトルバーをダブルクリックしたときの処理。
end;
end;
end;
WM_NCLBUTTONDBLCLKメッセージはタイトルバーだけでなく、フォームのフレームやメニューバーをダブルクリックした場合にも起きます。
そのためタイトルバーをダブルクリックしたのか、そうでないかの判定を行うために自身にWM_NCHITTESTメッセージを送っています。
2010-08-24: