gpt4 book ai didi

delphi - 选择更改后如何检索 VirtualStringTree 中的选定节点?

转载 作者:行者123 更新时间:2023-12-03 18:17:43 27 4
gpt4 key购买 nike

我启用了 MultiSelect 选项的 VST。 How can I retrieve the list of selected nodes in VirtualStringTree when the selection changes via keyboard events?

我尝试在 OnFocusChanged 事件中使用以下代码

procedure TForm1.UpdateSelection(VST: TVirtualStringTree);
Var
NodeArray: TNodeArray;
NodeData: PNodeData;
I: Integer;
begin
Memo1.Clear;

NodeArray := VST.GetSortedSelection(False);
For I := Low(NodeArray) to High(NodeArray) do
Begin
NodeData := VST.GetNodeData(NodeArray[I]);
Memo1.Lines.Add(NodeData.Caption);
End;
end;

procedure TForm1.VST1FocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex);
begin
UpdateSelection(VST1);
end;

如果我使用鼠标和 shift 键,这很好用,但是,如果我使用键盘,即选择节点,然后按 shift,然后按向下箭头选择多个节点,则选择返回完整列表 - 1。

这似乎是一个错误?关于如何在使用键盘时获得完整选择的任何想法?

最佳答案

我也可以重现这种行为(D5,VT 版本 4.5.5)。对我来说看起来像一个错误,我将解释原因:

似乎键盘事件调用 FocusChanged但不改变内部FSelectedCount此刻FocusChanged事件被触发。如果您查看 GetSortedSelection 的代码,第一行是SetLength(Result, FSelectionCount);如果你测试 VST1.SelectionCount属性将其设置为实际选择计数 - 1(如您所描述),或者如果您按 SHIFT-END,则保留先前的值。

我从未在自己的应用程序中注意到这一点,因为我通过 PostMessage 使用了延迟操作在这个特定的事件中。当事件处理程序退出时,这会导致正确的内部结构。这可能是一种解决方案。

但是,我认为正确的解决方案是处理 OnChange 中的选择。事件处理程序 - 无论焦点节点更改如何,选择都可能更改。

关于delphi - 选择更改后如何检索 VirtualStringTree 中的选定节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40345918/

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