मेरे पास एक ऐप है जो बाइनरी लॉग फ़ाइल से रिकॉर्ड लोड करता है और उन्हें वर्चुअल TListView में प्रदर्शित करता है। फ़ाइल में संभावित रूप से लाखों रिकॉर्ड हैं, और डिस्प्ले को उपयोगकर्ता द्वारा फ़िल्टर किया जा सकता है, इसलिए मैं एक ही समय में मेमोरी में सभी रिकॉर्ड्स लोड नहीं करता हूं, और ListView आइटम इंडेक्स 1-से-1 संबंध नहीं हैं फ़ाइल रिकॉर्ड ऑफ़सेट (उदाहरण के लिए सूची आइटम 1 फ़ाइल रिकॉर्ड 100 हो सकता है)। मैं ListView के OnDataHint ईवेंट का उपयोग केवल सूची दृश्यों के लिए रिकॉर्ड्स लोड करने के लिए करता हूं, क्योंकि सूची वास्तव में दिलचस्पी लेती है। जैसे ही उपयोगकर्ता स्क्रॉल करता है, ऑनडाटाइंट परिवर्तन द्वारा निर्दिष्ट सीमा, मुझे नए रिकॉर्ड में नहीं होने वाले रिकॉर्ड मुक्त करने की अनुमति देता है, और नए रिकॉर्ड आवंटित करता है जैसी जरूरत थी।टीवीर्टुअलस्ट्रिंगट्री - गैर-दृश्य नोड्स और मेमोरी खपत को रीसेट करना
यह ठीक काम करता है, गति सहनशील है, और स्मृति पदचिह्न बहुत कम है।
मैं वर्तमान में TListView के लिए एक स्थानापन्न के रूप TVirtualStringTree का मूल्यांकन कर रहा हूँ, मुख्य रूप से, क्योंकि मैं विस्तृत करने/संक्षिप्त रिकॉर्ड कि कई पंक्तियों अवधि क्षमता जोड़ना चाहते हैं (मैं इसे TListView साथ incrementing/decrementing आइटम गतिशील गिनती द्वारा हेराफेरी कर सकते हैं, लेकिन यह वास्तविक पेड़ का उपयोग करने के रूप में सीधे आगे नहीं है)।
अधिकांश भाग के लिए, मैं TListView तर्क को बंद करने में सक्षम हूं और मुझे जितनी भी आवश्यकता है, सबकुछ काम कर रहा है। मैंने देखा कि टीवीर्टुअलस्टिंगट्री का वर्चुअल प्रतिमान काफी अलग है, हालांकि। इसमें एक ही प्रकार की ऑनडाटाहिंट कार्यक्षमता नहीं है जो TListView करता है (मैं ऑनस्क्रॉल ईवेंट का उपयोग नकली में कर सकता हूं, जो मेरी मेमोरी बफर लॉजिक को काम जारी रखने की अनुमति देता है), और मैं आवंटित रिकॉर्ड्स के साथ नोड्स को जोड़ने के लिए ऑनइंस्टॉलिज़ नोड इवेंट का उपयोग कर सकता हूं ।
हालांकि, एक बार पेड़ नोड शुरू होने के बाद, यह देखता है कि यह पेड़ के जीवनकाल के लिए शुरू हुआ है। यह मेरे लिए अच्छा नहीं है। चूंकि उपयोगकर्ता चारों ओर स्क्रॉल करता है और मैं स्मृति से रिकॉर्ड हटा देता हूं, मुझे उन गैर-दृश्य नोड्स को पेड़ से पूरी तरह से हटाए बिना, या उनके विस्तार/पतन राज्यों को खोए बिना रीसेट करने की आवश्यकता होती है। जब उपयोगकर्ता उन्हें वापस देखता है, तो मैं रिकॉर्ड्स को फिर से आवंटित कर सकता हूं और नोड्स को फिर से शुरू कर सकता हूं। असल में, मैं जितना संभव हो सके TListView की तरह टीवीर्टुअलस्ट्रिंग ट्री कार्य करना चाहता हूं, जहां तक इसका वर्चुअलाइजेशन संबंधित है।
मैंने देखा है कि टीवीर्टुअल स्टिंगट्री के पास रीसेट नोड() विधि है, लेकिन जब भी मैं इसका उपयोग करने की कोशिश करता हूं तो मुझे कई त्रुटियों का सामना करना पड़ता है। मुझे इसका गलत इस्तेमाल करना होगा। मैंने अपने रिकॉर्ड बफर में प्रत्येक नोड के अंदर डेटा पॉइंटर को संग्रहीत करने का भी सोचा, और मैं आवंटित और मुक्त मेमोरी, तदनुसार उन पॉइंटर्स को अपडेट करें। अंत प्रभाव इतना अच्छा काम नहीं करता है, या तो।
इससे भी बदतर, मेरी सबसे बड़ी टेस्ट लॉग फ़ाइल में ~ 5 मिलियन रिकॉर्ड हैं। यदि मैं एक बार में कई नोड्स के साथ टीवीर्टुअल स्टिंगट्री शुरू करता हूं (जब लॉग डिस्प्ले unfiltered है), इसके नोड्स के लिए पेड़ का आंतरिक ओवरहेड 260 एमबी मेमोरी लेता है (बिना किसी रिकॉर्ड के आवंटित किए गए)। जबकि TListView के साथ, उसी लॉग फ़ाइल को लोड करना और इसके पीछे सभी मेमोरी तर्क, मैं केवल कुछ एमबी का उपयोग कर दूर हो सकता हूं।
कोई विचार?
मैं वर्तमान में एक टीएलिस्टबॉक्स में बनाम रिपोर्ट मोड में एक TListView का उपयोग करता हूं। TListView vsReport में चर-ऊंचाई आइटम का समर्थन नहीं करता है। –
मैं इसे अभी उत्तर के रूप में चिह्नित कर रहा हूं, लेकिन केवल इसलिए कि यह मुझे VST पर स्विच न करने के लिए कहता है। –