DBGrid Zeilen einfärben

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.

DBGrid Zeilen einfärben

Beitragvon DL3AD » 20. Sep 2017, 15:50 DBGrid Zeilen einfärben

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
DL3AD
 
Beiträge: 371
Registriert: 13. Sep 2013, 11:07
Wohnort: Rügen
OS, Lazarus, FPC: Win7 (L 1.8.0 FPC 3.0.4) und Debian Stretch (L 1.8.0 FPC 3.0.4) | 
CPU-Target: 32Bit/64Bit
Nach oben

Beitragvon wp_xyz » 20. Sep 2017, 16:17 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;
wp_xyz
 
Beiträge: 2688
Registriert: 8. Apr 2011, 08:01

Beitragvon DL3AD » 20. Sep 2017, 17:17 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
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: 371
Registriert: 13. Sep 2013, 11:07
Wohnort: Rügen
OS, Lazarus, FPC: Win7 (L 1.8.0 FPC 3.0.4) und Debian Stretch (L 1.8.0 FPC 3.0.4) | 
CPU-Target: 32Bit/64Bit
Nach oben

Beitragvon DL3AD » 1. Okt 2017, 12:58 Re: DBGrid Zeilen einfärben

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
DL3AD
 
Beiträge: 371
Registriert: 13. Sep 2013, 11:07
Wohnort: Rügen
OS, Lazarus, FPC: Win7 (L 1.8.0 FPC 3.0.4) und Debian Stretch (L 1.8.0 FPC 3.0.4) | 
CPU-Target: 32Bit/64Bit
Nach oben

Beitragvon wp_xyz » 1. Okt 2017, 16:05 Re: DBGrid Zeilen einfärben

In den DBGrid.Options dgRowSelect anmachen?
wp_xyz
 
Beiträge: 2688
Registriert: 8. Apr 2011, 08:01

• Themenende •

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried