beschäftige mich nach ein paar Jahren Pause wieder mit der Programmierung unter Lazarus/FPC. Ich bin mittlerweile auf MacOS umgestiegen, aber das sollte hierbei eigentlich keine Rolle spielen.
Ich möchte die aktive Zeile / Datensatz in einem DBGrid mit einem Farbverlauf darstellen. dgRowSelect ist gesetzt. Einfarbig sieht meine Lösung wie folgt aus und sie funktioniert auch:
Code: Alles auswählen
procedure TfrmMain.DBGrid1PrepareCanvas(sender: TObject; DataCol: Integer;
  Column: TColumn; AState: TGridDrawState);
var
  row : integer;
  R: TRect;
  Grid: TDBGrid;
begin
  Grid := Sender as TDBGrid;
  with Grid do
  begin
    row := DataSource.DataSet.RecNo;
    // Standard-Zeilenhintergrund
    if Odd(row) then
      Canvas.Brush.Color := RGBToColor(240, 245, 254)
    else
      Canvas.Brush.Color := clWhite;
    // Selektierte Zeile
    if (gdSelected in AState) and Focused then
    begin
      Canvas.Font.Style := [fsBold];
      Canvas.Brush.Color := RGBToColor(85, 148, 212);
      Canvas.Font.Color := clWhite;
    end;
  end;
end;
Code: Alles auswählen
...
    if (gdSelected in AState) and Focused then
    begin
      R := CellRect(DataCol, Row - 1);
      // Verlauf 
      FillGradient(Canvas, R, RGB(125, 125, 125), RGB(85, 148, 212), True);
      Canvas.Font.Style := [fsBold];
      Canvas.Font.Color := clWhite;
    end;
...
Code: Alles auswählen
procedure TfrmMain.FillGradient(FCanvas: TCanvas; const ARect: TRect;
  StartColor, EndColor: TColor; Vertical: Boolean = True);
var
  i, Steps: Integer;
  R1, G1, B1, R2, G2, B2: Byte;
  R, G, B: Double;
  Ratio: Double;
  LineRect: TRect;
begin
  // Schrittanzahl je nach Richtung bestimmen
  if Vertical then
    Steps := ARect.Bottom - ARect.Top
  else
    Steps := ARect.Right - ARect.Left;
  if Steps <= 0 then Exit;
  // Start- und Endfarben zerlegen
  R1 := GetRValue(ColorToRGB(StartColor));
  G1 := GetGValue(ColorToRGB(StartColor));
  B1 := GetBValue(ColorToRGB(StartColor));
  R2 := GetRValue(ColorToRGB(EndColor));
  G2 := GetGValue(ColorToRGB(EndColor));
  B2 := GetBValue(ColorToRGB(EndColor));
  for i := 0 to Steps - 1 do
  begin
    Ratio := i / Steps;
    R := R1 + (R2 - R1) * Ratio;
    G := G1 + (G2 - G1) * Ratio;
    B := B1 + (B2 - B1) * Ratio;
    Canvas.Pen.Color := RGB(Round(R), Round(G), Round(B));
    Canvas.Brush.Color := Canvas.Pen.Color;
    if Vertical then
      LineRect := Rect(ARect.Left, ARect.Top + i, ARect.Right, ARect.Top + i + 1)
    else
      LineRect := Rect(ARect.Left + i, ARect.Top, ARect.Left + i + 1, ARect.Bottom);
    Canvas.FillRect(LineRect);
  end;
end;
Was mache ich hier falsch?
 
  
  Verein
Verein 
 Links
Links Suche
Suche