2010-11-20 13 views
8

डेल्फी में कई क्षेत्रों के साथ एक सूचीदृश्य है। एक थ्रेड चेक करता है और सूचीदृश्य में आइटम जोड़ता है। यदि एक ही कैप्शन है, तो इस कैप्शन के उप-वर्ग में एक पूर्णांक जोड़ा जाएगा। जब आइटम गिनती 2000 से कम है, तो प्रदर्शन ठीक है। आइटम और आइटम गिनती की जांच और जोड़ते समय 2000 से अधिक हैं, प्रदर्शन खराब है। जब आइटम गिनती 20,000 से बड़ी होती है, तो प्रदर्शन को अत्यधिक धीमी गति से वर्णित किया जा सकता है। क्या आइटम सूची 50,000 या 100,000 तक पहुंचने पर सूची दृश्य में तेज़ी से पढ़ने और लिखने का कोई तरीका है?डेल्फी में सूचीदृश्य में पढ़ने और लिखने के लिए कैसे?

हम पढ़ लिया है सब अपने जवाब और आपकी मदद के लिए सभी को धन्यवाद:

आप

संपादित अग्रिम में बहुत बहुत धन्यवाद।

उत्तर

9

आपको बस "वर्चुअल" मोड में अपनी सूची का उपयोग करने की आवश्यकता है।

  1. अपने फॉर्म पर एक TListBox डालें;
  2. स्टाइल प्रॉपर्टी को lbVirtual पर सेट करें।
  3. अपनी सूची के आइटमों की संख्या के लिए गणना संपत्ति सेट करें।
  4. तब पाठ प्रदान करने के लिए OnData हैंडलर का उपयोग अनुरोध पर प्रदर्शित करने के लिए:

इस कोड में के रूप में (अपने डेटाबेस या से कुछ डेटा के साथ बदलें एक TStringList या इस तरह के):

procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer; 
    var Data: String); 
begin 
    Data := Format('Item %d',[Index+1]); // set the text to be displayed 
end; 

आप lbVirtualOwnerDraw शैली का उपयोग करके ड्राइंग को और अनुकूलित कर सकते हैं, और आपको ऑनड्राइटम ईवेंट हैंडलर का उपयोग करके आइटम खींचना होगा। डेल्फी दस्तावेज में कुछ नमूना कोड है (कम से कम डेल्फी 7 के तहत)। ;)

वर्चुअल मोड में, आप तात्कालिक तरीके से 50000 या 100000 आइटम प्रदर्शित कर सकते हैं।

टेक्स्ट को संग्रहीत करने के लिए, एक अच्छी पुरानी TStringList का उपयोग करके TListBox की आइटम विधि से तेज़ होगा, क्योंकि इस आइटम [] संपत्ति को प्रत्येक आइटम के लिए "धीमे" जीडीआई संदेशों के साथ विंडोज के साथ संवाद करना होगा, जबकि एक TStringList केवल डेल्फी ढेर में टेक्स्ट स्टोर करेगा, जो आमतौर पर बहुत तेज़ होता है।

+0

आपको बहुत बहुत धन्यवाद। – Dylan

6

अद्यतन के दौरान सूची को रोकने के लिए सूचीदृश्य को रोकने के द्वारा, आप प्रदर्शन सुधारने के लिए सूची दृश्य पर BeginUpdate और EndUpdate को कॉल कर सकते हैं। लेकिन यह शायद आपको वह बढ़ावा नहीं देगा जो आप चाहते हैं। इसके अलावा, आपको यह जानने की जरूरत है कि सीधे थ्रेड से वीसीएल नियंत्रणों तक पहुंच को सिंक्रनाइज़ किए जाने तक सुरक्षित नहीं है।

मुझे लगता है कि सूचीदृश्य को छोड़ना और Virtual Tree View जैसे तृतीय पक्ष नियंत्रण को चुनना बेहतर होगा जो कि महान और नि: शुल्क दोनों है। :)

+0

मैंने वर्चुअल ट्री व्यू घटक पर तुरंत देखा। कोड में पूरी तरह से कॉलम और पेड़ नोड्स पर कई मानक TListView और TTreeView नियंत्रकों का उपयोग करके इसे एप्लिकेशन में स्थानांतरित करने के लिए "कठिन" कितना "कठिन" है? क्या हम उन हिस्सों के पूर्ण पुनर्लेखन की बात कर रहे हैं? यदि हां, तो स्पीड गेन में कितना अंतर होगा, केवल टीटीवी व्यू और टीएलिस्टवीव बी के साथ चिपकने के लिए उन्हें वर्चुअल वाले के रूप में काम करने के लिए बदलना होगा? – inquam

