关于动态创建控件的释放的难题
我动态创建了一系列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掉。
请高手指点迷津!!!
问题点数:100、回复次数:20Top
1 楼alin()回复于 2000-08-30 11:34:00 得分 30
//根据TABSHEET.CAPTION来删除,如DestroyTabSheet('a1')
procedure DestroyTabSheet(Const TabSheetCaption:String)
var
I: Integer;
Temp: TComponent;
begin
for I := ComponentCount - 1 downto 0 do //查找所有控件
begin
Temp := Components[I];
if (Temp is TTabSheet) then //如果是TTABSHEET
begin
if (Temp As TTabSheet).Caption :=TabSheetCaption then //是否要删除
Begin
(Temp As TTabSheet).Free;
Exit;
end;
end;
end;
end;Top
2 楼Michaelyfj(星星还是那颗星星)回复于 2000-08-30 19:37:00 得分 0
建立TabSheet数组:
a1 : array[1..10] of TTabSheet;
...Top
3 楼yeah()回复于 2000-08-30 20:51:00 得分 0
用Tag最方便
Top
4 楼hfyun(啥都不懂)回复于 2000-08-30 22:49:00 得分 0
还是用name判断比较好,因为创建时已经有name='a'+inttostr(i)
所以只要判断(temp as Ttabsheet).name='a'+inttostr(i)即可.Top
5 楼JGTM2000(铁马小子)回复于 2000-08-31 01:38:00 得分 55
TTabSheet.Create(tabsheet1) 创建的TTabSheet实例会随着tabsheet1的释放而释放,这就是参数Owner的含义之一。如果比较正规的写法,一般用TObjectList来存储每一个新创建的对象实例,最后通过释放TObjectList来释放所有对象,或者从List中删掉某一项来释放相应对象。
如(示意,未经测试):
objList := TObjectList.Create;
with TTabSheet(TObjectList.Add(TTabSheet.Create(nil))) do
begin
...
end;
objList.Delete(0);
...
objList.FreeAndNil;
...Top
6 楼netsong(Edwin)回复于 2000-08-31 10:07:00 得分 0
JGTM2000兄说的好,我也想到了,但是当我在formcreate中创建Tobjectlist时,总是提示出错?我是这样写的:
在form的public中定义 tabsheetlist: TObjectList;
在formcreate中创建:
procedure TForm1.FormCreate(Sender: TObject);
begin
tablist.Create;
end;
运行出错提示:内存地址存取错误!
可是怎么能错呢?就这么几行程序???
Top
7 楼netsong(Edwin)回复于 2000-08-31 10:11:00 得分 0
sorry: 我定义的是 tablist: Tobjectlist; 打错了:)
但是出错!
Top
8 楼netsong(Edwin)回复于 2000-08-31 10:21:00 得分 0
还有一个问题:我的pagecontrol中含有多个动态生成的名字为'tabsheet'+inttostr(i)的tabsheet控件,每个tabsheet中又生成一个名字为‘listview‘+inttostr(i)的子控件,我可以通过pagecontrol.findchildcontrol(tabsheet's name)来得到某一个tabsheeti,她这个函数返回的是TControl类型,不能再通过它找属于该tabsheet的listview了,可是我要用它里面的listview, 怎么办?Top
9 楼netsong(Edwin)回复于 2000-08-31 10:22:00 得分 0
这种情况只能用TObjectList吗?Top
10 楼Tine(唐斩)回复于 2000-08-31 12:06:00 得分 15
1、定义ControlList:TList;
2、在窗体creat事件中:
procedure TForm1.FormCreate(Sender: TObject);
begin
ControlList:=TList.Create;
end;
3、在你的代码中加入:
for i:=0 to 10 do
begin
with TTabSheet.Create(tabsheet1) do
begin
PageControl:=PageControl1;
Name:='a'+inttostr(i);
Caption:='a'+inttostr(i);
end;
ControlList.Add(tabsheet1);
end;//end for
4、在FORMDESTROY事件中释放动态生成的控件资源
procedure TForm1.FormDestroy(Sender: TObject);
var i:Integer;
begin
for i := 1 to ControlList.Count -1 do
TQRLabel(ColTitleList.Items[i]).free;
ColTitleList.free;
for i := 1 to ColDetailList.Count -1 do
TTabSheet(ControlList.Items[i]).free;
ControlList.free;
end;
我用以上代码在动态创建控件中使用没有问题。呵呵。。。给分吧^o^,没有功劳也有苦劳吧
Top
11 楼sinsky(十方)回复于 2000-08-31 14:30:00 得分 0
我不要分,我只想看看还有什么办法。谢谢。Top
12 楼alin()回复于 2000-08-31 14:44:00 得分 0
根据控件名(你也可用其它)返回你要的控件,你想对它怎么操作都可以
操作:
Var
bb:TButton;
begin
bb :=GetMyButton('Button2');
if bb <> nil then
bb.Free;
end;
function TForm1.GetMyButton(Const CompName:String):TButton;
var
I: Integer;
Temp: TComponent;
begin
Result :=nil;
for I := ComponentCount - 1 downto 0 do //查找所有控件
begin
Temp := Components[I];
if (Temp is TButton) then //是否Button,你可用TabSheet,ListView等
begin
if (Temp As TButton).Name =CompName then //控件名称比较,你可以用Caption.Tag等
Begin
Result :=(Temp as TButton);
Exit;
end;
end;
end;
end;
Top
13 楼JGTM2000(铁马小子)回复于 2000-08-31 16:31:00 得分 0
呵呵,一定是你的笔误了。。。
procedure TForm1.FormCreate(Sender: TObject);
begin
tablist.Create; //!! tablist:=TObjectList.Create;
end;Top
14 楼netsong(Edwin)回复于 2000-08-31 17:08:00 得分 0
我试了,可是tobjectlist.items[i]得到的是tobject型,而不是ttabsheet?Top
15 楼JGTM2000(铁马小子)回复于 2000-08-31 17:26:00 得分 0
在确知实际存储的对象实例的类时,可以用强制类型转换将最底层的(因此兼容所有类)TObject转换成更高的对象类,即TTabSheet(objList.Items[i]),这就是面向对象的多态在实际中的应用之一。Top
16 楼JGTM2000(铁马小子)回复于 2000-08-31 17:30:00 得分 0
同理,TTabSheet(PageControl.FindChildControl(tabsheet's name))。。。Top
17 楼linlin(林霖)回复于 2000-08-31 18:27:00 得分 0
可以定义一个TObject的指针数组来存放生成的控件。然后用该指针数组来对控件进行操作。Top
18 楼alin()回复于 2000-09-01 09:31:00 得分 0
还没解决问题吗?Top
19 楼zcw(惊风)回复于 2000-09-01 15:57:00 得分 0
你用过FindComponent么,试一试,给你一个惊喜。Top
20 楼zcw(惊风)回复于 2000-09-01 15:59:00 得分 0
看看FindComponent的帮助。Top




