var
  Form1: TForm1;
  T1: TObjectList;
  b4: Tbutton;
  A: array of Tbutton;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
var
  b3: Tbutton;
begin
  b3 := TButton.Create(nil);//创建也需要 (程序需要)
  b3 := T1[0] AS TBUTTON;
  Showmessage(b3.Caption);//这里没问题
  b4 := T1[0] AS TBUTTON;
  FreeAndNil(b3); //这里一定Free(程序需要),但Free完了以后怎么也找不回了(如果不Free肯定可以)。
  Showmessage(b4.Caption);//这里报错,我怎么能够把T[0]拿出来放在一边,把b3free之后,B4 还能用?
end;procedure TForm1.FormShow(Sender: TObject);
Var
  b1,b2: Tbutton;
begin
  B4 := Tbutton.Create(nil);
  T1 := TOBJECTList.Create;
  B1 := Tbutton.Create(nil);
  b1.Caption := 'b1';
  B2 := Tbutton.Create(nil);
  b2.Caption := 'b2';
  T1.Add(b1);
  T1.Add(b2);
end;

解决方案 »

  1.   

    //创建了button类的实例,用b3引用
      b3 := TButton.Create(nil);//创建也需要 (程序需要)  //注意,b3引用到了t1[0]这个button类的实例,也就是说刚才创建的那个button实例被丢弃了
      b3 := T1[0] AS TBUTTON;  Showmessage(b3.Caption);//这里没问题  //注意这里,b4也引用到了t1[0]这个button类的实例,也就是说此刻b3,b4引用到同一个button类的实例 
      b4 := T1[0] AS TBUTTON;
      
      //释放b3,也就是说将t1【0】和b4引用的实例也不存在了,因为他们引用了同一个
      FreeAndNil(b3); //这里一定Free(程序需要),但Free完了以后怎么也找不回了(如果不Free肯定可以)。
      
      //b4引用的button类实例已经被释放,不报错才怪
      Showmessage(b4.Caption);//这里报错,我怎么能够把T[0]拿出来放在一边,把b3free之后,B4 还能用?
    end;
      

  2.   

    你上面的b3创建后马上丢弃,你为什么要创建?
    《《《我怎么能够把T[0]拿出来放在一边,把b3free之后,B4 还能用?
    你可以克隆一个t【0】保存到b4中,如下:
    b4 ;= TButton.Create(nil);
    b4.Assign(t[0] as TButton);
      

  3.   

    看我的源代码:Var
      SockD,SockA: Tsock;
      i: integer;
      s,Addr: string;
    begin
      for i := 0 to 2 do
      begin
        SockD := Tsock.Create(nil);
        SockD := SockH[i];//SockH array of Tsock
        SockA := Tsock.Create(nil);
        SockA.Assign(SockD as TSock);//这里报错
         s := SockD.ReceiveDatagram(Addr);
        if Trim(s) <> '' then
        begin
          Writeln(F,inttostr(cnt)+':'+s);
          inc(cnt);
        End;
        FreeAndNil(SockA);
      End;
    end;
      

  4.   

    //--------------------------------------------------------------------
    var
      Form1: TForm1;
      T1: TObjectList;
      b4: Tbutton;
      A: array of Tbutton;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
    var
      b3: Tbutton;
    begin
      b3 := TButton.Create(nil);//创建也需要 (程序需要)
      b3 := T1[0] AS TBUTTON;//(有这句话,上面的有没有必要?????)
      Showmessage(b3.Caption);//这里没问题
      b4 := T1[0] AS TBUTTON;
      FreeAndNil(b3); //这里一定Free(程序需要),但Free完了以后怎么也找不回了(如果不Free肯定可以)。(free的是T1[0] AS TBUTTON!!!!)
      Showmessage(b4.Caption);//这里报错,我怎么能够把T[0]拿出来放在一边,把b3free之后,B4 还能用?)。(b4就是T1[0] AS TBUTTON,已经free了,当然报错!!!!)
    end;//--------------------------------------------------------------------
    当然报错!
      

  5.   

    代码不全,看不懂。
    1、你的TSock.Create,会自动将创建的对象增加到数组SockH中吗?如果不是的化,你为什么写出下面的两行代码?
      SockD := Tsock.Create(nil);
      SockD := SockH[i];//SockH array of Tsock2、SockA没有存在的理由啊?你创建它干什么?
      

  6.   

    SockD := Tsock.Create(nil);
        SockD := SockH[i];//SockH array of Tsock
        SockA := Tsock.Create(nil);
        SockA.Assign(SockD as TSock);//这里报错为什么对象拷贝叶报错?