在由所述对象调用的事件期间销毁对象

时间:2010-04-20 16:59:13

标签: delphi

我有一个按钮。它的OnClick事件调用一个销毁按钮的过程,但是“线程”想要返回OnClick事件并且我得到访问冲突。

我完全难过了!

2 个答案:

答案 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事件调用当前正在调用的过程。设置定时器已禁用且间隔时间很短。