Автоматическая ширина колонок в 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;

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;

Взято с сайта: http://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 }

http://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;

Взято с сайта: http://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, чтобы текст не прилипал к границам ячеек

http://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 данными методами всегда расширяет данную колонку, если вновь добавляемая строка имеет ширину большую чем текущая ширина колонки.
http://delphiworld.narod.ru/
DelphiWorld 6.0

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...