我有问题。我有一个TTreeview后代,可以在我自己的计算机上显示复选框,以及我自己测试过的所有其他复选框。
使用TVS_CHECKBOXES
设置 SetWindowLong
。在Loaded
方法中,我使用StateIndex := 2;
,Item.State := TVIS_CHECKED
等设置/维护已检查状态
到目前为止一切顺利。但是现在有人联系我,树视图复选框在他的WindowsXP SP3上没有显示 。 (他甚至为我提供了一个屏幕截图。)从程序行为来看,我可以说默认检查节点正在运行,因为来自客户描述的程序就像预期的那样。
我无法找到任何地方描述的类似症状。我测试的所有计算机都运行良好。但客户的截图显示存在问题:(
我最好的猜测是,有些RecreateWnd
在一些系统上重置了treeview复选框模式?
我的测试选项有限,因为我无法在自己的计算机上重现问题,所以想知道其他人是否有其他建议我可以尝试将新的测试版代码发送给系统似乎隐藏树视图的人复选框?
答案 0 :(得分:3)
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;
虽然我也无法重现这个问题。并且未经检查的节点与根本不可见是不匹配的,所以我真的很想知道这会解决它。