当前位置:首页 > 工作总结 > [Delphi模拟实现控件数组分析]子类化实现控件数组
 

[Delphi模拟实现控件数组分析]子类化实现控件数组

发布时间:2019-02-21 04:43:59 影响了:

  摘要:利用窗体的Components[I],ComponentCount;ComponentIndex三个属性模拟实现控件的数组化。   关键词:Delphi 控件数组 Components[I]
  中图分类号:TP311.52 文献标识码:A 文章编号:1007-9416(2012)01-0103-02
  
  1、引言
  控件数组为使用共享公共功能的控件组提供了一种方便的方式。例如,控件组可以用来显示相关数据,或者在单击时提供相关的操作。控件数组处理多个控件统一事件上很方便此功能使得创建一个能够响应由多个不同控件引发的事件的处理程序方法成为可能。使用控件数组可开发出一些小型游戏。控件数组的灵活使用能够大大提高编程人员的编程效率。Delphi未提供专门的控件数组,本文主要讨论的是如何在Delphi中模拟实现控件数组。
  2、控件数组原理
  标准的控件数组是由一组相同类型的控件组成。它们共用一个控件名,具有相同的属性,执行相似的操作,同时共享同样的事件过程。为区分控件数组中的各个元素,具有此功能的程序设计语言通常会把各元素的下标值传送给过程,过程从接收到的下标来区分不同的元素。
  3、Delphi中控件数组的模拟实现
  3.1 Delphi模拟控件数组原理分析
  VB是具有的灵活的控件数组功能的典型程序设计语言,但在DELPHI中却未专门提供控件数组,在很多DELPHI的教材中都提到一个方法:TLISTSTRING;使TLISTSTRING类控制容器中的控件以达到使用控件数组的目的;另外一种途径是由用户自己来开发带数组性质的VCL组件。这两种方法对DELPHI的是初级入门者是不现实的。使用TLISTSTRING类代码量大,难以阅读,使用时非常吃力;由用户自己制作组件这又不是DELPHI初级使用者所能完成的工作。在Delphi中,各控件排列的先后顺序和它被拖放到窗体上的先后顺序相同。这个顺序是可以人为修改的,通过修改这个顺序,能够实现控件的数组化。
  3.2 Delphi模拟控件数组模拟实现方案
  使用Delphi窗体的Components[I],ComponentCount;ComponentIndex三个属性模拟控件的数组化。各属性相关含义如下:
  Components[I]属性 表示当前窗体上所有属于TCompo nent类的对象形成的数组ComponentCount属性表示当前窗体上所有属于TComponent类的对象的个数ComponentIndex属性 表示当前窗体上属于TComponent类的某个对象在Components[I]数组中的下标
  将窗体上所有Button组件的Caption属性设为Tbutton,代码如下:
  Var I:integer;
  for I:=0 to componentCount-1 do‘利用for循环判断某对象是否属于Tbutton类
  if(components[I] is Tbutton) then
  (components[I] as Tbutton).Caption:="TButton";
  分析:For循环用于遍历当前窗体上所有属于TComponent类的对象;if语句用于判断某个对象是否属于Tbutton类;如果条件成立,则将该对象的Caption属性修改为"TButton"。通过上述分析,不难发现,这种方法有一定局限性,最明显的是设计人员并不知道Components[I]到底代表哪一个控件,因此只能用遍历的方法进行筛选,这不仅影响了程序执行的效率,也带来编程上的繁琐问题。
  要解决上述问题,就要用到TComponent类的ComponentIndex属性。在delphi 7.0中,ComponentIndex属性表示当前窗体上属于TComponent类 的某个对象在Components[I]数组中的下标并且该属性是一个可读写属性;该属性的默认值是该组件的添加次序(从0开始计数),那么就可以利用这一属性在组件生成时将同类组件的ComponentIndex属性设置为连续的自然数数列;比如:n,n+1,n+2,……,n+m;如果我们要修改窗体上的该类组件,只需要遍历Components[I]数组的部分下标(比如Components[n]……Components[n+m])就可以实现。从而提高程序执行效率,同时也避免了编程上的繁琐问题。
  实现方案如下:
  例如:在窗体上添加若干个组件各组件布置如下图所示:
  
  现修改四个Edit组件的Color属性为clRed、Enabled属性为False、字体设为宋体。最简单的方法是逐句编写代码:
  Edit1.Enabled:=False ‘将Edit1及Edit2均设置为不可操作
  Edit2.Enabled:=False;
  … …
  Edit1.Color:=clRed;‘将Edit1及Edit2的前景色均设置为红色
  Edit2.Color:=clRed;
  … …
  Edit1.Font.name:=‘宋体’;‘将Edit1及Edit2的文本框字体均设置为‘宋体’
  Edit2.Font.name:=‘宋体’;
  … …
  但如果Tedit组件数量很多并且要修改它的多个属性,代码就变得很冗长。于是采用循环来实现。
  实现方法如下:
  第一步、要使所有要操作的Tedit组件的ComponentIndex属性的值有序并连续。实现方法有两种:
  方法一、窗体上各组件ComponentIndex属性值与它被拖放到窗体上的先后顺序相同。一次把所有需要的TEdit组件依次加入窗体,这样就可以实现所有Tedit组件的ComponentIndex属性的值有序并连续;然后测试出最先加入窗体的TEdit组件的Componen tIndex属性值。最后要说明的是:此后该窗体任何组件的Componen tIndex属性值不能用代码修改。
  方法二、在窗体生成时通过代码修改所有Tedit组件的Comp onentIndex属性的值有序并连续。代码如下:
  edit1.ComponentIndex:=2;‘设置各Edit控件的Compo nentIndex属性并使其连续
  edit2.ComponentIndex :=3;
  edit3.ComponentIndex :=4;
  edit4.ComponentIndex :=5;
  第二步、利用要操作组件ComponentIndex属性的有序性和连续性编写循环程序用于实现窗体上所有TEdit组件的属性修改。程序代码如下:
  var I:integer;
  for I:=2 to 5 do
  begin
  (components[I] as TEdit).enabled:=false;‘利用ComponentIndex属性对所有属于Tedit类的控件的属性集体赋值
  (components[I] as TEdit).color:=clred;
  (components[I] as TEdit).font.Name:="宋体";
  end ;
  实例中窗体上共有12个TComponent类组件,即Components[I]数组共有12个Tcomponent类元素(I的取值为0到11),通过我们上面第一步的调整使TEdit组件在Components[I]数组中的下标分别为2、3、4、5,基于此我们可以知道:当I?(2,5)时,components[I]对象一定是TEdit类的实例,因此我们就不用再判断components[I]对象是不是TEdit类的实例,同时也不用再遍历、判断另外的的八个对象;这样不仅使程序的代码结构简洁,而且使程序的运行速度提高了3~4倍。
  4、结语
  控件数组的灵活使用能够大大提高编程效率,在Delphi中利用模拟控件数组弥补了Delphi中没有真正的控件数组这一缺憾,使用该方法模拟实现的控件数组更加灵活,其中的控件允许属于不同的类。在现代应用领域中控件数组有着广泛的应用,其中在实现局域网中多个站点互连中显示了其独特的方便性。随着对软件优化度要求的提高,控件数组也会有更广泛的使用。
  参考文献
  [1]杜永华.Delphi控件数组的简易实现.计算机世界,2001.
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3