2010-08-06 105 views
9

从我的应用程序中,我希望打开一个对话框,在某些情况下应该立即关闭(在短消息之后)。如何在打开后立即关闭模式表单?

我已经试过这样:

procedure TForm2.FormActivate(Sender: TObject); 
begin 
    if SomeCondition then 
    begin 
    ShowMessage('You can''t use this dialog right now.'); 
    close; 
    modalresult := mrCancel; 
    end; 
end; 

,但该对话框保持打开状态。我也试着把代码放在OnShow事件中,但结果是一样的。

为什么不能正常工作?

回答

11

尝试这一个

procedure TForm2.FormActivate(Sender: TObject); 
begin 
    ShowMessage('You can''t use this dialog right now.'); 
    PostMessage(Self.Handle,wm_close,0,0); 
end; 
+0

谢谢,这很有效。 – 2010-08-06 09:10:55

4

在表单打开之前检查某些情况不是更容易,而不是打开它吗?

我看不到表单保持打开的原因,它应该在显示消息对话框中单击OK后马上消失。

该showmessage是阻止,所以你将无法关闭,直到这是OK'd(如果你需要关闭之前,那么你可以返回一个不同的模态结果(或使你自己的不与冲突。像mrUnavailable = 12)现有然后,你可以显示消息,如果ModalResult是mrunavailable

如果它在运行的代码,只是不关闭,然后尝试使用Release,而不是接近

编辑:。如果您在多个地方重复使用同一表单,则不要使用释放,除非您希望每次都重新创建表单!将关闭消息作为其他人发布ave建议

+0

我从几个地方打开对话框定时器,我不想要检查的每一个地方。 – 2010-08-06 08:59:33

+4

然后使用可以从几个地方调用的方法。在该方法中进行支票,如果确定,只需打开表格 – 2010-08-06 09:45:05

15

发表WM_CLOSE消息,而不是直接调用close;

ShowMessage('You can''t use this dialog right now.'); 
PostMessage(Handle, WM_CLOSE, 0, 0); 
modalresult := mrCancel; 
+0

即使答案几乎相同,我也接受Bharat的答案。抱歉。他击败了你两秒:-) – 2010-08-06 09:09:59

+1

@Svein - 在这里,这表明我的回答击败了他37秒。但无论如何它已经足够接近而不会对此大惊小怪了。 :-) – 2010-08-06 09:23:25

+2

爱因斯坦说:时间的感知取决于你的速度。 – 2010-08-06 09:29:03

0

可以尝试一个定时器:

  • 设置定时器的低间隔(20)
  • 上onTimer事件,关闭的形式;
  • 启用的FormActivate事件