使用具有Visible = false的列的TDBGrid保存表单时,不会保存列的Width属性,并且Width属性的原始值将丢失。
上下文是表单(Delphi 10.1 Berlin)上标准VCL TColumn控件中的TDBGrid。如果在对象检查器中将列的Visible属性设置为false,则Width属性将立即转到-1。将Visible设置为true,恢复以前的Width值。
但是,如果在列的Visible属性为false时保存表单,并且表单已关闭并重新打开,则同一列的Visible属性将再次设置为true,Width将始终显示这当然隐藏了右侧的任何其他列,并且会混淆滚动,这会使非技术用户感到困惑。
我怀疑这是一个VCL错误,因为TColumn.Width属性的属性getter(在单元Vcl.DBGrids中)如下:
unit Vcl.DBGrids;
...
function TColumn.GetWidth: Integer;
begin
if not Showing then // depends on Visible property
Result := -1 // obviously streamed to .DFM
else if cvWidth in FAssignedValues then
Result := FWidth
else
Result := DefaultWidth;
end;
这是一个VCL错误,还是我使用错了?
PS:这与TColumn有什么关系。AssignedValues?或者内置的Delphi DBGrid是否存在缺陷。
编辑:我的应用允许用户在运行时调整主结果网格中的列的大小,重新排序和显示/隐藏列,还可以还原为默认值。我在设计时使用网格作为"主人"恢复默认值时,即默认列宽和顺序,以及默认情况下哪些列可见。但是,默认情况下丢失隐藏列的列宽度会让人感到不安。