2017-05-01 4 views
6

GUI로 작업하고 있습니다. 핸들 구조에서 생성 된 추가 필드에 데이터를 저장하려고합니다. 그러나 콜백 함수가 끝날 때 핸들 구조를 올바르게 업데이트하는 방법을 모르겠습니다. 제발, 조언을 해줘. 신호Matlab GUI : 핸들 구조를 업데이트하는 방법?

내 간략화 프로그램

  • 집합 번호 (1-10). 각 신호에는 3 개의 매개 변수가 있습니다.
  • 핸들 구조에서 생성 된 배열에서 선택된 신호에 대한 읽기 매개 변수 (기본값은 0 임).
  • 매개 변수를 편집하고 배열을 업데이트하십시오.

GUI

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를 추가 할 필요가 단순화 된 콜백 선언으로 hObject입니다 , h);'귀하의 기능이 끝났을 때. 함수에 두 개의 입력을 추가해야합니다.'function simple_gui (hObject, h)' – Anthony

+0

@Anthony, 내가 언급 한 명령을 추가했지만 도움이되지 않았습니다. "존재하지 않는 필드 'parameter1'에 대한 참조"오류가 발생합니다. 그러나 GUIDE를 사용하여 유사한 프로그램을 작성하면 올바르게 작동합니다. 그러나 나는 programmaticaly 코드를 작성하는 것을 선호하고 그것을 작동시키는 법을 배우고 싶다. –

+0

죄송합니다, 제 제안은 끔찍한 잘못되었습니다. 나는 당신의 코드를 오해했습니다. 나중에 코드를 검사 할 것입니다. 아직 응답이 없으면 – Anthony

답변

1

:

전화 guidata(handleObject, varToStore) (documentation) GUI 콜백 함수의 마지막 업데이트를 보장하기 에 수정 된 변수가 저장됩니다. 여기에서 handleObject은 그림의 핸들이거나 그 자식이거나 입니다. 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에서 변경 내용을 볼 수 없습니다가 GUI와 당신의 편집 상자에 반영 편집 핸들의 String 필드에 숫자 값을 지정하기 때문에 현재 코드 이 필드 값을 찍을 때 str2double()을 호출하고 바로 역 (num2str()) 뒷면에 디스플레이 값을 얻을 할 필요가있다. 여기에 업데이트 된 코드 (

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