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?