フォームの移動を検出するには

解決


ウォレス  2004-06-19 05:35:42  No: 9497

Form1とForm2があって、Form2はForm1のすぐ下にくっついて表示されています。
(ここまでは問題ありません)
Form1をドラッグして動かすと、動かし終わった後にForm2がForm1のすぐ下に移動するようにしたいのですが、イベントを検出する方法がわかりません。
Formにはmoveっていうイベントはなさそうですし、タイトルバーのドラッグはマウスのupやdownイベントには引っかからないようです。
どうかよろしくお願いします。


jok  2004-06-19 07:57:28  No: 9498

自前で WM_MOVE メッセージを捕まえます。

type
  TForm1 = class(TForm)
    Label1: TLabel;
  private
    { Private 宣言 }
  public
    procedure WMMove(var Msg:TWMMove);message WM_MOVE;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.WMMove(var Msg: TWMMove);
begin
  Label1.Caption := Format('Left = %d  Top := %d',[Left,Top]);
end;


ウォレス  2004-06-19 18:31:04  No: 9499

早速の回答、有難うございます。

上記のサンプルソース、うまく動作しました。
しかし、これだと移動中、ずっとイベントが起きてしまいます。

タイトルバーをドラッグしていたマウスを離した時に、Form2を移動させようと思います。

重ねて質問なのですが、タイトルバーのマウスのメッセージはどのように捕まえるのでしょうか?

※jokさんのを真似て

procedure WMLBUTTONUP(var Msg:TWMLBUTTONUP);message WM_LBUTTONUP;
      (中略)

procedure TForm1.WMLBUTTONDOWN(var Msg: TWMLBUTTONDOWN);
begin
  Label2.Caption := 'DOWN';
end;

などとやってみましたが、こりゃFormのmausedownイベントと同じですね^^;
タイトルバーには反応しませんでした。


るるとん@K  2004-06-19 19:04:40  No: 9500

参考→https://www.petitmonte.com/bbs/answers?question_id=1675


はてな?  2004-06-19 20:25:28  No: 9501

>しかし、これだと移動中、ずっとイベントが起きてしまいます。

どのように確認したのでしょう?
Form1のドラッグ中には WM_MOVEメッセージは送られてこないはずですよ。
(送られてくるのはドラッグ終了時に一度だけ)


にゃ〜  2004-06-19 21:59:56  No: 9502

>しかし、これだと移動中、ずっとイベントが起きてしまいます。

にゃるほどにゃ〜
下のような設定にゃらば、そういうことが起きるにゃ〜

>「画面のプロパティ」、「効果」の
>「ウィンドウの内容を表示したままドラッグする」にチェック

にゃ〜も、そういう設定してるんにゃら、ドラッグ中にForm2が一緒に移動した方がいいと思うけどにゃ〜

ん?どうしても Form1のドラッグ終了時に Form2を移動させたいのかにゃ〜?
それはワガママというものだにゃ〜

  private
    procedure WMNCLBUTTONDOWN(var Msg: TWMNCLBUTTONDOWN); message WM_NCLBUTTONDOWN;
  end;

procedure TForm1.WMNCLBUTTONDOWN(var Msg: TWMNCLBUTTONDOWN);
begin
  inherited;
  if Msg.HitTest = HTCAPTION then begin
    if Assigned(Form2) then begin
      Form2.Top := Form1.Top + Form1.Height;
      Form2.Left := Form1.Left;
    end;
  end;
end;


ウォレス  2004-06-19 22:46:06  No: 9503

みなさん、ありがとうございます。
にゃ〜さんのコードを参考に目的は果たせました。また、過去ログの読みが浅いな、と反省しました。

【総括】(すみません。コピペばかりの文章です)

・画面のプロパティ->効果->ウィンドウの内容を表示したままドラッグする
にチェックがあると、ドラッグ中に WM_MOVEメッセージが送られ続ける。
(チェックを外すと移動後に1度送られる)

・WM_NCLBUTTONDOWN  (非クライアント領域上でマウスの左ボタンのイベント)と
  HTCAPTION(タイトルバーかどうか?)によってタイトルバーのドラッグを判定できる。


jok  2004-06-20 07:09:23  No: 9504

にゃ〜さん
> にゃ〜も、そういう設定してるんにゃら、ドラッグ中にForm2が一緒に移動した方がいいと思うけどにゃ〜

これに賛成。WM_MOVE のメッセージハンドラだけでいいのではないでしょうか。


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

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






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