2009-03-20 22 views
6

में आइटम जोड़ना मेरे पास एक काफी जटिल और बड़ा एप्लीकेशन है जो हाथों को लोड करता है और डेटा लोड करता है। क्या कॉम्बोबॉक्स में आइटम जोड़ने का कोई तेज़ तरीका है जो इतना समय नहीं लेता है? मेरे पी 3 3.2ghz पर, निम्नलिखित स्निपेट लगभग 32,000 आइटम जोड़ने के लिए बस एक सेकंड के नीचे लेता है। (मास्टरसिलिस्ट एक स्ट्रिंगलिस्ट है जिसमें तार आमतौर पर 20 - 30 बाइट लंबा होता है)।डेल्फी कॉम्बोबॉक्स स्पीड

with LookupComboBox do 
begin 
    Items.BeginUpdate; 
    Items.Clear; 
    for i := 0 to MasterCIList.Count - 1 do 
    Items.Add(MasterCIList[i]); 
    Items.EndUpdate; 
end; 

VCL में नीचे ड्रिलिंग, ऐसा लगता है TComboBoxStrings.Add में, वहाँ परिणाम के लिए एक कॉल है कि: = SendMessage (ComboBox.Handle, CB_ADDSTRING, 0, longint (PChar (एस)));

मुझे लगता है कि यह वास्तव में समय ले रहा है (ठीक है, मुझे पता है)। क्या तेज़ चीजों को पॉप्युलेट करने का कोई और तरीका है? कोई भी उच्च गति combox बक्से उपलब्ध हैं? मेरे पास टीएमएस घटक हैं लेकिन वे टीसीम्बोबॉक्स के विस्तार प्रतीत होते हैं।

उदाहरण के लिए, मेरे पास प्लसमेमो है जो एक टीएममो का कुल पुनर्लेखन प्रतीत होता है। मैं प्लसमेमो में एक सेकंड में आसानी से दस लाख लाइन जोड़ सकता हूं। एक टीएममो, मुझे ऐसा नहीं लगता है।

आपके समय के लिए बहुत बहुत धन्यवाद!

+4

कोई जवाब नहीं, लेकिन क्यों आप पृथ्वी पर 32,000 आइटम कॉम्बो बॉक्स में चाहते हैं? यह इतना डेटा स्टोर करने का एक भयानक तरीका है। –

उत्तर

1

शायद cmb.Items.Assign (myStringList) मदद करेगा।

यहां एक जंगली विचार है: मैंने कोशिश नहीं की है, लेकिन आप यह देखने के लिए जांच सकते हैं कि आइटम की संख्या और फिर मालिक ड्राइंग सेट करके कम्बोबॉक्स को वर्चुअल लोड करने का कोई तरीका है या नहीं। कृपया इस पागल विचार को क्षमा करें, लेकिन मुझे लगता है कि मैंने यह किसी भी तरह उपलब्ध होने के बारे में सुना है। अप्रासंगिक: इस यह कैसे पाम ओएस ... जहां बता गया लोड करने के लिए तेजी से जिस तरह से यह सब लोड नहीं करने के लिए है में किया जाता है है ... ;-)

नहीं एक जवाब, लेकिन क्यों पृथ्वी पर तुम चाहते हो जाएगा एक कॉम्बो बॉक्स में 32,000 आइटम? यह इतना डेटा स्टोर करने का एक भयानक तरीका है।

मैं सहमत हूं; यह एक बुरा अभ्यास है ...

17

क्षमा करें अगर मैं परेशान हूं, लेकिन मुझे संदेह है कि 32,000 आइटमों के साथ एक टीसीम्बोबॉक्स भी दूरस्थ रूप से 'उपयोग करने योग्य' है --- मैं कहूंगा कि यह धीमा क्यों है: यह ऐसा करने के लिए कभी नहीं था :)

