Delphi树形视图带复选框:有时复选框是不可见的。

3
我有一个问题。我有一个TTreeview后代,在我自己的电脑和我测试过的所有其他电脑上都可以正常显示复选框。
使用SetWindowLong设置了TVS_CHECKBOXES。在Loaded方法中,我使用StateIndex := 2;,Item.State := TVIS_CHECKED等来设置/维护选中状态。
到目前为止一切正常。但现在有个人联系我,他的WindowsXP SP3上树形视图复选框根本不显示。(他甚至提供了截图。)从程序行为来看,我可以说默认选中节点是有效的,因为程序从客户描述中的行为表现得像预期的那样。
我没有能够在任何地方找到类似的症状描述。我测试过的所有计算机都工作正常。但是客户的截图显示存在问题 :(
我最好的猜测是,在某些系统上,某个RecreateWnd会重置树形视图复选框模式?
由于我无法在自己的计算机上重现问题,因此我的测试选项有限,所以我想知道其他人在我向隐藏树形视图复选框的人发送新的beta代码之前是否有其他建议?

将SetWindowLong调用放在重写的CreateWnd中,然后您就会知道RecreateWnd是否有问题。 - Sertac Akyuz
我正在做那件事!唯一的问题是,由于我不能亲自测试,所以我必须将每次尝试/更改发送给用户。如果更改有效,我会在知道后再次写信(可能需要一两天时间,具体取决于人员回复的时间)。 - Tom
1
这听起来就像是一个只在我办公室的机器上表现出来的GroupWise漏洞。 - David Heffernan
情况是这样的。在测试人员有机会尝试新的测试版之前,他报告说通过安装/重新安装应用程序问题已经解决了...我确实要求测试人员安装修复后的测试版,并在问题再次发生时报告回来。到目前为止,他还没有联系我。我想我会保持这个问题的开放,以防有人能够提供经过验证的原始问题的原因和解决方案。 - Tom
1个回答

4
在重写的CreateWnd中设置这个样式可能会太晚,根据文档

如果您想使用此样式,在创建树形视图控件后,必须使用SetWindowLong在 之后 设置TVS_CHECKBOXES样式,而在填充树之前。否则,复选框可能未被选中,这取决于定时问题。

现在,这似乎是一个小的鸡生蛋或者蛋生鸡的问题,因为VCL没有为这个具体的时刻提供一个真正的解决方案。在调用CreateWnd之前设置这个样式是不可能的,因为还没有句柄。但是在继承的调用之后,由于重新创建,树可能已经被填充了。(在TCustomTreeView.CreateWnd中,VCL将节点流回)。

但既然这看起来只是一个简单的样式修改,你也可以尝试重写CreateParams并在Params.Style中添加该标记,在这里也能很好地工作。

procedure TMyTreeView.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or TVS_CHECKBOXES;
end;

虽然我也不能重现这个问题。并且节点没有被选中,不代表它们完全不可见,所以我真的很怀疑这是否能解决问题。


2
你引用了文档,很好,但是却没有按照它的指示去做。必须在窗口创建后才能设置标志位,而你在创建之前就设置了。正确的方法是在重写的CreateWnd中调用SetWindowLong。 - David Heffernan
@David 谢谢,我澄清了我的回答。还要感谢您的微妙提示 - NGLN
只是一个快速的提示:就像我在最初的问题中写的那样,我已经在使用SetWindowLong等函数了。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接