带有复选框的 Delphi 树视图:有时复选框是不可见的
Posted
技术标签:
【中文标题】带有复选框的 Delphi 树视图:有时复选框是不可见的【英文标题】:Delphi tree view with checkboxes: sometimes the checkboxes are invisible 【发布时间】:2011-11-02 20:33:31 【问题描述】:我有问题。我有一个 TTreeview 后代,它在我自己的计算机上和所有其他我自己测试过的复选框都可以正常显示。
TVS_CHECKBOXES
使用SetWindowLong
设置。在Loaded
方法中,我使用StateIndex := 2;
、Item.State := TVIS_CHECKED
等设置/维护检查状态。
到目前为止一切顺利。但是现在有人联系我,他的 WindowsXP SP3 上的树视图复选框根本没有显示 。 (他甚至给我提供了一个屏幕截图。)从程序的行为来看,我可以说默认检查节点正在工作,因为来自客户描述的程序的行为与预期的一样。
我无法在任何地方找到描述的类似症状。我测试过的所有电脑都运行良好。但是客户的截图显示有问题:(
我最好的猜测是某些系统上的某些RecreateWnd
重置了树视图复选框模式?
我的测试选项有限,因为我无法在我自己的计算机上重现问题,所以想知道其他人是否有其他建议我可以尝试,然后再将新的 beta 代码发送给系统似乎隐藏树视图的人复选框?
【问题讨论】:
将 SetWindowLong 调用置于覆盖的CreateWnd
中,然后您就会知道 RecreateWnd 是否是问题所在。
我现在正在这样做!唯一的问题是我已经将每次尝试/更改发送给用户,因为我自己无法测试它。当我知道更改是否有效时,我会再次写信。 (可能是一两天,具体取决于对方何时回复。)
这听起来就像一个 GroupWise 错误,只出现在我办公室的机器上。
情况是这样的。在测试人员有机会尝试新的测试版之前,他报告说问题已经通过安装/重新安装应用程序自行解决......我确实要求测试人员安装固定测试版并报告问题是否再次发生。到目前为止,他还没有就此联系过我。我想我会保持这个问题的开放,以防有人可以提供经过验证的解释和解决原始问题原因的方法。
【参考方案1】:
根据documentation,在覆盖的CreateWnd
中设置此样式可能为时已晚:
如果要使用此样式,则必须在创建树视图控件之后和填充树之前之前使用 SetWindowLong 设置 TVS_CHECKBOXES 样式。否则,复选框可能会显示为未选中,具体取决于时间问题。
现在,这似乎是一个鸡蛋和鸡的小困境,因为 VCL 并没有为这个确切的时刻提供真正的解决方案。在继承的 CreateWnd 调用之前设置此样式是不可能的,因为还没有句柄。但是在继承调用之后,由于重新创建,树可能已经被填充。 (VCL 将节点流回TCustomTreeView.CreateWnd
)。
但是由于这看起来只是一个简单的样式修改,您可以(也)尝试覆盖 CreateParams
并将此标志添加到 Params.Style
,这在这里也可以正常工作。
procedure TMyTreeView.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or TVS_CHECKBOXES;
end;
虽然我也无法重现该问题。并且出现未选中的节点根本不匹配不可见,所以我真的很想知道这会解决它。
【讨论】:
你引用了文档,很好,但后来没有遵循它。它必须在创建窗口之后。您在创建标志之前设置它。正确的方法是在重写的 CreateWnd 中调用 SetWindowLong。 @David 谢谢,我澄清了我的答案。也感谢您的subtle bump。 简单说明:就像我在最初的问题中写的那样,我已经在使用 SetWindowLong 等了。以上是关于带有复选框的 Delphi 树视图:有时复选框是不可见的的主要内容,如果未能解决你的问题,请参考以下文章
当我取消选中自定义树视图中的子节点复选框时,如何取消选中所有父节点