Delphi 框架Frames的使用

转眼间使用Delphi开发已近2年了,其间有几次想把它学好,但总有一种排斥心理,找各种借口间断了自己的努力,不知不觉间自己差距越来越大,无奈我必须面对现实,从现在起坚持做自己该做的,出来混,迟早要换的,现在就要努力补课,换自己以前的偷懒和惰性。今天第一次听说delphi中的Frames,程序中要复用一个界面,我一开始想用弹出一个模特Frame的方法实现,听一位delphi大牛说可以用Frames实现更好,我顿时傻眼了,也没好意思问Frames为何物,只好自己百度搜索一下。找了几篇文章看了后依旧头晕,于是就按照一篇文章所说尝试了一下:1.在我现有的工程中加入框架Frames:菜单File-》New –》Frames然后命名;2.单击standard选项卡上的Frames拖到我想放置Frames的主窗体panel上,弹出Select frame to insert对话框,选择我刚才新建的Frame。3.发现我原来Frame命名为FrameCount,而新插入的Frame被命名为FramesCount1,我于是在FrameCount上放置几个按钮控件,切换到主窗体上的FrameCount1,居然上面多了同名按钮控件;我直接在FrameCount1上放置几个按钮,FrameCount上没有,我大概明白了框架重用的含义,也逐渐明白了几篇文章,现摘录如下:

那么Frame到底是什么呢?简单来说:

1. Frame是组件容器,类似Panel

2. Frame在使用上类似Components组件,但并没有构造器和解析器,依赖于父容器完成Destroy的工作

3. Frame可以继承和嵌套

4. Frame内部的控件都是公开的,可以在IDE里重置属性和事件,所以frame的内部封装一般都是松散的。访问frame上的组件用frame.control方式

5. Frame的使用范围仅在当前工程内

6. Frame的使用不像一般组件component有独立的功能,很多时候需要和父容器耦合在一起

frame和普通components组件一样,都是为复用设计的。只是frame是Delphi的特技,是一种简化版组件。如果你有一组可视化组件的集合,在多个地方重复出现,就应该考虑使用Frame了。

摘自:http://blog.csdn.net/ppayun/article/details/7570946

Delphi中TFrame组件的使用

从Delphi 5.0开始,Borland 引进了一个新的可视化的容器类TFrame。这个类,我们称之为TFrame框架组件,使程序开发人员能够可视化的设置一组组件,之后系统中对它进行重用。

TFrame框架有两个主要的好处:

第一、框架可大幅减少需要存储在工程中的资源量。

第二、框架允许你可视化的创建能复制和扩展的对象。对可视化窗体继承(VFI), 你可以享受同样的好处。

VFI允许你很简单的创建由继承得来的窗体。VFI的限制是你必须用"全部或全无"的方式来使用窗体。更具体的说,当你用VFI时,你总是创建一个新的窗 体。

TFrame框架也可认为与组件模板(含一个或更多组件并用Component | Create Component Template命令保存到组件 面板的一个组)相似。但是,相似之处仅限于它们都是被可视化设计的(不象传统的完全基于代码的组件设计)。实际上,框架与组件模板的差异是巨大的。正如我 们已学过的,框架是一定义类的实例,当定义类发生改变时框架也将发生变化。与之相比,组件模板是组件的集合。对组件模板的改变不影响以前从这一模板创建的 对象。

创建框架

1> 选择 File | New Application 建立一个新的工程。

2> 选择 File | New Frame 建立一个新的TFrame框架。在这一框架上,添加三个Label和三个DBEdit,还有一个 DBNavigator和一个DataSource。将Label的Caption分别设为ID,First Name和Last Name。将 DBEdit和DBNavigator的DataSource属性设为DataSource1。

3> 将框架的Name属性设为NameFrame。(相比其它对象,起一个有意义的名字对框架来说非常重要)最后,选择File | Save As 保存框 架。在这里,用文件名NAMEFRAM.PAS保存框架。

使用框架

1> 在由上面步骤建立的工程中选择Form1。

2> 加两个GroupBox到窗体上,其中一个在另一个之上。设置第一个的Caption为Customers,第二个的Caption为 Employees。

3> 现在添加框架。选择组件面板的Standard页,点击Frame组件并将其拖到名为Customers的GroupBox中。这时Delphi会显示一 个Select frame to insert对话框。

4> 在对话框中选择NameFrame。现在框架将在名为Customers的GroupBox中显示。重复这一步骤,这一次将框架放在名为 Employees的GroupBox中。你可能要调节框架的尺寸,这跟你最初是如何放置有关。

5> 将两个Table组件放到窗体中,将其DatabaseName属性都设为IBLocal。将Table1的TableName属性设为 CUSTOMER,将Table2的TableName属性设为EMPLOYEE。将两个Table的Active属性都设为True,使它们有效。

6> 下面的步骤将把事情变得有趣。选择名为Customers的GroupBox中的DataSource,将其DataSet属性设为Table1。一般的 你不能直接选择组件中的对象,但是框架是个例外。你可以选择框架中的任何对象,操作它们的属性。然后,选择名名为Customers的GroupBox中 DataSource,其DataSet属性设为Table2。

7> 最后,设置好所有的DBEdits。将名为Customers的 GroupBox中的三个DBEdits的DataField属性分别设为CUST_NO,CONTACT_FIRST和CONTACT_LAST。对 Employees中的,设置DataField属性为EMP_NO,FIRST_NAME和LAST_NAME。

8> 保存工程并运行。

 

框架和继承

1> 在上面建立的工程中,按[Shift][F12]并在窗体列表中选择NameFrame。

2> 将DataSource的AutoEdit属性设为False 。

3> 然后,选择DBNavigator,展开它的VisibleButtons属性,并设置nbInsert,nbDelete,nbEdit,nbPost 和nbCancel标志为False。

4> 现在看一下你的主窗体,注意两个NameFrame的后代都继承了你对框架做的修改。

 

重载包含组件的属性

框架的优点之一(与VFI一样)是你可以改变框架中对象的属性和事件处理函数。这些修改重载了继承的值。说得具体些,随后对初始框架的重载属性的修改将不 改变后代的重载属性的值。

1> 在名为Customers的GroupBox中,选择标题为"ID"的label,在Object Inspector将其Caption属性改为 "Customer No:"。现在选择名为Customers的GroupBox中的标题为"ID"的Label,其Caption属性改为 "Employee ID:"。

2> 按[Shift][F12]并选择NameFrame。将标题为"ID"的Label的Caption属性改为Identifier。

3> 回到主窗体,注意Label的Caption属性没有变为Identifier。它们仍保持它们的重载值。

4> 这一效果是由保存在DFM文件中的信息实现的。

注意所有其属性改变过的在框架中的对象,都出现在DFM文件中的内置部分。但是,这一部分仅列出那些改变的值,所有其它属性值要么按初始框架的值设置(它 们已经存储在框架的DFM文件中),要么按每一组件的默认类定义值。

就象窗体中的对象的事件处理函数是窗体类的公开方法,框架中的对象的事件处理函数也是框架类的公开方法。(代码段实际上并没有说框架的这些方法是公开的, 而是它们在框架声明的默认可见部分被声明,其可见性默认是公开的。)

框架节省资源

在声明窗体中有两个框架。我们已经讨论了TwoButtonFrame框架。第二个框架显示公司标志,名为LogoFrame。

LogoFrame在FramDemo的多个窗体中出现。一种替代使用框架的做法是在每个窗体中设置一个Image对象来显示公司标志。但是,用框架可以 显著减少需要编译到EXE文件中的资源,生成一个较小的可执行文件。

如果把一个TImage放在窗体中,窗体的DFM文件将必须包含整个公司标志的二进制数表示。而且,每一个含有图象的窗体都重复保存这一资源。但用框架 时,资源只定义一次。

简化框架的使用

在一单个、小的工程中,使用组件面板Standard页上的框架组件是相当简单的。但是对更大的、或是要在多个程序中使用同一个框架的情况下,你需要使操 作更简单。幸运的是,Delphi允许你将单个框架放到组件面板,使这些框架不需要另外的步骤而简单的重复使用。框架也可放到对象库 (Object Repository)中,使它可以简单的拷贝。这两个技术都将在下面叙述。

把框架添加到组件面板

把一个框架添加到组件模板,你可以使放置这一框架变得与其它组件一样简单。与之相比,用组件模板的Standard页中的框架组件需要四步,而且限制你仅 能放置在你的工程中已经定义的框架。将一特定框架添加到组件模板中,需要:

1> 保存框架。如果你要在多个程序中使用一个框架,我非常建议你将框架保存到升级Delphi时不会被删除的目录中。例如,建立一个名为 c:\Program Files\Borland\DelphiFrames的目录来保存你的框架。

