7

I've been looking for a long time for a solution without any luck. Does anyone know a simple way to do that? I would like to stretch for example the second colum of my grid to fit the grid's width!

Tetsujin no Oni
  • 7,300
  • 2
  • 29
  • 46
Diogo Garcia
  • 536
  • 1
  • 8
  • 20

5 Answers5

9

Use the ColWidths property, like so:

with StringGrid1 do
  ColWidths[1] := ClientWidth - ColWidths[0] - 2 * GridLineWidth;

And for a more robust and flexible solution, take all fixed columns into account and parameterize the column index:

procedure SetColumnFullWidth(Grid: TStringGrid; ACol: Integer);
var
  I: Integer;
  FixedWidth: Integer;
begin
  with Grid do
    if ACol >= FixedCols then
    begin
      FixedWidth := 0;
      for I := 0 to FixedCols - 1 do
        Inc(FixedWidth, ColWidths[I] + GridLineWidth);
      ColWidths[ACol] := ClientWidth - FixedWidth - GridLineWidth;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetColumnFullWidth(StringGrid1, 4);
end;
NGLN
  • 43,011
  • 8
  • 105
  • 200
  • Thank you!! this is how it works for me: `code procedure SetColumnFullWidth(Grid: TStringGrid; ACol: Integer); var I: Integer; FixedWidth: Integer; begin FixedWidth := 0; for I := 0 to Grid.ColCount - 1 do begin if(I=0) then begin Grid.ColWidths[I] := 50; FixedWidth := FixedWidth +50; end else begin Grid.ColWidths[I] := 100; FixedWidth := FixedWidth +100; end; end; Grid.ColWidths[ACol] := (Grid.Width-FixedWidth)+90; end; `code – Diogo Garcia Oct 25 '11 at 11:45
  • https://sourceforge.net/p/dzlib/code/HEAD/tree/dzlib/trunk/src/u_dzVclUtils.pas#l110 – dummzeuch Jun 16 '16 at 12:06
2

The following code works with FixedCols = 0 (to adapt for other values, ex: FixedCols = 1 ==> for Col := 1 to ...)

procedure AutoSizeGridColumns(Grid: TStringGrid);
const
  MIN_COL_WIDTH = 15;
var
  Col : Integer;
  ColWidth, CellWidth: Integer;
  Row: Integer;
begin
  Grid.Canvas.Font.Assign(Grid.Font);
  for Col := 0 to Grid.ColCount -1 do
  begin
    ColWidth := Grid.Canvas.TextWidth(Grid.Cells[Col, 0]);
    for Row := 0 to Grid.RowCount - 1 do 
    begin
      CellWidth := Grid.Canvas.TextWidth(Grid.Cells[Col, Row]);
      if CellWidth > ColWidth then
        Grid.ColWidths[Col] := CellWidth + MIN_COL_WIDTH
      else
        Grid.ColWidths[Col] := ColWidth + MIN_COL_WIDTH;
    end;
  end;
end;
Sean Pianka
  • 2,157
  • 2
  • 27
  • 43
Kaci
  • 31
  • 1
1

even better like this :

procedure AutoSizeGridColumns(Grid: TStringGrid);
const
  MIN_COL_WIDTH = 15;
var
  Col : Integer;
  ColWidth, CellWidth: Integer;
  Row: Integer;
begin
  Grid.Canvas.Font.Assign(Grid.Font);
  for Col := 0 to Grid.ColCount -1 do
  begin
    ColWidth := Grid.Canvas.TextWidth(Grid.Cells[Col, 0]);
    for Row := 0 to Grid.RowCount - 1 do 
    begin
      CellWidth := Grid.Canvas.TextWidth(Grid.Cells[Col, Row]);
      if CellWidth > ColWidth then
        ColWidth := CellWidth
    end;
    Grid.ColWidths[Col] := ColWidth + MIN_COL_WIDTH;
  end;
end;
Kaci
  • 31
  • 1
0

Solution If there are more doubts command "grid.AutoFitColumns()" Where grid is one "TAdvStringGrid";

;)

0

Allows you to dynamically resize columns depending on the size of the container, given the dimensions of the content

You can just paste and it will work right out of the box. I won't explain, I don't have time. Who wants or who really needs to find time to understand this code, especially since it is very simple

    procedure AutoSizeGridColumns(Grid: TStringGrid);
    var
      ACol, ARow: Integer;
      GridWidth, ColWidth, ColsCount: Integer;
      ColWidthDifferenceWidth, ColMinWidth, ColsSumWidth: Integer;
    begin
      GridWidth := Grid.Width;
      ColsCount := Grid.ColCount;      
      ColWidth := 0;
      ColsSumWidth := 0;
      ColWidthDifferenceWidth := 0;
    
      Grid.Canvas.Font.Assign(Grid.Font);
      for ACol := 0 to ColsCount - 1 do
      begin
    
        for ARow := 0 to Grid.RowCount - 1 do
        begin
          ColMinWidth := Grid.Canvas.TextWidth(Grid.Cells[ACol, ARow]);
        end;
    
        ColsSumWidth := ColsSumWidth + ColMinWidth;
        Grid.ColWidths[ACol] := ColMinWidth;
      end;
           
      if ColsSumWidth < GridWidth then
        begin
          ColWidthDifferenceWidth := (GridWidth - ColsSumWidth) div ColsCount - 1;
    
          for ACol := 0 to ColsCount - 1 do
          begin
            Grid.ColWidths[ACol] := Grid.ColWidths[ACol] + ColWidthDifferenceWidth;
          end;
        end
      else
        begin
          ColWidthDifferenceWidth := (ColsSumWidth - GridWidth) div ColsCount;
    
          for ACol := 0 to ColsCount - 1 do
          begin
            Grid.ColWidths[ACol] := Grid.ColWidths[ACol] - ColWidthDifferenceWidth;
          end;
        end;
    end;
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community May 07 '23 at 17:13