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 3  1 23      
Jumpy

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

Zeilen eines TDBGrid "Blockweise" färben

  Alt 26. Jan 2018, 14:06
Hallo,

ich weiß, wie man Zeilen eines Grids abwechselnd färbt, aber wie mach ich das Blockweise?

Ich habe ein Grid, wo immer mehrere Zeilen untereinander zu einem Vorgang gehören, jede Zeile hat eine eigene ID und mehrere Zusammen / Hintereinander die selbe VorgangsID. Unterschiedlich viele Zeilen gehören so zusammen.
Dementsprechend ist die Datenmenge sortiert nach "Order by VorgangsID, ID".

Jetzt möchte ich, dass das Grid nicht nach jeder Zeile sondern nach jedem Vorgang die ID wechselt. Aber wie mach ich das?

Was nicht klappt

Delphi-Quellcode:
// im OnOwnerDrawCell
 if GridIDChangeDetected then
    SwitchGridColor;
  SetLastGridID;
// usw.

procedure TCheckdaten.SwitchGridColor;
begin
  if CurrentGridColor=Color1 then
     CurrentGridColor:=Color2
  else
   CurrentGridColor:=Color1;
end;

procedure TCheckdaten.SetLastGridID;
begin
  Last_VG_ID:=Quelle.FieldByName('VG_ID').AsInteger;
end;

function TCheckdaten.GridIDChangeDetected:Boolean;
begin
  Result:=Last_VG_ID<>Quelle.FieldByName('VG_ID').AsInteger;
end;
Irgendwie hab ich naiv angenommen, dass beim Zeichnen des Grids die Query einmal durchlaufen wird und das dann so funzt. Aber dem ist wahrscheinlich nicht so.
Ralph
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 26. Jan 2018, 14:19
Das Malen passiert erst bei der Anzeige (nur der sichtbare Bereich) und nicht beim Laden der Daten.

Habe Deine Idee vermutlich noch nicht so ganz verstanden, aber hier müsste irgendwo eine Änderung im Quelltext stattfinden:
Delphi-Quellcode:
procedure TCheckdaten.SwitchGridColor;
begin
  If GridIDChangeDetected then begin
    if CurrentGridColor = Color1 then
       CurrentGridColor := Color2
    else
     CurrentGridColor := Color1;
  end;
end;
  Mit Zitat antworten Zitat
Jumpy

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 26. Jan 2018, 14:25
Wenn ich Zeilenweise Färbe, dann kann ich ja so Dinge machen wie:
Wenn (Query.FieldByName('ID').AsInterger mod 2)=0 dann Farbwechsel.

Das hilft mir ja nicht, denn ich muss die Zeile der jetzt gezeichneten Celle mir der Zeile davor vergleichen, ob sich bei der VG_ID eine Änderunge ergeben hat, dann Farbwechsel.

Wenn beim Zeichnen halt die Query nicht von oben nach unten durchgegangen wird hilft das ganze ja auch nicht.
Ralph
  Mit Zitat antworten Zitat
RSF

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 26. Jan 2018, 15:05
Ich hoffe ich habe es richtig verstanden.

Ich mache es so:

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;
Ronald
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 26. Jan 2018, 17:25
Hallo,
ich würde mir eine Hilfsklasse bauen, z.B. eine StringList.
Die bekommt so viele Einträge wie Grid-Zeilen (DBGrid.Dataet.RowCount)
Du füllst du mit einfach mit passenden Zahlen (0,1, oder sowas) für die einzelnen Blöcke,
und benutzt die StringList dann im OnDrawCell.

Viel einfacher hättest Du mit einem normalen TStringGrid, dort könntest du mit Objects oder eine versteckten Spalte.
Heiko
  Mit Zitat antworten Zitat
Jumpy

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 09: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
155 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 11:33
welches Grid Ereignis benutzt du DrawColumnCell ?
Ronald
  Mit Zitat antworten Zitat
Jumpy

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 12: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
155 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 12: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.
Miniaturansicht angehängter Grafiken
dbgrid.png  
Ronald
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Zeilen eines TDBGrid "Blockweise" färben

  Alt 29. Jan 2018, 12:44
Hast Du für das Programm zufällig die JVCL zur Verfügung?

Dann könnte sich ein Blick auf TJvDBGrid lohnen.
Der Austausch ist einfach:
Altes Grid raus, neues Grid rein, solange der Name gleich bleibt, sollte das erstmal ohne Nebenwirkungen gehen.

Die Methoden für die farblische Gestaltung erscheinen mir aber deutlich leistungsfähiger.

Ein Grundproblem wird aber bleiben:

Beim Scrollen durch die Datenmenge, der Auswahl einer Zeile bzw. dem Aufheben der Auswahl ... muss man immer auf den Satz davor schauen, um auf die richtige Farbgestaltung zu kommen.

Das wird vermutlich zu einem wilden "Gehopse" mit Dataset.Next und Dataset.Prev führen.

Hab's gestern mal versucht, mir ist da keine sinnvolle und immer funktionierende Lösung eingefallen.

Beim Öffnen der Datenmenge und dem vorwärtsscrollen hat's ja noch geklappt, aber rückwärts oder bei der Auswahl eines Datensatzes und folgendem Wechsel vorwärts oder rückwärts bin ich gescheitert.

Was man eventuell noch versuchen könnte:

Neben dem DBGrid noch ein unsichtbares Stringgrid "mitführen".

Beim Lesen des Daten wird in das StringGrid je Datensatz dessen RecNo und seine Farbe als Zeile eingefügt. Scrollt man nun durch die Datenmenge, so schaut man dort nach, ob die RecNo schon vorhanden ist. Wenn ja, wird dem StringGrid der Wert für die Farbe entnommen, andernfalls muss die Farbe ermittelt werden und dann im StringGrid eine entsprechende Zeile eingefügt werden.

Oder immer dann, wenn eine neue VorgangsID auftaucht wird die im StringGrid mit der entsprechenden Farbe vermerkt. Bei einem Datensatzwechsel wird dort dann nachgeschaut, welche Farbe zu vergeben ist. Das könnte im Ereignis OnDrawColumnCell realisierbar sein.

Bei kleinen Datenmengen mag das insgesamt so angehen, für große Datenmengen dürfte es aber eher ungeeignet sein.

Oder im DataSet eine zusätzliche Spalte einfügen für den Farbwert. Die Spalte darf halt nur nicht angezeigt werden. Dann könnte man beim Scrollen die Farbe dort entnehmen. Nur bei der erstmaligen Anzeige eines Datensatzes muss halt die Farbe erst aus dem vorherigen Datensatz ermittelt werden und dann im DataSet eingefügt werden.
Bei einer ReadOnly-Datenmenge dürfte das aber auch schon wieder scheitern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 03:44 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