6

के साथ गायब हो जाता है मैं गाइड का उपयोग कर एक सीधा MATLAB GUI बना रहा हूं। मेरे पास वस्तुओं का एक सूची बॉक्स है। अधिकांश समय, यह के रूप में की उम्मीद काम करता है, लेकिन कभी कभी (आमतौर पर के बाद मैं गाइड के साथ आंकड़ा संपादित) लिस्टबॉक्स पॉप्युलेट इसे गायब करने का कारण बनता है, इस संदेश के साथ:MATLAB GUIDE gui listbox अप्रत्याशित रूप से अप्रचलित त्रुटि

Warning: single-selection listbox control requires a scalar Value 
Control will not be rendered until all of its parameter values are valid 

यह व्यवहार डिबगिंग खारिज कर देता है! जब मैं आगे बढ़ता हूं, यह अपेक्षा के अनुसार काम करता है (मुझे संदेह है कि यह एक तरह की धागा दौड़ या कुछ है)। इसके अलावा, यह आमतौर पर समान स्थितियों के तहत MATLAB पर्यावरण को पुनरारंभ करने के बाद चला जाता है।

इस त्रुटि पर मिले सभी दस्तावेज MATLAB के पिछले/प्राचीन संस्करणों (मैं R2010a का उपयोग कर रहा हूं) का संदर्भ देता हूं।

इस विषय पर किसी भी विचार या जानकारी की सराहना की जाएगी!


संपादित करें: मिखाइल के लिए धन्यवाद, मुझे समस्या हल हो गई है। मैं भविष्य में संदर्भ के लिए यहां अपना कोड पोस्ट कर रहा हूं।

डीबग प्रिंटिंग और जंगली क्लिकिंग के बहुत सारे बाद, मैंने पाया कि कभी-कभी जब आप सूची बॉक्स से पूछते हैं कि क्या चुना जाता है, तो आपको खाली परिणाम मिलता है। यह और अन्य समस्याओं ने चीजों को गड़बड़ कर दिया। मैंने लिस्टबॉक्स में मेरी सभी लेखन इंटरैक्शन को केंद्रीकृत फ़ंक्शन में ले जाया, और मैंने कुछ परीक्षण कोड लिखा ताकि यह सुनिश्चित किया जा सके कि चीजें जिस तरह से रहें।

कृपया ध्यान दें कि यह मेरे अपने पर्यावरण (R2010a पर) का परीक्षण किया गया है और बड़े पैमाने पर नहीं। इसके अलावा, कोड थोड़ा अनावश्यक है, लेकिन यह मुझे वैसे भी अच्छा महसूस कर रहा है। (यानी। itemcount 0 से कम नहीं हो सकता है ...)

function ensure_listbox_ok(handles) 

%check to make sure it does not suck - ask what it has 
thestrings = get(handles.listbox_files, 'String'); 
selection = get(handles.listbox_files, 'Value'); 

itemcount = length(thestrings); 

betterselection = selection; 

if(itemcount <= 0) 
    betterselection = 1; 
else 
    if(selection > itemcount) 
     betterselection = itemcount; 
    end 
end 

%never use zero!!!! even if 1 is out of bounds. 
if(isempty(betterselection) || betterselection <= 0) 
    betterselection = 1; 
end 

%uncomment for debug logging 
%display(['Was: ' num2str(selection) ', cleaned: ' num2str(betterselection)]); 

%update if we are out of bounds. 
if(isempty(selection) || betterselection ~= selection) 
    set(handles.listbox_files, 'Value', betterselection); 
end 

उत्तर

2

यह एक ज्ञात प्रोग्रामिंग त्रुटि है और यह रेस स्थिति से कोई लेना-देना नहीं है!

यह है कि यह कैसे काम करना चाहिए है:

पॉपअप और एकल चयन सूची के लिए string संपत्ति चाहिए नहीं खाली है, यानी कुछ सामग्री है। लेकिन यह डिफ़ॉल्ट रूप से खाली है इसलिए इसे हमेशा परिभाषित किया जाना चाहिए।

पॉपअप में दिखाया गया है (सूची हाइलाइट किया गया) मद दो गुण string द्वारा परिभाषित किया गया है और value (जो डिफ़ॉल्ट रूप से 1 है) (तार के सेल सरणी के रूप में)।

रिक्त सरणी में पहला तत्व लेना स्पष्ट रूप से काम नहीं करता है, इसलिए नियंत्रण प्रदान नहीं किया जा सकता है!

आपका लिस्टबॉक्स नियंत्रण एकल चयन है - इसकी गुण min < max और value स्केलर और> 0 है। सूची बॉक्स (लेकिन पॉपअप नहीं) बहु-चयन हो सकता है यदि संपत्ति min>max, इस मामले में value एक सरणी (जो खाली भी तात्पर्य है) हो सकती है और string खाली नहीं हो सकती है।

uicontrol गुण string, value, min, max, listboxtop

प्रैक्सिस

  • आप इसे गाइड के साथ संपादन के बाद में प्रकट होता है का कहना है कि में के लिए पढ़ें MATLAB मदद। गाइड कोड-पीछे बनाता है। पुराने कोड-बैक को संपादित करने के बाद कभी-कभी जगह बना रहता है।
  • कभी कभी MATLAB एक बयान के अंदर आदेश के प्रति संवेदनशील है, यानि कि 2 को set(hlist, 'value', 2, 'string', {'aa','bb'}) सेट भोलेपन से valuestring से पहले काफी लंबे समय है और uicontrol अमान्य हो जाएगा।
  • MATLAB छोटी है, साल में दो बार हर नया संस्करण पुराना हटा देता है और नई बग लाता है। यदि आप सुनिश्चित हैं कि डिबगिंग मोड ऐसा नहीं करता है, तो यह MATLAB समर्थन के लिए एक मामला है। मेरे पास एक ही कोड है जो एम-कोड, पी-कोड और संकलित एक्सई के रूप में चल रहा है - एक ही कोड अलग-अलग व्यवहार करता है, मुख्य रूप से जीयूआई कैसे काम करता है।
+0

हाय मिखाइल, उत्तर देने के लिए धन्यवाद! मुझे अभी भी अधिक जानकारी चाहिए। आप कहते हैं कि सूची बॉक्स डिफ़ॉल्ट रूप से खाली है लेकिन खाली नहीं होना चाहिए ... यह कैसे काम करता है ?? यह कभी-कभी मेरे लिए कैसे काम करता है, लेकिन हर समय नहीं? मैं इस त्रुटि को कैसे डीबग नहीं कर सकता? मुझे पूरा यकीन है कि मैं इस यूरिकंट्रोल के लिए सभी दिशानिर्देशों का पालन करता हूं, और फिर भी यह समान स्थितियों के तहत मेरे ऊपर कुछ दुर्घटनाग्रस्त हो जाता है। मदद के लिए शुक्रिया! – eli

+0

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

2

मेरे अनुभव में, यह त्रुटि अक्सर होती है जब value संपत्ति सूचीबॉक्स में प्रविष्टियों की संख्या से बड़ी है। इस प्रकार, जब भी आप सूची बॉक्स को दोबारा बदलते हैं, तो आपको value संपत्ति अपडेट करनी चाहिए - सुरक्षा कारणों से इसे 1 पर सेट करें।

इसके अलावा, @Mikhail द्वारा उत्कृष्ट टिप्पणियों की जांच करें।