![]() |
AW: Zeilen eines TDBGrid "Blockweise" färben
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; |
AW: Zeilen eines TDBGrid "Blockweise" färben
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 ;) ) |
AW: Zeilen eines TDBGrid "Blockweise" färben
Es würde auch reichen, wenn du dir die Farbe pro VorgangsID irgendwo hinterlegst.
|
AW: Zeilen eines TDBGrid "Blockweise" färben
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 :cry: |
AW: Zeilen eines TDBGrid "Blockweise" färben
Ganz simpler Ansatz:
Beim Einlesen der Daten erstellst du eine Liste der VG_IDs (z.B: 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 |
AW: Zeilen eines TDBGrid "Blockweise" färben
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 :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:22 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