die schleife ist kein problem und auch bei vielen Nodes sehr schnell:
hier mal ein beispiel:
Delphi-Quellcode:
const
VST_MOVEDOWN = -5;
VST_MOVEUP = -6;
class procedure TVirtualTreeviewHelper.SelectNode(_Vst: TBaseVirtualTree;
_StartNode: PVirtualNode; _IndexToSelect: Integer;_Center : Boolean = true);
begin
_Vst.ClearSelection;
if _StartNode = nil then
_StartNode := _Vst.RootNode.FirstChild;
if _StartNode = nil then
exit;
case _IndexToSelect of
VST_MOVEDOWN : _IndexToSelect := _StartNode.Index+1;
VST_MOVEUP : _IndexToSelect := _StartNode.Index-1;
-1 : exit;
end;
while _StartNode <> nil do
begin
if Integer(_StartNode.Index) = _IndexToSelect then
begin
_Vst.Selected[_StartNode] := true;
_Vst.FocusedNode := _StartNode;
_Vst.FocusedColumn := 0;
_Vst.ScrollIntoView(_StartNode,_Center);
break;
end;
if Integer(_StartNode.Index) < _IndexToSelect then
_StartNode := _StartNode.NextSibling
else
_StartNode := _StartNode.PrevSibling;
end;
end;