2010-06-22

InfoPower TwwDBGrid 怎麼新增 Footer !

在 InfoPower 中有個 TwwDBGrid 元件與原本的 TDBGrid 增強的功能,其中之一就是 Footer 『註腳』。Footer 在 Grid 的腳色當中最常放哪些資訊呢?因該是『加總』吧!而且要放什麼、什麼都能放喔。

§以 Footer 的功能來實現『加總』§
dbgBrowse.Options := dbgBrowse.Options + [dgShowFooter];
dbgBrowse.FooterCellColor := cl_ReadOnly;
dbgBrowse.FooterHeight := Trunc(dbgBrowse.RowHeights[0] * 1.3);
Line.01.開啟 Footer 的功能。
Line.02.設定 Footer Cell 內的顏色。
Line.03.設定 Footer Cell 的高度。寬度、是隨著各自欄位。

§算出『加總』數據§
以傳統的方式取得『加總』數據,可能還要再來一次 Query。如果我們是使用 TClientDataSet ,可以利用 Aggregate 在以下載的 RecordSet 中做運算,減少在一次的 Query 對 DBMS 的 I/O。以下透過動態建立 Aggregate 讓您更清晰地看到如何運作的。
vAggField := cdsBrowse.Aggregates.Add;
vAggField.Expression := 'SUM(' + vName + ')';
vAggField.AggregateName := 'sub' + vName;
vAggField.Active := True;
if not cdsBrowse.AggregatesActive then
  cdsBrowse.AggregatesActive := True;

§Show 出『註腳』數據吧§
Footer 的數據必須要在 TwwDBGrid.OnUpdateFooter 事件中實作。
procedure TdlgGrid.dbgBrowseUpdateFooter(Sender: TObject);
var
  ii, vDecimal: Integer;
  vName, vFooterName, vValue: String;
begin
  for ii := 0 to FMoneyStrs.Count - 1 do
  begin
    vName := FMoneyStrs.Names[ii];
    vDecimal := StrToInt(FMoneyStrs.Values[vName]);
    vFooterName := 'sub' + vName;
    vValue := VarToStr(cdsBrowse.Aggregates.Find(vFooterName).Value);
    dbgBrowse.ColumnByName(vName).FooterValue :=
      StrToDecimal(vValue, vDecimal);
  end;
end;
Line.08.是我動態儲存那些欄位需要 Footer 的變數。可能與這篇的主題無關!
Line.11.就是從上一段取得 Aggregates 中算出的『加總』數據。
Line.12.就是將已知的數據填入到 Footer,注意 Footer 的所在位置:TwwDBGrid.Columns[n].FooterValue。

§事件、就是要被觸發的§
這點倒是‧‧‧‧‧要自己觸發;選個好時機點觸發吧!
dbgBrowse.OnUpdateFooter(dbgBrowse);

TwwDBGrid.Footer

沒有留言: