我有一个项目,其主要形式和其他形式。 当应用程序加载时,它需要执行一些任务并在主窗体顶部以模式形式显示结果。 我遇到的问题是,如果我调用函数来执行任务/创建并在主窗体onshow事件中显示模态窗体,则会出现模态窗体但主窗体不会直到模态窗体关闭,这是我期望发生什么。为了解决这个问题,我在主表单上添加了一个计时器,并在主表单onshow事件上启动它,计时器调用该函数来执行任务/创建并显示模态表单。所以现在主要形式出现在模态形式之前。
然而,我不认为这是最好的解决方案,并且想知道是否有人能提供更好的解决方案。
我正在使用Delphi 7
科林
答案 0 :(得分:10)
一个常用选项是在表单OnShow
中发布消息。像这样:
const
WM_SHOWMYOTHERFORM = WM_USER + 0;
type
TMyMainForm = class(TForm)
procedure FormShow(Sender: TObject);
protected
procedure WMShowMyOtherForm(var Message: TMessage); message WM_SHOWMYOTHERFORM;
end;
...
procedure TMyMainForm.FormShow(Sender: TObject);
begin
PostMessage(Handle, WM_SHOWMYOTHERFORM, 0, 0);
end;
procedure TMyMainForm.WMShowMyOtherForm(var Message: TMessage);
begin
inherited;
with TMyOtherForm.Create(nil) do begin
try
ShowModal;
finally
Free;
end;
end;
end;
答案 1 :(得分:2)
为什么不使用这样的MainForm OnActivate
事件?
procedure TMyMainForm.FormActivate(Sender: TObject);
begin
//Only execute this event once ...
OnActivate := nil;
//and then using the code David Heffernan offered ...
with TMyOtherForm.Create(nil) do begin
try
ShowModal;
finally
Free;
end;
end;
将事件设置为nil将确保此代码仅在启动时运行一次。
答案 2 :(得分:0)
在调用Windows API函数OnShow
之前立即触发ShowWindow
事件。这次调用ShowWindow
实际上会导致窗口出现在屏幕上。
因此,理想情况下,您需要在调用ShowWindow
后立即运行某些内容。事实证明,驱动所有这些的VCL代码位于TCustomForm
的{{1}}消息处理程序中。该消息处理程序触发CM_SHOWINGCHANGED
事件,然后调用OnShow
。因此,一个出色的解决方案是在ShowWindow
的处理程序运行后立即显示您的模态表单。像这样:
CM_SHOWINGCHANGED