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消息通常在用户移动窗口时发送,例如在拖动操作期间。操作系统不断发送消息以询问允许它去哪里的表单,包括窗口将移动到的暂定窗口坐标。窗口通过调整建议的窗口边界来响应消息,然后操作系统将窗口移动到这些新坐标或更改拖动矩形(取决于是否设置了“全窗口拖动”选项)。

不过,仅仅发送一条单独的wm_Moving消息并不能做到这一点。您本质上是在询问表单它想去哪里,但由于您在这种情况下扮演操作系统的角色,您仍然需要对获得的结果采取行动并实际移动窗口。wm_Moving消息是通知,而不是命令;它本身没有固有的副作用。

于 2013-03-03T17:23:51.083 回答