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;- 
				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
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
- 
				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
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?
			
			
									
									
						 Verein
Verein 
 Links
Links Suche
Suche