assigned(...) 有时一点也不好用,见如下的代码, var edt,edt2:TEdit; procedure TForm1.Button1Click(Sender: TObject); begin edt:=Edit1;//edit1,edit2都是设计时从组件板上拉进Form1的 edt2:=edit1; edt.Free; if Assigned(edt) then//在这里,edit1=nil but edt<>nil why??? begin edt.Text:='Exist';//ok edt2.Text:=edt.Text; //ok edit2.text:=edt.text; //ok edt.Vusible:=True;//error end end;procedure TForm1.Button2Click(Sender: TObject); // if you press button1 before press button2... begin if assigned(edt) then //edt exist showmessage('edt exist'); edit1.Visible:=true; //error showmessage(edt2.text); //ok end; 另外,很多资料上都说类变量是指针,倒是没有说是引用的,如果真是引用,它有引用计数吗?
问题在于你只EDT.FREE 还缺一句edt := nil; edt这个变量依然存在
1)delphi中free不会给变量赋nil,所以要自己赋空 edit1.Free; edit1 := nil;//一定要自己加这句话。 2)在C++中 int &C; c是一个引用,它有引用计数吗?
引用和引用计数不是同一个概念。 delphi中string使用引用计数(reference counting)的技术。 var s:string; s有引用计数,那s 是引用吗?
delphi 中obj.Free是不能把obj置为nil但下面的代码却相反的Edit1置为nil了,这是什么原因?还请赐教。 edt:=Edit1;//edit1,edit2都是设计时从组件板上拉进Form1的 edt.Free;//注意,我是调用了edt.Free, if Assigned(edt) then//在这里,edit1=nil but edt<>nil 为什么Edit1成了nil了???我的问题是:如果Edit1在另外的地方Free掉了,但edt并没有在对象被释放的同时置为nil--因此对edt而言,Assigned(edt)是返回True的,因为edt仍指向了一个地址,(可用Integer(edt)查看它的值),那么我怎样才能知道edt指向的对象已经不存在了呢?也就是说怎样判断edt的合法性这个问题我花了不少时间研究,但仍不得其解,
var
edt,edt2:TEdit;
procedure TForm1.Button1Click(Sender: TObject);
begin
edt:=Edit1;//edit1,edit2都是设计时从组件板上拉进Form1的
edt2:=edit1;
edt.Free;
if Assigned(edt) then//在这里,edit1=nil but edt<>nil why???
begin
edt.Text:='Exist';//ok
edt2.Text:=edt.Text; //ok
edit2.text:=edt.text; //ok
edt.Vusible:=True;//error
end
end;procedure TForm1.Button2Click(Sender: TObject);
// if you press button1 before press button2...
begin
if assigned(edt) then //edt exist
showmessage('edt exist');
edit1.Visible:=true; //error
showmessage(edt2.text); //ok
end;
另外,很多资料上都说类变量是指针,倒是没有说是引用的,如果真是引用,它有引用计数吗?
还缺一句edt := nil;
edt这个变量依然存在
edit1.Free;
edit1 := nil;//一定要自己加这句话。
2)在C++中 int &C; c是一个引用,它有引用计数吗?
delphi中string使用引用计数(reference counting)的技术。
var s:string; s有引用计数,那s 是引用吗?
edt:=Edit1;//edit1,edit2都是设计时从组件板上拉进Form1的
edt.Free;//注意,我是调用了edt.Free,
if Assigned(edt) then//在这里,edit1=nil but edt<>nil 为什么Edit1成了nil了???我的问题是:如果Edit1在另外的地方Free掉了,但edt并没有在对象被释放的同时置为nil--因此对edt而言,Assigned(edt)是返回True的,因为edt仍指向了一个地址,(可用Integer(edt)查看它的值),那么我怎样才能知道edt指向的对象已经不存在了呢?也就是说怎样判断edt的合法性这个问题我花了不少时间研究,但仍不得其解,
如果edit1是自己代码里面新create的一个tedit对象而不是设计时拉进来的就没这种情况
我不知道怎么判断变量指向的对象是否存在,这一点java好多了,根本不用考虑这些问题