我有个问题。 我有一个TTreeview后代,在我自己的计算机上显示checkbox就好了,其他所有testing我自己。
TVS_CHECKBOXES
使用SetWindowLong
设置。 在Loaded
方法中,我使用StateIndex := 2;
设置/维护选中的状态StateIndex := 2;
, Item.State := TVIS_CHECKED
等
到现在为止还挺好。 但是现在有一个人联系了我,在他的WindowsXP SP3上,treeviewcheckbox没有显示出来 。 (他甚至给我提供了一个截图。)从程序的行为,我可以说默认检查的节点正在工作,因为程序,否则从客户描述行为像预期。
我无法find任何地方描述类似的症状。 所有我testing过的电脑都能正常工作。 但从客户的截图显示,有一个问题:(
我最好的猜测是这是一些RecreateWnd
,在一些系统重置树视图checkbox模式?
我的testing选项是有限的,因为我不能在我自己的计算机上重现问题,所以想知道别人是否有其他build议,我可以尝试之前,我发送新的testing代码的人似乎是系统似乎隐藏树视图checkbox?
根据文档,在覆盖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;
虽然我也不能重现这个问题。 而出现未经检查的节点根本不匹配,所以我真的不知道这会解决它。