ホーム >プログラム >Delphi 6 ローテクTips

コンポーネントメモ・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: