CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

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

楼主netsong(Edwin)2000-08-30 09:22:00 在 Delphi / VCL组件开发及应用 提问

我动态创建了一系列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

相关问题

  • 关于控制台程序创建ActiveX控件的难题……
  • 关于创建控件组资料释放问题
  • 急!急!!急!!!控件的创建和释放
  • 请问我创建的控件为什么不能释放。
  • 请教:关于动态创建控件的释放问题,谢谢!
  • 有关动态创建控件和释放的问题,请高手指教
  • Rich Edit 控件的创建
  • 动态创建控件
  • evb中创建控件
  • 关于创建控件……

关键词

  • 控件
  • tabsheet
  • ttabsheet
  • tobjectlist
  • controllist
  • pagecontrol
  • 释放
  • inttostr
  • tablist
  • 动态创建

得分解答快速导航

  • 帖主:netsong
  • alin
  • JGTM2000
  • Tine

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo