Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Автоматическая ширина колонок в TStringGrid

01.01.2007

Можно ли сделать так чтобы TStringGrid автоматически изменял ширину колонок, чтобы вместить самую длинную строчку в колонке?

procedure AutoSizeGridColumn(Grid: TStringGrid; column: integer);
var
  i
: integer;
  temp
: integer;
  max
: integer;
begin
  max
:= 0;
 
for i := 0 to (Grid.RowCount - 1) do
   
begin
      temp
:= Grid.Canvas.TextWidth(grid.cells[column, i]);
     
if temp > max then max := temp;
   
end;
 
Grid.ColWidths[column] := Max + Grid.GridLineWidth + 3;
end;
 
procedure TForm1
.Button1Click(Sender: TObject);
begin
 
AutoSizeGridColumn(StringGrid1, 1);
end;

procedure SetGridColumnWidths(Grid: TStringGrid;
   
const Columns: array of Integer);
 
{
 
When you double-Click on a Column-Header the Column
  autosizes to fit its content
 
 
Bei Doppelklick auf eine fixierte Spalte passt sich
 
die Spaltenbreite der Textgrosse an
}
 
   procedure
AutoSizeGridColumn(Grid: TStringGrid; column, min, max: Integer);
     
{ Set for max and min some minimal/maximial Values}
     
{ Bei max and min kann eine Minimal- resp. Maximalbreite angegeben werden}
   
var
     i
: Integer;
     temp
: Integer;
     tempmax
: Integer;
   
begin
     tempmax
:= 0;
     
for i := 0 to (Grid.RowCount - 1) do
     
begin
       temp
:= Grid.Canvas.TextWidth(Grid.cells[column, i]);
       
if temp > tempmax then tempmax := temp;
       
if tempmax > max then
       
begin
         tempmax
:= max;
         
break;
       
end;
     
end;
     
if tempmax < min then tempmax := min;
     
Grid.ColWidths[column] := tempmax + Grid.GridLineWidth + 3;
   
end;
 
   procedure TForm1
.StringGrid1DblClick(Sender: TObject);
   
var
     P
: TPoint;
     iColumn
, iRow: Longint;
   
begin
     
GetCursorPos(P);
     
with StringGrid1 do
     
begin
       P
:= ScreenToClient(P);
       
MouseToCell(P.X, P.Y, iColumn, iRow);
       
if P.Y < DefaultRowHeight then
         
AutoSizeGridColumn(StringGrid1, iColumn, 40, 100);
     
end;
   
end;

Взято с сайта: https://www.swissdelphicenter.ch


 procedure TForm1.Button1Click(Sender: TObject);
   
{ by P. Below }
   
const
     DEFBORDER
= 8;
   
var
     max
, temp, i, n: Integer;
   
begin
     
with Grid do
     
begin
       
Canvas.Font := Font;
       
for n := Low(Columns) to High(Columns) do
       
begin
         max
:= 0;
         
for i := 0 to RowCount - 1 do
         
begin
           temp
:= Canvas.TextWidth(Cells[Columns[n], i]) + DEFBORDER;
           
if temp > max then
             max
:= temp;
         
end; { For }
         
if max > 0 then
           
ColWidths[Columns[n]] := max;
       
end; { For }
     
end; { With }
   
end; {SetGridColumnWidths  }
https://delphiworld.narod.ru/

DelphiWorld 6.0


{   This will resize the columns of a TStringGrid / TDrawGrid (text 
    only
!) so the text is completely visble. To save some time,
    it uses the first
10 rows only, but that should be easy to fix,
   
if you need more. }
 
 
// we need this to access protected methods
type
   
TGridHack = class(TCustomGrid);
 
 procedure
ResizeStringGrid(_Grid: TCustomGrid);
 
var
   
Col, Row: integer;
   
Grid: TGridHack;
   
MaxWidth: integer;
   
ColWidth: integer;
   
ColText: string;
   
MaxRow: integer;
   
ColWidths: array of integer;
 
begin
   
Grid := TGridHack(_Grid);
   
SetLength(ColWidths, Grid.ColCount);
   
MaxRow := 10;
   
if MaxRow > Grid.RowCount then
     
MaxRow := Grid.RowCount;
   
for Col := 0 to Grid.ColCount - 1 do
   
begin
     
MaxWidth := 0;
     
for Row := 0 to MaxRow - 1 do
     
begin
       
ColText  := Grid.GetEditText(Col, Row);
       
ColWidth := Grid.Canvas.TextWidth(ColText);
       
if ColWidth > MaxWidth then
         
MaxWidth := ColWidth;
     
end;
     
if goVertLine in Grid.Options then
       
Inc(MaxWidth, Grid.GridLineWidth);
     
ColWidths[Col]      := MaxWidth + 4;
     
Grid.ColWidths[Col] := ColWidths[Col];
   
end;
 
end;
 

Взято с сайта: https://www.swissdelphicenter.ch

var
  i
, j, temp, max: integer;
begin
 
for i := 0 to grid.colcount - 1 do
 
begin
    max
:= 0;
   
for j := 0 to grid.rowcount - 1 do
   
begin
      temp
:= grid.canvas.textWidth(grid.cells[i, j]);
     
if temp > max then
        max
:= temp;
   
end;
    grid
.colWidths[i] := max + grid.gridLineWidth + 1;
 
end;
end;
 
 
 
 
 

Вероятно, вам необходимо будет добавить +1, чтобы текст не прилипал к границам ячеек

https://delphiworld.narod.ru/

DelphiWorld 6.0

Автор: Neil J. Rubenking

Я использую компонент StringGrid и хотел бы менять ширину его колонок в соответствии с расположенным в них текстом, другими словами я хочу чтобы весь текст в них был виден, но как это сделать?

Попробуйте это:

procedure TForm1.StringGrid1SelectCell(Sender: TObject; vCol,
  vRow
: Longint; var CanSelect: Boolean);
var
 
Wid: Integer;
begin
 
with Sender as TStringGrid do
 
begin
   
Wid := Canvas.TextWidth(Cells[Col, Row] + ' ');
   
if Wid > ColWidths[Col] then
     
ColWidths[Col] := Wid;
 
end;
end;
 
procedure TForm1
.StringGrid1KeyPress(Sender: TObject; var Key: Char);
var
 
Wid: Integer;
begin
 
if Key = #13 then
   
with Sender as TStringGrid do
   
begin
     
Wid := Canvas.TextWidth(Cells[Col, Row] + ' ');
     
if Wid > ColWidths[Col] then
       
ColWidths[Col] := Wid;
   
end;
end;

Имейте в виду, что в обработчике события OnSelectCell я переименовал параметры Col и Row на vCol и vRow, чтобы избежать путаницы со свойствами StringGrid, имеющими те же имена. StringGrid c данными методами всегда расширяет данную колонку, если вновь добавляемая строка имеет ширину большую чем текущая ширина колонки.

https://delphiworld.narod.ru/

DelphiWorld 6.0