4

我有一个带有预定义列的 TDBGrid,但我无法获得正确的宽度。我可以在表单设计器中弄乱列的 Width 属性,并在设计时使宽度看起来恰到好处,但在运行时,无论出于何种原因,列往往会明显更宽,最后我会得到一个滚动条在网格的底部。有没有办法让列的大小正确,而不需要所有的反复试验,特别是如果网格只有一两个?

4

5 回答 5

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;

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

于 2010-01-05T06:10:25.373 回答
1

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

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

于 2012-10-04T07:24:37.490 回答
0

你可以看看这个问题的答案。

也许受保护的 CalcDrawInfo 方法在这里可能会有所帮助。

于 2010-01-05T10:04:57.843 回答
0

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

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

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

一种可能的替代方法是为不适合其列的字段显示提示文本?

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

——杰伦

于 2010-01-05T05:47:08.197 回答
0

JP的答案是一个很好的解决方案。您需要根据需要手动拉伸或收缩列以使其适合窗口。有一个 windows API 调用来获取垂直滚动条的宽度。然后您可以查看可见行以查看是否正在显示垂直滚动条。

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

于 2010-01-05T07:51:05.837 回答