关于动态创建控件的一些问题

lovedkw 2016-06-27 11:29:12
我从书上看到,Create中的传入值Self和nil会有不同的表现,具体为:
1.若传入Self,则当其Owner释放时,该控件会被自动释放
2.若传入nil,则需要手动释放

那么问题来了,如果我传入的是nil,但是我将其父窗口销毁呢?这个动态创建的控件会不会销毁?
我做过试验,则某个动态创建的父窗口销毁掉,然后再对这个动态创建的控件进行操作,结果报错,是否这个动态创建的控件也已经被销毁了?是否只要其Parent被销毁了,那么这个动态创建的控件也会被同时销毁呢?如果是这样的话,那书上讲的就不完全正确?
...全文
154 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovedkw 2016-07-17
  • 打赏
  • 举报
回复
感谢楼上各位的悉心指导,谢谢~
lovedkw 2016-07-01
  • 打赏
  • 举报
回复
@lyhoo163 您所说的一定场合是指什么?绝大多数情况下吗?然后,如果指向控件的指针失效了,那这个控件应该还在内存中的吧?
hj8090 2016-07-01
  • 打赏
  • 举报
回复
手动创建的手动释放就可以了,不放心可使用FastMM测试。
lovedkw 2016-06-28
  • 打赏
  • 举报
回复
貌似楼上两位大神的说法不太一致
不得闲 2016-06-28
  • 打赏
  • 举报
回复
释放有几种情况,如果你传递的为nil,但是他是从TControl集成下来的控件,那么当他的Parent释放的时候,他也会被释放,如果是TComponent等非可视控件,没有Parent的
lyhoo163 2016-06-28
  • 打赏
  • 举报
回复
理论上,控件Create时,传入Self(TForm),它会随窗口释放的。传入Nil即空,需要人工代码释放它。否则,占用内存。 但是,Delphi它有优化代码的功能,在一定场合,即使传入的是Nil,当创建它的环境释放时,它也会被释放。另一种情况,它未被释放,但它的指针已经无效了。因为,创建它的环境失效了。指向控件的指针无效了。 明白了吗? 因此,当不带Self参数的控件,在窗口释放前,还得释放它。

5,388

社区成员

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

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