Articles   Members Online:
-Article/Tip Search
-News Group Search over 21 Million news group articles.
-Delphi/Pascal
-CBuilder/C++
-C#Builder/C#
-JBuilder/Java
-Kylix
Member Area
-Home
-Account Center
-Top 10 NEW!!
-Submit Article/Tip
-Forums Upgraded!!
-My Articles
-Edit Information
-Login/Logout
-Become a Member
-Why sign up!
-Newsletter
-Chat Online!
-Indexes NEW!!
Employment
-Build your resume
-Find a job
-Post a job
-Resume Search
Contacts
-Contacts
-Feedbacks
-Link to us
-Privacy/Disclaimer
Embarcadero
Visit Embarcadero
Embarcadero Community
JEDI
Links
How to display multiple lines in a single cell of 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
05-Nov-02
Category
VCL-General
Language
Delphi 2.x
Views
185
User Rating
No Votes
# Votes
0
Replies
0
Publisher:
DSP, Administrator
Reference URL:
DKB
			Author: Tomas Rutkauskas

How to display multiple lines in a single cell of a TStringGrid

Answer:

Solve 1:

It is fairly easy to draw such text in an OnDrawCell handler. However the standard 
inplace editor of a grid is not well prepared to handle cells higher than one line.
1   
2   procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
3     Rect: TRect; State: TGridDrawState);
4   var
5     S: string;
6     drawrect: TRect;
7   begin
8     S := (Sender as TStringGrid).Cells[Col, Row];
9     if Length(S) > 0 then
10    begin
11      drawrect := rect;
12      DrawText((Sender as TStringGrid).canvas.handle, Pchar(S), Length(S), drawrect,
13        DT_CALCRECT or DT_WORDBREAK or DT_LEFT);
14      if (drawrect.bottom - drawrect.top) > (Sender as TStringGrid).RowHeights[row] 
15  then
16        (Sender as TStringGrid).RowHeights[row] := (drawrect.bottom - drawrect.top)
17      else
18      begin
19        drawrect.Right := rect.right;
20        (Sender as TStringGrid).canvas.fillrect(drawrect);
21        DrawText((Sender as TStringGrid).canvas.handle, Pchar(S), Length(S),
22          drawrect, DT_WORDBREAK or DT_LEFT);
23      end;
24    end;
25  end;


It will automatically adjust the row height to larger values if needed. The main 
problem is that it will not automatically decrease the row height if the text would 
fit into a smaller row. It cannot do that since there may be other cells in the row 
that need a taller row. You could fix that problem by setting the rowheigh back to 
the defaultrowheight when you change the cell data for a row, that would trigger a 
redraw and that in turn would adjust the rowheight to what is needed. It would 
cause some flicker, though.


Solve 2:

This is a unit that enables word-wrap in a cell of a TStringGrid:

26  unit Unit1;
27  
28  interface
29  
30  uses
31    SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
32    Forms, Dialogs, ExtCtrls, Grids;
33  
34  type
35    TForm1 = class(TForm)
36      StringGrid1: TStringGrid;
37      Panel1: TPanel;
38      procedure StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;
39        Rect: TRect; State: TGridDrawState);
40    private
41      { Private declarations }
42    public
43      { Public declarations }
44    end;
45  
46  var
47    Form1: TForm1;
48  
49  implementation
50  
51  {$R *.DFM}
52  
53  procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;
54    Rect: TRect; State: TGridDrawState);
55  var
56    A: array[0..255] of char;
57    drawrect: TRect;
58  begin
59    StrPCopy(A, (Sender as TStringgrid).Cells[Col, Row]);
60    if StrLen(A) > 0 then
61      with (Sender as TStringgrid) do
62      begin
63        drawrect := rect;
64        {Note that the first DrawText uses the DT_CALCRECT flag to calculate a new
65  			value for drawrect. This value is used to set the RowHeights 
66  			parameter if necessary.}
67        DrawText(canvas.handle, A, -1, drawrect, DT_CALCRECT or DT_WORDBREAK or
68          DT_LEFT);
69        if (drawrect.bottom - drawrect.top) > RowHeights[Row] then
70          RowHeights[row] := (drawrect.bottom - drawrect.top)
71        else
72        begin
73          drawrect.right := rect.right;
74          canvas.fillrect(drawrect);
75          DrawText(canvas.handle, A, -1, drawrect, DT_WORDBREAK or DT_LEFT);
76        end;
77      end;
78  end;
79  
80  end.


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

 

Advertisement
Share this page
Advertisement
Download from Google

Copyright © Mendozi Enterprises LLC