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

=== Автоматическая ширина колонок в TStringGrid ===
Можно ли сделать так чтобы 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;
ID: 00609
----
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;
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 01066
----
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;
 if max > 0 then
 ColWidths[Columns[n]] := max;
 end;
 end;
end;
Source: http://delphiworld.narod.ru/
ID: 01067
----
{ 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;
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 01068
----
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, чтобы текст не прилипал к границам ячеек
Source: http://delphiworld.narod.ru/
ID: 01069
----
Я использую компонент 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 данными методами всегда расширяет данную колонку, если вновь добавляемая строка имеет ширину большую чем текущая ширина колонки.
Source: http://delphiworld.narod.ru/
ID: 01070