窗体内存释放的问题

woshixiaoxin 2002-07-10 11:22:50
主窗口调用的时候
procedure TMainFrm.N31Click(Sender: TObject);
begin
if ClientFrm = nil then
ClientFrm:=TClientInputFrm.Create(self);
ClientFrm.ShowModal;
end;

释放的时候
procedure TClientFrm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action:=caFree;
clientFrm:=nil;
end;

为什么在我测试使用内存的时候,窗口关闭只释放 反而不如不是动态生成的。
类别 开始内存 打开窗口最大内存 关闭窗口之后的内存
使用动态 6796K 7180K 7164K
不用动态 7256K 7332K 7268K

...全文
66 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
萝卜-Robbie 2002-07-11
  • 打赏
  • 举报
回复
其实Action:=caFree就可以释放窗口内存的,只是Delphi好像不会立即释放,它会等到所有对这个窗口的引用全部结束以后才释放。
oracle_lover 2002-07-11
  • 打赏
  • 举报
回复
在你想关闭并释放内存的窗体的onclose事件中加入
Action:=caFree;

参数:caNone,窗口不允许被关闭,点了右上角的X也没有任何事情发生
caHide,窗口没有关闭,而是隐藏,程序可以继续访问该窗口
caFree,窗口被关闭,占用的内存被释放
caMinimize,窗口被最小化,而不是被关闭,是MDI子窗口的默认Action

除了MDI子窗体外,一般的窗体调用close方法时都真正被关掉了。如果你不放心,就加上Action:=caFree;吧。
s_cube 2002-07-11
  • 打赏
  • 举报
回复
ShowModal的窗体可以这样写

procedure TMainFrm.N31Click(Sender: TObject);
begin
if ClientFrm = nil then
ClientFrm:=TClientInputFrm.Create(self);
ClientFrm.ShowModal;
ClientFrm.free;
end;

执行到ShowModal时 进入onshow事件
窗体关闭后回来 继续执行ClientFrm.free
s_cube 2002-07-11
  • 打赏
  • 举报
回复
ShowModal的窗体可以这样写

procedure TMainFrm.N31Click(Sender: TObject);
begin
if ClientFrm = nil then
ClientFrm:=TClientInputFrm.Create(self);
ClientFrm.ShowModal;
ClientFrm.free;
end;


yansea 2002-07-11
  • 打赏
  • 举报
回复
if ClientFrm = nil then begin
ClientFrm:=TClientInputFrm.Create(self);
ClientFrm.ShowModal;
ClientFrm.free;
ClientFrm ;= nil;
end;
woshixiaoxin 2002-07-11
  • 打赏
  • 举报
回复
请问楼上:

action:=cafree难道没有释放窗体吗?

clientfrm.free应该写在那儿?
Typhone 2002-07-10
  • 打赏
  • 举报
回复
你并没释放窗口。
Delphi里面的类的变量其实是指向类的实例的指针。
clientFrm:=nil 只是将指针置空,并没有将指针所指的空间释放出来。
需要 clientFrm.Free 才行(但是不能写在OnClose里)
byrrj 2002-07-10
  • 打赏
  • 举报
回复
DELPHI的close不是释放窗体的,只是相当于HIDE,
窗体并不真正释放

5,392

社区成员

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

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