報表、統計功能常需對資料集某數值欄位 (如「金額」) 做即時累加。利用 TDataSet.OnCalcFields 事件搭配全域變數,可在資料集瀏覽過程中自動完成求和。
var GrandTotal: Double;Table1.OnCalcFields 撰寫累加邏輯GrandTotal := 0 歸零var
GrandTotal: Double; // 全域累加器
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
var
CurrentAmount: Double;
begin
// 取得當前記錄「金額」欄位值
CurrentAmount := Table1.FieldByName('金額').AsFloat;
// 累加
GrandTotal := GrandTotal + CurrentAmount;
// 即時顯示於標籤 (格式化保留 2 位小數)
Label1.Caption := FormatFloat('#,##0.00', GrandTotal);
end;
// 重新查詢/重置時呼叫
procedure TForm1.ResetTotal;
begin
GrandTotal := 0;
Label1.Caption := '0.00';
Table1.Refresh; // 觸發 OnCalcFields 重算
end;
OnCalcFields 在資料集 每次讀取記錄 時觸發,包含游標移動、刷新、篩選等操作UniDirectional = True),累加邏輯仍有效,但無法回溯SUM() 聚合函數於資料庫端運算,效能更佳GrandTotaltype
TTotalRec = record
Amount, Tax, Discount: Double;
end;
var
Totals: TTotalRec;
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
Totals.Amount := Totals.Amount + Table1.FieldByName('金額').AsFloat;
Totals.Tax := Totals.Tax + Table1.FieldByName('稅額').AsFloat;
Totals.Discount := Totals.Discount + Table1.FieldByName('折扣').AsFloat;
LabelAmount.Caption := FormatFloat('#,##0.00', Totals.Amount);
LabelTax.Caption := FormatFloat('#,##0.00', Totals.Tax);
LabelDiscount.Caption := FormatFloat('#,##0.00', Totals.Discount);
end;