콜백 간 데이터 공유하기

데이터 공유 방법에 대한 개요

대다수의 앱에는 상호 종속적인 컨트롤, 메뉴, 그래픽스 객체가 포함되어 있습니다. 콜백 함수마다 고유한 범위를 가지므로 앱의 구성요소가 데이터에 액세스해야 하는 경우에는 명시적으로 데이터를 공유해야 합니다. 아래 표에는 앱 내부에서 데이터를 공유할 수 있는 몇 가지 방법이 설명되어 있습니다.

방법설명요건 및 장단점
UserData 또는 다른 객체 속성에 데이터 저장하기

구성요소 객체를 통해 직접 속성값을 가져오거나 설정합니다.

모든 UI 구성요소에는 어떤 MATLAB® 데이터도 저장할 수 있는 UserData 속성이 있습니다.

  • 속성을 설정하거나 가져오려면 구성요소에 액세스할 수 있어야 합니다.

  • UserData에는 한 번에 하나의 변수만 저장할 수 있지만, struct 배열 또는 셀형 배열을 사용하면 여러 개의 값을 저장할 수 있습니다.

데이터를 응용 프로그램 데이터로 저장하기

setappdata 함수를 사용하여 데이터와 특정 구성요소를 연결합니다. getappdata 함수를 사용하여 나중에 데이터에 액세스할 수 있습니다.

  • 응용 프로그램 데이터를 설정하거나 가져오려면 구성요소에 액세스할 수 있어야 합니다.

  • 여러 개의 변수를 공유할 수 있습니다.

중첩된 콜백 함수 만들기(프로그래밍 방식 앱)

메인 함수 내에 콜백 함수를 중첩합니다. 이렇게 하면 메인 함수의 모든 변수에 콜백 함수가 액세스할 수 있습니다.

  • 메인 함수를 코딩한 동일 파일에서 콜백 함수를 코딩해야 합니다.

  • GUIDE 앱에는 권장되지 않습니다.

  • 여러 개의 변수를 공유할 수 있습니다.

guidata 함수를 사용하여 데이터 저장하기

guidata 함수를 사용하여 Figure 창과 데이터를 공유합니다.

  • UI 구성요소를 통해 데이터를 저장하거나 가져옵니다.

  • 한 번에 하나의 변수만 저장할 수 있지만, struct 배열 또는 셀형 배열을 사용하여 여러 개의 값을 저장할 수 있습니다.

UserData 또는 다른 객체 속성에 데이터 저장하기

UI 구성요소는 자신의 속성에 유용한 정보를 저장합니다. 예를 들어, Value 속성을 쿼리하여 슬라이더의 현재 위치를 찾을 수 있습니다. 또한 모든 구성요소에는 어떤 MATLAB 변수도 저장할 수 있는 UserData 속성이 있습니다. 구성요소에 대한 액세스가 허용되는 한, 모든 콜백 함수는 UserData 속성에 저장된 값에 액세스할 수 있습니다.

프로그래밍 방식으로 만든 앱에서 UserData 공유하기

점 표기법 component.propertyname을 사용하여 프로그래밍 방식으로 속성값을 가져오거나 설정합니다. 점 표기법은 R2014b 이상 릴리스에서 동작합니다. 다음 코드는 Figure 이름을 가져와 설정합니다.

hfig = figure;
figname = hfig.Name;
hfig.Name = 'My Window';
이전 릴리스를 사용 중인 경우에는 get 함수와 set 함수를 대신 사용하십시오.
hfig = figure;
figname = get(hfig,'Name');
set(hfig,'Name','My Window');

코드가 구성요소에 직접 액세스할 수 없으면 findobj 함수를 사용하여 구성요소를 검색합니다. 검색에 성공하면 findobj는 해당 구성요소를 출력값으로 반환합니다. 그러면 구성요소의 속성에 액세스할 수 있습니다.

다음 앱 코드는 UserData 속성을 사용하여 슬라이더에 대한 정보를 공유합니다. 어떻게 작동하는지 확인하려면 이 코드를 복사해 편집기에 붙여 넣으십시오.

function my_slider()
hfig = figure();
slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'UserData',struct('val',0,'diffMax',1),...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Difference',...
         'Callback',@button_callback);
