Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi SMDBGrid: mehrere Werte pro Spalte in der Fußzeile (https://www.delphipraxis.net/139983-smdbgrid-mehrere-werte-pro-spalte-der-fusszeile.html)

Mike_on_Tour 9. Sep 2009 16:49


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

Mike_on_Tour 26. Okt 2009 17:03

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:
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):
Delphi-Quellcode:
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


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