我有一个带有预定义列的 TDBGrid,但我无法获得正确的宽度。我可以在表单设计器中弄乱列的 Width 属性,并在设计时使宽度看起来恰到好处,但在运行时,无论出于何种原因,列往往会明显更宽,最后我会得到一个滚动条在网格的底部。有没有办法让列的大小正确,而不需要所有的反复试验,特别是如果网格只有一两个?
5 回答
我在表单 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;
它有一些缺陷,但效果很好。
我想我知道问题的答案。几年来我遇到了同样的问题。当我将演示数据放入时,我调整了列宽(设计时),但我怀疑,作为 Delphi 中的一个错误,如果您输入的宽度与 Delphi 分配给列的默认宽度相同,则宽度不会保存在dfm 文件 - 如果您将 dfm 视为文本,则可以看到。
我的解决方案是将其设置为宽或窄一个像素,以便 Delphi 将被迫存储宽度(或直接编辑 dfm),因此它将在运行时设置。如果您不设置它,Delphi 将在运行时分配一些计算出的宽度——这不是您想要的,因为它可能会根据数据而改变。简单的解决方案,但我花了很长时间才弄清楚。
你可以看看这个问题的答案。
也许受保护的 CalcDrawInfo 方法在这里可能会有所帮助。
您可以这样做,但您必须检查所有可能显示的记录的所有字段的宽度。
鉴于仍有大量应用程序几乎无法过滤其记录集,这可能意味着您需要检查无数条记录,只是为了摆脱滚动条。
你有没有想过你可能只想一次显示太多信息?
一种可能的替代方法是为不适合其列的字段显示提示文本?
我使用了这样的替代方法,但需要检查来源;明天我可以给你一些示例代码。
——杰伦
JP的答案是一个很好的解决方案。您需要根据需要手动拉伸或收缩列以使其适合窗口。有一个 windows API 调用来获取垂直滚动条的宽度。然后您可以查看可见行以查看是否正在显示垂直滚动条。
另一种技术是计算出每列相对于彼此的宽度。然后,当您调整它们的大小时,保持相同的比例。