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!
Asked
Active
Viewed 2.1k times
5 Answers
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";
;)

Peter Richard
- 21
- 3
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;

Rashid Hasanov
- 11
- 1
-
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