2017-05-01 41 views
6

मैं जीयूआई पर काम कर रहा हूं। मैं हैंडल संरचना में बनाए गए अतिरिक्त क्षेत्रों में डेटा स्टोर करना चाहता हूं। हालांकि, मुझे नहीं पता कि कॉलबैक फ़ंक्शन समाप्त होने पर हैंडल संरचना को ठीक से कैसे अपडेट किया जाए। कृपया, कोई सलाह दें।मैटलैब जीयूआई: हैंडल संरचना को कैसे अपडेट करें?

मेरे सरलीकृत कार्यक्रम

  • संकेत के सेट संख्या (1-10)। प्रत्येक सिग्नल में 3 पैरामीटर होते हैं।
  • हैंडल संरचना (डिफ़ॉल्ट शून्य हैं) में बनाए गए सरणी से चयनित सिग्नल के लिए पैरामीटर पढ़ें।
  • पैरामीटर संपादित करें, सरणी अद्यतन करें।

जीयूआई

function simple_gui(hObject, h) 

h.fig = figure(... 
    'Units','pix',... 
    'Position',[50 50 500 400],... 
    'Visible','default',... 
    'Name','GUI',... 
    'NumberTitle','off',... 
    'Resize','on'); 

table = {'1' , '2', '3' , '4', '5', '6', '7', '8', '9', '10' }; 

h.number = uicontrol(... 
    'Units','characters',... 
    'Max',10,... 
    'Min',1,... 
    'String',table,... 
    'Style','popupmenu',... 
    'Value',1,... 
    'Position',[37.4 28.3846153846154 19.4 1.61538461538462],... 
    'BackgroundColor',[1 1 1]); 

h.edit1 = uicontrol(... 
    'Units','pix',... 
    'String','0',... 
    'Style','edit',... 
    'Position',[180 280 50 20],... 
    'BackgroundColor',[1 1 1],... 
    'FontSize',10); 

h.edit2 = uicontrol(... 
    'Units','pix',... 
    'String','0',... 
    'Style','edit',... 
    'Position',[180 255 50 20],... 
    'Children',[],... 
    'FontSize',10); 

h.edit3 = uicontrol(... 
    'Units','pix',... 
    'String','0',... 
    'Style','edit',... 
    'Position',[180 230 50 20],... 
    'FontSize',10); 

मुख्य कोड:

h.parameter1 = zeros(1,10); 
h.parameter2 = zeros(1,10); 
h.parameter3 = zeros(1,10); 
h.signal_no = 0; 

h.number.Callback = {@number_Callback, h}; 

h.edit1.Callback = {@parameter_change_Callback, h}; 
h.edit2.Callback = {@parameter_change_Callback, h}; 
h.edit3.Callback = {@parameter_change_Callback, h}; 
guidata(h.fig, h); 

function number_Callback(hObject,eventdata, h) 
h = guidata(hObject); 
h.signal_no = hObject.Value; 
k = h.signal_no; 
h.edit1.String = h.parameter1(k); 
h.edit2.String = h.parameter2(k); 
h.edit3.String = h.parameter3(k); 
guidata(hObject,h); 

function parameter_change_Callback(hObject,eventdata, h) 
h = guidata(hObject); 
k = h.signal_no; 
h.parameter1(k) = str2double(h.edit1.String); 
h.parameter2(k) = str2double(h.edit2.String); 
h.parameter3(k) = str2double(h.edit3.String); 
guidata(hObject, h); 
+0

आप 'guidata जोड़ने की जरूरत के साथ अद्यतन कोड है , एच); 'आपके समारोह के अंत में। आपको अपने फ़ंक्शन 'फ़ंक्शन simple_gui (hObject, h)' – Anthony

+0

@ एंथनी में दो इनपुट जोड़ने की भी आवश्यकता है, मैंने आपके द्वारा उल्लेखित आदेश जोड़े, लेकिन इससे मदद नहीं मिली। मुझे एक त्रुटि "अस्तित्वहीन क्षेत्र का संदर्भ 'पैरामीटर 1'" मिलता है। हालांकि, जब मैंने GUIDE का उपयोग करके समान प्रोग्राम लिखा था तो यह ठीक काम करता है। लेकिन मैं कोड प्रोग्रामेटिकल लिखना पसंद करता हूं और मैं सीखना चाहता हूं कि इसे कैसे काम करना है। –

+0

क्षमा करें, मेरा सुझाव बहुत गलत था। मैंने आपके कोड को गलत समझा। मैं बाद में अपना कोड जांचूंगा, अगर इसका अभी भी उत्तर नहीं दिया गया है – Anthony

उत्तर

1

सारांश में:

कॉल guidata(handleObject, varToStore) (documentation) जीयूआई कॉलबैक कार्यों के अंत में अद्यतन सुनिश्चित करने के लिए एक को संशोधित चर संग्रहित हैं। यहां, हैंडलऑब्जेक्ट या तो आपकी आकृति का हैंडल या उसका बच्चा है, और varToStore वह अद्यतन चर है जिसे आप संग्रहीत करना चाहते हैं; यह अक्सर एक संरचना है।

एक आंकड़ा या बच्चे handle से संग्रहीत डेटा पुन: प्राप्त करने के लिए वाक्य रचना:

handles = guidata(gcbo); % gcbo will get the callback object (instance of handle class). 
handles.propToUpdate = handles.propToUpdate+1; 
guidata(gcbo,handles); % stores the updated struct 

इसके अलावा:

आप अपने PopupMenu से परिवर्तन नहीं देखेंगे साथ जीयूआई में अपने बक्से संपादित में परिलक्षित वर्तमान कोड क्योंकि आप एडिट हैंडल के String फ़ील्ड में संख्यात्मक मान असाइन कर रहे हैं। आप str2double() फोन जब मूल्यों इस क्षेत्र को ले जा रहा है, और बस रिवर्स (num2str()) प्रदर्शन योग्य मूल्यों में वापस पाने के लिए क्या करने की जरूरत। यहाँ (hObject एक सरलीकृत कॉलबैक घोषणा

h.number.Callback = @number_Callback; 

function number_Callback(hObject,~) 
    h = guidata(hObject); 
    h.signal_no = hObject.Value; 
    k = h.signal_no; 
    h.edit1.String = num2str(h.parameter1(k)); 
    h.edit2.String = num2str(h.parameter2(k)); 
    h.edit3.String = num2str(h.parameter3(k)); 
    guidata(hObject,h); 
end 
संबंधित मुद्दे