举个简单例子:
Var
AEdit,BEdit:TEdit;
AEdit:=TEdit.Create(Nil) ;
BEdit:=AEdit;
执行上述代码后,AEdit,BEdit就指向同一个Edit控件了.
现假定我不知道AEdit是否存在,仅通过BEdit,我能否判断对象是否已经销毁了呢?因为如果执行了
AEdit.Free; AEdit:=Nil;后
此时仍有BEdit<>Nil, BEdit Is TEdit =True,但如果再试图通过BEdit去访问的话就会出错.另外想问一下大家意见,实际应用中是否应该允许一个对象有多个引用呢?
Var
AEdit,BEdit:TEdit;
AEdit:=TEdit.Create(Nil) ;
BEdit:=AEdit;
执行上述代码后,AEdit,BEdit就指向同一个Edit控件了.
现假定我不知道AEdit是否存在,仅通过BEdit,我能否判断对象是否已经销毁了呢?因为如果执行了
AEdit.Free; AEdit:=Nil;后
此时仍有BEdit<>Nil, BEdit Is TEdit =True,但如果再试图通过BEdit去访问的话就会出错.另外想问一下大家意见,实际应用中是否应该允许一个对象有多个引用呢?
解决方案 »
- Dll调用能够返回执行结果,但提示invalid pointer operation错误
- 如何设计一个通用的数据过滤办法,用于打印
- 如何创建父,子窗体???????
- 1.怎样在程序运行时 显示“正在运行...” 2.完后“运行完毕”,并有确定按钮
- 怎样写这样一个查询的sql语句
- 百度中搜索到的mp3地址一部分是无效的.请问如何检测某mp3地址是否有效?
- 只因为我的问题太菜,也许根本就没人在意我这个小菜鸟
- 哪里有ExpressQuantumGrid Suite v4下载
- Delphi 如何调用.hlp文件阿???
- 十万火急?高手请进~~~~~~~~~~~~~~~~~~~~~~~~~~~`````
- 两个软件间的断点续传, 可再加分~~~~~
- 如何使SpeedButton按钮单击呈按下状态,在单击弹起
这样就可以完全释放,并且为NIL
我已经执行了AEdit.Free; AEdit:=Nil,对象就已经被销毁了
但因为该对象有多个引用,此时BEdit不会为Nil,所以才想知道应该如果判断
你可以试试执行FreeAndNil(AEdit);此时BEdit绝对不会为Nil,但实际上他指向的对象已通过AEdirt被销毁了
Var
AEdit,BEdit:TEdit;
begin
AEdit:=TEdit.Create(Nil) ;
AEdit.FreeNotification(Self);
BEdit:=AEdit;
end;procedure TForm1.Notification(
Component : TComponent; Operation : TOperation); //override;
begin
if (Component = AEdit) and (Operation = opRemove) then
begin
AEdit := nil;
BEdit := nil;
end;
end;有些参数名称可能有出入,自己查一下帮助吧。
我明白你的意思了,这的确是一种可行的办法.
但如果该对象的引用不是两个,而是10个,并且谁都可能执行释放
那不是要写10遍,并在每个事件里列举其余9个引用出来置为Nil?
要是那天我想再加一个,那我除了要写一个新的事件外同时还要修改上述10个事件?感觉不爽.暂时撇开存在10个相同引用存在的必要性,我是希望能否直接通过任一个引用来判断他所指向的对象是否已销毁,如果可以做到的话,那即便我再引入100个引用,也不会产生太大的影响.我只需在使用前判断一下,如果还存在的话那我就可以放心地通过他做我想要做的事了.