200分!!求解系统资源为何没有释放?(200分)

  • 主题发起人 主题发起人 qqzzhh
  • 开始时间 开始时间
Q

qqzzhh

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个程序,当我点击菜单打开一个窗体,进行一些操作后,关闭窗体,然而系统资
并没有释放,当打开多个窗体后就不能打开任何窗体了,只有当主窗体关闭后系统资源才
释放出来。
 
窗体在执行Close来关闭时,如果它是子窗体,实际上只等于将其隐藏,只有当该窗体是
主窗(程序的第一个创建的窗体或是唯一的窗体)时才会将其销毁并释放。
要想子窗被释放,应在其OnClose事件中执行Free,关键看你是怎样创建并打开的子窗,
如果是在创建后再打开的,才应该手动地Free之,而如果你的子窗是在项目文件*.dpr
里就定义了创建的,就不应手动地将其Free。
建议:在项目文件*.dpr中把创建子窗的语句删除,而只保留创建主窗的语句
Application.Initialize;
Application.CreateForm(TForm1, Form1); //假设Form1是主窗
Applicatoin.CreateForm(TForm2, Form2); //假设Form2是子窗,把这一行删除
Application.Run;
然后在你的菜单命令里加入:
begin
Form2 := TForm2.Create(Form1);
try
Form2.ShowModal; //以模态方式打开
finally
FreeAndNil(Form2);
//在关闭窗体时释放窗体,在此情况下就不要在Form2的OnClose事件上加入Free了。
end;
end;
 
当按下子窗的X,缺省的处理方式是Hide。
尝试在FormClose中把Action设置为caFree
 
同意JohnsonGuo
F1一下FormClose
 
JohnsonGuo的应该是对的!
就应该用cafree,或者destroy直接释放!
 
当按下子窗的X,缺省的处理方式是Hide。
但如果说是主窗口而没有做什么处理就会关闭程序对吧
 
比较安全的做法是:
显示:
if not Assigned(FormXX) then
生成FormXX
FormXX.Show;
释放:
FormXXClose()
begin
Action:=caFree;
end;

FormXXDestory()
begin
FormXX:=nil;
end;
 
释放窗体好像不能用 Destroy 吧。
如果在窗体本身代码内释放自身,应该用 Self.Release,或者在 OnDestroy 中写 Action := caFree;
如果在外部释放一个窗体,应该用 Form1.Free 这样的形式。
在窗体本身代码内千万不要使用 Self.Free !!!
 
多人接受答案了。
 

Similar threads

后退
顶部