2012-12-26 13 views
6

मेरे पास एक पेड़ दृश्य है जो पहले से ही किसी अन्य प्रक्रिया से फ़ाइलों/फ़ोल्डर्स के साथ पॉप्युलेट किया गया है। मैं पेड़ दृश्य में वस्तुओं के माध्यम से एक-एक करके फिर से शुरू करना चाहता हूं, जो ऊपर से नीचे तक सटीक क्रम में जा रहा है। हालांकि, एक सामान्य सूची के विपरीत, मैं इसके लिए केवल एक साधारण for कथन का उपयोग नहीं कर सकता। मुझे प्रत्येक नोड में जाना है, आदिएक पेड़ दृश्य में नोड्स के माध्यम से पुनरावर्ती Iterate?

मैं यह कैसे कर सकता हूं? मैं उम्मीद कर रहा हूं कि एक पुनरावर्ती प्रक्रिया चलाने के बिना मैं ऐसा कर सकता हूं। जैसे-जैसे मैं इन वस्तुओं के माध्यम से पुन: प्रयास करता हूं, मुझे वर्तमान में ध्यान केंद्रित करने वाले माता-पिता या बच्चे नोड्स की जरुरत नहीं है। मुझे बस Data प्रत्येक नोड की संपत्ति को पढ़ने के लिए सक्षम होने की आवश्यकता है, साथ ही साथ पेड़ दृश्य में वर्तमान को हाइलाइट करने के लिए, जैसा कि मैं इसके माध्यम से जाता हूं। इस पेड़ दृश्य में प्रत्येक आइटम के लिए, मैं कुछ काम कर रहा हूं और इस प्रक्रिया के दौरान वर्तमान में चयनित उपयोगकर्ता को दृश्य रूप से प्रदर्शित करना चाहता हूं।

+0

"मैं इसके लिए कथन के लिए बस इतना आसान उपयोग नहीं कर सकता" <- मुझे समझ में परेशानी हो रही है क्यों? ** ** लूप के लिए ** ** के बाद ** आप नोड पर कार्य करते हैं ** डेटा प्रॉपर्टी और कॉलर अगले नोड पर आगे बढ़ेगा और इसी तरह आप ** के लिए ** ** के साथ एक रिकर्सिव फ़ंक्शन/प्रक्रिया का उपयोग करना चाहते हैं। ... – ComputerSaysNo

+1

मैंने कहा कि मैं इसके लिए ** कथन के लिए एक साधारण ** का उपयोग नहीं कर सकता, क्योंकि पेड़ दृश्य में आइटम इंडेक्स या कुल नोड गिनती जैसी कोई चीज़ नहीं है। –

+0

मैं जो कारण पूछ रहा हूं वह इसलिए है क्योंकि मैं वास्तव में इस प्रक्रिया को दोबारा कॉल करने से बचने की कोशिश कर रहा हूं, इसके बजाय मुझे कोई सीधा 0..मैक्स -1 लूप नहीं होगा, लेकिन मुझे नहीं लगता कि यह संभव है , और मैं निश्चित करना चाहता हूं। –

उत्तर

16

वास्तव में आप for लूप का उपयोग कर सकते हैं।

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

पठनीयता के संदर्भ में मैं for/in पाश की सिफारिश करेंगे:

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

यह वाक्यात्मक चीनी के लिए है।

पुराने डेल्फी संस्करणों में जो नोड इटरेटर का समर्थन नहीं करते हैं, आप इसे while लूप के साथ करना पसंद कर सकते हैं।

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

मुझे उम्मीद है कि ऐसा करने के अन्य तरीके हैं। ये केवल वे हैं जिन्हें मैं जानता हूं!

तक पहुँचना सूचकांक द्वारा ट्री व्यू आइटम समय गहन हो सकता है, खासकर जब ट्री दृश्य कई मदों में शामिल हैं:


LU आरडी रोचक अवलोकन है कि documentation राज्यों में आता है। इष्टतम प्रदर्शन के लिए, अपने एप्लिकेशन को डिज़ाइन करने का प्रयास करें ताकि पेड़ दृश्य के आइटम इंडेक्स पर जितनी संभव हो सके उतनी निर्भरता हो।

यह काफी सच है। यादृच्छिक अभिगम के लिए कोड को रूट पर शुरू करने के लिए पेड़ पर चलना है, जब तक कि मैं वें नोड स्थित न हो।

हालांकि, अनुक्रमिक पहुंच के लिए एक अनुकूलन है। डेल्फी पेड़ व्यू रैपर इंडेक्स द्वारा स्थित अंतिम नोड की अनुक्रमणिका को याद करता है। अगली बार जब आप कैश किए गए नोड से एक से अधिक अलग इंडेक्स के साथ नोड मांगते हैं, तो आवश्यक नोड को तुरंत वापस किया जा सकता है। यह TTreeNodes.GetNodeFromIndex में लागू किया गया है।

+0

नाइस और मैंने कभी सोचा नहीं था कि यह संभव था। –

+0

+1 कभी नहीं पता था कि यह एक पाश में सभी आइटम के माध्यम से जाना संभव है ... – ComputerSaysNo

+0

+1 अच्छा आरंभिक पोस्ट के बंद गोलाई ... – 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

यह केवल पदानुक्रम का पहला स्तर है, सभी उपसमूह नहीं। –

+3

@ जेरी नो, यह उनके विश्लेषण करता है सब –

+0

... मैं निष्कर्ष पर कूद के लिए संदेह में हूँ तो, क्षमा करें। –

संबंधित मुद्दे