社区
语言基础/算法/系统设计
帖子详情
组件的Owner如果是其自身?
saxash
2005-07-08 03:28:09
看到一段代码使我迷惑:
var
edt: TEdit;
begin
edt := TEdit.Create(edt);
...
end;
这样的组件,如果没有手动释放,将如何?
在此情况下,是否相当于TEdit.Create(nil); ?
...全文
255
19
打赏
收藏
组件的Owner如果是其自身?
看到一段代码使我迷惑: var edt: TEdit; begin edt := TEdit.Create(edt); ... end; 这样的组件,如果没有手动释放,将如何? 在此情况下,是否相当于TEdit.Create(nil); ?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Eastunfail
2005-07-11
打赏
举报
回复
对str赋常量值要分配,赋变量值不分配只是增加引用计数
前面说错了,不好意思
ZyxIp
2005-07-10
打赏
举报
回复
To 楼上
var
Str:String;
begin
Str:='abcd';赋值的时候不分配,这内存从哪里来的呢?
end;
Eastunfail
2005-07-09
打赏
举报
回复
To 楼上
Delphi的string在赋值的时候不会分配内存,呵呵
ZyxIp
2005-07-09
打赏
举报
回复
这就应算是无法预料的结果吧.
要将Btn初始化成Nil;
如果是定义在类的私有域系统会帮你初始化为空.对于局部变量要自己初始化的.
当然对于String不用,因为它是DELPHI自己管理的,只有当赋值的时候才分配内存,声明的时候只是一个空指针.
ZyxIp
2005-07-09
打赏
举报
回复
记住一个原则,自己创建的对象自己一定要释放.
传什么参数很多情况下都是无所谓的,只要类型符合就行.
但有些对象会调用Owner 的一些功能,所以传递的不正确会引起错误,除非你看过这个类的代码,要不还是最好按它想要的传递.
var
Atest:TMyClass;
begin
Atest:=TMyClass.Create();
Atest.....
end;
这样的代码会造成内存泄漏,过程结束的时候如果没有Free ,这个对象很难在Free了.
自己创建自己释放,而且创建和释放的代码最好是在一个类中,不要离的太运.
saxash
2005-07-09
打赏
举报
回复
那么请问什么情况下创建对象会出错,能不能模拟一下创建时出错的环境?
GoldProgramer
2005-07-09
打赏
举报
回复
请大家运行以下内容。
procedure TForm1.Button1Click(Sender: TObject);
var
Btn: TEdit;
begin
if Btn = nil then
Btn := TEdit.Create(Btn)
else
ShowMessage(Btn.Text);
Btn.Free;
end;
GoldProgramer
2005-07-09
打赏
举报
回复
Eastunfail(龍子龍孫) 说的没错,
对于局部变量是不会进行自动初始化的,所以会出现无法预料的错误
dejoy
2005-07-08
打赏
举报
回复
这样的代码真是没有水准,只有初初初级程序员才会写出这样不负责任的代码。这样的代码是非常不稳定的,随时有可能出现异常。这样的代码用来讨论学习还可以,大家千万不要在自己的程序中使用这样的代码。
何鲁青
2005-07-08
打赏
举报
回复
很对!!!学习
Eastunfail
2005-07-08
打赏
举报
回复
因为局部变量编译器只是通过修改esp指针来在栈上划分一块数据,并没有显示的为其分配内存,也不会执行初始化,edt的值就可能是别的过程使用的时候遗留下来的。所以可能指向一个存在的对象,可能指向一个不存在不可读取得内存空间
saxash
2005-07-08
打赏
举报
回复
当然我知道这不是好方法,我也是第一次看到有人这样写。
实际试一下,是可以创建的,而且不会报错。
下面这样也行,不过会有[Warning]
var
edt: TEdit;
a: TComponent;
begin
edt := Tedit.Create(a);
edt.Parent := self;
edt.Left := 50;
edt.Top := 50;
end;
zwjchina
2005-07-08
打赏
举报
回复
Eastunfail(龍子龍孫) 说的没错,
对于局部变量是不会进行自动初始化的,所以会出现无法预料的错误
YAMABACK
2005-07-08
打赏
举报
回复
对于Eastunfail说的偶有些不同的意见:每次申明变量,系统都给它分配内存,而这个内存应该是可用的,不会出现无法预料的结果吧
g961681
2005-07-08
打赏
举报
回复
在create(owner)的时候,好象会通知owner做些事情的,
估计50的可能会出异常的!
Eastunfail
2005-07-08
打赏
举报
回复
和nil不一样.你在TEdit.Create的时候,edt的值不是固定的
可能只想一个无法访问的内存空间
所以这样创建的话可能会出现无法预料的异常
saxash
2005-07-08
打赏
举报
回复
to YAMABACK:
对,应该是这样吧。
wtg476
2005-07-08
打赏
举报
回复
----------学习--------
YAMABACK
2005-07-08
打赏
举报
回复
看了一下TComponent的构造函数,edt := TEdit.Create(edt)和TEdit.Create(nil)应该是一样的,因为此时edt还没有被创建就被引用了
05-通过
owner
获取自定义
组件
1.创建配置文件application.properties ,上篇文章中我们已经创建了就不需要创建了 2.通过Settings设置对应文件编码为UTF-8,以支持中文 3.在配置文件appication.properties自定义属性 com.study.model.author=li xiao com.study.model.title=学习教程 4.添加配置工具
owner
的...
parent 与
owner
的含义区别及举例
parent即 养父是指拥有该
组件
的父类,即parent
组件
必定是一个窗口控制
组件
(Windowed control)由于
组件
就是容纳该
组件
的父类,因此当父类移动时,附着其内的
组件
也会移动.Object TreeVIew 里表示的就是这种关系. 1unitUnit1;23interface45uses6Windows,Messages,SysUtils,Variant...
owner
和parent的区别
owner
和parent的区别 评论(0)发表时间:2007年3月21日 10时38分
why-did-you-render原理剖析(五):如何捕获
组件
的
owner
?getCurrent
Owner
到log
Owner
Reasons全链路
React 重渲染(re-render)排查是前端性能优化的核心难题,而 why-did-you-render(WDYR)能精确告诉你:**是哪个父
组件
(
owner
)的 props/state/hooks 变化导致了这次重渲染**。本文剖析 WDYR 从 React 内部 API `getCurrent
Owner
` 捕获
owner
,到 `log
Owner
Reasons` 输出归因日志的完整链路。
Delphi控制
组件
组件
的parent和
owner
属性 parent为包含此
组件
的父窗口
组件
,可以是form,groupbox,panel等等。
owner
属性用于指出此
组件
的宿主是谁,当
组件
A的宿主为
组件
B时,一旦
组件
B的内存被释放,那么它所拥有的
组件
A的内存也会释放。 formnew.show(); 本文转自鹅倌51CTO博客,原文...
语言基础/算法/系统设计
16,741
社区成员
33,233
社区内容
发帖
与我相关
我的任务
语言基础/算法/系统设计
Delphi 语言基础/算法/系统设计
复制链接
扫一扫
分享
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章