在Delphi中巧改窗体文件实现控件数组化

阳啦西

阳啦西

2016-01-29 14:02

在Delphi中巧改窗体文件实现控件数组化,在Delphi中巧改窗体文件实现控件数组化
 
delphi 开发的应用中,每一个窗体都有一个对应的窗体文件(.dfm),用来记录该窗体的属性以及窗体上所有控件的属性,以便在窗体关闭后能准确地重新生成窗体。几乎所有的DELPHI参考书都没有提到过该文件的具体情况,偶尔提到,也都泛泛而谈,因为窗体文件是二进制文件,只有在DELPHI提供的编辑环境中才能看到它的本来面目,对其进行操作可能会出现不可预知的错误;而且在大多数情况下,确实没有修改的必要。而本文谈到的和窗体文件密切相关。

---- 要利用窗体文件,首先必须了解该类型文件的结构。窗体文件的结构很简单,朋友们可以生成一个窗体,随便放上一些控件,存盘后打开Unit1.dfm文件,就可以看到窗体文件是由关键字"object"和"end"构成的代码段,基本结构如下:


object  控件名 :类名属性1 =属性值属性2 =属性值…end

---- 并且支持嵌套。Delphi在记录控件属性时,只记录修改过的属性,举一个例子,比如对一个标签控件(label1)的缺省描述如下:


object Label1: TLabelLeft = 256Top = 80Width = 32Height = 13Caption = 'Label1'End

---- 记录的五个属性都是随开发者拖放的位置和顺序不同而变化的,其它属性由于没有修改过,都是缺省值,所以不必记录。

---- 窗体文件是有序的,它的有序性表现如下:


object 窗体名:Tform窗体属性1=属性值窗体属性2=属性值 。。。 。。。// 以下是TgraphControl类型的控件object 控件名:类名控件属性1=属性值控件属性2=属性值。。。 。。。endobject 控件名:类名控件属性1=属性值控件属性2=属性值。。。 。。。end。。。 。。。// 以下是TwinControl类型的控件object 控件名:类名控件属性1=属性值控件属性2=属性值 。。。 。。。endobject 控件名:类名控件属性1=属性值控件属性2=属性值 。。。 。。。end。。。 。。。// 以下是其它类型的控件object 控件名:类名控件属性1=属性值控件属性2=属性值 。。。 。。。end 。。。 。。。end

---- 在同一种类型的控件中,各控件排列的先后顺序和它被拖放到窗体上的先后顺序相同。这个顺序是可以人为修改的,我们正是通过修改这个顺序,来实现控件的数组化。下面将详细介绍。

---- 熟悉VB的朋友肯定知道在VB中可以通过控件拷贝实现控件的数组化。而DELPHI中则没有这种功能。Delphi中可以使用Components, Controls两个控件数组在一定程度上模拟控件的数组化,比如:


for I := 1 to ControlCount-1 do  if (Controls[I] is Tlabel) then(Controls[I] as Tlabel).Caption := 'Test';

---- 这段代码的功能是将窗体上所有Label的Caption属性设为'Test';这是一种非常有用的方法,大家如果不太熟悉可以参考delphi帮助作进一步了解。这种方法有很多局限,最明显的是我们并不知道Controls[i]或Components[i]到底代表哪一个控件,只能用遍历的方法进行筛选,这不仅影响了程序执行的效率,也带来编程上的繁琐。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/delphi/)

---- 其实,Controls和Components中控件的排列顺序和对应的窗体文件(.dfm)中控件描述代码段的排列顺序是相同的。前面我们谈到窗体文件是可以进行适当修改的,也就是说,我们可以根据需要调整窗体文件中控件描述代码段的排列顺序,让Controls和Components这两个控件数组全在掌握之中,这样我们就能清楚知道Controls[I]或Components[I]具体代表的是哪一个控件。下面举例说明。

---- 比如,我们想让窗体Form1上的所有Tbutton灰化,最简单的方法是一句一句的编写代码:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/delphi/)
Button1.Enabled := False;Button2.Enabled := False;  … …

---- 如果Tbutton数量很多,代码就变得很冗长。于是我们采用一个循环来实现:


for I := 0 to ControlCount -1  do    if Controls[I] is Tbutton Then(Controls[I] as Tbutton).Enabled := False;

展开更多 50%)
分享

猜你喜欢

在Delphi中巧改窗体文件实现控件数组化

Delphi
在Delphi中巧改窗体文件实现控件数组化

在Delphi中巧改窗体文件实现控件数组

编程语言 网络编程
在Delphi中巧改窗体文件实现控件数组

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

C++Builder中实现控件数组的功能

编程语言 网络编程
C++Builder中实现控件数组的功能

Delphi实现窗体控件自由摆布

Delphi
Delphi实现窗体控件自由摆布

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

在BCB中使用VCL控件数组1

编程语言 网络编程
在BCB中使用VCL控件数组1

在BCB中使用VCL控件数组2

编程语言 网络编程
在BCB中使用VCL控件数组2

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Delphi快速入门(一)

Delphi快速入门(一)

文本编辑器的设计(一)

文本编辑器的设计(一)
下拉加载更多内容 ↓