+0

मैं ईमानदारी से गति अंतर नहीं जानता। मुझे लगता है कि एक आभासी TListView बहुत तेजी से भी हो सकता है, लेकिन मुझे लगता है कि रास्ते में इसका उपयोग नहीं किया है, इसलिए मैं आप एक उचित तुलना नहीं दे सकता। – GolezTrol

10

डेल्फी TListView नियंत्रण विंडोज सूची दृश्य घटक के चारों ओर एक रैपर है। सूची डेटा की ऑपरेशन प्रतियों के डिफ़ॉल्ट मोड में आपके ऐप से विंडोज नियंत्रण में स्थानांतरित किया जाता है और यह धीमा है।

इसका विकल्प विंडोज शब्दावली में वर्चुअल सूची दृश्य के रूप में जाना जाता है। आपका ऐप डेटा को विंडोज नियंत्रण में पास नहीं करता है। इसके बजाए, जब नियंत्रण को डेटा प्रदर्शित करने की आवश्यकता होती है तो यह आपके ऐप को आवश्यक डेटा के लिए पूछता है।

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

+2

मैं यह भी सुझाव देने जा रहा था कि उसे सूचीदृश्य के वर्चुअल मोड पर स्विच करना पड़ा। व्यक्तिगत रूप से हम वर्चुअल ट्री व्यू का उपयोग करते हैं जिसे गोल्ज़ट्रोल ने उल्लेख किया है। –

+1

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

+1

दुर्भाग्य से इस मोड में सूचीदृश्य GroupView का समर्थन नहीं करता ... – Tupel

2

ऑनडाटा हैंडलर का उपयोग करके वर्चुअल लिस्टव्यू आज़माएं।

डेटा आपके डेटा संरचना में रहता है, सूचीदृश्य आपके ऑनडाटा हैंडलर को केवल डेटा आइटम प्राप्त करने के लिए कॉल करता है जब उसे इसकी आवश्यकता होती है। यानी जब आप पूछते हैं तो आप अपने डेटा संरचना से विशेष डेटा निकालते हैं।

आपका अन्य काम सूची में आइटम की संख्या में सूचीदृश्य की आइटमकाउंट रखना है।

3

कई साल पहले हमने पाया कि StartUpdate/EndUpdate के अलावा सूची दृश्य की दृश्यता को बदलने के पहले सूची में व्यू स्टाइल को बदलना, और इसके बाद वर्कपॉर्ड पर वापस लाने के बाद हमें काफी सुधार हुआ। यह विंडोज 98 और विंडोज 2000 पर था अगर मुझे सही याद है तो मुझे यकीन नहीं है कि यह अभी भी मामला है या नहीं।

3

आइटम अपडेट करते समय BeginUpdate और EndUpdate एक पूर्ण आवश्यक है। आपके विवरण से यह एक विशिष्ट कैप्शन की तलाश में वस्तुओं के माध्यम से आपके लूपिंग की तरह लगता है। यह धीमा है और स्पष्ट रूप से डेटा की बड़ी मात्रा के साथ अधिक ध्यान देने योग्य होगा।

चूंकि आप मिलान करने वाले कैप्शन की तलाश में हैं, तो सूचीदृश्य FindCaption फ़ंक्शन का उपयोग करें।

यह आइटम खोजने के लिए एक विंडोज कॉल करता है और काफी तेज़ और सरल है। यदि यह पाता है तो यह आइटम को वापस भेज देता है और आप इसे सबिटैम को अपडेट करने के लिए संदर्भित कर सकते हैं। अन्यथा एक नया आइटम बनाएं और अपनी प्रसंस्करण के साथ जारी रखें।

जब तक आपका धागा सुरक्षित हो और आपको सभ्य प्रदर्शन देखने में सक्षम होना चाहिए।

एचटीएच।

+0

FindCaption IIRC API कॉल की ओर जाता है, लेकिन मैं इस बारे में गलत हो सकता है। मेरे पास इस मशीन पर 100% निश्चित होने के लिए डेल्फी नहीं है। –

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