在主窗体的OnShow中显示模态窗体时,主窗体不显示?

时间:2011-08-17 14:52:57

标签: delphi modal-dialog tform

我创建了一个应用程序,其中主表单在主表单的FormShow事件上调用子表单。显示子表单并提供两个选项供您选择。如果选择子表单上的第一个选项,则显示一个消息,然后将显示该主表单。现在,当应用程序第一次运行时,将在子窗体Meassage上选择选项后显示。但我想显示主窗体作为背景的消息。所以任何解决方案。下面是FormShow代码。

Procedure TMainForm.FormShow(Sender:TObject);
begin
  if (SubForm.ShowModal = mrOK) and bOption1 then
  begin
    ShowMessage('Enter the value');
  end;
end;

5 个答案:

答案 0 :(得分:2)

如果我理解正确,那么您的问题是当消息框显示时您的主表单仍然不可见。

如果是这种情况,那么您有两个选择:

  1. 不要在主要表单的SubForm事件中显示您的OnShow,而是在以后显示
  2. ShowModal返回后不要直接显示消息,但稍后会再次显示消息
  3. 对于第2点,您可以使用与我建议here类似的方法,使用PostMessage。所以你的代码看起来像这样:

    procedure TMainForm.FormShow(Sender:TObject);
    begin
      if (SubForm.ShowModal = mrOK) and bOption1 then
      begin
        PostMessage(Self.Handle, WM_SHOWMYDIALOG, 0, 0);
      end;
    end;
    

    WM_SHOWMYDIALOG的处理程序然后显示实际消息。此方法也适用于第1点,请参阅ain's answer

    PostMessage向您的应用程序的消息队列发布消息,该消息队列将在主表单完成可见后处理。

答案 1 :(得分:2)

另一种选择是使用Mainform的OnActivate而不是onShow。

答案 2 :(得分:1)

如果我理解你,你想要

const
    UM_AFTERSHOW   = WM_APP + 1;

type
  TForm1 = class(TForm)
  protected
    procedure UMAfterShow(var Msg: TMessage); message UM_AFTERSHOW;
    procedure DoShow; override;
  end;


procedure TForm1.DoShow;
begin
  inherited;
  PostMessage(Self.Handle, UM_AFTERSHOW, 0, 0);
end;

procedure TForm1.UMAfterShow(var Msg: TMessage);
begin
  ShowMessage('Enter the value');
end;

通过在UMAfterShow处理程序中显示您的消息,您可以使主表单机会变为可见,从而处于后台。

答案 3 :(得分:0)

您看到的问题(如果我理解的话)是在您的主表单实际可见之前调用FormShow。因此,消息对话框显示在主窗体之前。

您需要做的是使用PostMessage将消息发布到您随后处理的主表单。这将允许您的FormShow代码完成,并在显示表单后触发代码。

看看here的例子。

答案 4 :(得分:0)

另一种选择是在主窗体上删除TTimer组件以触发消息对话框。

在主窗体上删除TTimer组件,并将enabled属性设置为False,并将时间从1000更改为100.编写消息对话框,并在timer事件中将Timer.Enabled属性设置为False,以避免重复触发。

现在,您可以在主窗体的OnShow事件中显示消息对话框的位置启用定时器。