資料感知控件是 Delphi 快速建構資料庫應用的基石。本文系統梳理:資料來源架構、編輯與更新機制、刷新控制策略、以及 主流資料控件(單欄位、多行文字、RTF、圖像、下拉清單、核取方塊、資料網格、資料來源) 的核心屬性與實務用法,助您快速上手。
TTable/TQuery/TADOTable),設定 DatabaseName、TableName、Active = TrueTDataSource,設定 DataSet 指向上述資料集TDBEdit、TDBGrid 等),設定 DataSource 指向 TDataSourceDataField 指定顯示欄位;TDBGrid、TDBCtrlGrid、TDBNavigator 操作整個資料集,無需設定 DataField| 條件 | 結果 |
|---|---|
DataSource.AutoEdit = True(預設) | 使用者輸入時自動進入 dsEdit 模式 |
DataSource.AutoEdit = False | 需程式呼叫 DataSet.Edit 才能編輯 |
DataControl.ReadOnly = False | 允許使用者修改 |
DataControl.ReadOnly = True | 唯讀顯示 |
DataSet.ReadOnly = True | 資料集層級鎖定,修改不會寫入 |
焦點移動觸發寫入: 非 TDBGrid 控件需將焦點移離該控件(或按 Esc 取消);TDBGrid 需移至另一筆記錄。
遍歷或搜尋大量資料時,暫停控件重繪可大幅提升效能並避免閃爍:
CustTable.DisableControls;
try
CustTable.First;
while not CustTable.EOF do begin
// 處理邏輯
CustTable.Next;
end;
finally
CustTable.EnableControls; // 確保即使發生例外也會恢復
end;
建議永遠採用 try...finally 結構保證配對呼叫。
多使用者環境下,呼叫 DataSet.Refresh 可重讀最新資料。注意:若他人已刪除當前記錄,Refresh 後該記錄將從控件消失。
| 控件 | 基底類別 | 用途 | 關鍵屬性 |
|---|---|---|---|
TDBText | TLabel | 唯讀標籤顯示欄位值 | AutoSize = True 避免截斷 |
TDBEdit | TEdit | 單行文字編輯 | ReadOnly, DataField |
TDBMemo | TMemo | 多行文字/備註欄位 | WantTabs, MaxLength, ScrollBars, WordWrap, AutoDisplay |
TDBRichEdit | TRichEdit | RTF 格式化文字(BLOB) | 需自行設計工具列發揮功能 |
TDBImage | TImage | 圖像欄位(BLOB) | Stretch, AutoDisplay, CutToClipboard/CopyToClipboard/PasteFromClipboard |
| 控件 | 資料來源 | 特性 |
|---|---|---|
TDBListBox | 靜態 Items | 單選清單 |
TDBComboBox | 靜態 Items | 可輸入或選擇,Style=csOwnerDrawFixed 時可設 ItemHeight |
TDBLookupListBox | 另一 DataSet | 顯示查找表欄位,ListField/KeyField/ListSource |
TDBLookupComboBox | 另一 DataSet | 下拉式查找,同 TDBLookupListBox 設定 |
查找範例: 訂單表 OrdersTable 含 CustNo,客戶表 CustomersTable 含 CustNo、Company。設定 TDBLookupComboBox.ListSource = CustomersSource、ListField = Company、KeyField = CustNo、DataField = CustNo、DataSource = OrdersSource,即可在訂單編輯時以公司名稱選擇客戶。
TDBCheckBox 將欄位值與 ValueChecked、ValueUnchecked 比對(支援分號分隔多值,如 'True;Yes;On'),匹配則勾選,否則取消;兩者皆不符時呈現灰色不確定狀態。區分大小寫。
Columns 編輯器建立,可自訂 Caption、Width、Alignment、ButtonStyle 等,適合固定結構報表建立永久欄:選取 Grid → Object Inspector 雙擊 Columns → 右鍵選單 Add All Fields 或工具列 Add New。永久欄刪除後自動回復動態模式。
技巧:FieldName 可留空建立空白欄,用於 OnDrawColumnCell 繪製圖示、圖表等自訂內容;多欄可指向同一 FieldName。
// 動態切換資料集
with CustSource do
if DataSet = Customers then DataSet := Orders else DataSet := Customers;
// 跨表單引用
procedure TForm2.FormCreate(Sender: TObject);
begin
DataSource1.DataSet := Form1.Table1;
end;
事件:OnDataChange(記錄位置變更)、OnUpdateData(寫入前驗證)。AutoEdit 控制自動進入編輯模式。
Active = True 即時預覽資料,開發效率倍增DisableControls/EnableControls 配對TDBLookupComboBox 替代硬寫下拉選單,維護性更佳TDBGrid 永久欄模式下修改 Title.Caption 不影響底層 Field.DisplayLabel掌握上述核心概念與控件特性,即可高效開發專業級資料庫應用程式。