Delphi onshow主要表单/模态表单

时间:2012-01-19 13:15:21

标签: forms delphi modal-dialog

我有一个项目,其主要形式和其他形式。 当应用程序加载时,它需要执行一些任务并在主窗体顶部以模式形式显示结果。 我遇到的问题是,如果我调用函数来执行任务/创建并在主窗体onshow事件中显示模态窗体,则会出现模态窗体但主窗体不会直到模态窗体关闭,这是我期望发生什么。为了解决这个问题,我在主表单上添加了一个计时器,并在主表单onshow事件上启动它,计时器调用该函数来执行任务/创建并显示模态表单。所以现在主要形式出现在模态形式之前。

然而,我不认为这是最好的解决方案,并且想知道是否有人能提供更好的解决方案。

我正在使用Delphi 7

科林

3 个答案:

答案 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