-1

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

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

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

我执行这个:

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

idTCPServer 会执行这个:

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

2 回答 2

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;
于 2013-08-03T02:53:18.533 回答
0
Form1.ModalResult := mrOK;

当 ModalResult 获得的值不是 mrNone 时,ShowModal 关闭表单

于 2013-08-03T15:45:01.957 回答