form1.Release;与form1.free;有什么区别啊
tform1.Create(nil);与tform1.Create(self);与tform1.Create(application);有什么区别
tform1.Create(nil);与tform1.Create(self);与tform1.Create(application);有什么区别
解决方案 »
- 急!在线等!动态调用DLL中的疑问!
- 如何改变DBGridEh按输入的顺序排序!
- 在delphi的单步调试过程中碰到这样一个怪问题?
- 关于保存数据到数据库中的问题!
- 怎样读取数库中的图片另存为BMP文件? 在线等待.............
- 请问怎么动态的获取对方的ip地址值?
- 我想要这样的工作环境,不知有没有
- 简单的学了下Delphi,深入的看不明,现在打开Delphi就发呆,不知应该怎么学..
- 请问下面的代码中的MergeChangeLog方法有什么用啊?
- IP地址输入框是怎么做的?
- 请教高手在多层结构下客房端如何连接到服务端的多个SOAP SERVER DATA MODULE。急需使用。
- 怎样在SQLSERVER里的IMAGE字段的问题?50分 急
Form1.Release;?????我在很不知道..应该是调用了Form1.Free;帮助里应该有.你自己先看看.
tform1.Create(nil);//Tform1自己完成创建工作;
tform1.Create(self);//由当前窗体 负责创建Form1;如果你在Form2中写的代码,那么这个
//self.就是Form2;
tform1.Create(application);// 记不太清..应该就是主窗体的Handle;
Tform1.Create(Application);是由Project->Option里你设置的主窗体作为父级
procedure TCustomForm.Release;
begin
PostMessage(Handle, CM_RELEASE, 0, 0);
end;procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
不过还要补充一下呵呵
如果用tform1.Create(nil);建立的窗体必须用
Tform1.Free;不然他没有父级控件是不能被自动从内存中删除滴.
tform.create(self)它的属主窗口为form本生,可以不必手动释放,在form关闭时,自动释放;
tform.create(application)表示form由应用程序创建,因此当应用程序关闭时,form才释放。
一般有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;
try
childForm.show;
except
childForm.Create(application);
end;//这样创建行么?action:=childForm.close;
childForm:=nil;
//这样释放好么?
Create后面的括号表示这个创建对象的宿主,即这个对象由谁来管理释放,
nil表示不指定它的宿主,它必须要你自己来手动释放(form1.free);
self表示该对象由程序释放,比如:procedure Tform1.SpeedButton1Click(Sender: TObject);这个触发事件里创建的,那么当该SpeedButton1释放的时候该对象也会自动释放。
application同上,它也是由程序来控制的, 当应用程序关闭的时候它就自动释放掉了。