I am doing this :
procedure TForm1.BitBtn1Click(Sender: TObject);
var dtStart: TDateTime;
I: Integer;
begin
dtStart := DateTimePicker1.Date;
for I := 0 to 7 do
AdvStringGrid1.Cells[I 1, 0] := uppercase(FormatDateTime('DD/MM/YYYY DDD', dtStart I));
end;
Is there a way to colour a column when (example) Sunday (SUN) appears? I would like the SUN column (all the way down) to appear in different color than the rest.
CodePudding user response:
You can do this by using the OnDrawCell
event (do not set DefaultDraw
to False). Here's an example with a regular TStringGrid
:
// Sample to populate the cells with the days of the week
procedure TForm1.FormShow(Sender: TObject);
var
r, c: Integer;
begin
StringGrid1.ColCount := 8; // Ignore fixed column and row for this example
StringGrid1.RowCount := 8;
for c := 1 to StringGrid1.ColCount - 1 do
for r := 1 to StringGrid1.RowCount - 1 do
StringGrid1.Cells[c, r] := FormatSettings.ShortDayNames[c];
end;
// Assign this to the StringGrid's OnDrawCell using the Object Inspector
// Events tab.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
CellText: string;
begin
if (ARow > 0) and (ACol > 0) then
begin
CellText := StringGrid1.Cells[ACol, ARow];
if Pos('Sun', CellText) > 0 then
begin
StringGrid1.Canvas.Brush.Color := clRed;
StringGrid1.Canvas.FillRect(Rect);
end
else
StringGrid1.Canvas.Brush.Color := clWindow;
end;
// The ' 4' is from the VCL; it's hard-coded when themes are enabled.
// You should probably check the grid's DrawingStyle to see if it's
// gdsThemed, and adjust as needed. I leave that as an exercise for you.
StringGrid1.Canvas.TextOut(Rect.Left 4, Rect.Top 4, CellText);
end;
Sample output of the exact code above:
Here's a second example that outputs just exactly what you want (except I didn't convert the SUN to caps):
procedure TForm1.FormShow(Sender: TObject);
var
r, c: Integer;
begin
StringGrid1.DefaultColWidth := 100;
StringGrid1.ColCount := 8;
StringGrid1.RowCount := 8;
for c := 1 to StringGrid1.ColCount - 1 do
for r := 1 to StringGrid1.RowCount - 1 do
StringGrid1.Cells[c, r] := FormatDateTime('mm/dd/yyyy ddd',
Date() c r - 1);
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
CellText: string;
begin
if (ARow > 0) and (ACol > 0) then
begin
CellText := StringGrid1.Cells[ACol, ARow];
if Pos('Sun', CellText) > 0 then
StringGrid1.Canvas.Brush.Color := clRed
else
StringGrid1.Canvas.Brush.Color := clWindow;
StringGrid1.Canvas.FillRect(Rect);
end;
StringGrid1.Canvas.TextOut(Rect.Left 4, Rect.Top 4, CellText);
end;
Here's the capture to match the second sample:
CodePudding user response:
Using the DrawCell procedure is the way to go. This example handles the possibility that the column with "Sun" might be in any column. Leave DefaultDrawing to the default - true.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with Sender as TStringGrid do
if Pos('Sun', Cells[ACol, 0])>0 then begin
Canvas.Brush.Color := clRed;
Canvas.FillRect(Rect);
Canvas.Font.Color := clwhite;
Canvas.TextOut(Rect.Left 2, Rect.Top 2, Cells[ACol, ARow]);
end;
end;