将对象赋为nil(50分)

  • 主题发起人 主题发起人 wxysiwei
  • 开始时间 开始时间
W

wxysiwei

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在onclose事件中将form1:=nil
但是如果我将窗体的name属性改变后“form1:=nil”中form1的名字是不会跟着变的,需要我人为的改动,这样太麻烦。
我想问是否有什么更好的办法例如:self:=nil等(当然“self:=nil”肯定不对)。
 
让Form自己引发OnClose事件,然后用Sender := nil可以实现
 
这个问题基本上是无解的,你想啊,你定义了一个类,你可以在任何地方创建这个类,并且把创建的实例给任何一个变量,并且,你阻止不了变量之间的赋值,换句话说,多个对象变量可能指向同一个对象实例,在这个实例释放的时候,他是没有能力一一通知这些变量的
 
呵呵,好玩的话可以自己定义一个窗体类,在Create的时候传递窗体对象过去,
模仿: Application.CreateForm(TForm1, Form1);
procedure TMyForm.Create(Owner: XXxxx, FormXx: TForm)
begin
// ...........
FormXx := TForm.Create(Owner);
end;

然后在覆盖 OnClose 事件处理过程.. 里面 FormXx := nil;

[:D] 这只是一种可能,不过没多大实用性,说着好玩,楼主莫怪
 
self是不变的,为什么不对呢。 名字是动态可以改变的,但是self始终指向对象本身的。
再说了, 为什么在close事件中写释放代码? 最好由创建它的对象或者方法释放它。
 
看了几遍总算把楼主的意思搞明白了。
我在此谈几点看法:
1 要渐渐的培养面向对象编程思想。不要在程序中在出现什么form1,form2等的全局变量,
封装性不好。
2 你的问题完全可以用self来指代吗。self:= nil 或 FreeAndNil(self)等绝对是对的。
3 form1:= Tform1.create(nil) 或 Application.CreateForm(TForm1, Form1);
需要手动释放内存;但 form1:= Tform1.create(Application) 就不需要你手动释放了,
它会由它的主属性Application去管理的,主属性Application消失时它就会跟着消失的。
 
lisongmagic 谢谢你的建议
我用曾用过self:= nil 或 FreeAndNil(self)都[:(]了
 
用 self 是不行的.
 
楼主需要学习OOP思想
尤其是OOP的设计原则
不要把对象当做新的全局变量...

当前问题的解决方法:
close事件中加入
Action := caFree;
 
请问name属性和form1有什么关系?
 
什么是self,在类的一般方法中,self是函数参数表中的一个隐含的参数,而且是传值类型的,也就是说,你让self := nil,仅仅是让一个函数的参数值等于空了,这和对象没有什么关系。
例如
TMyObject = class
public
procedure abcd(aa: Integer);
end;

procedure TMyObject.abcd(aa: Integer);
begin
//这个函数中的self仅仅是函数的一个默认的隐含参数
//就和aa是一个概念,这个self指向的是类实例在内存中的地址
//因此,你操作self:=nil是没有什么用的,
//但是如果你self.free,这就表示你要释放这个类的实例,
//而且仅仅是释放了类实例所占的内存
end;
 
楼主你最好把那段问题代码粘贴上来,不然我也不知道你的确切意思,你写那句
form1:=nil到底想实现什么功能。
楼上朋友说的对,free 和置为 nil 是两回事,所以一般在编程时就用free,而不需要
用freeAndNile了。
 
后退
顶部