end

function slider_callback(hObject,eventdata)
	sval = hObject.Value;
	diffMax = hObject.Max - sval;
	data = struct('val',sval,'diffMax',diffMax);
	hObject.UserData = data;
	% For R2014a and earlier: 
	% sval = get(hObject,'Value');  
	% maxval = get(hObject,'Max');  
	% diffMax = maxval - sval;      
	% data = struct('val',sval,'diffMax',diffMax);   
	% set(hObject,'UserData',data);   

end

function button_callback(hObject,eventdata)
	h = findobj('Tag','slider1');
	data = h.UserData;
	% For R2014a and earlier: 
	% data = get(h,'UserData'); 
	display([data.val data.diffMax]);
end
사용자가 슬라이더를 이동하면 slider_callback은 다음 명령을 사용하여 구조체에 데이터를 저장합니다.

  • data = struct('val',sval,'diffMax',diffMax)는 값 svaldiffMaxdata 구조체에 저장합니다.

  • hObject.UserData = datadata의 값을 슬라이더의 UserData 속성에 저장합니다.

사용자가 누름 버튼을 클릭하면 button_callback은 다음 명령을 사용하여 데이터를 가져옵니다.

  • h = findobj('Tag','slider1')은 슬라이더 구성요소를 찾습니다.

  • data = h.UserData는 슬라이더의 UserData 속성값을 가져옵니다.

GUIDE 앱에서 UserData 공유하기

참고

GUIDE 환경은 향후 릴리스에서 제거될 예정입니다. GUIDE가 제거된 후에도 기존 GUIDE 앱은 MATLAB에서 계속 실행할 수 있지만 GUIDE에서 편집할 수는 없게 됩니다.

기존의 GUIDE 앱을 계속 편집하려면 GUIDE 마이그레이션 전략 항목에서 향후 MATLAB 릴리스와의 앱 호환성을 유지하는 방법에 대한 내용을 참고하십시오. 새로 앱을 만들려면 앱 디자이너를 대신 사용하십시오.

