Delphi-PRAXiS
Seite 3 von 3     123   

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/)
-   -   Zeilen eines TDBGrid "Blockweise" färben (https://www.delphipraxis.net/195018-zeilen-eines-tdbgrid-blockweise-faerben.html)

Delphi.Narium 29. Jan 2018 16:44

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;

HolgerX 29. Jan 2018 16:47

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 ;) )

Uwe Raabe 29. Jan 2018 16:51

AW: Zeilen eines TDBGrid "Blockweise" färben
 
Es würde auch reichen, wenn du dir die Farbe pro VorgangsID irgendwo hinterlegst.

Jumpy 29. Jan 2018 16:54

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:

Uwe Raabe 29. Jan 2018 17:41

AW: Zeilen eines TDBGrid "Blockweise" färben
 
Ganz simpler Ansatz:
Beim Einlesen der Daten erstellst du eine Liste der VG_IDs (z.B:
Delphi-Quellcode:
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
Delphi-Quellcode:
Odd()
prüfen) malst du die Zeile in der einen oder anderen Farbe.

Jumpy 30. Jan 2018 09:31

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 21:20 Uhr.
Seite 3 von 3     123   

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