通过事件关闭模态表单不起作用

时间:2013-08-03 00:34:05

标签: delphi

我有一个发送请求的Modal表单(带有idTCpClient)。然后在idTCPServer OnExecute事件中,应该关闭该表单(在接收数据之后)。

第一个ShowModal;Close;按预期执行,但第二个close;不起作用,表单仍然可见。

我在表单上放了一个Button(btnClose)来关闭它。如果我在idTCPServer OnExecute事件中使用btnClose.Click;,表单不会关闭,但如果我手动点击此按钮,表单将被关闭!

我执行此操作:

Procedure btnStart();
begin
  Form1.ShowModal;
end;

idTCPServer将执行此操作:

procedure idTCPServerOnExecute(...)
begin
  Form1.close //Or for testing purpose: Form1.btnClose.Click;  
end;

2 个答案:

答案 0 :(得分:5)

TIdTCPServer是一个多线程组件。其OnExecute事件在工作线程中运行,因此无法安全地访问UI组件。

对于您正在尝试的内容,最简单的解决方案是使用TIdNotify类,例如:

Uses
  ..., IdSync;

procedure TSomeClass.IdTCPServerOnExecute(AContext: TIdContext);
begin
  TIdNotify.NotifyMethod(Form1.Close);
  //Or for testing purpose:
  //TIdNotify.NotifyMethod(Form1.btnClose.Click);
end;

答案 1 :(得分:0)

Form1.ModalResult := mrOK;
当ModalResult获得的值不是mrNone

时,

ShowModal关闭表单