下面的代码在我的程序退出是,我是否要作清理工作?

xthmpro_cn 2003-08-27 01:33:54
procedure TForm_MainForm.ToolButton6Click(Sender: TObject);
var TabSheet: TTabSheet;
WebBrowser: TWebBrowser;
begin
TabSheet:=TTabSheet.Create(Self);
TabSheet.Caption:='New';
TabSheet.PageControl:=PageControl1;

WebBrowser:=TWebBrowser.Create(Self);
TabSheet.InsertControl(WebBrowser);
//WebBrowser.Parent:=TabSheet;
WebBrowser.Align:=alClient;
WebBrowser.Navigate('http://www.csdn.net');
end;

上面的过程,运行时正常,我的程序在退出时,是否需要Free我动态建立的控件?
...全文
59 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xthmpro_cn 2003-11-17
  • 打赏
  • 举报
回复
这个问题很长时间了,现在我已经有了确认的方法了.
结论是,退出时不需要释放,但是,没有Parent的类需要自己释放.
验证方法是:
首先建立一个PageControl1,然后建立TabSheet,在建立的TabSheet上加入一个控件Acontrol.
在PageControl1的onchange事件中加入:
Acontrol.parent:=PageControl1.activePage;
然后在加入一个按钮button1:
TabSheet:=TTabSheet.Create(Self);
TabSheet.Caption:='New';
TabSheet.PageControl:=PageControl1;
再加入一个按钮button1:
PageControl1.activePage.free;
程序运行时,你新建几页,在free掉当前页后,当你再进入新的页的时候你就会发现:Acontrol is nil
风往南吹123 2003-09-07
  • 打赏
  • 举报
回复
验证方法如下:
建立两个窗口和一个共巷单元。
在共享单元中声明一个窗口类控件,我声明了一个TEdit;
然后让第一个窗口来创建第二个窗口,第二个窗口为模式窗口,
在第二个窗口的Create事件中创建TEdit,然后由第一个窗口释放
第二个窗口,不写释放TEdit代码,释放完第二个窗口后,在第一个窗口中
ShowMessage(Edit.text)
出现地址冲突,表明TEdit已经被第二个窗口释放,不用写释放语句。
大地精灵 2003-09-07
  • 打赏
  • 举报
回复
这是一个很明显的,Owner都free掉了,它里面包含的自然都会Free,而且这些工作是由DELPHI完成的


楼主的名字太日本化了吧
jmjunta 2003-08-28
  • 打赏
  • 举报
回复
同意pressman的意见
xthmpro_cn 2003-08-28
  • 打赏
  • 举报
回复
to pressman(还穿三角裤):
你的意见还是可以接受的,但是,我动态建立的是窗口型控件,只有在用户关闭,或者程序退出时才需要释放.如果,我要建立一个类的临时的实列,我当然会采用用完就释放的方法.
to netatomy(Eyes On Me):
我怎样才能验证你的说法?
xthmpro_cn 2003-08-28
  • 打赏
  • 举报
回复
我上面的释放代码有问题,更改如下,各位自己看!
procedure TForm_MainForm.FormClose(Sender: TObject;
var Action: TCloseAction);
var TabSheet: TTabSheet;
WebBrowser: TWebBrowser;
begin
While PageControl1.PageCount <> 0 do
begin
TabSheet:=PageControl1.Pages[0];
WebBrowser:=TabSheet.Controls[0] as TWebBrowser;

TabSheet.RemoveControl(TabSheet.Controls[0]);
TabSheet.PageControl:=nil;

WebBrowser.Free;
TabSheet.Free;
end
end;
xthmpro_cn 2003-08-28
  • 打赏
  • 举报
回复
现在比较有趣了!我两种相左的意见都得到了大家的支持!
请同意 netatomy(Eyes On Me) 的高手给个验证的方法!
谢谢!
如果netatomy(Eyes On Me)正确我再开贴加100分!
bxh2dai 2003-08-27
  • 打赏
  • 举报
回复
同意 netatomy(Eyes On Me) 说的
zqc-tutorial 2003-08-27
  • 打赏
  • 举报
回复
不用了,控件会由它的Owner释放的。
pressman 2003-08-27
  • 打赏
  • 举报
回复
建议不要这样去FREE。
要养成每CREATE一个类,在用完后就FREE它
这样比较清晰些,而且效率会好一些!
xthmpro_cn 2003-08-27
  • 打赏
  • 举报
回复
一下是我建立的清理代码,请问各位是否有问题?
procedure TForm_MainForm.FormClose(Sender: TObject;
var Action: TCloseAction);
var i: Integer;
TabSheet: TTabSheet;
WebBrowser: TWebBrowser;
begin
for i:= 0 to PageControl1.PageCount -1 do
begin
TabSheet:=PageControl1.Pages[i];
WebBrowser:=TabSheet.Controls[0] as TWebBrowser;

TabSheet.RemoveControl(TabSheet.Controls[0]);
TabSheet.PageControl:=nil;

WebBrowser.Free;
TabSheet.Free;
end
end;

5,388

社区成员

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

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