![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить TTreeNode
Дмитрий К.К. © (2002-10-26 10:07:00)Подскажите, плиз, как получить TTreeNode по его StateIndex?
MBo (2002-10-28 13:56:00) [1]>Но мне на форуме Борланда уже ответили конкретно, с примером и без хождения вокруг да около
С твоей стороны такое заявление непорядочно.
Стоило привести здесь know-how, касающееся просто метода ускоренного обхода дерева
It"s much more efficient to walk a tree using the internal node pointers than to loop
through the Items.
function GetMyNode( StateNDX: Integer ): TTreeNode;
var
Node: TTreeNode;
begin
Node := TreeView.GetFirstNode;
while Assigned( Node ) and ( Node.StateIndex <> StateNDX ) do
Node := Node.GetNext;
Result := Node;
end;
John Leavey
Дмитрий К.К. (2002-10-28 13:36:00) [2]Спасибо!
Но мне на форуме Борланда уже ответили конкретно, с примером и без хождения вокруг да около :)
turusov (2002-10-28 13:22:00) [3]В uses ComCtrls в implementation есть TTreeStrings. Там в SaveTreeToStream есть реализация перебора дерева, может это что надо.
troits (2002-10-28 12:19:00) [4]Ну, StateIndex - просто индекс картинки в списке TreeView.StateImages для отображения. Во-первых, много узлов может иметь один и тот же индекс. Когда он назначается, например при создании узла, или когда - либо ещё, ты имеешь сам указатель на узел. Ну и запоминай его где-нибудь, например в списке TList, чтобы не проходить потом все дерево.
Дмитрий К.К. (2002-10-28 06:44:00) [5]
> troits © (26.10.02 12:27)
> Оптимальнее было бы при назначении
> узлу StateIndex-a запоминать ссылку на него в каком-нибудь
> списке пар (StateIndex, List_Of_TreeNodes)
Можно чуточку подробнее?
troits (2002-10-26 12:27:00) [6]Конечно не оптимально. Оптимальнее было бы при назначении узлу StateIndex-a запоминать ссылку на него в каком-нибудь списке пар (StateIndex, List_Of_TreeNodes) , если уж это так надо, хотя это очень странный способ привязки к узлу.
Потом даже в приведенный код можно улучшить, поставив выход из цикла после нахождения нужного узла.
Дмитрий К.К. (2002-10-26 10:32:00) [7]Делаю так:
function GetMyNode(StateNDX: Integer): TTreeNode;
var
i: Integer;
begin
Result := nil;
for i := 0 to TreeView.Items.Count - 1 do
if TreeView.Items[i].StateIndex = StateNDX then
Result := TreeView.Items[i];
end;
но уверен, что ето не оптимально