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