Einzelnen Beitrag anzeigen

Mike_on_Tour

Registriert seit: 16. Aug 2007
195 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: SMDBGrid: mehrere Werte pro Spalte in der Fußzeile

  Alt 26. Okt 2009, 17:03
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
Programmieren ist wie das Wandeln auf dem schmalen Pfad zwischen Wahnsinn und Intelligenz.
  Mit Zitat antworten Zitat