Author: Tomas Rutkauskas
Is it possible to create an OnDrawCell event to draw the cell text in a way that it
looks like in Excel? For example, I don't want to truncate the text if the right
adjacent cell is empty.
Answer:
You can do that but it is not quite as easy as it may look at first glance. The
problem you may run into is that something may invalidate the right adjacent cell
in your scenario but not the cell holding the text. So the OnDrawCell event would
only fire for the empty cell, not for the one holding the text. So some work has to
be done to make sure the cell holding the text is invalidated as well when one of
the adjacent cells is invalidated.
1
2 procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
3 Rect: TRect; State: TGridDrawState);
4 var
5 i, x, y: Integer;
6 begin
7 if gdFixed in State then
8 Exit;
9 if ARow > 1 then
10 Exit;
11 {Draw row 1 with text from cell 1,1 spanning all cells in the row}
12 with sender as TStringGrid do
13 begin
14 {Extend rect to include grid line on right, if not last cell in row}
15 if aCol < Pred(ColCount) then
16 Rect.Right := Rect.Right + GridlineWidth;
17 {Figure out where the text of the first cell would start relative to the
18 current cells rect}
19 y := Rect.Top + 2;
20 x := Rect.Left + 2;
21 for i := 1 to aCol - 1 do
22 x := x - ColWidths[i] - GridlineWidth;
23 {Paint cell pale yellow}
24 Canvas.Brush.Color := $7FFFFF;
25 Canvas.Brush.Style := bsSolid;
26 Canvas.FillRect(Rect);
27 {Paint text of cell 1,1 clipped to current cell}
28 Canvas.TextRect(Rect, x, y, Cells[1, 1]);
29 end;
30 end;
31
32 procedure TForm1.FormCreate(Sender: TObject);
33 var
34 i, k: Integer;
35 begin
36 with StringGrid1 do
37 begin
38 cells[1, 1] := 'A rather long line which will span cells';
39 for i := 1 to colcount - 1 do
40 for k := 2 to rowcount - 1 do
41 cells[i, k] := Format('Cell[%d, %d]', [i, k]);
42 end;
43 end;
|