工程中的主窗体在CLOSE后,是否自动释放自己及其上的对象(事先摆放好的)?如果需要释放应该如何写,写在什么事件中?(100分)

  • 主题发起人 主题发起人 于小澜
  • 开始时间 开始时间
应该用FREE吧!!
 
会自动释放, 不必关心
 
一般不用,但有些控件会有问题,如lmd什么的,个别控件会出错,free一下会好的。
delphi标准控件不用free.
 
不用,系统会自动释放
 
一般情况下会自动释放,除非程序出现错误,因为主窗口作为其它控件的载体,
父窗口不存在,其它对象也没有存在的道理。
如需释放,代码如下:
procedure TMainForm.FormClose(Sender:TObject);
begin
Vcl1.Free;
Vcl2.Free;
...
Close;
end;
 
我想问一下,主窗体和非主窗体是否一样?
因为我这两天正在写一个程序,我原本是认为主窗体和非主窗体
只要CLOSE,其上的标准控件和其自己会自动释放,但我在实际中
并非如此,非主窗体必须CAFREE、NIL,我在调试中感觉非主窗体
光CLOSE,只是隐藏了,并没有释放内存,我想准确的掌握这块
的来龙去脉。

也可以在这个提问中回答:
“工程中的非主窗体(设计时已有,运行时根据需要Create)在CLOSE
后,是否自动释放自己及其上的对象(事先摆放好的)?如果需要释放
应该如何写,写在什么事件中?”
 
1.想法是对的,如果单纯用CLOSE方法关闭窗体,窗体和其上面的的构件依然存在内存中,
之所以看不见是因为隐含调用了HIDE函数,所以当需要重新找到窗体的时候会很快的从内存
中调出来,这特别适合那些需要经常调用的窗体,因为它只需要在内存中CREATE一次!
而对于那些不经常用到的窗体,这样做就很费内存,所以你可以在
Form的close事件中加如下面代码:
action:=caFre;
这样以后调用的close方法时就会将窗体在内存中释放。
2.对窗体中的控件来说,窗体是他们的“父亲”,或说是他们的容器!所以容器没了,里面
的东西也不会有,窗体释放后上面的构件也跟着释放,但是对于那些你动态添加的构件,如
果没有指明他的Parent是你的窗体,那么就要手工的释放掉!其实这个原则就是属于谁的
谁管理,要不怎么能叫面向对象的封装呢?
 
在FORM的CLOSE 事件中写入:
action:=caFree;
 
一般子窗體使用時創建,用完在FORM的CLOSE 事件中写入:
action:=caFree;

 
我用函数检测窗体是否建立,发现CLOSE 关闭窗体,调用函数返回值仍是TRUE
可见并没有释放内存。各位以为呢?
function AlreadyCreate(TFrm1:TCLASS):boolean;
var
i:integer;
begin
Result:=false;
for I := 0 to Screen.FormCount - 1 do
if Screen.Forms IS TFrm1 then
begin
result:=true;
Break;
end;
end;
 
xinyt
问题有意思,我去试试
 
基本释放,(有些不释放,例如:如果你不关闭,打开的文件句柄,打开的本地的表等)
 
调用主窗口的Close,主窗口会Free.但其他窗口则要在OnClose中加上Action=caFree;

to 孔枫: 开学了吧。
 
嘿嘿
VICTORIM,好久不见了。我9号开学
你现在怎么样了。
 
对于这个问题应该这样理解:
1)如果你在创建对象时,用Application或是用你的主窗口为Owner的话,
就会自动被释放的。
2)如果不是的话,呵,自己释放就好了,
一般在OnClose里做(因为如果在OnDestroy里做,而你所释放的恰好又是以Application
为Owner的,那就会报错)


我的OICQ号是6006839
可以到OICQ聊天服务器里的“北京卓越聊天室”里的程序员驿站里找我,
 
Tform1.Create(applicaton);
Tform1.Create(selft);
还有什么创建方法?它们的区别是什么?
 
为什么不看一下 VCL 源码呢?

procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel // 如果是 Modal 窗口,则关闭的默认值为 mrCancel
else
if CloseQuery then // 发 OnCloseQuery 事件
begin
if FormStyle = fsMDIChild then // MDI 子窗口不能关闭,转换成最小化动作
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone // 如果MDI 子窗口不能最小化,则什么事也不做
else
CloseAction := caHide; // 不是 MDI 子窗口,则隐藏之(暂不释放)
DoClose(CloseAction); // 发 OnClose 事件,并得到用户的 Action
if CloseAction <> caNone then
// !!! 如果是应用程序的主窗口,则终止程序(释放所有资源,包括窗口自身)
if Application.MainForm = Self then Application.Terminate
// 否则按照用户返回的 Action 执行相应的动作
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;

源码很清楚地说明了 Close 的流程。 See it ?

From: BaKuBaKu
 
To 于小澜:
>>Tform1.Create(applicaton);
>>Tform1.Create(self);
>>还有什么创建方法?它们的区别是什么?

Create 的参数是控件的 Owner,(注意不是 Parent ),当 Owner 被释放时,
Owner 所拥有的子控件将被自动释放。
上面无非是为 Form1 指定不同的 Owner 罢了。 Ok ?
 
哈哈,博大精深!就光程序来说,CLOSE后会释放的,如果没有别的未被释放的东西
 
后退
顶部