关于动态创建控件的释放的难题

netsong 2000-08-30 09:22:00
我动态创建了一系列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掉。

请高手指点迷津!!!

...全文
615 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
alin 2000-09-01
  • 打赏
  • 举报
回复
还没解决问题吗?
zcw 2000-09-01
  • 打赏
  • 举报
回复
看看FindComponent的帮助。
zcw 2000-09-01
  • 打赏
  • 举报
回复
你用过FindComponent么,试一试,给你一个惊喜。
Tine 2000-08-31
  • 打赏
  • 举报
回复
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^,没有功劳也有苦劳吧
netsong 2000-08-31
  • 打赏
  • 举报
回复
这种情况只能用TObjectList吗?
netsong 2000-08-31
  • 打赏
  • 举报
回复
还有一个问题:我的pagecontrol中含有多个动态生成的名字为'tabsheet'+inttostr(i)的tabsheet控件,每个tabsheet中又生成一个名字为‘listview‘+inttostr(i)的子控件,我可以通过pagecontrol.findchildcontrol(tabsheet's name)来得到某一个tabsheeti,她这个函数返回的是TControl类型,不能再通过它找属于该tabsheet的listview了,可是我要用它里面的listview, 怎么办?
netsong 2000-08-31
  • 打赏
  • 举报
回复
sorry: 我定义的是 tablist: Tobjectlist; 打错了:)
但是出错!

netsong 2000-08-31
  • 打赏
  • 举报
回复
JGTM2000兄说的好,我也想到了,但是当我在formcreate中创建Tobjectlist时,总是提示出错?我是这样写的:
在form的public中定义 tabsheetlist: TObjectList;
在formcreate中创建:
procedure TForm1.FormCreate(Sender: TObject);
begin
tablist.Create;
end;
运行出错提示:内存地址存取错误!
可是怎么能错呢?就这么几行程序???
linlin 2000-08-31
  • 打赏
  • 举报
回复
可以定义一个TObject的指针数组来存放生成的控件。然后用该指针数组来对控件进行操作。
JGTM2000 2000-08-31
  • 打赏
  • 举报
回复
同理,TTabSheet(PageControl.FindChildControl(tabsheet's name))。。。
JGTM2000 2000-08-31
  • 打赏
  • 举报
回复
在确知实际存储的对象实例的类时,可以用强制类型转换将最底层的(因此兼容所有类)TObject转换成更高的对象类,即TTabSheet(objList.Items[i]),这就是面向对象的多态在实际中的应用之一。
netsong 2000-08-31
  • 打赏
  • 举报
回复
我试了,可是tobjectlist.items[i]得到的是tobject型,而不是ttabsheet?
JGTM2000 2000-08-31
  • 打赏
  • 举报
回复
呵呵,一定是你的笔误了。。。

procedure TForm1.FormCreate(Sender: TObject);
begin
tablist.Create; //!! tablist:=TObjectList.Create;
end;
alin 2000-08-31
  • 打赏
  • 举报
回复
根据控件名(你也可用其它)返回你要的控件,你想对它怎么操作都可以
操作:
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;
sinsky 2000-08-31
  • 打赏
  • 举报
回复
我不要分,我只想看看还有什么办法。谢谢。
JGTM2000 2000-08-31
  • 打赏
  • 举报
回复
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;
...
alin 2000-08-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;
hfyun 2000-08-30
  • 打赏
  • 举报
回复
还是用name判断比较好,因为创建时已经有name='a'+inttostr(i)
所以只要判断(temp as Ttabsheet).name='a'+inttostr(i)即可.
yeah 2000-08-30
  • 打赏
  • 举报
回复
用Tag最方便
Michaelyfj 2000-08-30
  • 打赏
  • 举报
回复
建立TabSheet数组:
a1 : array[1..10] of TTabSheet;
...

5,388

社区成员

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

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