【发布时间】: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中的代码运行了,就是没有效果。