如何判断变量的合法性

hardnut 2000-04-06 11:14:00
var
edt:TEdit;
begin
edt:=Edit1;//Edit1;已经存在
.
.
.
Edit1.Free; //or edt.Free;
.
.
.
if IsValid(edt) then
edt.Text:='Is a Valid object'
else
begin
edt:=TEdit.Create(self);
edt.Text:='It is a new object');
end;
end;

问题的核心就是function IsValid(var objvar):boolean,请问这个函数如何写?
怎样判断一个对象类型的变量(指针)是否仍然是指向一个合法的对象(仍可利用)?

...全文
372 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
vive 2000-04-13
  • 打赏
  • 举报
回复
edit1变成nil是form1做的,好像tedit在free的时候通知它的owner把自己设置成nil.
如果edit1是自己代码里面新create的一个tedit对象而不是设计时拉进来的就没这种情况
我不知道怎么判断变量指向的对象是否存在,这一点java好多了,根本不用考虑这些问题
kxy 2000-04-07
  • 打赏
  • 举报
回复
引用和引用计数不是同一个概念。
delphi中string使用引用计数(reference counting)的技术。
var s:string; s有引用计数,那s 是引用吗?
kxy 2000-04-07
  • 打赏
  • 举报
回复
1)delphi中free不会给变量赋nil,所以要自己赋空
edit1.Free;
edit1 := nil;//一定要自己加这句话。
2)在C++中 int &C; c是一个引用,它有引用计数吗?
hardnut 2000-04-07
  • 打赏
  • 举报
回复
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的合法性

这个问题我花了不少时间研究,但仍不得其解,
AcherMagic 2000-04-07
  • 打赏
  • 举报
回复
问题在于你只EDT.FREE
还缺一句edt := nil;
edt这个变量依然存在
kxy 2000-04-06
  • 打赏
  • 举报
回复
Edit.Free;
Edit:=nil;

if assigned(edit1) then ....
delphi中,一个类的对象类型的变量不是指针而是一个引用。
hardnut 2000-04-06
  • 打赏
  • 举报
回复
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;


另外,很多资料上都说类变量是指针,倒是没有说是引用的,如果真是引用,它有引用计数吗?

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