Содержание материала

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

 

Code:

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

);

     if temp > max then max := temp;

   end;

Grid.ColWidths

:= Max + Grid.GridLineWidth + 3;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

AutoSizeGridColumn(StringGrid1, 1);

end;

 

 

Code:

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

);

      if temp > tempmax then tempmax := temp;

      if tempmax > max then

      begin

        tempmax := max;

        break;

      end;

    end;

    if tempmax < min then tempmax := min;

    Grid.ColWidths

:= 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;

 


 

Code:

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  }

 

 

Code:

{   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;

 

 


 

 

Code:

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

  

Автор: Neil J. Rubenking

 

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

 


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

 

Code:

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

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить