DBGrid Zeilen einfärben

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

DBGrid Zeilen einfärben

Beitrag von DL3AD »

Hallo,

ich möchte bei einem DBGrid die Zeilenfarbe in abhängigkeit von einem Zellinhalt ändern.
Dazu wollte ich das OnDrawColumnCell Event verwenden.

Wie kann ich die Zeilenfarbe ändern ?

Gruß Frank

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: DBGrid Zeilen einfärben

Beitrag von wp_xyz »

OnDrawColumnCell würde ich nicht nehmen, weil du da alles neu zeichnen muss. Viel besser geeignet ist OnPrepareCanvas, das wird unmittelbar vor der Ausgabe aufgerufen, nachdem alle Fonts und Farben bereits eingestellt sind. So kannst du "in letzter Minute" noch schnell die Farbe des Hintergrunds, zum Beispiel, anpassen. Im folgenden Beispiel wird der Zellhintergrund jeder Zeile je nach dem Wert in Spalte #1 unterschiedlich eingefärbt; außerdem wird die Farbe der selektierten Zeile etwas abgedunkelt und die Schrift fett gesetzt. Die Font-Farbe wird je nach Hintergrundfarbe weiß oder schwarz gewählt, so dass die Schrift immer optimal sichtbar ist (nicht wie bei den beliebten Sternchen-Texten hellgrau auf weiß):

Code: Alles auswählen

uses
  LclIntf, Math;
 
{ TForm1 }
 
function Darken(AColor: TColor; ADelta:Integer): TColor;
begin
  Result := Rgb(
    EnsureRange(GetRValue(AColor) - ADelta, 0, 255),
    EnsureRange(GetGValue(AColor) - ADelta, 0, 255),
    EnsureRange(GetBValue(AColor) - ADelta, 0, 255)
  );
end;
 
function ContrastColor(AColor: TColor): TColor;
begin
  if GetRValue(AColor) + GetGValue(AColor) + GetBValue(AColor) < 3*128 then
    Result := clWhite
  else
    Result := clBlack;
end;
 
procedure TForm1.DBGrid1PrepareCanvas(sender: TObject; DataCol: Integer;
  Column: TColumn; AState: TGridDrawState);
var
  F: TField;
  col: TColor;
begin
  col := ColorToRGB(DBGrid1.Canvas.Brush.Color);
  F := DBGrid1.Columns[1].Field;
  if F <> nil then begin
    if F.AsFloat < 80000 then
      col := clYellow
    else
    if F.AsFloat < 90000 then
      col := clRed
    else
    if F.AsFloat <100000 then
      col := clSilver;
  end;
  if [gdSelected, gdFocused] * AState <> [] then begin
    DBGrid1.Canvas.Font.Style := [fsBold];
    DBGrid1.Canvas.Brush.Color := Darken(col, 32);
  end else begin
    DBGrid1.Canvas.Brush.Color := col;
  end;
  DBGrid1.Canvas.Font.Color := ContrastColor(DBGrid1.Canvas.Brush.Color);
end;

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: DBGrid Zeilen einfärben

Beitrag von DL3AD »

Hallo wp_xyz,

Danke für die schnelle Antwort.
Der Tipp mit OnPrepareCanvas ist gut.
Hmmm nun muss ich erstmal schauen um die 10% Code zu finden wo ich die Zeilenfarbe einstelle - vermutlich dass hier

Code: Alles auswählen

 
DBGrid1.Canvas.Brush.Color :=
 

und mit

Code: Alles auswählen

 
DBGrid1.Columns[1].Field
 

spreche ich das Feld an in dem die Info zum einfärben enthalten ist - d.h. wenn ich den Inhalt als Integer auslese dann so

Code: Alles auswählen

 
DBGrid1.Columns[1].Field.AsInteger
 


OK dass sollte dann mein Problem Lösen

EDIT: Jo Es Funktioniert so wie muss :mrgreen:
DANKE 8)

Gruß
Frank

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: DBGrid Zeilen einfärben

Beitrag von DL3AD »

Hallo wp_xyz,

habe nun dass mit dem "Darken" ausprobiert coole Sache :mrgreen:
Es wird aber nur immer eine Zelle abgedunkelt - wie erreicht mann dass die gesammte Zeile abgedunkelt wird ?

Gruß Frank

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: DBGrid Zeilen einfärben

Beitrag von wp_xyz »

In den DBGrid.Options dgRowSelect anmachen?

Antworten