1

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

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

5 回答 5

2

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

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

  1. 不要SubFormOnShow主窗体的事件中显示您,而是在以后显示
  2. ShowModal退货后不要直接显示消息,而是稍后显示

对于第 2 点,您可以使用我在此处建议的类似方法,使用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向您的应用程序的消息队列发布一条消息,该消息将在主窗体完成变得可见后进行处理。

于 2011-08-17T15:09:10.873 回答
2

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

于 2011-08-17T15:40:00.903 回答
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 处理程序中显示您的消息,您可以让主窗体有机会变得可见并因此处于后台。

于 2011-08-17T15:08:19.007 回答
0

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

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

看看这里的例子。

于 2011-08-17T15:10:20.450 回答
0

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

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

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

于 2011-08-18T01:53:19.240 回答