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
Seite 3 von 3     123   
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#21

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 17: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 17:46 Uhr)
  Mit Zitat antworten Zitat
HolgerX

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 17: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
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 17:51
Es würde auch reichen, wenn du dir die Farbe pro VorgangsID irgendwo hinterlegst.
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.736 Beiträge
 
Delphi 6 Enterprise
 
#24

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 17: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 17:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 18: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.736 Beiträge
 
Delphi 6 Enterprise
 
#26

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 30. Jan 2018, 10: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
Antwort Antwort
Seite 3 von 3     123   


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 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz