AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi SMDBGrid: mehrere Werte pro Spalte in der Fußzeile
Thema durchsuchen
Ansicht
Themen-Optionen

SMDBGrid: mehrere Werte pro Spalte in der Fußzeile

Ein Thema von Mike_on_Tour · begonnen am 9. Sep 2009 · letzter Beitrag vom 26. Okt 2009
Antwort Antwort
Mike_on_Tour

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

SMDBGrid: mehrere Werte pro Spalte in der Fußzeile

  Alt 9. Sep 2009, 16:49
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
Programmieren ist wie das Wandeln auf dem schmalen Pfad zwischen Wahnsinn und Intelligenz.
  Mit Zitat antworten Zitat
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz