![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Быстрый поиск узла в TreeView
learner © (2006-07-31 10:51:00)Здравствуйте !
В DelphiWorld, при поиске узла в TreeView рекомендуют
не искать по индексу,
function ItemByIndex(TrView: TTreeView): TTreeNode;а искать, используя GetNext
var
i:integer;
begin
for i := 0 to TrView.Items.Count - 1 do
if TrView.Items[i].Text = 'bala - bala' then
begin
Result:=TrView.Items[i];
break;
end;
end;
function NodeSearchRec(const Node: TTreeNode): TTreeNode;Утверждают, что второй вариант гораздо быстрее.
var
TmpNode: TTreeNode;
begin
if Node <> nil then
if Node.text = 'bala - bala' then Result:=Node else NodeSearchRec(Node.GetNext);
end;
procedure ItemByNode(TrView: TTreeView);
var
Node: TTreeNode;
begin
Node:=NodeSearchRec(TrView.Items[0]);
end;
Сколько я не проверяла, скорость одна и та же.
Может я что-то не так делаю ?
Как лучше всего искать нужный узел ?
learner (2006-07-31 12:02:00) [1]Спасибо всем. Успокоили :))
Stakan (2006-07-31 11:48:00) [2]learner © (31.07.06 11:37) [4]
Посмотрел код TTreeNodes.GetNodeFromIndex(D6) и увидел, что при последовательном переборе действительно разница невелика.
learner (2006-07-31 11:37:00) [3]>[3] Stakan © (31.07.06 11:17)
Я сначала пробовала без рекурсии и, не увидев выиграша в скорости,
решила попробовать убрать "лишнее присвоение".
Stakan (2006-07-31 11:17:00) [4]learner © (31.07.06 11:02) [2]
Непонятно зачем рекурсия во втором варианте, и зачем тогда временная переменная.
Попробуй просто
TmpNode := Node;
while TmpNode <> nil do
if TmpNode.Text = 'bala - bala' then
begin
Result := TmpNode;
Exit;
end
else
TmpNode := TmpNode.GetNext;
learner (2006-07-31 11:02:00) [5]>На каких объёмах проверяла?
1500 узлов в дереве
каждую поцедуру вызывала в цикле от 0 до 100
Ega23 (2006-07-31 10:54:00) [6]
> Сколько я не проверяла, скорость одна и та же.
На каких объёмах проверяла?