我现在写了这样一个函数
function TForm1.Cratebt(s: string): TButton;
var
  tbt:TButton;
begin
  tbt:=TButton.Create(nil);
  try
    tbt.Caption:=s;
    tbt.Top:=100;
    tbt.Left:=100;
    Result:=tbt;
  finally
    tbt.Free;
  end;
end;
________________
我用以下代码来生成按钮
var
  bt2:TButton;
begin
  bt2:=TButton.Create(Self);
  bt2:=Cratebt('a');         
  bt2.Parent :=form1;
end;
问题1 Cratebt生成的函数 不能在 finaly里 free 如果 free 后,返回的值就不对了。应该在什么地方free 呢问题2 就算返回了但是   bt2:=Cratebt('a')  只是把指针给bt2 不是复制出一个新的指针,
我查了书,书上说利用一个抽象类——TPersistent的AssignTo方法就行了。可是我不知道怎么用。
谢谢
 

解决方案 »

  1.   

    你的代码有问题!
    var
      bt2:TButton;
    begin
      bt2:=TButton.Create(Self); //你已经创建了一个button按钮!
      bt2:=Cratebt('a'); //bt2被重新指向了,并且在finally中将此对象销毁!所以报错!        
      bt2.Parent :=form1;
    end;
    函数这样写
    function TForm1.Cratebt(s: string): TButton;
    var
      tbt:TButton;
    begin
      try
        tbt:=TButton.Create(nil);
        tbt.Caption:=s;
        tbt.name:=s;
        tbt.Top:=100;
        tbt.Left:=100;
        Result:=tbt;
      except
        showmessage('error!');
      end;
    end;
    创建按钮时就不会促错了
    var
      bt2:TButton;
    begin
      bt2:=TButton.Create(Self); 
      bt2:=Cratebt('a');         
      bt2.Parent :=form1;
    end;
      

  2.   

    创建按钮时就不会促错了
    var
      bt2:TButton;
    begin
      bt2:=TButton.Create(Self); 
      bt2.Assign(Cratebt('a'));
      bt2.Parent :=form1;
    end;
      

  3.   

    不好意思!可以直接用
    var
      bt2:TButton;
    begin
        bt2:=Cratebt('a');
        bt2.Parent :=form1;
    end;
      

  4.   

    var
      bt2:TButton;
    begin
      bt2:=TButton.Create(Self);
      bt2:=Cratebt('a');         
      bt2.Parent :=form1;
    end;如果我是老师,我的学生写出这样的代码,直接给0分。
      

  5.   

    function TForm1.Cratebt(s: string): TButton;
    var
      tbt:TButton;
    begin
      tbt:=TButton.Create(self);   //////////////////////// 
      try
        tbt.Caption:=s;
        tbt.Top:=100;
        tbt.Left:=100;
        Result:=tbt;
      finally
        //tbt.Free; 
      end;
    end;
      

  6.   

    最好的办法是建一琏,想什么释放就什么时候释放
    如果不释放,就交个delphi去干,如function TForm1.Cratebt(s: string): TButton;
    var
      tbt:TButton;
    begin
      tbt:=TButton.Create(self);   //////////////////////// 
      try
        tbt.Caption:=s;
        tbt.Top:=100;
        tbt.Left:=100;
        Result:=tbt;
      finally
        //tbt.Free; 
      end;
    end;
      

  7.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
       List : TList;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      List:=TList.Create;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      button : Tbutton;
    begin
      button:=Tbutton.Create(self);
      button.Parent:=self;
      button.Left:=100;
      button.Top:=100;
      List.Add(button);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      if List.Count>0 then
      Tbutton(List.Items[0]).free;end;end.
      

  8.   

    郑重地告诉搂主:
    如果类创建是:Create(AObject),只要AObject是有效的对象,则AObject释放时,你创建的对象也会自动释放。如果是:Create(nil),则需要自己手工释放创建的对象。
      

  9.   

    楼上的同志们误会了,可能是我没说清什么意思。
    function TForm1.Cratebt(s: string): TButton;
    var
      tbt:TButton;
    begin
      tbt:=TButton.Create(nil);
      try
        tbt.Caption:=s;
        tbt.Top:=100;
        tbt.Left:=100;
        Result:=tbt;
      finally
        tbt.Free;
      end;
    end;这个函数 我知道不 free 就对了,可是不释放对于这个函数是失败的,只有创建,没有释放。
    MFC里可以有这样的临时变量,过一段时间系统会自动释放。delphi 里应该用什么方法。还有
    var
      bt2:TButton;
    begin
      bt2:=TButton.Create(Self);
      bt2:=Cratebt('a');         
      bt2.Parent :=form1;
    end;这段代码只是我举个例子来说明白这段问题啦
      

  10.   

    晕到其实问题很简单,现给个过程如下:
    function TForm1.Createbt(s: String): TButton;
    begin
      Result:=TButton.Create(Self);
      with Result do
      begin
        Caption:=s;
        Top:=100;
        Left:=100;
        Parent:=Self;
      end;
    end;
    用如下方法调用(你的过程中多创建了次):
    var
    bt2:TButton;
    begin
    bt2:=Cratebt('a');
    end;