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