GUIDE 앱이 UserData 속성과 슬라이더 데이터를 공유하도록 설정하려면 다음 단계를 수행하십시오.

  1. 명령 창에 guide를 입력합니다.

  2. GUIDE 빠른 시작 대화 상자에서 Blank GUI (Default)를 선택합니다. 그런 다음 확인(OK)을 클릭합니다.

  3. 구성요소 팔레트에 UI 구성요소 이름을 표시합니다.

    1. 파일(File) > 기본 설정(Preferences) > GUIDE를 선택합니다.

    2. 구성요소 팔레트에 이름 표시(Show names in component palette)를 선택합니다.

    3. 확인(OK)을 클릭합니다.

  4. 레이아웃 편집기 왼쪽의 구성요소 팔레트에서 누름 버튼 툴을 선택하고 레이아웃 영역으로 끌어서 놓습니다.

  5. 레이아웃 편집기 왼쪽의 구성요소 팔레트에서 슬라이더 툴을 선택하고 레이아웃 영역으로 끌어서 놓습니다.

  6. 파일(File) > 저장(Save)을 선택합니다. UI를 myslider.fig로 저장합니다. 그러면 MATLAB이 편집기에서 코드 파일을 엽니다.

  7. 개시 함수 myslider_OpeningFcn에서 UserData 속성의 초기값을 설정합니다. 이 함수는 UI가 사용자에게 표시되기 직전에 실행됩니다.

    myslider_OpeningFcn에서 명령 handles.output = hObject 바로 아래에 다음 명령을 삽입합니다.

    data = struct('val',0,'diffMax',1);
    set(handles.slider1,'UserData',data);
    
    이 명령을 추가하면 myslider_OpeningFcn은 다음과 같이 표시됩니다.
    function myslider_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to junk (see VARARGIN)
    
    % Choose default command line output for myslider
    handles.output = hObject;
    data = struct('val',0,'diffMax',1);
    set(handles.slider1,'UserData',data);
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes myslider wait for user response
    % uiwait(handles.figure1);
    
    handlesmyslider_OpeningFcn에 대한 입력 인수라는 것을 알 수 있습니다. handles 변수는 UI의 모든 구성요소가 포함된 구조체입니다. 이 구조체의 각 필드는 개별 구성요소에 해당합니다. 각 필드 이름은 해당 구성요소의 Tag 속성과 일치합니다. 따라서 handles.slider1은 이 UI의 슬라이더 구성요소입니다. 명령 set(handles.slider1,'UserData',data)는 변수 data를 슬라이더의 UserData 속성에 저장합니다.

  8. 데이터를 수정하려면 슬라이더 콜백에 코드를 추가합니다. 함수 slider1_Callback의 끝에 다음 명령을 추가합니다.

    maxval = get(hObject,'Max');  
    sval = get(hObject,'Value');  
    diffMax = maxval - sval;   
    data = get(hObject,'UserData');
    data.val = sval;
    data.diffMax = diffMax;
    % Store data in UserData of slider
    set(hObject,'UserData',data);
    이 명령을 추가하면 slider1_Callback은 다음과 같이 표시됩니다.
    % --- Executes on slider movement.
    function slider1_Callback(hObject, eventdata, handles)
    % hObject    handle to slider1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hints: get(hObject,'Value') returns position of slider
    %        get(hObject,'Min') and get(hObject,'Max') to determine range of slider
    maxval = get(hObject,'Max');  
    sval = get(hObject,'Value');  
    diffMax = maxval - sval;   
    data = get(hObject,'UserData');
    data.val = sval;
    data.diffMax = diffMax;
    % Store data in UserData of slider
    set(hObject,'UserData',data);
    
    hObjectslider1_Callback 함수에 대한 입력 인수라는 것을 알 수 있습니다. hObject는 항상 콜백을 트리거하는 구성요소입니다(이 경우에는 슬라이더). 따라서 set(hObject,'UserData',data)data 변수를 슬라이더의 UserData 속성에 저장합니다.

  9. 데이터를 가져오려면 누름 버튼 콜백에 코드를 추가합니다. 함수 pushbutton1_Callback의 끝에 다음 명령을 추가합니다.

    % Get UserData from the slider
    data = get(handles.slider1,'UserData');
    currentval = data.val;
    diffval = data.diffMax;
    display([currentval diffval]);
    이 명령을 추가하면 pushbutton1_Callback은 다음과 같이 표시됩니다.

    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get UserData from the slider
    data = get(handles.slider1,'UserData');
    currentval = data.val;
    diffval = data.diffMax;
    display([currentval diffval]);

    이 코드는 핸들 구조체를 사용하여 슬라이더에 액세스합니다. 명령 data = get(handles.slider1,'UserData')가 슬라이더의 UserData 속성을 가져옵니다. 그런 다음, display 함수가 저장된 값을 표시합니다.

  10. 편집기 툴스트립에서 저장(Save)을 눌러 코드를 저장합니다.

데이터를 응용 프로그램 데이터로 저장하기

응용 프로그램 데이터를 저장하려면 setappdata 함수를 호출하십시오.

setappdata(obj,name,value);
첫 번째 입력값 obj는 데이터가 저장될 구성요소 객체입니다. 두 번째 입력값 name은 값을 설명하는 이름입니다. 세 번째 입력값 value는 저장하려는 값입니다.

응용 프로그램 데이터를 가져오려면 getappdata 함수를 사용하십시오.

data = getappdata(obj,name);
구성요소 obj는 데이터가 포함된 구성요소 객체여야 합니다. 두 번째 입력값 name은 데이터를 저장하는 데 사용한 이름과 일치해야 합니다. 변수를 하나만 포함하는 UserData 속성과 달리, setappdata를 사용하면 여러 개의 변수를 저장할 수 있습니다.

프로그래밍 방식으로 만든 앱에서 응용 프로그램 데이터 공유하기

이 앱은 응용 프로그램 데이터를 사용하여 2개의 값을 공유합니다. 어떻게 작동하는지 확인하려면 이 코드를 복사해 편집기에 붙여 넣으십시오.

function my_slider()
hfig = figure();
setappdata(hfig,'slidervalue',0);
setappdata(hfig,'difference',1);

slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Values',...
         'Callback',@button_callback);
end

function slider_callback(hObject,eventdata)
	diffMax = hObject.Max - hObject.Value;
	setappdata(hObject.Parent,'slidervalue',hObject.Value);
	setappdata(hObject.Parent,'difference',diffMax);
	% For R2014a and earlier: 
	% maxval = get(hObject,'Max');  
	% currval = get(hObject,'Value');  
	% diffMax = maxval - currval;   
	% parentfig = get(hObject,'Parent');  
	% setappdata(parentfig,'slidervalue',currval); 
	% setappdata(parentfig,'difference',diffMax); 
end

function button_callback(hObject,eventdata)
	currentval = getappdata(hObject.Parent,'slidervalue');
	diffval = getappdata(hObject.Parent,'difference');
	% For R2014a and earlier:
	% parentfig = get(hObject,'Parent');
	% currentval = getappdata(parentfig,'slidervalue');
	% diffval = getappdata(parentfig,'difference');

	display([currentval diffval]);
end
사용자가 슬라이더를 이동하면 slider_callback 함수가 diffMax를 계산합니다. 그런 다음, 함수는 다음 명령을 사용하여 응용 프로그램 데이터를 수정합니다.

  • setappdata(hObject.Parent,'slidervalue',hObject.Value) - 이름 'slidervalue'를 사용하여 현재 슬라이더 값을 Figure에 저장합니다. 이 경우, hObject.Parent가 Figure입니다.

  • setappdata(parentfig,'difference',diffMax) - 이름 'difference'를 사용하여 diffMax를 Figure에 저장합니다.

사용자가 누름 버튼을 클릭하면 button_callback 함수는 다음 명령을 사용하여 데이터를 가져옵니다.

  • currentval = getappdata(hObject.Parent,'slidervalue') - Figure에서 현재 슬라이더 값을 가져옵니다. 이 경우, hObject.Parent가 Figure입니다.

  • diffval = getappdata(hObject.Parent,'difference') - Figure에서 차이 값을 가져옵니다.

GUIDE 앱에서 응용 프로그램 데이터 공유하기

참고

GUIDE 환경은 향후 릴리스에서 제거될 예정입니다. GUIDE가 제거된 후에도 기존 GUIDE 앱은 MATLAB에서 계속 실행할 수 있지만 GUIDE에서 편집할 수는 없게 됩니다.

기존의 GUIDE 앱을 계속 편집하려면 GUIDE 마이그레이션 전략 항목에서 향후 MATLAB 릴리스와의 앱 호환성을 유지하는 방법에 대한 내용을 참고하십시오. 새로 앱을 만들려면 앱 디자이너를 대신 사용하십시오.

GUIDE 앱이 응용 프로그램 데이터를 공유하도록 설정하려면 다음 단계를 수행하십시오.

  1. 명령 창에 guide를 입력합니다.

  2. GUIDE 빠른 시작 대화 상자에서 Blank GUI (Default)를 선택합니다. 그런 다음 확인(OK)을 클릭합니다.

  3. 구성요소 팔레트에 UI 구성요소 이름을 표시합니다.

    1. 파일(File) > 기본 설정(Preferences) > GUIDE를 선택합니다.

    2. 구성요소 팔레트에 이름 표시(Show names in component palette)를 선택합니다.

    3. 확인(OK)을 클릭합니다.

  4. 레이아웃 편집기 왼쪽의 구성요소 팔레트에서 누름 버튼 툴을 선택하고 레이아웃 영역으로 끌어서 놓습니다.

  5. 레이아웃 편집기 왼쪽의 구성요소 팔레트에서 슬라이더 툴을 선택하고 레이아웃 영역으로 끌어서 놓습니다.

  6. 파일(File) > 저장(Save)을 선택합니다. UI를 myslider.fig로 저장합니다. 그러면 MATLAB이 편집기에서 코드 파일을 엽니다.

  7. 개시 함수 myslider_OpeningFcn에서 응용 프로그램 데이터의 초기값을 설정합니다. 이 함수는 UI가 사용자에게 표시되기 직전에 실행됩니다. myslider_OpeningFcn에서 명령 handles.output = hObject 바로 아래에 다음 명령을 삽입합니다.

    setappdata(handles.figure1,'slidervalue',0); 
    setappdata(handles.figure1,'difference',1);
    이 명령을 추가하면 myslider_OpeningFcn은 다음과 같이 표시됩니다.
    function myslider_OpeningFcn(hObject,eventdata,handles,varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to junk (see VARARGIN)
    
    % Choose default command line output for junk
    handles.output = hObject;
    setappdata(handles.figure1,'slidervalue',0); 
    setappdata(handles.figure1,'difference',1);
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes junk wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    handlesmyslider_OpeningFcn에 대한 입력 인수라는 것을 알 수 있습니다. handles 변수는 UI의 모든 구성요소가 포함된 구조체입니다. 이 구조체의 각 필드는 개별 구성요소에 해당합니다. 각 필드 이름은 해당 구성요소의 Tag 속성과 일치합니다. 이 경우, handles.figure1은 Figure 객체입니다. 따라서 setappdata는 이 Figure 객체를 사용하여 데이터를 저장합니다.

  8. 데이터를 변경하려면 슬라이더 콜백에 코드를 추가합니다. 함수 slider1_Callback의 끝에 다음 명령을 추가합니다.

    maxval = get(hObject,'Max');  
    currval = get(hObject,'Value');  
    diffMax = maxval - currval;   
    % Store application data
    setappdata(handles.figure1,'slidervalue',currval); 
    setappdata(handles.figure1,'difference',diffMax);
    이 명령을 추가하면 slider1_Callback은 다음과 같이 표시됩니다.
    function slider1_Callback(hObject, eventdata, handles)
    % hObject    handle to slider1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Hints: get(hObject,'Value') returns position of slider
    %        get(hObject,'Min') and get(hObject,'Max') to determine range of slider
    maxval = get(hObject,'Max');  
    currval = get(hObject,'Value');  
    diffMax = maxval - currval;   
    % Store application data
    setappdata(handles.figure1,'slidervalue',currval); 
    setappdata(handles.figure1,'difference',diffMax);
    이 콜백 함수는 handles 구조체에 액세스할 수 있기 때문에 setappdata 명령은 handles.figure1에 데이터를 저장합니다.

  9. 데이터를 가져오려면 누름 버튼 콜백에 코드를 추가합니다. 함수 pushbutton1_Callback의 끝에 다음 명령을 추가합니다.

    % Retrieve application data
    currentval = getappdata(handles.figure1,'slidervalue');
    diffval = getappdata(handles.figure1,'difference');
    display([currentval diffval]);
    이 명령을 추가하면 pushbutton1_Callback은 다음과 같이 표시됩니다.
    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Retrieve application data
    currentval = getappdata(handles.figure1,'slidervalue');
    diffval = getappdata(handles.figure1,'difference');
    display([currentval diffval]);
    이 콜백 함수는 handles 구조체에 액세스할 수 있기 때문에 getappdata 명령은 handles.figure1에서 데이터를 가져옵니다.

  10. 편집기 툴스트립에서 저장(Save)을 눌러 코드를 저장합니다.

중첩된 콜백 함수 만들기(프로그래밍 방식 앱)

프로그래밍 방식 앱의 메인 함수 내에서 콜백 함수를 중첩할 수 있습니다. 이렇게 하면 중첩된 콜백 함수는 메인 함수와 작업 공간을 공유합니다. 결과적으로 중첩 함수는 메인 함수에 정의된 모든 UI 구성요소와 변수에 액세스할 수 있습니다. 다음 예제 코드에서는 중첩 함수를 사용하여 슬라이더 위치에 대한 데이터를 공유합니다. 어떻게 작동하는지 확인하려면 이 코드를 복사해 편집기에 붙여 넣으십시오.

function my_slider()
	hfig = figure();
	data = struct('val',0,'diffMax',1);
	slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
	button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Difference',...
         'Callback',@button_callback);

	function slider_callback(hObject,eventdata)
		sval = hObject.Value;
		diffMax = hObject.Max - sval;
		% For R2014a and earlier:
		% sval = get(hObject,'Value');
		% maxval = get(hObject,'Max');
		% diffMax = maxval - sval;

		data.val = sval;
		data.diffMax = diffMax;
	end

	function button_callback(hObject,eventdata)
		display([data.val data.diffMax]);
	end
end
메인 함수는 data라는 struct 배열을 정의합니다. 사용자가 슬라이더를 이동하면 slider_callback 함수는 data 구조체의 val 필드와 diffMax 필드를 업데이트합니다. 최종 사용자가 누름 버튼을 클릭하면 button_callback 함수는 data에 저장된 값을 표시합니다.

참고

GUIDE 앱에서는 중첩 함수가 권장되지 않습니다.

guidata 함수를 사용하여 데이터 저장하기

guidata 함수를 사용하면 Figure 창과 데이터를 공유할 수 있습니다. hObject 구성요소를 통해 어떤 콜백에서도 데이터를 저장하거나 가져올 수 있습니다. 다시 말해, UserData나 응용 프로그램 데이터와는 달리 데이터를 설정하거나 가져오기 위해 특정 구성요소에 액세스할 필요가 없다는 의미입니다. 2개의 입력 인수와 함께 guidata를 호출하여 데이터를 저장합니다.

guidata(object_handle,data);
첫 번째 입력값 object_handle은 UI 구성요소입니다(일반적으로 hObject). 두 번째 입력값 data는 저장할 변수입니다. 2개의 입력 인수를 사용하여 guidata를 호출할 때마다 MATLAB은 이전에 저장된 모든 데이터를 덮어씁니다. 즉, 한 번에 하나의 변수만 저장할 수 있습니다. 여러 개의 값을 공유하려면 데이터를 struct 배열 또는 셀형 배열로 저장합니다.

데이터를 가져오려면 입력 인수 하나와 출력 인수 하나를 사용하여 guidata를 호출하십시오.

data = guidata(object_handle);
데이터를 저장하기 위해 지정하는 구성요소는 데이터를 가져오기 위해 사용하는 구성요소와 동일하지 않아도 됩니다.

데이터가 struct 배열 또는 셀형 배열로 저장된 경우에 다른 요소를 변경하지 않고 하나의 요소만 업데이트하려면 데이터를 가져와 수정된 배열로 바꾸십시오.

data = guidata(hObject);
data.myvalue = 2;
guidata(hObject,data);

프로그래밍 방식으로 만든 앱에서 guidata 사용하기

프로그래밍 방식 앱에서 guidata를 사용하려면 메인 함수에서 일부 초기값을 사용하여 데이터를 저장하십시오. 그러면 모든 콜백 함수에서 데이터를 가져와 수정할 수 있습니다.

다음 코드는 프로그래밍 방식 앱에 대한 간단한 예제입니다. 이 앱에서는 guidata를 사용하여 2개의 필드가 포함된 구조체를 공유합니다. 어떻게 작동하는지 확인하려면 이 코드를 복사해 편집기에 붙여 넣으십시오.

function my_slider()
hfig = figure();
guidata(hfig,struct('val',0,'diffMax',1));
slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Values',...
         'Callback',@button_callback);
end

function slider_callback(hObject,eventdata)
	data = guidata(hObject);
	data.val = hObject.Value;
	data.diffMax = hObject.Max - data.val;
	% For R2014a and earlier:
	% data.val = get(hObject,'Value');
	% maxval = get(hObject,'Max');
	% data.diffMax = maxval - data.val;

	guidata(hObject,data);
end

function button_callback(hObject,eventdata)
	data = guidata(hObject);
	display([data.val data.diffMax]);
end
사용자가 슬라이더를 이동하면 slider_callback 함수는 다음 명령을 실행하여 저장된 데이터를 가져온 후 수정합니다.

  • data = guidata(hObject)는 저장된 데이터를 구조체로 가져옵니다.

  • data.diffMax = maxval - data.val은 구조체의 diffMax 필드를 수정합니다.

  • guidata(hObject,data)는 수정된 구조체를 저장합니다.

사용자가 누름 버튼을 클릭하면 button_callback 함수는 guidata를 호출하여 저장된 구조체의 복사본을 가져옵니다. 그런 다음, 구조체에 저장된 2개의 값을 표시합니다.

GUIDE 앱에서 guidata 사용하기

참고

GUIDE 환경은 향후 릴리스에서 제거될 예정입니다. GUIDE가 제거된 후에도 기존 GUIDE 앱은 MATLAB에서 계속 실행할 수 있지만 GUIDE에서 편집할 수는 없게 됩니다.

기존의 GUIDE 앱을 계속 편집하려면 GUIDE 마이그레이션 전략 항목에서 향후 MATLAB 릴리스와의 앱 호환성을 유지하는 방법에 대한 내용을 참고하십시오. 새로 앱을 만들려면 앱 디자이너를 대신 사용하십시오.

GUIDE는 guidata 함수를 사용하여 모든 UI 구성요소가 포함된 handles 구조체를 저장합니다. 그러면 MATLAB은 handles 배열을 모든 콜백 함수에 전달합니다. guidata를 사용하여 추가 데이터를 공유하려면 개시 함수에서 handles 구조체에 필드를 추가합니다. 개시 함수는 코드 파일 상단에 정의되어 있는 함수로, 이름에 _OpeningFcn이 포함되어 있습니다.

콜백 함수에서 데이터를 수정하려면 handles 구조체를 수정한 다음, guidata 함수를 사용하여 저장하십시오. 다음 슬라이더 콜백 함수에서는 GUIDE 콜백 함수에서 handles 구조체를 수정하여 저장하는 방법을 보여줍니다.

function slider1_Callback(hObject, eventdata,handles)
% hObject   handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles   structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range
	handles.myvalue = 2;
	guidata(hObject,handles);
end 

GUIDE 예제: guidata를 사용하여 슬라이더 데이터 공유하기

다음은 사전 작성된 GUIDE 앱으로, guidata 함수를 사용하여 슬라이더와 텍스트 필드 간에 데이터를 공유합니다. 슬라이더를 이동하면, 텍스트 필드에 표시된 숫자가 새로운 슬라이더 위치에 맞게 변경되어 표시됩니다.

GUIDE 예제: 2개의 앱 간에 데이터 공유하기

다음은 사전 작성된 GUIDE 앱으로, 응용 프로그램 데이터와 guidata 함수를 사용하여 두 대화 상자 간에 데이터를 공유합니다. 두 번째 대화 상자에 텍스트를 입력하고 OK를 클릭하면 첫 번째 대화 상자에서 버튼 레이블이 변경됩니다.

changeme_main.m에서 buttonChangeMe_Callback 함수는 다음 명령을 실행하여 두 번째 대화 상자를 표시합니다.

changeme_dialog('changeme_main', handles.figure)

handles.figure 입력 인수는 changeme_main 대화 상자의 Figure 객체입니다.

changeme_dialog 함수는 Figure 객체에서 handles 구조체를 가져옵니다. 따라서 changeme_main 대화 상자의 전체 구성요소 집합을 두 번째 대화 상자에서 사용할 수 있습니다.

GUIDE 예제: 3개의 앱 간에 데이터 공유하기

다음은 사전 작성된 GUIDE 앱으로, guidataUserData를 사용하여 3개의 앱 창 간에 데이터를 공유합니다. 큰 창은 아이콘 편집기이며, 툴 팔레트 창과 색 팔레트 창에서 정보를 받습니다.

guide_inconeditor.m에서 함수 guide_iconeditor_OpeningFcn에는 다음 명령이 포함됩니다.

colorPalette = guide_colorpalette('iconEditor', hObject)

인수는 다음과 같습니다.

  • 'iconEditor'guide_iconEditor 창의 콜백이 함수 실행을 트리거했음을 지정합니다.

  • hObjectguide_iconEditor 창의 Figure 객체입니다.

  • colorPaletteguide_colorPalette 창의 Figure 객체입니다.

guide_iconeditor_OpeningFcn도 유사한 입력 인수와 출력 인수로 guide_toolpalette 함수를 호출합니다.

이러한 함수 간에 Figure 객체를 전달하면 guide_iconEditor 창에서 다른 두 창의 handles 구조체에 액세스할 수 있습니다. 마찬가지로, 다른 두 창에서도 guide_iconEditor 창의 handles 구조체에 액세스할 수 있습니다.

관련 항목