我有一个发送请求的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;
答案 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关闭表单