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
DBGrid Zeilen einfärben
Re: DBGrid Zeilen einfärben
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;
-
- 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
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
und mit
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
OK dass sollte dann mein Problem Lösen
EDIT: Jo Es Funktioniert so wie muss
DANKE
Gruß
Frank
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 :=
Code: Alles auswählen
DBGrid1.Columns[1].Field
Code: Alles auswählen
DBGrid1.Columns[1].Field.AsInteger
EDIT: Jo Es Funktioniert so wie muss

DANKE

Gruß
Frank
-
- 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
Hallo wp_xyz,
habe nun dass mit dem "Darken" ausprobiert coole Sache
Es wird aber nur immer eine Zelle abgedunkelt - wie erreicht mann dass die gesammte Zeile abgedunkelt wird ?
Gruß Frank
habe nun dass mit dem "Darken" ausprobiert coole Sache

Es wird aber nur immer eine Zelle abgedunkelt - wie erreicht mann dass die gesammte Zeile abgedunkelt wird ?
Gruß Frank
Re: DBGrid Zeilen einfärben
In den DBGrid.Options dgRowSelect anmachen?