2009-12-24 13 views
9

मैं एक साजिश इसके हैंडल का उपयोग करने पर डेटा में हेरफेर:मैं कैसे जांच सकता हूं कि MATLAB हैंडल मान्य है या नहीं?

x = 1:10; y = sin(x); 
h1 = line(x,y); 

हालांकि, यह आंकड़ा बंद कर दिया जाता है, तो इससे पहले कि स्क्रिप्ट वास्तव में, समाप्त हो जाता है कि यह एक त्रुटि देता है की तरह कुछ कर रही।

>>set(h1,'Color','green') % line is green 
??? Error using ==> set 
Invalid handle object. 

वहाँ अगर h1 इसके साथ किसी भी जोड़तोड़ करने से पहले एक वैध संभाल है की जाँच करने के लिए एक तरीका है?

if ishandle(h1) 
    set(h1, 'Color', 'green'); 
end 

अद्यतन:

MATLAB के नए संस्करण के लिए, संभाल वस्तुओं वास्तविक वस्तुओं, बस सांख्यिक नहीं हैं

+0

एक हैंडल, जो कुछ मामलों के लिए उपयोगी हो सकता है की जाँच के लिए एक वैकल्पिक, है करने के लिए '(एच 1 निर्धारित करते हैं, 'DeleteFcn ', @delete_fcn_callback)', जहां 'function delete_fcn_callback (hObj, event)' कुछ है जिसे आप परिभाषित करते हैं और जब इसे हटाया जा रहा है तो इसे कॉल किया जाएगा। –

उत्तर

13

आप पहली बार जांच करने के लिए अगर एक ग्राफिक्स संभाल मान्य है ishandle समारोह का उपयोग कर सकते मान।

if isvalid(h1) 
    set(h1, 'Color', 'green'); 
end 
+3

यदि आप जानते हैं कि आप किस प्रकार की ऑब्जेक्ट खोज रहे हैं, तो आप इसके लिए स्पष्ट रूप से परीक्षण कर सकते हैं। को बदलें यदि Ishandle (h1) उदा। यदि ishandle (h1) && strcmp (get (h1, 'type'), 'line') – Jonas

+0

a = 0। Ishandle (ए) सच देता है। लेकिन एक आंकड़ा नहीं है, इसलिए: अपूर्ण जवाब। – Pedro77

+0

@ पेड्रो 77: गलत। यदि आप हैंडल संग्रहीत कर रहे हैं, उदाहरण के रूप में, और बाद में उन्हें 'आइसलैंड' के साथ जांचना सुनिश्चित करने के लिए कि वे अभी भी वैध हैं, तो आपको कभी ऐसी स्थिति नहीं मिलेगी जहां हैंडल 0 है। केवल रूट ऑब्जेक्ट शून्य हो सकता है; ग्राफिक्स हैंडल कभी नहीं होगा। – gnovice

4

ध्यान दें कि ishandle में है कि यह भी आम सांख्यिक और जैसे 0 (= डेस्कटॉप हैंडल) मान 1 को स्वीकार करता है एक दोष (= पहले खुले आंकड़ा द्वारा दिया गया है: बेहतर विकल्प संभाल वस्तुओं के लिए isvalid विधि का उपयोग करने के लिए है डिफ़ॉल्ट) जो प्रायः वैध हैंडल भी होते हैं, हालांकि संभवतः अपेक्षित हैंडल नहीं है। यदि आप एक अस्तित्वहीन संपत्ति सेट करने का प्रयास करते हैं तो आपको तब भी एक त्रुटि दिखाई देगी।

इस तरह के मामलों को संभालने के लिए, बस एक अपवाद-हैंडलिंग ब्लॉक के भीतर अपने कोड जगह:

try 
    set(myHandle,propName,propValue); 
catch 
    % do something useful... (recreate the GUI?) 
end 
+2

एक कोशिश/पकड़ ब्लॉक एक अच्छा समाधान है। हालांकि, हैंडल '0' हमेशा रूट ऑब्जेक्ट और प्लॉट ऑब्जेक्ट्स के लिए आरक्षित है या यूकंट्रोलोल में हमेशा फ़्लोटिंग-पॉइंट हैंडल होते हैं। आंकड़ों में डिफ़ॉल्ट रूप से पूर्णांक हैंडल होते हैं, लेकिन आप MATLAB को संपत्ति 'इंटेगरहैंडल' सेट से 'ऑफ' के साथ आकृति बनाकर आंकड़ों के लिए फ़्लोटिंग-पॉइंट हैंडल का उपयोग करने के लिए मजबूर कर सकते हैं। यह उस स्थिति से बच जाएगा जहां एक आंकड़ा बनाया गया है, पूर्णांक हैंडल संग्रहीत किया जाता है, और फिर आंकड़ा हटा दिया जाता है और एक ही पूर्णांक संभाल के साथ बनाया गया एक नया आंकड़ा (इसलिए यह वास्तव में पहले हैंडल की तुलना में एक अलग आंकड़ा है)। – gnovice

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

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