/ / Iterovať rekurzívne cez uzly v stromovom zobrazení? - delphi, rekurzia, treeview, iterácia

Itera rekurzívne cez uzly v stromovom zobrazení? - delphi, rekurzia, stromové zobrazenie, iterácia

Mám stromový pohľad, ktorý je už vyplnenýso súbormi / adresármi z iného postupu. Chcel by som iterovať jednu po druhej cez položky v stromovom prehľade a prechádzať v presnom poradí zhora nadol. Na rozdiel od bežného zoznamu však nemôžem použiť iba jednoduchý for vyhlásenie k tomu. Musím ísť do každého uzla atď.

Ako to urobím? Dúfam, že existuje spôsob, ako to zvládnem bez použitia rekurzívneho postupu. Keď prechádzam týmito položkami, nemusí mi nevyhnutne záležať na rodičovských alebo podradených uzloch momentálne zameraného. Potrebujem iba prečítať Data majetku každého uzla, keď ich míňam, rovnako akozvýrazním súčasný v stromovom prehľade, keď ním prechádzam. Pre každú položku v tomto stromovom prehľade budem vykonávať určité práce a chcem používateľovi vizuálne zobraziť, ktorá z nich je počas tohto procesu aktuálne vybraná.

odpovede:

16 pre odpoveď č. 1

V skutočnosti môžete použiť a for slučky.

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

Toto je syntaktický cukor pre:

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

Z hľadiska čitateľnosti by som odporučil for/in slučky.

V starších verziách Delphi, ktoré nepodporujú iterátor uzlov, môžete urobiť radšej pomocou a while slučky.

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

Očakávam, že existujú aj iné spôsoby, ako to urobiť. Sú jediné, ktoré poznám!


LU RD robí zaujímavé zistenie, že dokumentácia uvádza:

Prístup k položkám stromového prehľadu pomocou indexu môže byťčasovo náročné, najmä keď stromové zobrazenie obsahuje veľa položiek. Pre optimálny výkon sa pokúste navrhnúť aplikáciu tak, aby mala čo najmenej závislostí od indexu položiek v stromovom zobrazení.

To je celkom pravda. Pre náhodný prístup musí kód kráčať po strome počnúc koreňom až po ith uzol sa nachádza.

Existuje však optimalizácia pre postupnéprístup. Obal na zobrazenie stromu Delphi si pamätá index posledného uzla umiestneného podľa indexu. Keď nabudúce požiadate o uzol s indexom najviac odlišným od uzla vo vyrovnávacej pamäti, požadovaný uzol možno rýchlo vrátiť. Toto sa implementuje v TTreeNodes.GetNodeFromIndex.


3 pre odpoveď č. 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;