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.
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: