Graphic Delphi

Title: Coloring Cells in a StringGrid / DBGrid
Question: StringGrids / DBGrids with colored cells looks very nice and you can inform the user about importent data inside the Grid.
Answer:
Unfortunately you can't use the same method for coloring StringGrids and DBGrids. So first let's have a look to the StringGrid:
1. StringGrid
=============
Use the "OnDrawCell"-event to make your StringGrids colorful! The following Code shows how to give your Grid a red background color. The second column will be colored with green background.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
Const //define your color here. Of course you
//can use default colors too.
clPaleGreen = TColor($CCFFCC);
clPaleRed = TColor($CCCCFF);
begin
//Does the cell have the focus you have to paint it with other colors
if (gdFocused in State) then begin
StringGrid1.Canvas.Brush.Color := clBlack;
StringGrid1.Canvas.Font.Color := clWhite;
end
else //Does the cell have NOT the focus you can use
//your personal colors here
if ACol = 2 //the second Column should be
//green, the other cells red
then StringGrid1.Canvas.Brush.color := clPaleGreen
else StringGrid1.canvas.brush.Color := clPaleRed;
//Now Paint the cells, but only, if the cell isn't the Title- Row/Column
//This of course depends whether you have title-Row/Columns or not.
If (ACol 0) and (ARow0) then
begin
//Painting the Background
StringGrid1.canvas.fillRect(Rect);
//Painting the Text. Here you can improve the code with
// using alignment and so on.
StringGrid1.canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
end;
end;
If you want to colorize your cells depending on values in the cells you can replace the 3 lines (if Acol = 2 ......) with something like this
if StringGrid1.Cells[ACol,ARow] = 'highlight it'
then StringGrid1.Canvas.Brush.color := clPalered
else StringGrid1.canvas.brush.Color := clwhite;
But now lets coloring DBGrids:
2. DBGrid
=========
It's much easier to give color to DBGrids. Here you have to use the "OnDrawColumnCell"-Event. The following example is coloring the Cells of Column "Status" when the value is not "a".
If you want to color the whole line you only have to delete the "If..." statement (see below)
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn;
State: TGridDrawState);
const
clPaleGreen = TColor($CCFFCC);
clPaleRed = TColor($CCCCFF);
begin
If Column.FieldName = 'Status' then //Remove this line, if you want
//to highlight the whole line
If Column.Field.Dataset.FieldbyName('Status').AsString 'a'
then
If (gdFocused in State) //does the cell have the focus?
then dbgrid1.canvas.brush.color := clBlack //focused
else dbgrid1.canvas.brush.color := clPaleGreen; //not focused
//Now let's paint the cell using a Default-Method:
dbgrid1.DefaultDrawColumnCell(rect,DataCol,Column,State)
end;
That's all. Doesn't it look nice?