/ / Iterować rekurencyjnie przez węzły w widoku drzewa? - delphi, rekurencja, widok drzewa, iteracja

Iterować rekursywnie przez węzły w widoku drzewa? - delphi, rekurencja, widok drzewa, iteracja

Mam widok drzewa, który jest już wypełnionyz plikami / folderami z innej procedury. Chciałbym iterować jeden po drugim po elementach w widoku drzewa, przechodząc w kolejności od góry do dołu. Jednak w przeciwieństwie do zwykłej listy, nie mogę użyć tylko prostej for oświadczenie w tej sprawie. Muszę wejść do każdego węzła itp.

Jak mam to zrobic? Mam nadzieję, że istnieje sposób, aby to zrobić bez uruchamiania procedury rekurencyjnej. Podczas iteracji po tych elementach niekoniecznie przejmuję się nadrzędnymi lub podrzędnymi węzłami aktualnie skupionego. Muszę tylko móc przeczytać Data właściwość każdego węzła, gdy je przekazuję, a takżepodświetlając bieżący w widoku drzewa, gdy go przeglądam. Dla każdego elementu w tym widoku drzewa wykonam trochę pracy i chcę wizualnie wyświetlić użytkownikowi, który jest aktualnie wybrany podczas tego procesu.

Odpowiedzi:

16 dla odpowiedzi nr 1

W rzeczywistości możesz użyć for pętla.

var
Node: TTreeNode;
....
for Node in TreeView.Items do
DoSomething(Node);

To jest cukier syntaktyczny dla:

for i := 0 to TreeView.Items.Count-1 do
DoSomething(TreeView.Items[i]);

Pod względem czytelności polecam for/in pętla.

W starszych wersjach Delphi, które nie obsługują iteratora węzłów, możesz to zrobić za pomocą while pętla.

Node := TreeView.Items.GetFirstNode;
while Assigned(Node) do
begin
DoSomething(Node);
Node := Node.GetNext;
end;

Spodziewam się, że istnieją inne sposoby, aby to zrobić. To jedyne, które znam!


LU RD dokonuje ciekawej obserwacji, że dokumentacja stwierdza:

Dostęp do elementów widoku drzewa według indeksu może byćczasochłonne, szczególnie gdy widok drzewa zawiera wiele elementów. Aby uzyskać optymalną wydajność, spróbuj zaprojektować aplikację tak, aby miała jak najmniej zależności od indeksu elementów widoku drzewa.

To jest całkiem prawda. Aby uzyskać dostęp losowy, kod musi przejść drzewo, zaczynając od katalogu głównego, aż do ith węzeł znajduje się.

Istnieje jednak optymalizacja sekwencyjnadostęp. Opakowanie widoku drzewa Delphi zapamiętuje indeks ostatniego węzła znajdującego się według indeksu. Następnym razem, gdy poprosisz o węzeł o indeksie nie większym niż jeden inny niż buforowany, wymagany węzeł można szybko zwrócić. Jest to zaimplementowane w TTreeNodes.GetNodeFromIndex.


3 dla odpowiedzi № 2
var
i:Integer;
begin
for I := 0 to tv.Items.Count - 1 do
begin
Listbox1.Items.Add(tv.Items[i].Text +" SubItems: " + IntToStr(tv.Items[i].Count))
end;

end;