大家好日子!
我有一些问题。当我为所选节点的父节点调用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。
答案 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;