AGB  ·  Datenschutz  ·  Impressum  







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

Zeilen eines TDBGrid "Blockweise" färben

Ein Thema von Jumpy · begonnen am 26. Jan 2018 · letzter Beitrag vom 30. Jan 2018
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#1

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 16:22
Hallo,
Zitat:
Ich muss nur merken, Wert ändert sich also wechsel ich die Farbe.
Das sehe ich aber im OnDrawCell von Zeile2 nicht, dass die vorige Zeile eine andere Id hatte.
Genau das ist halt mein Problem. Deswegen merke ich mir die ID der vorherigen Zeile um zu sehen, ob ein Wechsel stattfiden muss. Das funktioniert dann aber nur beim erstmaligen Zeichnen des Grids, wo das von oben nach unten neu gezeichnet wird und dementsprechend die darunterliegende Query einmal von oben nach unten durchlaufen wird.
Wenn ich den Cursor/Selector zwischen den Zeilen hin und her springe, werden nur einzelne Zeilen neu gezeichnet und ich habe nicht den Bezug zu den Zeilen davor. Genau das ist mein Problem.

@Jobo: Sortierung war quatsch, das Grid kann nicht sortiert werden, denn es muss ja immer ala "Order By GruppenID, EinzelID" sortiert sein, damit es überhaupt erst möglich ist zusammenhängende Blöcke zu haben.

Das einzige was passieren kann ist Filterung, d.h. die Datenmenge ändert sich und das Grid müsste eigentlich komplett neu gezeichnet und gefärbt werden. Das eine weiße Zeile dann grau wird oder umgekehrt ist egal. Es geht ja nur darum den einen Block vom nächsten zu unterscheiden. Und deswegen kann dann der Übernächste Block auch wieder die selbe Farbe haben wie der erste.

Ich basteln nachher in der Firma nochmal ein bisschen rum, irendwie muss das doch gehen .
Ralph
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.598 Beiträge
 
Delphi 7 Professional
 
#2

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 16:44
Beim Zeichnen der Daten müsste das Grid doch eigentlich immer erstmal von oben nach unten durch die Datenmenge gehen.

Wenn man nun hergeht und im Ereignis AfterOpen (bzw. beim Setzen eines Filters) eine (globale) Stringliste leert und immer dann, wenn eine Zeile gezeichnet wird prüft, ob die aktuelle VorgangsID dort vorhanden ist, müsste doch ungefähr so eine Logik funktionieren:
Delphi-Quellcode:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if StringList.IndexOf(VorgangsID) < 0 then StringList.Add(VorgangsID);
  Case StringList.IndexOf(VorgangsID) Mod 2 of
    0 : DBGrid1.Canvas.Brush.Color := clWhite;
    1 : DBGrid1.Canvas.Brush.Color := clInfoBk;
  end;
end;

Geändert von Delphi.Narium (29. Jan 2018 um 16:46 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 16:54
Das klingt sehr gut. Beim erstmaligen Zeichnen wird die Farbinformation in einer Parallelstruktur gespeichert und über die VorgangsID verlinkt. Das kann dann beim Neuzeichnen einzelner Zeilen oder Zellen weiterhin benutzt werden.
Erst bei einer Filterung und somit einen anderen Aufbau des Grids muss diese Parallelstruktur aktualisiert werden.

Ich glaube das habt ihr weiter oben auch schon mal gemeint, als z.B. Uwe von temporärer Tabelle o.ä. gesprochen hat. Da hab ich nicht verstanden was gemeint war, aber jetzt scheint es mir klar zu sein.

Werde ich morgen gleich testen. Irgendwie will die Bahn mich heute nicht mehr in die Firma lassen
Ralph

Geändert von Jumpy (29. Jan 2018 um 16:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.756 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 17:41
Ganz simpler Ansatz:
Beim Einlesen der Daten erstellst du eine Liste der VG_IDs (z.B: TList<Integer> ). Dazu musst du eventuell einmal durch die ganze Query durch, da das Grid eventuell nur einen Teil der Daten abruft, die in seinen internen Puffer passen.
Im DrawCell-Event hast du ja für den aktuellen Datensatz die VG_ID in dem entsprechenden Feld. Nun suchst du den Index dieser VG_ID in der zuvor erstellten Liste. Je nachdem ob der Index gerade oder ungerade ist (kann man leicht mit der Funktion Odd() prüfen) malst du die Zeile in der einen oder anderen Farbe.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 30. Jan 2018, 09:31
Hallo und guten morgen,

habe jetzt erstmal den Ansatz von Delphi.Narium mit der Stringliste umgesetzt (@Uwe: Dieses Programm ist noch in D6 ohne Generics, sonst wäre dein Vorschlag noch einfacher) als einfachste Version einer Liste, arbeite halt einfach mit der ID als String. Funzt sehr gut.
Auch das Aktualisieren / Neuzeichnen nach Filter-Aktionen klappt schon, oder wenn wein modales Form auf und wieder zugeht, müssen ja die davon verdeckten Zellen neue gezeichnet werden, klappt alles.

Bei manchen Aktionen kommt es noch durcheinander, aber da muss ich nur noch die Stellen finden, an denen ich die Stringlist zurücksetzen muss, damit das da auch klappt, aber das krieg ich hin.

Vielen lieben Dank allen Helfenden
Ralph
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
989 Beiträge
 
Delphi 6 Professional
 
#6

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 16:47
Hmm..

Ich würde mir ne StringList nehmen und dort nach dem Name/Value Prinzip Einträge erzeugen.

Die Liste wird beim OnAfterOpen des Querys gelöscht.

Beim OnDrawCell wird nun in der Liste nach einem 'Name' mit der ID gesucht (StringList.NameOf()).
- Wenn Nicht vorhanden, dann ein Add mit ID=NewColor hinzufügen.
- Wenn Vorhanden, dann die Color (StringList.Value[]) der ID verwenden.

Wenn nun gescrollt wird, wird immer die passende Farbe zur ID verwendet, egal ob rauf oder runter.

Dann ist auch die Sortierung der Datenmenge egal, da die Farbe zur ID des Datensatzes geholt wird.

Wenn Du die StringList auf Sorted setzt, wird auch das Suchen darin schneller.

(Nur so eine Idee zur Umsetzung )
  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 01:09 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-2025 by Thomas Breitkreuz