【问题标题】:How to force execution of code at form show如何在表单显示中强制执行代码
【发布时间】:2013-03-03 17:09:29
【问题描述】:

我在一个单元中包含以下代码,作为我的使用列表中的最后一个单元

{ 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 事件中,但它没有效果。 我知道该功能有效,因为如果我尝试用鼠标拖动表单,它会立即移动到有效位置。

所以我的问题是:如何在显示表单时强制代码运行?

【问题讨论】:

  • 没有效果,还是触发了访问冲突?您正在为两个消息参数传递空指针,那么您希望您的消息处理程序用于rec 什么?
  • FormShow 操作无效。它不会触发任何 AV 我可以看到你对 REC 的看法 - 关于如何改变它的任何建议
  • 技术上真的是帮手吗? class helper for?
  • 好的。这清除了它。您只需将WMMoving 中的代码提取到一个单独的函数中,该函数接收一个矩形作为其参数。从WMMoving 调用该函数,并从覆盖的DoShow 调用它。你完成了。但是你不能发送WM_MOVING,它不在你的礼物里。这样做是错误的..
  • 我认为这应该标题为如何在 WM_MOVING 处理程序中强制执行代码。 FormShow中的代码运行了,就是没有效果。

标签: delphi messages


【解决方案1】:

要在显示表单时运行代码,请将代码放入 OnShow 事件处理程序中。


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

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

【讨论】:

    猜你喜欢
    • 2019-08-11
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2017-07-30
    相关资源
    最近更新 更多