停用表单时出现TTreeView绘图错误

时间:2011-06-08 12:08:10

标签: delphi delphi-2010

我发现了与TTreeView相关的错误。

  • 将包含TTreeViewHideSelection设置为True的表单。
  • 使树状视图多选,并在树状视图中选择多个项目。
  • 显示另一个表单,以便您的应用有两种形式。
  • 为树状视图指定焦点,然后单击另一种形式。

结果如下:

enter image description here

但实际上应该没有突出显示的项目。有趣的是,最后一个项目被选中,它不再被突出显示,实际上应该是所有其他项目。似乎最近点击的项目是获得特殊处理的项目。

如果您在编辑框中(或实际上任何其他需要对焦的控件)单击,则会正确隐藏所有项目。因此,将焦点转移到表单上的另一个控件是很好的 - 问题似乎仅限于停用表单。

我通过反复试验发现,只要表单被停用并激活(需要防止错误的镜像),我就可以通过在树视图上调用Invalidate来解决这个问题。但是,我正在寻找一个更好的理解错误是什么以及如何以较少侵入性的方式修复它,即在树视图级别而不是包含的表单级别。

总而言之,我的问题是:

  1. 究竟是什么导致了这个问题?
  2. 如何在不编写挂钩TForm事件的代码的情况下修复它?

  3. 将问题提交为QC#94908

1 个答案:

答案 0 :(得分:9)

解决方案似乎是通过使所选节点无效来响应NM_SETFOCUSNM_KILLFOCUS通知。您可以直接修改TCustomTreeView.CNNotify,也可以编写新的TCustomTreeView后代。这是一个快速入侵,只显示缺少的代码:

type
  TTreeView = class(ComCtrls.TTreeView)
  private
    procedure CNNotify(var Message: TWMNotifyTV); message CN_NOTIFY;
  end;

procedure TTreeView.CNNotify(var Message: TWMNotifyTV);
begin
  case Message.NMHdr^.code of
    NM_KILLFOCUS, NM_SETFOCUS:
      InvalidateSelectionsRects;
  end;
  inherited;
end;

修改:David的QC report