动态创建控件的释放的难题(100分)

  • 主题发起人 主题发起人 netsong
  • 开始时间 开始时间
N

netsong

Unregistered / Unconfirmed
GUEST, unregistred user!
我动态创建了一系列tabsheet,当要destroy其中某一个的时候,却不知道怎样用.
我的源程序如下:
for i:=0 to 10 do
with TTabSheet.Create(tabsheet1) do
begin
PageControl:=PageControl1;
Name:='a'+inttostr(i);
Caption:='a'+inttostr(i);
end;
加入说我要destroy a1, 怎么办?我不能用直接用a1.destroy,会编译出错,提示
变量a1未定义;我也不能 var a1: TTabSheet,这样会出错:“abstract error”;
我更不能先 a1:=tabsheet1 , 这样会把刚才动态创建的所有tabsheet都destroy掉。

请高手指点迷津!!!

 
你是没定义a1,你应该用控件数组,先定义a:array[1..10] of TTabsheet;
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls;

type
TForm1 = class(TForm)
PageControl1: TPageControl;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a:array[1..10] of TTabsheet;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var i:byte;
begin
for i:=0 to 10 do
begin
a:=TTabSheet.Create(nil);
with a do
begin
PageControl:=PageControl1;
Name:='a'+inttostr(i);
Caption:='a'+inttostr(i);
end;
end;

end;

procedure TForm1.FormDestroy(Sender: TObject);
var i:byte;
begin
for i:=0 to 10 do a.Destroy;
end;

end.
 
先定义a:array[1..10] of TTabsheet
用free释放
 
//create
for i:=0 to 10 do
with TTabSheet.Create(tabsheet1) do
begin
parent:=form1;
PageControl:=PageControl1;
Name:='a'+inttostr(i);
Caption:='a'+inttostr(i);
end;
//destroy
for j:=form1.componentcount-1 downto 0 do
if ((form1.components[j] is TTabSheet) and
(form1.components[j] as TTabSheet).name=('a'+inttostr(i))) then
form1.components[j].destroy;
 
TTabSheet(TabSheet1.FindComponent('a1')).Free;
顺便问一句: TabSheet1是什么东西? 你在设计期已经在PageControl1上生成的页?
如果是那样, 运行时没事千万别释放它, 要不你动态生成的所有TabSheet都没了.
 
我用Tobjectlist作,应该可以的,可是
在form的public中定义 tabsheetlist: TObjectList;
在formcreate中创建:
procedure TForm1.FormCreate(Sender: TObject);
begin
tablist.Create;
end;
运行出错提示:内存地址存取错误!
可是怎么能错呢?就这么几行程序???

还有一个问题:我的pagecontrol中含有多个动态生成的名字为
'tabsheet'+inttostr(i)的tabsheet控件,每个tabsheet中又生
成一个名字为‘listview‘+inttostr(i)的子控件,我可以通过
pagecontrol.findchildcontrol(tabsheet's name)来得到某一
个tabsheeti,她这个函数返回的是TControl类型,不能再通过
它找属于该tabsheet的listview了,可是我要用它里面的listview,
怎么办?

这种情况只能用TObjectList吗?

 
强制类型转换.

 
问题还没回答完呀!!!
 
procedure TForm1.FormCreate(Sender: TObject);
begin
TabSheetList := TTablist.Create;
end;
 
首先,
tablist.Create;
这一句是错误的,应该写成:
tablist:=TObjectList.Create;

第二个问题,Another_eYes是对的,用强制类型转换:
TheSheet:=TTabSheet(pagecontrol.findchildcontrol(tabsheet's name));
因为你知道找到的对象一定是TabSheet,所以这种转换是安全的。
 
我在空间释放的时候,老是死机???
 
我以前做類似的東西時﹐發現控件在FREE之后仍然不為nil,必須賦為nil才行
 
不知道你是如何释放,可否详细一点?
 
在程序结束mainformdestroy中,用循环关闭所有的动态创建的form,即form.close,
最后释放装载这些form的Tobjectlist,即tobjectlist.free。
(程序都简写了)
 
别在MainFormDestroy里自己去关闭动态创建的form. 此时Delphi已经自动将那些form
释放掉了.
 
先 Form.Close 再 释放里面的 TObjectList ?!!@???@!@
我晕倒!! 应该反过来!
说实在的,根本不用执行 TObjectList.free,Form.Close 会自动释放你动态
Create(AOwner) 产生的所有组件。
 
关于动态创建的控件, 一点小小的提示:
凡是继承自TComponent的控件 (创建时带Owner的--Create(AOwner)), 除非你指定的
Owner是nil(用Create(nil)创建), 否则程序结束时不要(不是<strong>不需要</strong>, 而是<strong>不要</strong>)手动去释放.
 
多人接受答案了。
 
后退
顶部