首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 進階技巧:修改 DFM 實現控件陣列化管理

     編輯:Delphi

前言

Delphi 每個表單對應一個 .dfm 檔案,記錄表單與控件的屬性狀態。雖然 DFM 為二進位/文字混合格式,僅在 IDE 中可視化編輯,但理解其結構後,可透過手動調整控件宣告順序,將 Controls / Components 陣列「陣列化」,大幅簡化批次操作程式碼。

一、DFM 結構解析

DFM 以 object ... end 巢狀結構描述元件樹:

object Form1: TForm
  Left = 200
  Top = 100
  // 先列出 TGraphicControl 類控件 (無視窗控制代碼)
  object Label1: TLabel
    Left = 256
    Top = 80
    Caption = 'Label1'
  end
  // 再列出 TWinControl 類控件 (有視窗控制代碼)
  object Button1: TButton
    Left = 50
    Top = 50
    Caption = 'Button1'
  end
  object Button2: TButton
    Left = 50
    Top = 90
    Caption = 'Button2'
  end
end
  • 同類控件依「拖放順序」排列
  • 順序直接對應 Controls[] 與 Components[] 索引
  • 父子關係以縮排體現

二、Controls/Components 陣列的索引規則

  • Controls[] 僅包含同層級的 TWinControl 子控件
  • Components[] 包含表單擁有的所有元件 (含非視覺元件)
  • 索引 0 為 DFM 中第一個出現的同層級控件

三、實戰範例:批次灰化所有 Button

傳統寫法

Button1.Enabled := False;
Button2.Enabled := False;
Button3.Enabled := False;
// ... 冗長且難維護

遍歷篩選法 (效率較低)

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

DFM 陣列化法 (最高效)

  1. 用文字編輯器開啟 Form1.dfm
  2. 將所有 TButton 的 object ... end 區塊移至連續位置
  3. 統計其前方同層級控件數量 n,則第一個 Button 索引為 n-1
  4. 程式碼簡化為:
for I := n-1 to n-1 + ButtonCount - 1 do
  (Controls[I] as TButton).Enabled := False;

四、進階應用:動態組裝 Socket 發送字串

假設表單有 20 個 TEdit 依序對應欄位,需依序串接非空值:

  1. 在 DFM 中將 20 個 Edit 區塊集中排序
  2. 確認第一個 Edit 在 Controls[] 索引為 n-1
  3. 單一迴圈完成驗證與串接:
for I := n-1 to n-1 + EditCount - 1 do
begin
  if (Controls[I] as TEdit).Text = '' then
  begin
    Application.MessageBox('請填寫必要資訊', '提示', MB_OK);
    Exit;
  end;
  InfoStr := InfoStr + (Controls[I] as TEdit).Text;
end;

五、注意事項與限制

  • 類型分層限制:TGraphicControl (Label、Shape 等) 永遠排在 TWinControl 前,不可跨層移動
  • 父子層級:計算索引時需區分 Controls (同層) 與 Components (全層級)
  • 可讀性權衡:DFM 調整後程式碼依賴隱含順序,建議加註解說明索引對應關係
  • IDE 同步:修改 DFM 後需在 IDE 重新開啟專案,設計器才會同步新順序

六、總結

透過掌握 DFM 的有序特性,開發者可將 Delphi 原生不支援的「控件陣列」功能以零成本實現,對於大量同類控件的批次操作 (啟用/禁用、驗證、資料收集) 具有顯著的程式碼簡化與效能提升效果。此技巧適用於 Delphi 所有版本,屬於進階開發者的實用工具箱必備技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved