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 1 von 2  1 2      
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, 08:29
Hallo,

sorry die späte Meldung, war halt Wochenende, und da bleibt der Rechner aus .

Also prinzipiell funktioniert das schon, wie ich das oben beschrieben habe, ich hatte nur einen Denkfehler und hab die falsche ID verglichen. Das heißt ich kann die Zeilen Blockweise alternierend einfärben, zumindest beim ersten mal!

Das neue Problem ist nämlich jetzt, dass die ausgewählte Zeile (gdSelected in State) wie üblich anders gefärbt ist, gehighlighted. Das ist natürlich für diese Zeile kein Problem.

Aber wenn ich nun in eine andere Zeile klicke, so wird diese nun gehighlighted, aber die alte Zeile muss nun ja wieder neu gezeichnet werden und da fehlt dann halt der Kontext, da eben nur einzelne Zeilen neu gezeichnet werden und nicht das ganze Grid.

Ich müsste vielleicht sowas machen wie OnSelectionChange->Grid.Repaint, aber ich hab da im Grid kein Event für gefunden.
Ralph
  Mit Zitat antworten Zitat
RSF

Registriert seit: 13. Mär 2008
156 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 10:33
welches Grid Ereignis benutzt du DrawColumnCell ?
Ronald
  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, 11:12
welches Grid Ereignis benutzt du DrawColumnCell ?
Ja genau. Ich habe hier leider eine alte Anwendung mit Datensensitiven-Controls, hier halt das TDBGrid und die Anforderung des Einfärbens kam jetzt neu auf. Ich will halt ungern das ganze Programm umstellen müssen auf TStringGrid o.ä., weil ich dann für diese kleine Änderung fast alles neu machen muss.
Ralph
  Mit Zitat antworten Zitat
RSF

Registriert seit: 13. Mär 2008
156 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 11:35
OK, hast du mein Beispiel aus #4 probiert
Delphi-Quellcode:
procedure TRechnungen.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
if (gdSelected in State) or (gdFocused in State) then
   DBGrid1.Canvas.Font.Color := clBlue;
  
   if DataModule2.Rechnung.FieldByName('Bezahlt').AsBoolean=True then
   Begin
   DBGrid1.Canvas.Brush.Color := clGray;
   end;
   if DataModule2.Rechnung.FieldByName('Bezahlt').AsBoolean=False then
   Begin
   DBGrid1.Canvas.Brush.Color := clMoneyGreen;
   end;
   DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
So färbe ich Zeilen. Die Sortierung (Gruppen) macht ja eigentlich ein SQL-Script.
Das geht nicht nur einmal am Anfang auch beim durchklicken.
Angehängte Grafiken
Dateityp: png dbGrid.png (187,7 KB, 20x aufgerufen)
Ronald
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 11:52
OK, hast du mein Beispiel aus #4 probiert
Im Unterschied zu Ralph's Anforderung lässt sich dein Status direkt aus dem aktuellen Datensatz ermitteln. Bei der Frage geht es aber darum, alle Datensätze mit gleicher ID auch gleich zu färben und zusätzlich bei jedem Wechsel der ID diese Farbe umzuschalten. Das lässt sich allein aus dem aktuellen Datensatz nicht ermitteln.

@Ralph: Welche Datenzugriffskomponente setzt du denn ein?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
685 Beiträge
 
Delphi 12 Athens
 
#6

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 11:57
Pack doch ein berechnetes Feld rein, welches den Status "leer bzw 0" (also Farbe ermitteln), "1" (Farbe 1) und "2" (Farbe 2) hat. Dann setze die Farbe anhand dieses Flags.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 12:01
Für die Berechnung sind aber Informationen aus dem vorherigen Datensatz (VorgangsID) erforderlich.
Berechnet Felder beziehen sich aber (soweit ich weiß) auf den aktuellen Datensatz. Der Datensatz enthält also bereits alle zur Berechnung erforderlichen Informationen. Diese Bedingung ist hier aber nicht erfüllt.
  Mit Zitat antworten Zitat
Jumpy

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 12:25
@Ralph: Welche Datenzugriffskomponente setzt du denn ein?
Da ist eine TADOQuery dahinter, dann TDatasource, dann das TDBGrid.


@all: Danke für die bisherigen Vorschläge. Das Problem hat Uwe gut beschrieben, nicht der aktuelle Datensatz alleine bestimmt ob/wie gefärbt wird.

Ich überlege jetzt (nach dem ersten Zeichnen) eine Event-Prozedur an das OnDataChange der TDatasource zu hängen. Feuert dieses, dann
- weise dem OnDataChange nil zu
- Komplettes Grid.Repaint
- dann weise dem OnDataChange wieder die Prozedur zu
(da das OnDataChange während eines Repaint ohne Ende feuert, muss man das mMn vorher ausschalten).

Komme aber erst später dazu das mal zu testen, da ich gerade nicht in der Firma bin.
Ralph
  Mit Zitat antworten Zitat
RSF

Registriert seit: 13. Mär 2008
156 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 12:43
@Uwe Raabe Danke für die verständliche Erklärung.
Könnte es eventuell mit einer temporären Tabelle(im dbGrid) mit den erforderlichen Flags gehen. Die entsprechend mit den veränderten IDs aktualisiert wird.
Ich meine damit das Problem auf DB-Ebene zu lösen.
Oder ist der Gedankengang wieder daneben.
Ronald

Geändert von RSF (29. Jan 2018 um 13:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 13:33
Da ist eine TADOQuery dahinter, dann TDatasource, dann das TDBGrid.
Ist die Query Read-Only und passt komplett in den Speicher?

In dem Fall könntest du die Daten in ein TClientDataSet oder ein anderes InMemory-Dataset übernehmen und dabei ein zusätzliches Feld für die Farbe besetzen. Da die Übernahme sequentiell erfolgt, kann der ursprüngliche Algorithmus für das Färben verwendet werden.

Das funktioniert natürlich nicht so gut, wenn die Daten im Grid verändert werden. In dem Fall kannst du aber vielleicht ein temporäre Tabelle anlegen und diese als Lookup verwenden. Die Tabelle hat nur zwei Felder (ID, Farbe), wobei ID mit der ID der Originaltabelle identisch ist.

Wenn die Query eine überschaubare Datenmenge zurückliefert, kannst du nach dem Öffnen auch einfach ein Dictionary (ID, Farbe) anlegen. Es läuft darauf hinaus, daß du irgendwie für jeden Datensatz eine Farbe hinterlegst.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:50 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