Die Antwort lautet: JA.
Da ich bisher keine Anregung bekommen habe, möchte ich hier meine Lösung grob als Ansatz vorstellen.
Ich habe erst mal ein Array definiert:
Delphi-Quellcode:
var
arGridSumme : array [1 .. 3, 1 .. 12] of Real; // 3 Zeilen und 12 Spalten
In der Prozedur 'FormCreate' wird die Fußzeile des SMDBGrids zugewiesen:
Delphi-Quellcode:
SMDBGrid1.Columns[1].FooterText := ' Summe 1:' + #13 +
' Summe 2:' + #13 +
' Summe 3:';
Für das Ereignis 'OnDrawFooterCell' des SMDBGrid wird für alle betreffenden Spalten die Fußzeile mit den Summenwerten aus dem Array "bestückt":
Delphi-Quellcode:
procedure TForm1.SMDBGrid1DrawFooterCell(Sender: TObject; Canvas: TCanvas;
FooterCellRect: TRect; Field: TField;
var FooterText:
string;
var DefaultDrawing: Boolean);
begin
try
if (Field <>
NIL)
then begin
DefaultDrawing := ((Field.FieldName = '
Betrag01')
or
(Field.FieldName = '
Betrag02')
or
(Field.FieldName = '
Betrag03')
or
(Field.FieldName = '
Betrag04')
or
(Field.FieldName = '
Betrag05')
or
(Field.FieldName = '
Betrag06')
or
(Field.FieldName = '
Betrag07')
or
(Field.FieldName = '
Betrag08')
or
(Field.FieldName = '
Betrag09')
or
(Field.FieldName = '
Betrag10')
or
(Field.FieldName = '
Betrag11')
or
(Field.FieldName = '
Betrag12'));
if ((Field.FieldName <> '
ID')
and
(Field.FieldName <> '
Jahr'))
then begin
FooterText := FloatToStrF (arGridSumme[1, Field.
Index], ffNumber, 8,2) + #13 +
FloatToStrF (arGridSumme[2, Field.
Index], ffNumber, 8,2) + #13 +
FloatToStrF (arGridSumme[3, Field.
Index], ffNumber, 8,2);
end;
end;
except
on E:
Exception do begin
raise Exception.Create (FormatException ('
Fehler bei Summenanzeige.',
Name, '
DrawFooterCell', E.ClassName, E.
Message));
end;
end;
end;
Die jeweiligen Summen ermittle ich in einer privaten Routine:
Delphi-Quellcode:
procedure TForm1.BerechnenSpaltenSumme;
var
bmTable : TBookmark;
iSpalte,
iMonat : Integer;
sFeldName : String;
begin
Table1.DisableControls;
bmTable := Table1.GetBookmark;
try
for iSpalte := 1 to 12 do begin
arGridSumme[1, iSpalte] := 0;
end;
Table1.First;
while (not Table1.EOF) do begin
for iMonat := 1 to 12 do begin
sFeldName := Format ('Betrag%.2d', [iMonat - 3]);
arGridSumme[1, iMonat] := arGridSumme[1, iMonat] + Table1.FieldByName(sFeldName).AsFloat;
end;
Table1.Next;
end;
finally
Table1.GotoBookmark (bmTable);
Table1.FreeBookmark (bmTable);
Table1.EnableControls;
end;
end;
Damit die Fußzeile auch aktualisiert wird, muß im Programm an einer passenden Stelle noch folgende Codezeile eingefügt werden (z.B. im Ereignis 'OnUpdateData' der TDatasource für das Grid):
SMDBGrid1.InvalidateFooter;
Das ist eigentlich schon alles. Bei mir funktioniert es jedenfalls und vielleicht kann der ein oder andere von Euch das ja auch mal gebrauchen.
Mike