如何使StringGrid的列适合网格的宽度?

7

我已经很长时间在寻找解决方案,但没有运气。有人知道一个简单的方法吗?例如,我想将网格的第二列拉伸以适应网格的宽度!

5个回答

9
使用 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;

谢谢!对我来说是这样工作的:`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
https://sourceforge.net/p/dzlib/code/HEAD/tree/dzlib/trunk/src/u_dzVclUtils.pas#l110 - dummzeuch

2
以下代码适用于 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;

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;

0

解决方案:如果有更多疑问,可以使用命令 "grid.AutoFitColumns()",其中 grid 是一个 "TAdvStringGrid"。

;)


0

允许您根据内容的尺寸动态调整列的大小,以适应容器的尺寸。

您只需粘贴即可立即使用。 我不会解释,我没有时间。 谁想或真正需要找时间来理解这段代码,特别是它非常简单。

    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;

目前您的回答不够清晰,请 [编辑] 添加更多细节,以帮助其他人了解如何解决所提出的问题。您可以在帮助中心找到有关撰写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接