gpt4 book ai didi

delphi - TTreeView : AlphaSort scrolls to selected node (like MakeVisible)

转载 作者:行者123 更新时间:2023-12-03 07:19:23 25 4
gpt4 key购买 nike

祝大家有美好的一天!

我有一些问题。当我为所选节点的父节点调用 AlphaSort 时(所选节点目前不可见,因为我已向下或向上滚动 TreeView ), TreeView 滚动到所选节点(如调用 MakeVisible)。如何禁止 TreeView 以确保排序期间可见?我尝试像这样拦截 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 时。

最佳答案

您观察到的行为是由基础 TreeView 控件提供的。您可能无能为力来阻止这种情况发生。因此,如果您想改变这种行为,您需要解决这种行为。

你必须决定你真正想要什么行为。排序完成后您希望哪些节点可见。 @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;

关于delphi - TTreeView : AlphaSort scrolls to selected node (like MakeVisible),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20605321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com