delphi树视图与checkbox:有时checkbox是不可见的

我有个问题。 我有一个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; 

虽然我也不能重现这个问题。 而出现未经检查的节点根本不匹配,所以我真的不知道这会解决它。