Articles   Members Online:
-Article/Tip Search
-News Group Search over 21 Million news group articles.
Member Area
-Account Center
-Top 10 NEW!!
-Submit Article/Tip
-Forums Upgraded!!
-My Articles
-Edit Information
-Become a Member
-Why sign up!
-Chat Online!
-Indexes NEW!!
-Build your resume
-Find a job
-Post a job
-Resume Search
-Link to us
Visit Embarcadero
Embarcadero Community
How to merge cells in a TStringGrid Turn on/off line numbers in source code. Switch to Orginial background IDE or DSP color Comment or reply to this aritlce/tip for discussion. Bookmark this article to my favorite article(s). Print this article
Delphi 2.x
User Rating
No Votes
# Votes
DSP, Administrator
Reference URL:
			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.


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

Vote: How useful do you find this Article/Tip?
Bad Excellent
1 2 3 4 5 6 7 8 9 10


Share this page
Download from Google

Copyright © Mendozi Enterprises LLC