uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure BtDel(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  Bt:TButton;
implementation
{$R *.dfm}
procedure TForm1.BtDel(Sender: TObject);
begin
  FreeAndNil(Sender);
  //去掉下面这句代码就部报错,但是下面必须做一些处理的不能去并且
  //这两句代码不能颠倒顺序
  caption:='pp'
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  Bt:=TButton.Create(Self);
  Bt.Parent:=Self;
  Bt.OnClick := BtDel;
end;

解决方案 »

  1.   

    通过Sender处理?很容易出问题的逻辑问题来的,在对象自己的事件处理中Free对象自己,这是不合理的http://lysoft.7u7.net
      

  2.   

    你在自己的事件中Free掉自己,Free后,控件所占的区域被释放了,然后执行下一句就会出错。你可以在过程中释放,而要再事件中释放。
      

  3.   

    自己Free自己,Free后,控件所占的区域被释放了,然后执行下一句就会出错。
      

  4.   

    肯定出错了,自己释放自己,原来的类为nil了,就有问题了
      

  5.   

    Sender在在TWinCtrol的Click方法中要使用,删除会引起混乱。
    为避免重复定义Bt,应做如下改动:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Assigned(Bt) then FreeAndNil(Bt);//如果不加这句,先前定义的对象会在内存中丢失,导致  内存泄漏。
      Bt:=TButton.Create(Self);
      Bt.Parent:=Self;
      Bt.OnClick := BtDel;
    end;
      

  6.   

    感谢各位,看来只能用别的办法处理了
    ly_liuyang(Liu Yang)  兄:
    你很强啊,发现你回答的问题特多
    是不是老在这里逛啊