【发布时间】:2014-06-17 16:00:16
【问题描述】:
在程序启动时,在OnActivate 事件处理程序中,我需要做一些事情来阻止程序几秒钟。在此期间,窗体的客户区仍未完全绘制,这对用户来说看起来很丑陋。 (在这段阻塞时间内,我不需要程序响应点击或其他用户操作,因此无需将阻塞操作放入线程中 - 我只需要完全绘制表单即可)。所以我使用TForm.Update和Application-ProcessMessages在阻塞操作之前更新表单,效果很好:
procedure TForm1.FormActivate(Sender: TObject);
begin
Form1.Update;
Application.ProcessMessages;
Sleep(7000);
end;
但是,我想知道对于这个问题是否没有其他更优雅的解决方案。例如,这可能是在 TForm 的后代中实现的 OnShown 事件,该事件将在表单完全绘制后触发。这样的事件怎么可能实现?
【问题讨论】:
-
参见例如swissdelphicenter.com/torry/showcode.php?id=1276。但我很确定在 Stack Overflow 上有一个关于它的问题。
-
发布消息(如您提供的链接中)IMO 并不完全可靠,因为消息 (AFAIK) 在某些情况下也可能会丢失。我需要 200% 可靠的东西。
-
消息不会丢失。但是如果队列已满,
PostMessage可能会在排队时失败,您可以使用PostMessage结果参数检测到。 -
在 .NET 中有一个 Form.Shown 事件(参见 MSDN)。因此,在 Windows 级别,窗体必须知道何时完全绘制。不应该可以使用 Windows API 访问它吗?
-
你在错误的地方阻止了。只需在 FormShow 事件结束时向自己发送一条消息,然后执行阻止操作以响应该消息。当您在其处理程序中收到消息时,该表单已完全绘制。 (当表单/应用程序失去焦点并重新获得焦点时,可以多次触发 OnActivate;无论如何,这通常是错误的地方。)
标签: delphi delphi-xe2 tform