2> 选择框架并在上面点鼠标右键,选择Add to Palette,Delphi会显示Component Template Information对话 框。

3> 在Component name栏定义框架组件的名称,在Palette page栏填写你想让框架在组件模板内出现的页。如果你已为框架建立了一个 24 x 24象素、16色的图标,点击Change按钮来选择这个BMP文件。当你完成后,点击OK按钮。

从组件模板使用框架

要使用一个已添加到组件面板的框架,在组件面板中选择你保存框架的页,选择框架图标并在你要框架后代出现的窗体上拖出该框架。这个过程仅需这两步。

将框架添加到对象库

把框架添加到对象库,你可以使拷贝该框架到一个新工程的过程变得简单。尤其重要的是对象库提供放置继承的框架到新的工程的能力,它使框架和它的祖先之间的 关系得以保持。要将框架添加到对象库,需要以下步骤:

1> 保存框架。除了保存框架到Delphi的OBJREPOS目录或是共享目录,你还可以使用你保存添加到组件模板中的框架的目录。如果你使用共享库,将框架 保存到共享目录特别好,它允许多个开发者共享框架。

2> 在框架上面点鼠标右键,选择Add To Repository,Delphi会显示Add To Repository对话框。

3> 就像你添加其它模板到Object Repository一样填写Add To Repository对话框。完成后点击OK按钮。

从对象库中使用框架

按照下面步骤来从对象库中使用框架:

1> 选择 File | New.

2> 选择你在Object Repository保存框架模板的页。

3> 选择代表框架的图标,然后选择Inherit单选按钮。

4> 点击OK按钮,添加框架的继承版本到你的工程

如果你选择Copy单选按钮而不是Inherit单选按钮,添加进的框架将是原框架的一个拷贝。当你需要创建一个新的框架,但又不想保持它与原框架的关系 时是很有用的。

 

把需要重复使用的框架添加到组件模板与添加到对象库有不同的效果吗?答案是:"Yes!"。在 大多数情况,你要把你频繁使用的框架添加到组件面板中。这样当你放置框架时,你得到的是框架的一个实例。你然后可以容易的修改这一实例 的属性和事件处理函数,就象本文先前介绍的一样。与之相比,从对象库放置一个框架会产生一个新的类,而不是一个实例。这 个类要么是原来的拷贝要么是原来的继承,取决于你在Object Repository对话框中选择了哪一个单选按钮。如果你要在工程中 使用框架,添加一个框架实例比定义一个框架新类有意义的多。如果是这一目的,将框架保存到组件面板是最好的方法。

有一种情况你要使用对象库:当你需要专门创建一框架层次,并且每一个框架后代引进了附加的对象、方法或事件处理函数。这时,对象库提 供的继承性使创建后代变得简单。定义好需要经常使用框架的后代,可以将它们添加到组件面板以简化它们的使用。

摘自:http://www.itqun.net/content-detail/138582_2.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DELPHI动态创建删除FRAME unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,FM; type TForm2 = class(TForm) Panel1: TPanel; Button2: TButton; ScrollBox1: TScrollBox; procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type TFM = Array Of TFrame1; var Form2: TForm2; aFM: TFM; procedure DeleteArrItem(var arr: TFM ; Index: Integer);stdcall; implementation {$R *.dfm} procedure DeleteArrItem(var arr: TFM ; Index: Integer); var Count: Cardinal; i:integer; begin Count := Length(arr); if (Count = 0) or (Index = Count) then Exit; Move(arr[Index+1], arr[Index], (Count-Index)* SizeOf(arr[0])); SetLength(arr, Count - 1); for I := 0 to Length(arr) - 1 do begin arr[i].Label1.Caption:=inttostr(i); end; end; procedure TForm2.Button2Click(Sender: TObject); var fram:TFrame1; begin SetLength(aFM,length(aFM)+1); aFM[length(aFM)-1] :=TFrame1.Create(nil) ; fram:=aFM[length(aFM)-1]; fram.Label1.Caption:=inttostr(length(aFM)-1); fram.Parent:=ScrollBox1; end; end. unit fm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFrame1 = class(TFrame) GroupBox1: TGroupBox; Label1: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; implementation uses unit2; {$R *.dfm} procedure TFrame1.Button1Click(Sender: TObject); begin DeleteArrItem(aFM,strtoint(label1.Caption)); ( Sender as Tbutton ).Parent.Parent.Destroy; end; end.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值