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
From:http://tw.wingwit.com/Article/program/Delphi/201401/30261.html