AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DBGrid Zeilen farbig

Offene Frage von "muli"
Ein Thema von muli · begonnen am 22. Apr 2012 · letzter Beitrag vom 23. Apr 2012
Antwort Antwort
muli

Registriert seit: 7. Mär 2011
11 Beiträge
 
#1

DBGrid Zeilen farbig

  Alt 22. Apr 2012, 15:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: DBGrid Zeilen farbig

  Alt 22. Apr 2012, 16:24
Initial eine Liste/Dictionary/.. mit Datum>Farbe für DISTINCT der Datumswerte anlegen und dort nachschlagen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
muli

Registriert seit: 7. Mär 2011
11 Beiträge
 
#3

AW: DBGrid Zeilen farbig

  Alt 22. Apr 2012, 16:37
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?

Geändert von muli (22. Apr 2012 um 18:42 Uhr)
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#4

AW: DBGrid Zeilen farbig

  Alt 23. Apr 2012, 01:05
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.

Geändert von Iwo Asnet (23. Apr 2012 um 01:07 Uhr)
  Mit Zitat antworten Zitat
muli

Registriert seit: 7. Mär 2011
11 Beiträge
 
#5

AW: DBGrid Zeilen farbig

  Alt 23. Apr 2012, 23:49
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. 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?
  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 22:38 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