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

时间:2010-01-05 04:30:15

标签: delphi column-width tdbgrid

我有一个带预定义列的TDBGrid,我只是无法获得正确的宽度。我可以搞乱表单设计器中列的Width属性,并在设计时看到恰到好处的宽度,但在运行时,无论出于何种原因,列往往会更宽,我最终得到一个滚动条在网格的底部。有没有办法在没有所有试错的情况下正确地使列大小正确,特别是如果网格只有一个或两个?

5 个答案:

答案 0 :(得分:4)

我在表单OnResize事件

中使用此过程
procedure AutoStretchDBGridColumns(Grid: TDBGrid; Columns, MinWidths: Array of integer);
var
  x, i, ww: integer;
begin
  // Stretches TDBGrid columns
  // Columns contains columns to stretch
  // MinWidths contains columns minimum widhts
  // To stretch grids columns 1,2 and 5 automatically and set minimum widths to 80, 150 and 150 call
  // AutoStretchDBGridColumns(DBGrid1, [1,2,5], [80, 150, 150]);
  Assert(Length(Columns) = Length(MinWidths), 'Length(Columns) <> Length(MinWidths)');
  ww := 0;
  for i := 0 to Grid.Columns.Count - 1 do
  begin
    if Grid.Columns[i].Visible then
      ww := ww + Grid.Columns[i].Width + 1; //** +1 for grid line width
  end;
  if dgIndicator in Grid.Options then
    ww := ww + IndicatorWidth;
  x := (Grid.ClientWidth - ww) div Length(Columns);
  for i := 0 to  High(Columns) do
    Grid.Columns[Columns[i]].Width := Max(Grid.Columns[Columns[i]].Width + x, MinWidths[i]);
end;

它有一些缺陷,但效果很好。

答案 1 :(得分:1)

我想我知道问题的答案。我有几年同样的问题。 当我放入演示数据时我调整了列宽(设计时间),但我怀疑,作为Delphi中的一个错误,如果输入的宽度与Delphi分配给列的默认宽度相同,则宽度不保存在dfm文件 - 如果您将dfm视为文本,可以看到。

我的解决方案是将其设置为更宽或更窄的一个像素,以便Delphi将被强制存储宽度(或直接编辑dfm),因此它将在运行时设置。如果你没有设置它,Delphi将在运行时分配一些计算的宽度 - 这不是你想要的,因为它可能会根据数据而改变。简单的解决方案,但我花了很长时间才弄明白。

答案 2 :(得分:0)

您可以这样做,但您必须检查可能可以显示的所有记录所有字段的宽度。

鉴于仍有大量应用程序几乎无法过滤其记录集,这可能意味着您需要检查无数的记录,只是为了摆脱滚动条。

你有没有想过你可能只想一次显示太多信息?

可能的替代是为不适合其列的字段显示提示文字?

我使用过这样的替代品,但需要检查来源;我明天可以给你一些示例代码。

- 的Jeroen

答案 3 :(得分:0)

JP's answer是一个非常好的解决方案。您需要根据需要手动拉伸或缩小列以使其适合窗口。有一个Windows API调用来获取垂直滚动条的宽度。然后,您可以查看可见行,以查看是否显示了垂直滚动条。

另一种技术是计算每列相对于彼此的宽度。然后当你调整大小时保持相同的比例。

答案 4 :(得分:0)

您可以查看this问题的答案。

受保护的CalcDrawInfo方法可能对此有所帮助。