我创建了一个应用程序,其中主表单在主表单的FormShow事件上调用子表单。显示子表单并提供两个选项供您选择。如果选择子表单上的第一个选项,则显示一个消息,然后将显示该主表单。现在,当应用程序第一次运行时,将在子窗体Meassage上选择选项后显示。但我想显示主窗体作为背景的消息。所以任何解决方案。下面是FormShow代码。
Procedure TMainForm.FormShow(Sender:TObject);
begin
if (SubForm.ShowModal = mrOK) and bOption1 then
begin
ShowMessage('Enter the value');
end;
end;
答案 0 :(得分:2)
如果我理解正确,那么您的问题是当消息框显示时您的主表单仍然不可见。
如果是这种情况,那么您有两个选择:
SubForm
事件中显示您的OnShow
,而是在以后显示ShowModal
返回后不要直接显示消息,但稍后会再次显示消息对于第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事件中显示消息对话框的位置启用定时器。