简单问题,来就送了

chenliang2001 2004-04-20 02:56:33
form1.Release;与form1.free;有什么区别啊
tform1.Create(nil);与tform1.Create(self);与tform1.Create(application);有什么区别
...全文
50 15 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
虽然不怎么会,也来帮你顶一下

5,388

社区成员

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

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