क्या डेटा फ़िल्टर करने की संभावना होगी, और केवल एक सबसेट लोड करें? अधिक ठोस होने के लिए, एक विशेष डेटाबेस एप्लिकेशन में मैं काम कर रहा हूं, उपयोगकर्ता किसी व्यक्ति की तलाश कर सकता है। हम उपयोगकर्ता को नाम के कम से कम 3 या 4 वर्ण टाइप करने देते हैं, और उसके बाद केवल एक सूची बॉक्स में परिणाम वापस करना शुरू करते हैं। इसने खोज फ़ॉर्म की उपयोगिता में काफी वृद्धि की है, जो पूरी प्रक्रिया को बहुत तेज करता है।

क्या आप एक समान दृष्टिकोण का पालन करने में सक्षम होंगे?

या, पूरी तरह से अलग ले जाने पर, शायद आप VirtualTreeView घटक --- या तो सीधे उपयोग के लिए, या प्रेरणा के लिए देख सकते हैं।

+0

यह एक अच्छी टिप है। हो सकता है कि ऑनड्रॉपडाउन हैंडलर में तार जोड़ें, जो पहले से दर्ज किए गए वर्णों से शुरू करने के लिए फ़िल्टर किए गए हैं। इस तरह उपयोगकर्ता को देरी पर प्रभाव पड़ता है। किसी भी मामले में, 32000 वस्तुओं के साथ एक लुकअप सूची अनुपयोगी है, भले ही तुरंत आबादी हो। – mghie

3

मैं मानता हूँ कि 32K आइटम एक combobox में है करने के लिए ... कहा जा रहा है, आपको पहले एक TStringList में आइटम डाले के संयोजन का उपयोग शुरू/EndUpdate और AddStrings कोशिश कर सकते हैं और फिर एक हास्यास्पद राशि है:

SL := TStringList.Create; 
try 
    // Add your items to the stringlist 
    ComboBox.Items.BeginUpdate; 
    try 
    ComboBox.Items.AddStrings(YourStringList); 
    finally 
    ComboBox.Items.EndUpdate; 
    end; 
finally 
    SL.Free; 
end; 

कोड संकलित करता है, लेकिन मैंने उससे आगे परीक्षण नहीं किया; मैंने कभी भी कुछ दर्जन से अधिक वस्तुओं को एक combobox या listbox में जोड़ने की आवश्यकता महसूस नहीं की है। यदि उससे अधिक वस्तुओं की आवश्यकता हो सकती है, तो मुझे सूची पॉप्युलेट करने से पहले फिल्टर करने का एक तरीका मिल गया है, इसलिए कम आइटम हैं।

जिज्ञासा से बाहर, आप किसी उपयोगकर्ता को निर्णय लेने के लिए कितनी वस्तुओं को हल करने की उम्मीद करते हैं?

1

यह मैं फिर से हूं। मैं 32,000 आइटम जोड़ रहा हूं क्योंकि मुझे इसकी आवश्यकता है। यह मेरे आवेदन में कई नियंत्रणों में से एक है जिसमें वस्तुओं के "बहुत सारे" हैं। मुझे उन कई वस्तुओं की आवश्यकता है। यह सिर्फ ठीक दिखने वाली चीज़ों को काम करता है। वास्तव में वास्तव में। मैं सिर्फ चीजों को अनुकूलित करने की कोशिश कर रहा हूं। उपयोगकर्ताओं को चीजों को ठीक लगता है क्योंकि वे एक निश्चित तार्किक क्रम में हैं।

असाइन और एड्रेसिंग के साथ अब तक जो कुछ भी लगता है वह यह है कि वे अंततः SendMessage कॉल के साथ जोड़ें में समाप्त होते हैं। तो मैं देख रहा हूँ।

प्रतिक्रिया के लिए धन्यवाद।

+1

सबसे पहले, इस तरह का "उत्तर" पोस्ट करना गलत है। अपनी मूल पोस्ट संपादित करें। दूसरा, फिर से, मैं 20+ सालों के लिए प्रोग्रामिंग कर रहा हूं, 15+ के लिए विन ऐप्स, कुछ असाधारण जटिल ऐप्स किए हैं, और कभी भी एक combobox में 1K आइटम की आवश्यकता नहीं मिली है। लेकिन आपको शुभकामनाएं (और आपके ऐप के उपयोगकर्ता)। –

+0

केन के साथ सहमत हैं। स्पष्ट होने के लिए - अगर यह वास्तव में आपके प्रश्न का उत्तर है तो उत्तर पोस्ट करना ठीक है। यदि आपके पास कोई टिप्पणी है तो बस अपना प्रश्न संपादित करें। – Argalatyr

0

शायद आप बैक एंड में डेटाबेस इंजन का उपयोग कर सकते हैं और डेटा जागरूक घटक का उपयोग कर सकते हैं। फिर चीजें अधिक तेज़ी से और उपयोग योग्य हो जाएंगी। शायद अगर आप यह वर्णन करने की कोशिश करेंगे कि आप क्या करने की कोशिश करते हैं तो हम आपकी मदद करेंगे। किसी भी मामले में, आपका यूआई डिज़ाइन है, मान लें, विषम। और इसके लिए शायद Embarcadero forums आपको बेहतर मदद करेगा।

0

मैं इसे एक अलग तरीके से कार्यान्वित करता हूं। सबसे पहले मैंने कम्बोबॉक्स नियंत्रण हटा दिया और टेक्स्टबॉक्स नियंत्रण लिया और इसे कस्टम स्रोत के लिए स्वत: पूर्ण कर दिया जहां कस्टम स्रोत स्ट्रिंग संग्रह 32k आइटम है। मुझे नियंत्रण सत्यापन पर एक नई क्वेरी से चयनित मान मिलता है।

तो यह combobox कार्यक्षमता को प्रतिस्थापित कर सकता है। ज्यादातर के बारे में 32k आइटम लोग न स्क्रॉल लेकिन वे केवल AddStrings का उपयोग MasterCIList items.after पूरा जोड़ने आइटम जोड़ने के लिए उपयोग backgroundworker की स्ट्रोक में प्रवेश रखने के लिए और हमारे कस्टम स्वत: पूर्ण स्रोत द्वारा catched है ..

1

procedure TForm2.BackgroundWorker1Work(Worker: TBackgroundWorker); 
var 
    I: Integer; 
begin 
    MasterCIList.BeginUpdate; 
    try 
    MasterCIList.Capacity := 32 * 1024; // if derminate count of items 
    for I := 1 to 32 * 1024 do 
    begin 
     MasterCIList.Add(IntToStr(I)); 
     { if need progess } 
     if I mod 300 = 0 then 
     Worker.ReportProgress((I * 100) div MasterCIList.Capacity); 
     { if need cancelable } 
     if (I mod 100 = 0) and Worker.CancellationPending then 
     Break; 

    end; 

    finally 
    MasterCIList.EndUpdate; 
    end; 

end; 

procedure TForm2.BackgroundWorker1WorkComplete(Worker: TBackgroundWorker; 
    Cancelled: Boolean); 
begin 

    LookupComboBox.Items.AddStrings(MasterCIList); 


// AddStrings use beginupdate..endupdate in itself 

end; 
2
var 
    Buffer: TStringList; 
begin 
    Buffer := TStringList.Create; 

    try 
    // --> Add items to Buffer here <-- 

    ComboBox.Items := Buffer; 
    finally 
    FreeAndNil(Buffer); 
    end; 
end; 

यह सबसे तेज़ तरीका है कि हम एक दृश्य नियंत्रण अद्यतन करने के लिए मिल गया है कि "एक combobox या लिस्टबॉक्स में आइटम डाले बढ़ाता है"।

वीसीएल प्रारंभिक अद्यतन, साफ़, और अंत में अद्यतन करता है।

यदि आप मुझ पर विश्वास नहीं करते हैं, तो इसे प्रोफ़ाइल करें।

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