程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 在Delphi中巧改窗體文件實現控件數組化

在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]到底代表哪一個控件,只能用遍歷的方法進行篩選,這不僅影響了程序執行的效率,也帶來編程上的繁瑣。

---- 其實,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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved