CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  非技术区

动态添加Frame请教,有代码。

楼主lizhennehzil(悠闲的白云)2004-12-03 10:56:52 在 Delphi / 非技术区 提问

小弟现在要做一个很复杂的系统,想来想去,只能用Frame去作,现在为了学习Frame,做了一个非常简单的测试,左边是导航栏,上面有两个按钮,右边放了一个Pannel2,然后建了两个Frame,分别是FrameFirst和FrameSecond,  
  代码如下  
  procedure   Tfrmmain.Button1Click(Sender:   TObject);  
  var  
      Fra1:tframefirst;  
  begin  
      fra1:=tframefirst.Create(nil);  
      fra1.Parent:=self.Panel2;  
  end;  
   
  procedure   Tfrmmain.Button2Click(Sender:   TObject);  
  var  
      fra2:tframesecond;  
  begin  
      fra2:=tframesecond.Create(nil);  
      fra2.Parent:=self.Panel2;  
  end;  
  非常简单,功能也实现了,点击Button1出现第一个,点击Button2出现第二个,我现在想问的是,生成的那些我应当如何去释放,有没有更好的方法.因为真正到了程序,可能会有上百个Frame,有没有更好的方法.再分别点击不同的按钮时,显示不同的Frame,命名没有规则的. 问题点数:40、回复次数:6Top

1 楼ddqqyy(ddqqyy)回复于 2004-12-03 12:36:18 得分 0

不用多操心,在动态生成frame的时候,指定该frame的Owner就可以了,即:  
      fra2:=tframesecond.Create(Self);  
  TfrmMain撤消的时候,自然会先释放这些子frame,这也就是VCL构架的优点之一。  
   
  如果你想动态生成,再动态撤消,那你当然要组织好你动态生成的对象,想撤消的时候,free一下该对象就完事了。Top

2 楼lizhennehzil(悠闲的白云)回复于 2004-12-03 12:40:03 得分 0

我担心的是  
  如果几百个Frame都添加进去,会不会造成内存之类的不够用阿  
  因为每个Frame上面都挺复杂的Top

3 楼KAPOK_CSDN(上善若水,厚德载福)回复于 2004-12-03 13:24:50 得分 0

try...finally...  
  procedure   Tfrmmain.Button1Click(Sender:   TObject);  
  begin  
      with   tframefirst.Create(nil)   do  
      try  
          Parent:=self.Panel2;  
          {Other   Code   here}  
      finally  
          Free;  
      end;  
  end;  
   
  procedure   Tfrmmain.Button2Click(Sender:   TObject);  
  begin  
      with   tframesecond.Create(nil)   do  
      try  
          Parent:=self.Panel2;  
          {Other   Code   here}  
      finally  
          Free;  
      end;  
  end;  
  Top

4 楼ddqqyy(ddqqyy)回复于 2004-12-03 13:51:58 得分 10

建议定义一个基类,其他Frame都从该基类派生。在基类中定义公共的虚拟方法,如CloseFrame,所有子类可以根据情况重载该CloseFrame。  
   
  虽然有几百个frame,但同一时间只会有一个frame对用户是可见的吧?这样在动态生成新Frame时,先调用先前活动frame的CloseFrame方法。引用该Frame的对象,应该是一个声明为对基类对象的引用,这样在撤消时,会正确调用子类的CloseFrame方法,而不用关心子类对象具体的对象名。  
   
   
  看一看类的多态性概念,会给你带来启发的。Top

5 楼KAPOK_CSDN(上善若水,厚德载福)回复于 2004-12-03 14:11:47 得分 30

不好意思,刚才代码丢脸了。  
  没有注意Frame的问题。  
  下面的代码是实际做的,道歉了:  
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls,   ExtCtrls;  
   
  type  
      TMyFrame   =   class   of   TFrame;  
       
      TForm1   =   class(TForm)  
          Button1:   TButton;  
          Button2:   TButton;  
          Panel1:   TPanel;  
          procedure   FormCreate(Sender:   TObject);  
          procedure   Button1Click(Sender:   TObject);  
          procedure   Button2Click(Sender:   TObject);  
      private  
          FCurrentfrmClass:   String;  
          Ffrm:   TFrame;  
          procedure   LoadFrameByClassName(FrameClassName:   TMyFrame);  
          {   Private   declarations   }  
      public  
           
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  uses   Unit2,   Unit3;  
   
   
  {$R   *.dfm}  
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      FCurrentfrmClass   :=   '';  
  end;  
   
  procedure   TForm1.LoadFrameByClassName(FrameClassName:   TMyFrame);  
  begin  
      if   Assigned(Ffrm)   and   (not   SameText(FrameClassName.ClassName,   FCurrentfrmClass))   then  
          FreeAndNil(Ffrm);  
   
      Ffrm   :=   FrameClassName.Create(nil);  
      Ffrm.Parent   :=   Panel1;  
      FCurrentfrmClass   :=   FrameClassName.ClassName;  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      LoadFrameByClassName(TFrame2);  
  end;  
   
  procedure   TForm1.Button2Click(Sender:   TObject);  
  begin  
      LoadFrameByClassName(TFrame3);  
  end;  
   
  end.  
  Top

6 楼KAPOK_CSDN(上善若水,厚德载福)回复于 2004-12-03 14:12:32 得分 0

Unit2,Unit3是两个Frame的单元;Top

相关问题

  • 在VB中如何实现动态添加执行代码?
  • 如何用代码动态添加控件,并设定位置??
  • 怎样在代码中动态添加progressbar
  • DataGrid如何用代码动态添加itemplatecolumn列
  • 怎样为动态创建的控件添加代码?
  • 如何通过代码给grid控件动态添加列?
  • 怎样在代码里面动态添加image ?
  • 可以动态添加frame的吗?
  • 谁有动态添加连接oracle数据库的odbc的代码??
  • 动态添加菜单项问题,求C#示例代码,50分

关键词

  • 代码
  • fra
  • frame
  • closeframe
  • ffrm
  • frameclassname
  • tframesecond
  • tfrmmain
  • fcurrentfrmclass
  • tframefirst

得分解答快速导航

  • 帖主:lizhennehzil
  • ddqqyy
  • KAPOK_CSDN

相关链接

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

广告也精彩

反馈

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