0

使用リストの最後のユニットとして含めるユニットに次のコードがあります

{ TFormHelper }
procedure TForm.WMMoving(var aMessage: TWMMoving);
var
  rec: ^TRect;
  wrk: TRect;
begin
  wrk := GetWorkArea;
  rec := Pointer(aMessage.DragRect);
  if rec^.Left < wrk.Left then
    begin
      rec^.Right := rec^.Right - (rec^.Left - wrk.Left);
      rec^.Left := wrk.Left;
    end
  else if rec^.Right > wrk.Right then
    begin
      rec^.Left := rec^.Left - (rec^.Right - wrk.Right);
      rec^.Right := wrk.Right;
    end;
  if rec^.Top < wrk.Top then
    begin
      rec^.Bottom := rec^.Bottom - (rec^.Top - wrk.Top);
      rec^.Top := wrk.Top;
    end
  else if rec^.Bottom > wrk.Bottom then
    begin
      rec^.Top := rec^.Top - (rec^.Bottom - wrk.Bottom);
      rec^.Bottom := wrk.Bottom;
    end;
end;

フォームがメインフォームの作業ウィンドウ内にあるかどうかを確認し、そうでない場合はフォームを有効な位置に移動する必要があります。

確認したいフォームに入れました

SendMessage(Handle, WM_MOVING, 0, 0);

FormShow イベントに含まれていますが、効果はありません。マウスでフォームをドラッグしようとすると、すぐに有効な位置に移動されるため、機能が機能することはわかっています。

私の質問は次のとおりです。フォームが表示されているときにコードを強制的に実行するにはどうすればよいですか?

4

1 に答える 1

3

フォームが表示されたときにコードを実行するには、OnShowイベント ハンドラーにコードを配置します。


しかし、それはあなたの問題ではありません。あなたの問題は、あなたのコードが効果がないことです。wm_Movingメッセージは通常、ドラッグ操作中など、ユーザーがウィンドウを移動しているときに送信されます。OS は継続的にメッセージを送信して、ウィンドウの移動先の一時的なウィンドウ座標を含め、どこに移動できるかをフォームに尋ねます。ウィンドウは、提案されたウィンドウ境界を調整することによってメッセージに応答し、OS はウィンドウをそれらの新しい座標に移動するか、ドラッグ四角形を変更します (「フル ウィンドウ ドラッグ」オプションが設定されているかどうかによって異なります)。

ただし、単独のwm_Movingメッセージを送信するだけでは、そのようなことはありません。基本的にフォームに行きたい場所を尋ねていますが、このシナリオでは OS の役割を果たしているため、得られた結果に基づいて行動し、実際にウィンドウを移動する必要があります。メッセージはwm_Movingコマンドではなく通知です。固有の副作用はありません。

于 2013-03-03T17:23:51.083 に答える