一、資料存取元件階層架構
TSession (全域單例,不可見)
└─ TDatabase (客戶/伺服器連線參數)
└─ TDataSet (抽象基類)
├─ TTable (單表存取)
└─ TQuery (SQL 查詢)
└─ TDataSource (橋樑)
└─ 資料瀏覽元件 (DBGrid, DBEdit…)
TField (欄位物件) ── 由 DataSet 動態建立或 Fields Editor 靜態建立
二、TSession 核心屬性與方法
| 屬性/方法 | 用途 |
DatabaseCount / Databases[] | 目前 Session 管理的資料庫別名清單 |
KeepConnections | True=保持非活動資料庫連線 (預設) |
NetFileDir | BDE 網路控制檔路徑 (多使用者環境關鍵) |
PrivateDir | 暫存檔目錄 |
GetAliasNames | 取得 BDE 定義的所有別名 |
GetTableNames | 列出指定別名下的所有資料表 |
GetDriverNames | 列出已安裝的 BDE 驅動程式 |
DropConnections | 切斷所有資料庫連線 |
範例:動態列出別名與資料表
procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
Session.GetAliasNames(ListBoxAlias.Items);
Screen.Cursor := crDefault;
end;
procedure TForm1.ListBoxAliasClick(Sender: TObject);
var Alias: string;
begin
Alias := ListBoxAlias.Items[ListBoxAlias.ItemIndex];
ListBoxTables.Clear;
Session.GetTableNames(Alias, '', True, True, ListBoxTables.Items);
end;
三、TTable/TQuery 共用資料集核心功能
1. 導航與狀態
First, Prior, Next, Last, MoveBy
State:dsBrowse, dsEdit, dsInsert, dsSetKey
EOF, BOF, RecordCount, RecNo
2. 資料維護方法
| 方法 | 功能 |
Edit | 進入編輯模式 |
Insert / Append | 插入/附加新記錄 (需後續 Post) |
Post | 寫入修改/新增 |
Cancel | 取消當前操作 |
Delete | 刪除當前記錄 |
AppendRecord / InsertRecord | 單行插入 (含欄位值陣列,自動 Post) |
SetRecord | 批次修改多欄位 (需 Edit→SetRecord→Post) |
3. 書籤
var BM: TBookmark;
BM := Table1.GetBookmark;
try
Table1.DisableControls;
Table1.First;
while not Table1.EOF do begin ... Table1.Next; end;
finally
Table1.GotoBookmark(BM);
Table1.FreeBookmark(BM);
Table1.EnableControls;
end;
4. 篩選與範圍
Filter / Filtered:客戶端字串篩選
SetRange/SetRangeStart/SetRangeEnd + ApplyRange:索引式範圍 (Paradox/dBase 僅限索引欄位)
CancelRange:取消範圍
5. 查找
| 模式 | 方法組合 | 特點 |
| Goto | SetKey → 指定欄位值 → GotoKey/GotoNearest | 精確/最近匹配 |
| Find | FindKey([值]) / FindNearest([值]) | 單行呼叫,陣列傳參 |
6. 主從關聯
{ 設計期:Field Link Designer }
TableDetail.MasterSource := DataSourceMaster;
TableDetail.MasterFields := 'CustNo'; // 或 'OrderNo;CustNo'
{ 執行期自動同步:主表游標移動 → 從表篩選 }
7. 常用事件
Before/After Open/Close/Insert/Edit/Post/Cancel/Delete
OnCalcFields:計算欄位賦值
OnFilterRecord:自訂篩選邏輯
四、TDataSource:橋樑角色
| 屬性/事件 | 說明 |
DataSet | 指向 TTable/TQuery (可跨 Form 指派) |
AutoEdit | True=使用者輸入自動進入編輯模式 |
OnDataChange | 記錄指標移動觸發 (多控件同步) |
OnStateChange | DataSet 狀態變更觸發 (控制按鈕啟用/禁用) |
OnUpdateData | Post 前觸發 (非資料感知控件同步) |
狀態同步範例
procedure TForm1.DataSource1StateChange(Sender: TObject);
begin
BtnInsert.Enabled := (Table1.State = dsBrowse);
BtnCancel.Enabled := Table1.State in [dsEdit, dsInsert, dsSetKey];
end;
五、TField 欄位物件體系
1. 常見欄位類別對應
| TField 子類別 | 資料庫型別 |
TStringField | CHAR, VARCHAR |
TIntegerField | INTEGER |
TFloatField | FLOAT, DOUBLE |
TCurrencyField | MONEY, CURRENCY |
TDateTimeField | DATETIME, TIMESTAMP |
TBlobField | BLOB, IMAGE, MEMO |
2. 關鍵屬性
DisplayFormat / EditFormat:顯示/編輯格式 (配合 FormatFloat/FormatDateTime)
EditMask:輸入遮罩 (如電話 `!\(999\)000-0000;0;`)
Visible:DBGrid 是否顯示
ReadOnly:禁止修改
Calculated = True:標記為計算欄位
3. 型別轉換函數
Edit1.Text := Table1Field.AsString; // 任意型別 → 字串
Table1Field.AsInteger := StrToInt(Edit1.Text); // 字串 → 整數
{ 完整對照見原文表 15.9 }
4. 存取方式
- 靜態欄位:
Table1FieldName.Value (直接命名)
- 動態欄位:
Table1.Fields[索引] 或 Table1.FieldByName('名稱')
5. Fields Editor 操作
- Add Fields:從資料庫結構建立永久欄位
- New Field → Calculated:建立計算欄位,配合
OnCalcFields 賦值
- Delete:移除永久欄位 (屬性設定隨之消失)
六、TReport 整合 ReportSmith
ReportName/ReportDir:指定 .rpt 檔
Preview:True=預覽,False=直接列印
AutoUnload:單一報表 True,批次報表 False
InitialValues:傳遞報表變數 VarName := Value
- 方法:
Run, RunMacro, Connect, SetVariable, ReCalcReport
七、TBatchMove 大量資料搬移
Mode:batAppend, batUpdate, batAppendUpdate, batCopy, batDelete
Source/Destination:指定來源/目標 DataSet
Mappings:欄位對應清單 DestField = SrcField
Execute:執行搬移
八、多 Form 共用單一 DataSet 實作
{ Form1 建立 Table1, DataSource1 }
{ Form2 僅建立 DataSource2 }
procedure TForm2.FormCreate(Sender: TObject);
begin
DataSource2.DataSet := Form1.Table1; // 關鍵:共用同一 DataSet
end;
{ 兩 Form 的 DBGrid/DBEdit 綁定各自 DataSource,即時同步 }