---- 要利用窗體文件,首先必須了解該類型文件的結構。窗體文件的結構很簡單,朋友們可以生成一個窗體,隨便放上一些控件,存盤後打開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]到底代表哪一個控件,只能用遍歷的方法進行篩選,這不僅影響了程序執行的效率,也帶來編程上的繁瑣。
---- 其實,Controls和Components中控件的排列順序和對應的窗體文件(.dfm)中控件描述代碼段的排列順序是相同的。前面我們談到窗體文件是可以進行適當修改的,也就是說,我們可以根據需要調整窗體文件中控件描述代碼段的排列順序,讓Controls和Components這兩個控件數組全在掌握之中,這樣我們就能清楚知道Controls[I]或Components[I]具體代表的是哪一個控件。下面舉例說明。
---- 比如,我們想讓窗體Form1上的所有Tbutton灰化,最簡單的方法是一句一句的編寫代碼:
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;