delphi 开发的应用中每一个窗体都有一个对应的窗体文件(dfm)用来记录该窗体的属性以及窗体上所有控件的属性以便在窗体关闭后能准确地重新生成窗体几乎所有的DELPHI参考书都没有提到过该文件的具体情况偶尔提到也都泛泛而谈因为窗体文件是二进制文件只有在DELPHI提供的编辑环境中才能看到它的本来面目对其进行操作可能会出现不可预知的错误而且在大多数情况下确实没有修改的必要而本文谈到的和窗体文件密切相关
要利用窗体文件首先必须了解该类型文件的结构窗体文件的结构很简单朋友们可以生成一个窗体随便放上一些控件存盘后打开Unitdfm文件就可以看到窗体文件是由关键字"object"和"end"构成的代码段基本结构如下
object 控件名 类名属性 =属性值属性 =属性值…end
并且支持嵌套Delphi在记录控件属性时只记录修改过的属性举一个例子比如对一个标签控件(label)的缺省描述如下
object Label: TLabelLeft = Top = Width = Height = Caption = ;Label;End
记录的五个属性都是随开发者拖放的位置和顺序不同而变化的其它属性由于没有修改过都是缺省值所以不必记录
窗体文件是有序的它的有序性表现如下
object 窗体名Tform窗体属性=属性值窗体属性=属性值 // 以下是TgraphControl类型的控件object 控件名类名控件属性=属性值控件属性=属性值 endobject 控件名类名控件属性=属性值控件属性=属性值 end // 以下是TwinControl类型的控件object 控件名类名控件属性=属性值控件属性=属性值 endobject 控件名类名控件属性=属性值控件属性=属性值 end // 以下是其它类型的控件object 控件名类名控件属性=属性值控件属性=属性值 end end
在同一种类型的控件中各控件排列的先后顺序和它被拖放到窗体上的先后顺序相同这个顺序是可以人为修改的我们正是通过修改这个顺序来实现控件的数组化下面将详细介绍
熟悉VB的朋友肯定知道在VB中可以通过控件拷贝实现控件的数组化而DELPHI中则没有这种功能Delphi中可以使用Components Controls两个控件数组在一定程度上模拟控件的数组化比如
for I := to ControlCount do if (Controls[I] is Tlabel) then(Controls[I] as Tlabel)Caption := ;Test;
这段代码的功能是将窗体上所有Label的Caption属性设为;Test;这是一种非常有用的方法大家如果不太熟悉可以参考delphi帮助作进一步了解这种方法有很多局限最明显的是我们并不知道Controls[i]或Components[i]到底代表哪一个控件只能用遍历的方法进行筛选这不仅影响了程序执行的效率也带来编程上的繁琐
其实Controls和Components中控件的排列顺序和对应的窗体文件(dfm)中控件描述代码段的排列顺序是相同的前面我们谈到窗体文件是可以进行适当修改的也就是说我们可以根据需要调整窗体文件中控件描述代码段的排列顺序让Controls和Components这两个控件数组全在掌握之中这样我们就能清楚知道Controls[I]或Components[I]具体代表的是哪一个控件下面举例说明
比如我们想让窗体Form上的所有Tbutton灰化最简单的方法是一句一句的编写代码
ButtonEnabled := False;ButtonEnabled := False; … …
如果Tbutton数量很多代码就变得很冗长于是我们采用一个循环来实现
for I := to ControlCount do if Controls[I] is Tbutton Then(Controls[I] as Tbutton)Enabled := False;
<FONT colo