TTreeView:AlphaSort滚动到选定节点(如MakeVisible)

时间:2013-12-16 07:15:20

标签: delphi treeview scroll

大家好日子!

我有一些问题。当我为所选节点的父节点调用AlphaSort时(由于我向下或向上滚动树视图,此时所选节点不可见),树视图滚动到所选节点(如调用MakeVisible)。我怎样才能禁止树视图在排序过程中确保可见?我试图像这样拦截TVM_ENSUREVISIBLE

type
  TTreeNode = class(ComCtrls.TTreeNode)
    protected
      procedure EnsureVisible(var Message: TMessage); message TVM_ENSUREVISIBLE;
  end;

type
  TTreeView = class(ComCtrls.TTreeView)
    protected
      procedure EnsureVisible(var Message: TMessage); message TVM_ENSUREVISIBLE;
  end;

...

{ TTreeView }

procedure TTreeView.EnsureVisible(var Message: TMessage);
begin
  inherited;
  ShowMessage('MakeVisibleFromTreeView');
end;

{ TTreeNode }

procedure TTreeNode.EnsureVisible(var Message: TMessage);
begin
  inherited;
  ShowMessage('MakeVisibleFromTreeNode');
end;

但在滚动排序期间没有调用此消息。只有我手动调用MakeVisible。

1 个答案:

答案 0 :(得分:3)

您观察到的行为由基础树视图控件提供。可能没有什么可以阻止它发生的事情。因此,如果您想要更改行为,则需要解决此问题。

你必须确定你真正想要的行为。排序完成后,您希望哪些节点可见。 @TLama建议存储滚动条位置,排序,然后恢复滚动条位置。但这可能会产生相当令人惊讶的结果。首先,在排序之后,无法保证在排序之前可见的任何节点都是可见的。如果您正在排序的节点有子节点,那也可能会加剧奇怪现象。

但是,您在评论中说正在排序的节点没有子节点。在这种情况下,我认为@TLama建议的将满足您的需求。并且有一种相当简单的方法来实现它。您需要在排序之前记住顶部项目的索引,然后在排序之后将顶部项目设置为具有该索引的项目。像这样:

TreeView1.Items.BeginUpdate;
try
  TopIndex := TreeView1.TopItem.Index;
  TreeView1.AlphaSort; // or whatever you do to perform the sort 
  TreeView1.TopItem := TreeView1.Items[TopIndex];
finally
  TreeView1.Items.EndUpdate;
end;