2011-08-17 154 views
1

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

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

您必须在onPaint事件中使用Canvas绘制它,这是我在过去7年前用Delphi 7编写的,所以它可能会有所改变。 :D – Rolice

+0

但在主窗体上我已经把一个按钮重定向到SubForm。在那个按钮上单击我让Mainform Visible为false,并且在用户从SubForm中选择选项后,Mainform显示为可见。在这种情况下,Smessage在后台显示Mainform。感谢帮助。 – naren

回答

2

如果我理解正确,那么你的问题是,当消息框显示你的主窗体仍然是不可见的。

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

  1. 不要从OnShow事件的主要形式展示你SubForm,但在稍后的时间
  2. 不显示消息后直接ShowModal回报,但在稍后的时间

对于点2号,你可以使用类似的方法,我建议here,使用PostMessage。所以,你的代码将somethind这样的:

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将消息发布到应用程序的消息队列中,在主窗体完成变为可见状态后将处理消息队列。

+0

谢谢..它解决了这个问题。 – naren

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处理你的信息。

0

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

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

查看示例here

2

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

+0

Set OnActivate:= nil;以防止它运行一次以上。这里有一个类似的问题:http://stackoverflow.com/questions/8926615/delphi-onshow-main-form-modal-form –

0

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

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

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