我有一个按钮。它的OnClick事件调用一个销毁按钮的过程,但是“线程”想要返回OnClick事件并且我得到访问冲突。
我完全难过了!
答案 0 :(得分:11)
您需要在所有代码执行完毕后销毁该按钮。执行此操作的标准方法是将一个用户定义的消息发布到表单,并为表单提供一个消息方法来解释它。例如:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
WM_KILLCONTROL = WM_USER + 1;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure KillControl(var message: TMessage); message WM_KILLCONTROL;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
PostMessage(self.Handle, WM_KILLCONTROL, 0, integer(Button1))
end;
procedure TForm1.KillControl(var message: TMessage);
var
control: TControl;
begin
control := TObject(message.LParam) as TControl;
assert(control.Owner = self);
control.Free;
end;
end.
这是有效的,因为消息被放入Windows消息队列中,并且直到它之前的所有内容(包括按钮当前正在响应的Click消息)完成处理后才会出现。
答案 1 :(得分:0)
您可以在OnClick事件中启用计时器,然后首先编写Timer事件以禁用计时器,然后从OnClick事件调用当前正在调用的过程。设置定时器已禁用且间隔时间很短。