社区
Delphi
帖子详情
简单问题,来就送了
chenliang2001
2004-04-20 02:56:33
form1.Release;与form1.free;有什么区别啊
tform1.Create(nil);与tform1.Create(self);与tform1.Create(application);有什么区别
...全文
50
15
打赏
收藏
简单问题,来就送了
form1.Release;与form1.free;有什么区别啊 tform1.Create(nil);与tform1.Create(self);与tform1.Create(application);有什么区别
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
nicolas2003
2004-04-20
打赏
举报
回复
tform1.Create(nil);与tform1.Create(self);与tform1.Create(application);有什么区别
Create后面的括号表示这个创建对象的宿主,即这个对象由谁来管理释放,
nil表示不指定它的宿主,它必须要你自己来手动释放(form1.free);
self表示该对象由程序释放,比如:procedure Tform1.SpeedButton1Click(Sender: TObject);这个触发事件里创建的,那么当该SpeedButton1释放的时候该对象也会自动释放。
application同上,它也是由程序来控制的, 当应用程序关闭的时候它就自动释放掉了。
lzy6204
2004-04-20
打赏
举报
回复
studying
dalang81
2004-04-20
打赏
举报
回复
如果是MDI子窗体怎么创建?怎么释放?才是最规范的呢?
try
childForm.show;
except
childForm.Create(application);
end;//这样创建行么?
action:=childForm.close;
childForm:=nil;
//这样释放好么?
ybuck
2004-04-20
打赏
举报
回复
接分~~~呵呵~~~~
cll007
2004-04-20
打赏
举报
回复
TCustomForm.Create(AOwner: TComponent);
一般有AOwner 的 代表所有者,就是负责释放该资源的东东
Form:=TForm1.Create(nil);
如果 是nil,那么就是说由程序员负责释放
其它的Self,application 都是由程序释放,self代表当前类的引用
释放的时间不相同,是self,那么当前self释放的时候,Form会被self先释放
是application ,程序结束时释放Form
如
constructor TCustomForm.Create(AOwner: TComponent);
begin
Form:=TForm1.Create(self); //此时self 就 代表 对TCustomForm类实例的引用
end;
转贴:http://www.delphibbs.com/keylife/iblog_show.asp?xid=2385
KeyLife富翁笔记
作者: majorsoft
标题: destroy, free, freeAndNil, release用法和区别
关键字: 销毁对象,free,release,destory
分类: 开发经验
密级: 公开
(评分: , 回复: 0, 阅读: 196) »»
destroy, free, freeAndNil, release用法和区别
1)destroy:虚方法
释放内存,在Tobject中声明为virtual,通常是在其子类中override 它,且要加上inherited关键字,才能保证派生类对象正确地被销毁;
但destroy一般不能直接用,为什么?
假如当一个对象为nil,我们仍然调用destroy,此时会产生错误。因为destroy是虚方法,它要根据对象中的头四个字节找到虚拟方法表Vmt的入口地址,从而找到destroy的入口地址,所以此时对象一定要存在。但free就是静态方法,它只需根据对象引用/指针的类型来确定,即使对象本身不存在也没问题,而且在free中有判断对象是否存在的操作, 所以用free比用destroy安全。
2)free:静态方法
测试对象是否为nil, 非nil则调用destroy。下面是free的Delphi代码:
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
一静一动,取长补短,岂不妙哉!
但是调用对象的Destroy只是把对象销毁了,但并没有把对象的引用设为nil,这需要程序员来完成,不过自从Delphi5之后,在sysUtils单元中提供了一个freeAndNil。
3)freeAndNil;一般方法,非对象方法,非类方法。
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
建议大家用它代替free/Destroy,以便确保正确地释放对象。
4)release;TcustomForm中定义的静态方法。
当窗口中所有的事件处理完之后,才调用free函数。常用在销毁窗口,而在这个窗口中事件处理需要一定的时间的时候,用这个方法能确保窗口事件处理完之后才销毁窗口。下面是TCustomForm.Release的Delphi源代码:
procedure TCustomForm.Release;
begin
PostMessage(Handle, CM_RELEASE, 0, 0);
//向窗口发CM_RELEASE消息到消息队列,当所有的窗口事件消息处理完之后,
//再调用CM_RELEASE消息处理过程CMRelease
end;
再看看下面CM_RELEASE消息处理过程CMRelease的定义:
procedure CMRelease(var Message: TMessage); message CM_RELEASE;
procedure TCustomForm.CMRelease;
begin
Free; //最后还是free;
end;
wzg1031
2004-04-20
打赏
举报
回复
tform.create(nil)它的属主窗口为空,必须手动释放;
tform.create(self)它的属主窗口为form本生,可以不必手动释放,在form关闭时,自动释放;
tform.create(application)表示form由应用程序创建,因此当应用程序关闭时,form才释放。
web700
2004-04-20
打赏
举报
回复
学习...
johnzhangbit
2004-04-20
打赏
举报
回复
网很慢一下子发太多总出错
不过还要补充一下呵呵
如果用tform1.Create(nil);建立的窗体必须用
Tform1.Free;不然他没有父级控件是不能被自动从内存中删除滴.
tengwei99
2004-04-20
打赏
举报
回复
Release returns immediately to the caller. It does not wait for the form to be freed before returning.
johnzhangbit
2004-04-20
打赏
举报
回复
至于Tform.Free 和Release 的区别你看一下也就明白咯~
procedure TCustomForm.Release;
begin
PostMessage(Handle, CM_RELEASE, 0, 0);
end;
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
sandyboy
2004-04-20
打赏
举报
回复
平时只知道用,一谈到区别还真有点说不清!
看看大家的看法1
UP
johnzhangbit
2004-04-20
打赏
举报
回复
同意2楼说法
Tform1.Create(Application);是由Project->Option里你设置的主窗体作为父级
wangxinqwe
2004-04-20
打赏
举报
回复
不清楚帮你顶一下
SydPink
2004-04-20
打赏
举报
回复
来就送???我来了。.送吧.
Form1.Release;?????我在很不知道..应该是调用了Form1.Free;帮助里应该有.你自己先看看.
tform1.Create(nil);//Tform1自己完成创建工作;
tform1.Create(self);//由当前窗体 负责创建Form1;如果你在Form2中写的代码,那么这个
//self.就是Form2;
tform1.Create(application);// 记不太清..应该就是主窗体的Handle;
workers
2004-04-20
打赏
举报
回复
虽然不怎么会,也来帮你顶一下
Web实时推
送
Demo by SignalR
因近期发现很多关于 Web实时推
送
的
问题
贴,所以写了一个
简单
的 基于 SignalR 的Web实时推
送
Demo.
Web实时推
送
Demo by SignalR ,WebForm
因近期发现很多关于 Web实时推
送
的
问题
贴,所以写了一个
简单
的 基于 SignalR 的Web实时推
送
Demo. 开发工具 VS2010 ASP.NET WebForm SignalR 版本 -Version 1.1.3
技术人员在处理电商快递配
送
中常见的5个常见
问题
和对应解决方案
在现实中会有很多事情导致延迟发货,但零售商解决这些延迟发货
问题
的方式,会对消费者的购物体验带来截然不同的影响,要么好评要么就差评。 幸运的是,这些最常见的发货或配
送
延迟
问题
有
简单
的解决方案。对于跨境...
关于推
送
遇到的一些
问题
今天就
简单
说说我在推
送
消息时遇到的一些
问题
。 1.用推
送
做聊天应用。 推
送
是可以做聊天应用的,但是国内大部分的第三方框架的推
送
都只支持文字推
送
,要想推
送
声音和图片需要付费享用高级推
送
。 解决方法:建议推...
VRP(车辆路径
问题
)的两种
简单
算法
VRP(车辆路径
问题
)的两种
简单
算法VRP
问题
描述:假设在一个供求关系系统中,车辆从货源取货,配
送
到对应的若干配
送
点。车辆存在最大载货量,且配
送
可能有时间限制。需要合理安排取货时间,组织适当的行车路线,使...
Delphi
5,388
社区成员
262,730
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章