2012-03-05 13 views
8

मैं डेल्फी 2009 के लिए वर्चुअल ट्री सूची का उपयोग कर रहा मैं जैसे डेटा के साथ एक पेड़ बना लिया है:पुनरावृत्ति और संशोधित डेटा

type 
    PTreeData = ^TTreeData; 
    TTreeData = record 
    FCaption: String; 
    FPath: String; 
    end; 

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

सबसे पहले मैं शीर्ष स्तर नोड पर itterate करने के लिए कैसे पता नहीं है।

इस

+2

इस विशेष प्रश्न के लिए उपयुक्त नहीं है, लेकिन 'IterateSubtree' विधि भी देखें। –

उत्तर

11

पर कोई सुझाव के लिए अग्रिम धन्यवाद यहाँ शीर्ष स्तर नोड्स पुनरावृति करने का तरीका बताया। कृपया ध्यान दें (के रूप में कड़ी चोट उसकी टिप्पणी में छोड़ दिया) कि नोड्स अगर GetFirst और GetNextSibling का उपयोग कर क्या नीचे यात्रा एक छोटा सा धीमी गति से हो सकता है की जरूरत प्रारंभ किया जा रहा है। लेकिन अगर आप GetFirstNoInit और GetNextNoInit कार्यों (यदि आप पहले से ही नोड्स प्रारंभ किया है) का उपयोग कर सकते हैं और आप बेहतर प्रदर्शन प्राप्त हो सकता है।

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Data: PTreeData; 
    Node: PVirtualNode; 
begin 
    Node := VirtualStringTree1.GetFirst; 
    while Assigned(Node) do 
    begin 
    Data := VirtualStringTree1.GetNodeData(Node); 
    // here you can access your data 
    Node := VirtualStringTree1.GetNextSibling(Node); 
    end; 
end; 
+2

यह लगभग काम करता है :) इसके बजाय GetNext मैं GetNextSibling उपयोग करने के लिए केवल शीर्ष स्तर नोड पर पुनरावृति की जरूरत है। कृपया इसे सही करें ताकि मैं आपका उत्तर स्वीकार कर सकूं। और धन्यवाद! :) –

+6

लेकिन जेसेक, आपके सवाल स्पष्ट रूप से आप सभी उच्च-स्तरीय नोड्स * और अपने बच्चों को * से अधिक पुनरावृति करने की जरूरत है कहते हैं। –