![]() |
SMDBGrid: mehrere Werte pro Spalte in der Fußzeile
Hallo zusammen,
ich verwende in einer Form die Komponente SMDBGrid und möchte zu den Spalten eine Fußzeile ausgeben mit Summe und so. Prinzipiell funktioniert das mit der Komponente ganz gut. Nun möchte ich aber nicht nur einen Wert in der Fußzeile haben, sondern vier pro Spalte (Spaltensumme, Zeitaufwand, Selbstkosten, GuV). Ich habe nun versucht, die Summen in einem StringGrid unter dem SMDBGrid anzuzeigen. Da die Grids aber sehr breit sind, scheiterte das an der horizontalen Synchronisation der Tabellenspalten innerhalb der Form. Nun bin ich wieder nur beim SMDBGrid. Ich habe die Höhe der Fußzeile auf vier Zeilen erhöht und möchte nun die entsprechenden Werte selbst errechnen und eintragen. Leider fehlt mir noch der richtige Einstieg in die Berechnung der Werte. Meine Frage deshalb, geht das überhaupt und wenn ja wie ? Mike |
Re: SMDBGrid: mehrere Werte pro Spalte in der Fußzeile
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:
In der Prozedur 'FormCreate' wird die Fußzeile des SMDBGrids zugewiesen:
var
arGridSumme : array [1 .. 3, 1 .. 12] of Real; // 3 Zeilen und 12 Spalten
Delphi-Quellcode:
Für das Ereignis 'OnDrawFooterCell' des SMDBGrid wird für alle betreffenden Spalten die Fußzeile mit den Summenwerten aus dem Array "bestückt":
SMDBGrid1.Columns[1].FooterText := ' Summe 1:' + #13 +
' Summe 2:' + #13 + ' Summe 3:';
Delphi-Quellcode:
Die jeweiligen Summen ermittle ich in einer privaten Routine:
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;
Delphi-Quellcode:
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):
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;
Delphi-Quellcode:
Das ist eigentlich schon alles. Bei mir funktioniert es jedenfalls und vielleicht kann der ein oder andere von Euch das ja auch mal gebrauchen.
SMDBGrid1.InvalidateFooter;
Mike |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz