So jetzt habe ich doch eine Lösung gefunden:
Ich habe einen Array
Spaltenfarbe : Array[0..100] of TColor;
definiert. Der Einfachheit halber 100 Elemente = mehr als ich maximal brauche.
Die Farbwerte im Array werden mit clWhite initialisiert
Delphi-Quellcode:
for i := 0 to 100 do
begin
Spaltenfarbe[i] := clWhite;
end;
Der Eventhandler SelectCell speichert mir die Spalte / Reihe der angeklickten Zelle
Delphi-Quellcode:
procedure TForm1.StringGridVorschauSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
SelectedCellCol := ACol;
SelectedCellRow := ARow;
//ShowMessage('Col=' + IntToStr(SelectedCellCol) + ' Row=' + IntToStr(SelectedCellRow) );
end;
Doppelklick ruft den Farbauswahldialog auf
Delphi-Quellcode:
procedure TForm1.StringGridVorschauDblClick(Sender: TObject);
begin
ColorCellCol := SelectedCellCol;
ColorCellRow := SelectedCellRow;
ColorDialog1.Execute;
Spaltenfarbe[ColorCellCol] := ColorDialog1.Color;
end;
Und weist dem Array-Element die Farbe aus dem Colordialog zu.
Dem Farbauswahldialog habe ich gleich noch einen hinweisgebenden Titel verpasst
Delphi-Quellcode:
procedure TForm1.ColorDialog1Show(Sender: TObject);
begin
SetWindowText(ColorDialog1.Handle, 'Farbe für Spalte '
+ StringGridVorschau.Cells[SelectedCellCol, 0] + ' setzen' );
end;
Im DrawCell-Eventhandler werden dann die farbigen Rects und mit weiß/schwarz als Kontrastfarbe
der Text geschrieben.
Aber nur dann wenn auch eine Farbe <> weiß gesetzt wurde.
Delphi-Quellcode:
procedure TForm1.StringGridVorschauDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
with sender as Tstringgrid do
if ( (ARow = 0) and (Spaltenfarbe[ACol] <> clWhite) ) then
begin
Canvas.brush.Color := Spaltenfarbe[ACol];
Canvas.Font.Color := BlackWhiteContrastColor(Spaltenfarbe[ACol]);
canvas.fillRect(Rect);
canvas.TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]);
end;
end;
Die Schriftfarbe schwarz/weiß wird von dieser function ermittelt
Delphi-Quellcode:
function BlackWhiteContrastColor(value: TColor):TColor;
var
intensity : Integer;
begin
value := ColorToRGB(value);
intensity := GetBValue(value) * 21 // Blue
+ GetGValue(value) * 174 // Green
+ GetRValue(value) * 61; // Red
// intensity = 0 -> dark
// intensity = 255*256 -> bright
if intensity >= (128*256) then
Result := clBlack
else
Result := clWhite;
end;
viele Grüße Stefan