类的问题(请大家关注一下)谢谢(80分)

  • 主题发起人 主题发起人 coolwindfly
  • 开始时间 开始时间
C

coolwindfly

Unregistered / Unconfirmed
GUEST, unregistred user!
连续的使用form1:=Tform.Create(Self);这样就创建了多个同名的form1.这样会不会有冲突,另外,在free的时候是否要注意什么,会不会同时销毁呢?另外,如果这个form1是一个子窗口的话,是用create(self)好还是create(nil)好?谢谢
 
连续的使用form1:=Tform.Create(Self);这样就创建了多个同名的form1.这样会不会有冲突?答:冲突倒是没有,但是因为创建的窗体没有释放,会导致内存泄漏。所以每次创建的窗体不再用时要用free销毁。创建一个销毁一个。
create(self)是要通知application的,在退出程序时会自动销毁。用create(nil)就要自己销毁。
 
谢谢墨剑!但请问为什么会没有冲突呢?如果没有冲突的话,为什么我不同同时将两个form都命名为FORM1呢?
 
另外,如果有两个相同名字的button被创建,请问应用程序要如何识别呢?不过我发现倒是的确可以创建多个相同名字的button的,这是什么原因呢?谢谢
 
还有,如果我用了这个语句form1:=Tform.Create(Self);它和用with Tform.Create(Self) do有什么区别,我用with语句没有给其赋值的话那个这个动态生成的form的名字是什么?用多个with Tform.Create(Self) do语句和多个form1:=Tform.Create(Self);的区别是什么呢?
 
  with Tform.Create(Self) do是创建了一个无名窗体,如果不指定参数为Self或其它控件,而是Nil,你在退出With do结构后就再没有机会访问它了

  连续的使用form1:=Tform1.Create(Self);的问题,我给举个风筝的例子你就明白了,TForm1好比是风筝的模板,Form1是那个放风筝的手,它只能拿一根线(因为实质是一个变量,2个字节)即使单独调用:
  TFrom1.Create(self)
也能生成一个实例,但是没有可用于放飞的线,写成
  form1:=Tform.Create(Self);
就是把线头放在Form1里面,再一次调用
  form1:=Tform.Create(Self);
这时发生什么?你可以想到:扔掉了原来的那根线,换了个新的!但是这个新和旧的因为是一个模子出来的,肯定用起来一样,所以不会报错,但不原来的那个,一撒手就不好找回来了对不对?
正如墨剑所言,create(self)是要通知application的,在退出程序时会自动销毁。用create(nil)就要自己销毁。
我有个地方不同意,通知的不是Application,而有Form1本身,这就很悬了,让高手指点吧
 
非常感谢icc的精彩指点,说得十分形象,请问你指的很悬的意思是什么呢?为什么会很悬呢?为什么子窗口不可以定义成self呢?
 
连续的使用form1:=Tform.Create(Self);

在Form1没有被释放之前,下一次创建就会出错的!
 
to lxian:have you try it ?在Form1没有被释放之前,下一次创建就会出错的!
 
我说的悬,是因为我认为,既然Self指的Form1,是不是就是把新实例的“线头”交由Form1变量保存,属主又定义为Form1本身,这时候内部的机制我不清楚,一会我有空了写段代码测试一下它的机制
 
谢谢icc,如果你所说的线头由Form1变量保存的话,会不会在form1销毁的时候释放掉呢?
那么我在手动释放这个Form1的时候是不是不要写上form1:=nil了呀?这样不正是完全的释放资源了吗:)如果是由application来释放的话。我手工掉用cafree的时候不就是不能完全释放资源了吗?这样不是非得等到掉用者来释放它了吗?
 
Form.free的结果就是Form1 = nil
一般就是写了free就可以了,这时它自动就是nil了
如果创建时指定的owner为Application或其它组件,你也可以手工free,Application.free的时候,就不用再free这个窗体了,如果你不手工free,application.free的时候就会代你做这件事
  如果是TForm的子类,推荐使用Create(Application)的用法,如果是在Form中定义的其它组件,推荐使用Create(Self),指定具体的Owner有一些VCL的附加操作,但对效率没什么影响,用Ceate(nil),如果你忘了free就是内存泄漏
 
多人接受答案了。
 
ICC:推荐使用Create(Application)的用法,为什么要这么推荐
 
  因为窗体里的函数,self指的就是窗体本身,如果用这个窗体类创建一个新实例,属主指定为本身,这不太好
  我也只是猜测
 
后退
顶部