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/)
-   -   DBGrid Zeilen farbig (https://www.delphipraxis.net/167856-dbgrid-zeilen-farbig.html)

muli 22. Apr 2012 15:57

DBGrid Zeilen farbig
 
Irgendwie sehe ich den Wald vor lauter Bäumen nicht. Wie ich in einem DBGrid Zeilen abwechselnd einfärbe oder abhängig vom Wert einer Zelle die Farbe ändere, ist klar. Was mir aber nicht gelingen will, ist folgendes:

Die erste Spalte meines DBGrid enthält ein Datum, die Datensätze sind nach diesem Datum sortiert. Es gibt nicht zu jedem Datum einen Datensatz, aber es können auch mehrere Datensätze mit dem gleichen Datum auftreten. Ich möchte nun farblich die zum gleichen Datum gehörenden Zeilen zusammenfassen.

Also z.B.
01.05.12 Zeile grau
01.05.12 Zeile grau
02.05.12 Zeile weiß
03.05.12 Zeile grau
03.05.12 Zeile grau
03.05.12 Zeile grau
05.05.12 Zeile weiß

Ich hoffe, das ich das Problem verständlich beschrieben habe. Wie kann ich das lösen? Ich müsste ja einerseits herausbekommen, ob sich das Datum vom vorhergehenden unterscheidet, wenn es sich unterscheidet, muß ich wissen, in welcher Farbe die vorhergehende Zeile gezeichnet wurde, um dann die Farbe zu wechseln.

Schon mal vielen Dank für Eure Vorschläge.

Bummi 22. Apr 2012 16:24

AW: DBGrid Zeilen farbig
 
Initial eine Liste/Dictionary/.. mit Datum>Farbe für DISTINCT der Datumswerte anlegen und dort nachschlagen.

muli 22. Apr 2012 16:37

AW: DBGrid Zeilen farbig
 
Daran habe ich auch schon gedacht. Das ganze funktioniert nur in dem Moment nicht mehr, in dem ich die Datensätze im DBGrid filtere (es sei denn, ich erstelle dann das "Dictionairy" neu). Ich hatte gehofft, es gibt eine elegantere Lösung.

Nachtrag: Die zugrunde liegende Abfrage liefert einige Tausend Datensätze. Ich hatte auch schon überlegt nachzuschauen, ob der dem Datum zugrunde liegende Real-Wert gerade oder ungerade ist und die Zeilen entsprechend zu färben. Das klappt aber immer dann nicht, wenn zwischendurch eine ungerade Anzahl an Tagen fehlt.

2. Nachtrag: Die "Lookup-Liste" müsste dann zwei Felder enthalten: Datum und laufende Nummer. Dann Zeile einfärben, je nachdem ob laufende Nummer gerade oder ungerade ist ... So meinetest Du das wahrscheinlich. Bleibt aber das Filterproblem. Kann ich nicht irgendwie aus DrawColumnCell in den vorhergehenden Datensatz schauen?

Iwo Asnet 23. Apr 2012 01:05

AW: DBGrid Zeilen farbig
 
Zitat:

Zitat von muli (Beitrag 1163028)
Kann ich nicht irgendwie aus DrawColumnCell in den vorhergehenden Datensatz schauen?

Nein. Die Komponente merkt sich nicht, was in der Zelle steht.

Du musst die Lookupliste nach jedem Filtern neu erstellen.
Erstelle eine Liste der eindeutigen Datumswerte, d.h. jeder Datumswert kommt nur 1x vor.
Im DrawDataCell-Ereignis steht dann:
Delphi-Quellcode:
procedure TMyForm.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
begin
  if Field is MyDateField then
    If Odd (MyDateList.IndexOf(Field.DisplayText)) Then
      (Sender as TDBGrid).Canvas := ThisColor
    Else
      (Sender as TDBGrid).Canvas := ThatColor;
  (Sender as TDBGrid).DefaultDrawDataCell(Rect,Field,State);
end;
Wenn Du oft mit Grids und Datenmengen arbeitest, solltest Du dir eine Komponente zulegen, die dir bei deinen speziellen Bedürfnissen hilft.
Wir verwenden DevExpress, damit kann man eigentlich so gut wie alles machen.

muli 23. Apr 2012 23:49

AW: DBGrid Zeilen farbig
 
Vielen Dank für den Hinweis und den mitgelieferten Code. Das ist ja Service!

Nun stellt sich allerdings die Frage, wie ich die Lookup-Tabelle erstelle. Auf den ersten Blick die schnellste Lösung wäre wohl eine SQL-Abfrage mit DISTINCT. Da ich aber in meinem DBGrid mit dynamisch erzeugten Filtern arbeite, wird das doch sehr aufwändig.

Ich habe mir deshalb überlegt, jeweils im DataChange des dem DBGrid zugrunde liegenden Datasets die entsprechenden Datumswerte in ein TMemDataset (Lazarus) zu kopieren. Ich dachte, daß ich damit das Filterproblem löse Das funktioniert nur nicht:pale:. Es scheint, als würde DataChange für jeden einzelnen Datensatz aufgerufen. Ist das richtig? Hat jemand eine bessere Idee?

Wann werden OnDataChange und OnUpdateData genau aufgerufen?

Oder doch besser StringList? Nur wo klinke ich mich ein, um sie zu füllen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 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