Цвет шрифта на StringGrid с помощью firemonkey
Я изменяю цвет фона на основе данных, но это делает мой текст трудным для чтения, поэтому мне нужно изменить цвет шрифта (на белый, если у меня более темный цвет), но я не могу найти способ сделать это, я использую Delphi XE8.
if not (isSelected) then
begin
case StrToInt((Sender as TStringGrid).Cells[0, Row]) of
0:
begin
//TTextCell(CellCtrl).StyledSettings := [];
TTextCell(CellCtrl).FontColor := Cores[3 - auxCor - 1];
RowColor.Color := Cores[auxCor-1];
end;
1:
begin
//TTextCell(CellCtrl).StyledSettings := [];
TTextCell(CellCtrl).FontColor := TAlphaColors.Black;
RowColor.Color := TAlphaColors.Red;
end;
2:
begin
//TTextCell(CellCtrl).StyledSettings := [];
TTextCell(CellCtrl).FontColor := TAlphaColors.Black;
RowColor.Color := TAlphaColors.Yellow;
end;
3:
begin
//TTextCell(CellCtrl).StyledSettings := [];
TTextCell(CellCtrl).FontColor := TAlphaColors.Black;
RowColor.Color := TAlphaColors.LightGreen;
end;
end;
end;
Canvas.FillRect(Bounds, 0, 0, [], 1, RowColor);
TGrid(Sender).DefaultDrawColumnCell(Canvas, Column, Bounds, Row,
Value, State);
(Sender as TStringGrid).Selected := SelectedRow;
часть TTextCell ничего не делает (у меня есть другой пример с аналогичным случаем, когда я устанавливаю зеленый цвет, поэтому мне нужно, чтобы текст был белым (если белый цвет оказывается трудным для чтения, я попробую другие цвета).
Ядра представляет собой массив с черно-белым TAlphaColors
1 ответ
Понял:
пришлось изменить цвет сетки прямо перед вызовом метода DefaultDrawColumnCell:
procedure TFrmMainMaximized.StringGridDrawColumnCell(
Sender: TObject; const Canvas: TCanvas; const Column: TColumn;
const Bounds: TRectF; const Row: Integer; const Value: TValue;
const State: TGridDrawStates);
var
RowColor : TBrush;
isSelected : boolean;
FontColor : Integer;
SelectedRow : Integer;
begin
RowColor := Tbrush.Create(TBrushKind.Solid, TAlphaColors.Alpha);
isSelected := ((Sender as TStringGrid).Selected = Row) and
((Sender as TStringGrid).ColumnIndex = Column.Index);
SelectedRow := (Sender as TStringGrid).Selected;
if not (isSelected) then
begin
case StrToInt((Sender as TStringGrid).Cells[0, Row]) of
0:
begin
FontColor := Cores[3 - auxCor - 1];
RowColor.Color := Cores[auxCor-1];
end;
1:
begin
FontColor := TAlphaColors.Black;
RowColor.Color := TAlphaColors.Red;
end;
2:
begin
FontColor := TAlphaColors.Black;
RowColor.Color := TAlphaColors.Yellow;
end;
3:
begin
FontColor := TAlphaColors.Black;
RowColor.Color := TAlphaColors.LightGreen;
end;
end;
end
else
begin
case StrToInt((Sender as TStringGrid).Cells[0, Row]) of
0:
begin
FontColor := Cores[auxCor - 1];
RowColor.Color := Cores[3 - auxCor-1];
end;
1:
begin
FontColor := TAlphaColors.Black;
RowColor.Color := TAlphaColors.Pink;
end;
2:
begin
FontColor := TAlphaColors.Black;
RowColor.Color := TAlphaColors.LightYellow;
end;
3:
begin
FontColor := TAlphaColors.White;
RowColor.Color := TAlphaColors.Green;
end;
end;
end;
Canvas.FillRect(Bounds, 0, 0, [], 1, RowColor);
TGridAccess((Sender as TStringGrid)).GetTextSettingsControl.ResultingTextSettings.FontColor := FontColor;
TGrid(Sender).DefaultDrawColumnCell(Canvas, Column, Bounds, Row,
Value, State);
inherited;
end;
свойство TextSettingControl из сетки защищено, поэтому мне пришлось создать класс доступа с помощью этой функции:
function TGridAccess.GetTextSettingsControl: TTextCell;
begin
result := inherited TextSettingsControl;
end;