Как сделать так, чтобы столбцы StringGrid соответствовали ширине сетки?
Я долго искал решение без какой-либо удачи. Кто-нибудь знает простой способ сделать это? Я хотел бы растянуть, например, второй столбик моей сетки, чтобы соответствовать ширине сетки!
5 ответов
Использовать ColWidths
Свойство, вот так:
with StringGrid1 do
ColWidths[1] := ClientWidth - ColWidths[0] - 2 * GridLineWidth;
А для более надежного и гибкого решения учитывайте все фиксированные столбцы и параметризуйте индекс столбцов:
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;
Следующий код работает с FixedCols = 0
(для адаптации к другим значениям, например: 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;
еще лучше вот так:
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;
Решение Если есть больше сомнений, команда "grid.AutoFitColumns ()" Где сетка является одним "TAdvStringGrid";
;)
Позволяет динамически изменять размеры столбцов в зависимости от размера контейнера с учетом размеров содержимого.
Вы можете просто вставить, и все будет работать прямо из коробки. Я не буду объяснять, у меня нет времени. Кому хочется или кому очень нужно найти время разобраться в этом коде, тем более, что он очень простой
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;