2012-12-26 26 views
6

Başka bir yordamdan dosya/klasörlerle doldurulmuş bir ağaç görünümüm var. Ağaç görünümündeki öğelerden tek tek, yukarıdan aşağıya doğru sırayla ilerlemek istiyorum. Ancak, normal bir listeden farklı olarak, bunun için basit bir for ifadesini kullanamıyorum. Ben, vb her düğüm gitmek zorundaAğaç görünümünde düğümleri yinelemeli olarak yineleyin mi?

Bunu nasıl yapacağım? Umarım yinelemeli bir prosedür yapmadan yapabileceğim bir yol var. Bu öğeler üzerinden geçerken, şu anda odaklanmış olanın ebeveyn veya çocuk düğümlerini önemsemem. Sadece her bir düğümün Data özelliğini okuyabildiğim kadarını okumanın yanı sıra, ağaç görünümündeki geçerli olanı vurguladım. Bu ağaç görünümündeki her bir öğe için, biraz iş yapacağım ve bu süreçte seçili olan kullanıcıya görsel olarak görünmek istiyorum.

+0

"Bunun için yalnızca basit bir deyim kullanamıyorum" <- Nedenini anlamakta sorun yaşıyorum? ** için bir ** için ** ile tekrarlayan bir fonksiyon/prosedür kullanmanız gerekiyor, çünkü ** for döngüsünden sonra ** Node.Data özelliği üzerinde harekete geçin ve arayan bir sonraki düğüme geçecek ve ... – ComputerSaysNo

+1

Bunun için basit bir ** for ** deyimi kullanamayacağımı söyledim, çünkü bir ağaç görünümünde öğe dizini veya toplam düğüm sayısı diye bir şey yoktur. Ben yinelemeli bu aynı prosedürü çağıran aslında önlemek çalışıyorum çünkü –

+0

Soruyorum tek sebebi değil hayır özyineleme ile sadece düz bir 0..MAX-1 döngü olurdu, ama bunun mümkün olduğunu sanmıyorum, olduğu ve emin olmak isterim. –

cevap

16

Aslında sen bir for döngü kullanabilirsiniz.

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

okunabilirliği açısından ben for/in döngü öneriyoruz:

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

Bu için sözdizimsel şekerdir. Eğer bir while döngü ile yapmayı tercih edebilir düğüm yineleyici desteklemeyen eski Delphi sürümlerinde

.

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

Bunu yapmanın başka yolları olduğunu umuyorum. Bunlar bildiğim tek şey! endeksine göre

Erişme ağaç görünümü öğeleri ağaç görünümü çok sayıda öğe içeren özellikle, zaman yoğun olabilir:


LU RD documentation devletler ilginç bir gözlem yapar. En iyi performans için, uygulamanızı, ağaç görünümünün öğe dizinine olabildiğince az bağımlı olacak şekilde tasarlamaya çalışın.

Bu oldukça doğrudur. Rastgele erişim için, kod, kökte başlayarak, th düğümün bulunduğu yere kadar yürümelidir.

Ancak sıralı erişim için bir optimizasyon vardır. Delphi ağaç görünümü sarmalayıcısı, endeksle bulunan son düğümün dizinini hatırlar. Önbelleğe alınmış düğümden bir taneden farklı olmayan bir düğüm için bir sonraki sorduğunuzda, gerekli düğüm hızlı bir şekilde döndürülür. Bu, TTreeNodes.GetNodeFromIndex'da uygulanır.

+0

GÜZEL ve ben bir zamanlar bunun mümkün olduğunu düşünmemiştim. –

+0

+1, bir döngüdeki tüm öğelerin içinden geçmenin mümkün olmadığını biliyordu ... – ComputerSaysNo

+0

+1 İlk gönderimden güzel yuvarlama ... – bummi

3
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; 
+0

Bu yalnızca hiyerarşinin ilk düzeyini değil, tüm alt öğelerdir. –

+3

@Jerry No, Bu, tüm –

+0

numaralarını numaralandırıyor ... Daha sonra karışık, sonuçlara vardığım için üzgünüm –

İlgili konular