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;
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;
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;
《《《我怎么能够把T[0]拿出来放在一边,把b3free之后,B4 还能用?
你可以克隆一个t【0】保存到b4中,如下:
b4 ;= TButton.Create(nil);
b4.Assign(t[0] as TButton);
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;
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;//--------------------------------------------------------------------
当然报错!
1、你的TSock.Create,会自动将创建的对象增加到数组SockH中吗?如果不是的化,你为什么写出下面的两行代码?
SockD := Tsock.Create(nil);
SockD := SockH[i];//SockH array of Tsock2、SockA没有存在的理由啊?你创建它干什么?
SockD := SockH[i];//SockH array of Tsock
SockA := Tsock.Create(nil);
SockA.Assign(SockD as TSock);//这里报错为什么对象拷贝叶报错?