Graphic Delphi

Title: How to create an multiple colored Stringgrid ? / How to draw in a StringGrid-Cell ?
Question: The standard Delphi-StringGrid can only hold one color for all cells.
How to create an multiple colored Stringgrid ?
Answer:
I's easier than you assumed. You must simply override the DrawCell and manuelly draw some data on the canvas of the Stringgrid-Cell .
feel free to copy and reuse this sweet tiny component....
I hope this article is helpful for you .... for feedback - please rate
regards
Boris Benjamin Wittfoth
TBWStringGrid=class(TStringGrid)
private
protected
procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
AState: TGridDrawState); override;
public
{ just hold some data for each cell }
CellColor:array of array of TColor;
CellFontColor:Array of array of TColor;
CellData:array of array of REAL;
procedure RebuildDynColorArray; // net gut !!!!
procedure ResizeGrid(ColCount:Integer;RowCount:Integer;ClearAllFields:Boolean=TRUE);
procedure ResetGridCellData;
procedure ResetGrid;
procedure UnselectAll;
published
end;
function InvertColor(Color:TColor):TColor;
{ TBWStringGrid }
//Created at 05-Jul-2002 (14:12:19 ) by benjamin wittfoth
procedure TBWStringGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
AState: TGridDrawState);
begin
inherited;
if CellColor[ACol,ARow]=clBlack then EXIT;
With Canvas Do Begin
if (gdSelected in AState) then begin // wenn selektiert - INVERTIEREN
Font.Color:=InvertColor(CellFontColor[ACol,ARow]);
Brush.Color := InvertColor(CellColor[ACol,ARow]);
end
else begin // Ansonsten nicht !
Brush.Color := CellColor[ACol,ARow];
Font.Color:= CellFontColor[ACol,ARow];
end;
Brush.Style := bsSolid;
FillRect( ARect );
TextRect( ARect, ARect.left+2, ARect.top+2, Cells[ ACol, ARow ] );
End;
end;
//Created at 05-Jul-2002 (14:56:33 ) by benjamin wittfoth
procedure TBWStringGrid.RebuildDynColorArray;
begin
SetLength(CellColor,ColCount,RowCount);
SetLength(CEllFontColor,ColCount,RowCount);
SetLength(CellData,ColCount,RowCount);
end;
//Created at 10-Jul-2002 (08:11:25 ) by benjamin wittfoth
procedure TBWStringGrid.ResizeGrid(ColCount:Integer;RowCount:Integer;ClearAllFields:Boolean=TRUE);
begin
Self.RowCount:=RowCount;
Self.ColCount:=ColCount;
RebuildDynColorArray;
if ClearAllFields then
ResetGrid;
end;
//Created at 10-Jul-2002 (08:11:29 ) by benjamin wittfoth
procedure TBWStringGrid.ResetGridCellData;
var X,Y:Integer;
begin
for Y:=0 to RowCount-1 do
for X:=0 to ColCount-1 do
CellData[X,Y]:=0;
end;
//Created at 09-Jul-2002 (16:54:43 ) by benjamin wittfoth
procedure TBWStringGrid.ResetGrid;
var X,Y:Integer;
begin
for Y:=0 to RowCount-1 do begin
for X:=0 to ColCount-1 do begin
CellData[X,Y]:=0;
CellColor[X,Y]:=clWhite;
CellFontColor[X,Y]:=clBlack;
Cells[X,Y]:='';
end;
end;
end;
//Created at 09-Jul-2002 (11:08:35 ) by benjamin wittfoth
procedure TBWStringGrid.UnselectAll;
var ARect:TGridRect;
begin
ARect.Left:=0;ARect.Top:=0;ARect.Right:=0;ARect.Bottom:=0;
Selection:=ARect;
end;
function InvertColor(Color:TColor):TColor;
begin
case Color of
clAqua : RESULT:=clTeal;
clBlack : RESULT:=clWhite;
clBlue : RESULT:=clMaroon;
clDkGray : RESULT:=clFuchsia;
clFuchsia : RESULT:=clDkGray;
// clGray : RESULT:=clPurple;
clGreen : RESULT:=clRed;
clLime : RESULT:=clSilver;//clYellow;
clLtGray : RESULT:=clLime ;
clMaroon : RESULT:=clOlive; //clBlue;
clNavy : RESULT:=clNavy;
clOlive : RESULT:=clMaroon;//clNavy;
clPurple : RESULT:=clGray;
clRed : RESULT:=clYellow;//clGreen;
// clSilver : RESULT:=clLtGray;
clTeal : RESULT:=clAqua;
clWhite : RESULT:=clBlack;
clYellow : RESULT:=clRed;//clLime;
end;
end;