Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.
Muchas aplicaciones contienen controles, menús y objetos gráficos interdependientes. Dado que cada función de devolución de llamada tiene su propio ámbito, debe compartir datos explícitamente con las partes de la aplicación que necesiten acceder a ella. La siguiente tabla describe varios métodos diferentes para compartir datos dentro de la aplicación.
Método | Descripción | Requisitos y compensaciones |
---|---|---|
Almacenar datos en UserData u otras propiedades de objeto | Obtener o establecer valores de propiedad directamente a través del objeto de componente. Todos los componentes de la interfaz de usuario tienen una propiedad que puede almacenar datos. |
|
Almacenar datos como datos de aplicación | Asocie datos con un componente específico utilizando la función. |
|
Crear funciones de devolución de llamada anidadas (aplicaciones programáticas) | Anidar sus funciones de devolución de llamada dentro de su función principal. Esto proporciona a las funciones de devolución de llamada acceso a todas las variables de la función main. |
|
Almacenar datos mediante la función guidata | Comparta datos con la ventana de figura utilizando la función. |
|
Los componentes de interfaz de usuario contienen información útil en sus propiedades. Por ejemplo, puede encontrar la posición actual de un control deslizante consultando su propiedad.Value
Además, todos los componentes tienen una propiedad, que puede almacenar cualquier variable.UserData
MATLAB Todas las funciones de devolución de llamada pueden tener acceso al valor almacenado en la propiedad siempre que esas funciones puedan tener acceso al componente.UserData
Utilice la notación de puntos,
component.propertyname
, para obtener o establecer valores de propiedad mediante programación. La notación de puntos funciona en la versión r2014b y versiones posteriores. Este código obtiene y establece el nombre de una figura. Si está utilizando una versión anterior, utilice las funciones y en su lugar:
hfig = figure; figname = hfig.Name; hfig.Name = 'My Window';
get
set
hfig = figure; figname = get(hfig,'Name'); set(hfig,'Name','My Window');
Si el código no tiene acceso directo a un componente, utilice la función para buscar ese componente.findobj
Si la búsqueda se realiza correctamente, devuelve el componente como salida.findobj
A continuación, puede acceder a las propiedades del componente.
El siguiente código de aplicación usa la propiedad para compartir información sobre el control deslizante.UserData
Para ver cómo funciona, copie y pegue este código en un editor y ejecútelo.
Cuando el usuario mueve el control deslizante, utiliza estos comandos para almacenar datos en una estructura:
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
almacena los valores y, en una estructura llamada.data = struct('val',sval,'diffMax',diffMax)
sval
diffMax
data
almacena el valor de en la propiedad del control deslizante.hObject.UserData = data
data
UserData
Cuando el usuario hace clic en el botón pulsador, utiliza estos comandos para recuperar los datos:button_callback
encuentra el componente deslizante.h = findobj('Tag','slider1')
Obtiene el valor de la propiedad del control deslizante.data = h.UserData
UserData
Para configurar una aplicación GUIDE para compartir datos deslizantes con la propiedad, realice estos pasos:UserData
En la ventana de comandos, escriba.guide
En el cuadro de diálogo guía de inicio rápido, seleccione.Blank GUI (Default) A continuación, haga clic.OK
Mostrar los nombres de los componentes de interfaz de usuario en la paleta de componente:
Seleccione File > Preferences > GUIDE.
Seleccione Show names in component palette.
Haga clic.OK
Seleccione la herramienta de pulsador de la paleta de componentes en el lado izquierdo del editor de diseño y arrástrela al área de diseño.
Seleccione la herramienta deslizante en la paleta de componentes en el lado izquierdo del editor de diseño y arrástrela al área de diseño.
Seleccione File > Save. Guarde la IU como. abre el archivo de código en el editor.myslider.fig
MATLAB
Establezca el valor inicial de la propiedad en la función de apertura,.UserData
myslider_OpeningFcn
Esta función se ejecuta justo antes de que la interfaz de usuario sea visible para los usuarios.
En, inserte estos comandos inmediatamente después del comando,. Después de agregar los comandos, se ve así.myslider_OpeningFcn
handles.output = hObject
data = struct('val',0,'diffMax',1); set(handles.slider1,'UserData',data);
myslider_OpeningFcn
Tenga en cuenta que es un argumento de entrada.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);
handles
myslider_OpeningFcn
La variable es una estructura que contiene todos los componentes de la interfaz de usuario.handles
Cada campo de esta estructura corresponde a un componente independiente. Cada nombre de campo coincide con la propiedad del componente correspondiente.Tag
Por lo tanto, es el componente deslizante en esta interfaz de usuario.handles.slider1
El comando, almacena la variable, en la propiedad del control deslizante.set(handles.slider1,'UserData',data)
data
UserData
Agregue código a la devolución de llamada del control deslizante para modificar los datos. Agregue estos comandos al final de la función,. Después de agregar los comandos, se ve así. Tenga en cuenta que es un argumento de entrada a la función. es siempre el componente que desencadena la devolución de llamada (el control deslizante, en este caso).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);
hObject
slider1_Callback
hObject
Por lo tanto, almacena la variable en la propiedad del control deslizante.set(hObject,'UserData',data)
data
UserData
Agregue código a la devolución de llamada del botón de inserción para recuperar los datos. Agregue estos comandos al final de la función,. Después de agregar los comandos, se ve así.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]);
Este código usa la estructura de identificadores para tener acceso al control deslizante. El comando,, obtiene la propiedad del control deslizante.data = get(handles.slider1,'UserData')
UserData
A continuación, la función muestra los valores almacenados.display
Guarde el código presionando el editor ToolStrip.Save
Para almacenar los datos de la aplicación, llame a la función: la primera entrada, es el objeto de componente en el que se almacenarán los datos.setappdata
setappdata(obj,name,value);
obj
La segunda entrada, es un nombre descriptivo que describe el valor.name
La tercera entrada, es el valor que desea almacenar.value
Para recuperar los datos de la aplicación, utilice la función:getappdata
El componente, debe ser el objeto componente que contiene los datos.
data = getappdata(obj,name);
obj
La segunda entrada, debe coincidir con el nombre que usó para almacenar los datos.name
A diferencia de la propiedad, que solo contiene una variable, puede usar para almacenar varias variables.UserData
setappdata
Esta aplicación utiliza datos de aplicación para compartir dos valores. Para ver cómo funciona, copie y pegue este código en un editor y ejecútelo. Cuando el usuario mueve el control deslizante, la función calcula.
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
A continuación, utiliza estos comandos para modificar los datos de la aplicación:
almacena el valor del control deslizante actual en la figura con el nombre,.setappdata(hObject.Parent,'slidervalue',hObject.Value)
'slidervalue'
En este caso, es la figura.hObject.Parent
almacena en la figura utilizando el nombre,.setappdata(parentfig,'difference',diffMax)
diffMax
'difference'
Cuando el usuario hace clic en el botón pulsador, la función recupera los datos mediante estos comandos:button_callback
Recupera el valor del control deslizante actual de la figura.currentval = getappdata(hObject.Parent,'slidervalue')
En este caso, es la figura.hObject.Parent
recuperar el valor de diferencia de la figura.diffval = getappdata(hObject.Parent,'difference')
Para configurar una aplicación GUIDE para compartir datos de aplicaciones, realice estos pasos:
En la ventana de comandos, escriba.guide
En el cuadro de diálogo guía de inicio rápido, seleccione.Blank GUI (Default) A continuación, haga clic.OK
Mostrar los nombres de los componentes de interfaz de usuario en la paleta de componente:
Seleccione File > Preferences > GUIDE.
Seleccione Show names in component palette.
Haga clic.OK
Seleccione la herramienta de pulsador de la paleta de componentes en el lado izquierdo del editor de diseño y arrástrela al área de diseño.
Seleccione la herramienta deslizante en la paleta de componentes en el lado izquierdo del editor de diseño y arrástrela al área de diseño.
Seleccione File > Save. Guarde la IU como. abre el archivo de código en el editor.myslider.fig
MATLAB
Establezca el valor inicial de los datos de la aplicación en la función de apertura,.myslider_OpeningFcn
Esta función se ejecuta justo antes de que la interfaz de usuario sea visible para los usuarios. En, inserte estos comandos inmediatamente después del comando,. Después de agregar los comandos, se ve así.myslider_OpeningFcn
handles.output = hObject
setappdata(handles.figure1,'slidervalue',0); setappdata(handles.figure1,'difference',1);
myslider_OpeningFcn
Tenga en cuenta que es un argumento de entrada.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);
handles
myslider_OpeningFcn
La variable es una estructura que contiene todos los componentes de la interfaz de usuario.handles
Cada campo de esta estructura corresponde a un componente independiente. Cada nombre de campo coincide con la propiedad del componente correspondiente.Tag
En este caso, es el objeto de la figura.handles.figure1
Por lo tanto, puede utilizar este objeto de figura para almacenar los datos.setappdata
Agregue código a la devolución de llamada del control deslizante para cambiar los datos. Agregue estos comandos al final de la función,. Después de agregar los comandos, se ve así. Esta función de devolución de llamada tiene acceso a la estructura, por lo que los comandos almacenan los datos en.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
Agregue código a la devolución de llamada del botón de inserción para recuperar los datos. Agregue estos comandos al final de la función,. Después de agregar los comandos, se ve así. Esta función de devolución de llamada tiene acceso a la estructura, por lo que los comandos recuperan los datos de.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
Guarde el código presionando el editor ToolStrip.Save
Puede anidar funciones de devolución de llamada dentro de la función principal de una aplicación programática. Al hacerlo, las funciones de devolución de llamada anidadas comparten un espacio de trabajo con la función main. Como resultado, las funciones anidadas tienen acceso a todos los componentes de la interfaz de usuario y las variables definidas en la función main. El siguiente código de ejemplo utiliza funciones anidadas para compartir datos sobre la posición del control deslizante. Para ver cómo funciona, copie y pegue este código en un editor y ejecútelo. La función Main define una matriz llamada.
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
struct
data
Cuando el usuario mueve el control deslizante, la función actualiza los campos y de la estructura.slider_callback
val
diffMax
data
Cuando el usuario final hace clic en el botón pulsador, la función muestra los valores almacenados.button_callback
data
Nota
Las funciones anidadas no se recomiendan para las aplicaciones GUIDE.
La función proporciona una manera de compartir datos con la ventana de la figura.guidata
Puede almacenar o recuperar los datos en cualquier devolución de llamada a través del componente.hObject
Esto significa que, a diferencia de trabajar con datos o de aplicaciones, no es necesario tener acceso a un componente específico para establecer u obtener los datos.UserData
Llame con dos argumentos de entrada para almacenar datos: la primera entrada, es cualquier componente de interfaz de usuario (normalmente).guidata
guidata(object_handle,data);
object_handle
hObject
La segunda entrada, es la variable que se va a almacenar.data
Cada vez que se llama mediante dos argumentos de entrada, sobrescribe los datos almacenados previamente.guidata
MATLAB Esto significa que solo puede almacenar una variable a la vez. Si desea compartir varios valores, almacene los datos como una matriz o matriz de celdas.struct
Para recuperar datos, llame mediante un argumento de entrada y un argumento de salida: el componente que especifique para almacenar los datos no necesita ser el mismo componente que utiliza para recuperarlo.guidata
data = guidata(object_handle);
Si los datos se almacenan como una matriz o matriz de celdas, y desea actualizar un elemento sin cambiar los demás elementos, a continuación, recupere los datos y reemplácelo con la matriz modificada:struct
data = guidata(hObject); data.myvalue = 2; guidata(hObject,data);
Para usar en una aplicación programática, almacene los datos con algunos valores iniciales en la función main.guidata
A continuación, puede recuperar y modificar los datos en cualquier función de devolución de llamada.
El código siguiente es un ejemplo sencillo de una aplicación de programación que usa para compartir una estructura que contiene dos campos.guidata
Para ver cómo funciona, copie y pegue este código en un editor y ejecútelo. Cuando el usuario mueve el control deslizante, la función ejecuta estos comandos para recuperar y modificar los datos almacenados:
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
Recupera los datos almacenados como una estructura.data = guidata(hObject)
modifica el campo de la estructura.data.diffMax = maxval - data.val
diffMax
almacena la estructura modificada.guidata(hObject,data)
Cuando el usuario hace clic en el botón de inserción, la función llama para recuperar una copia de la estructura almacenada.button_callback
guidata
A continuación, muestra los dos valores almacenados en la estructura.
GUIDE utiliza la función para almacenar una estructura llamada, que contiene todos los componentes de la interfaz de usuario. pasa la matriz a cada función de devolución de llamada.guidata
handles
MATLABhandles
Si desea utilizar para compartir datos adicionales, a continuación, añadir campos a la estructura en la función de apertura.guidata
handles
La función de apertura es una función definida cerca de la parte superior del archivo de código que tiene en el nombre._OpeningFcn
Para modificar los datos en una función de devolución de llamada, modifique la estructura y, a continuación, guárdela con la función.handles
guidata
Esta función de devolución de llamada deslizante muestra cómo modificar y almacenar la estructura en una función de devolución de llamada 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
Aquí hay una aplicación GUIDE precompilable que utiliza la función para compartir datos entre un deslizador y un campo de texto.guidata
Al mover el deslizador, el número mostrado en el campo de texto cambia para mostrar la nueva posición del deslizador.
Aquí hay una aplicación GUIDE Precompilando que utiliza los datos de la aplicación y la función para compartir datos entre dos cuadros de diálogo.guidata
Al introducir texto en el segundo cuadro de diálogo y hacer clic, la etiqueta del botón cambia en el primer cuadro de diálogo.OK
En, la función ejecuta este comando para mostrar el segundo cuadro de diálogo:changeme_main.m
buttonChangeMe_Callback
changeme_dialog('changeme_main', handles.figure)
El argumento de entrada es el objeto del cuadro de diálogo.handles.figure
Figure
changeme_main
La función recupera la estructura del objeto.changeme_dialog
handles
Figure
Por lo tanto, todo el conjunto de componentes en el cuadro de diálogo está disponible para el segundo cuadro de diálogo.changeme_main
Aquí hay una aplicación GUIDE Precompilando que utiliza y para compartir datos entre tres ventanas de la aplicación.guidata
UserData
La ventana grande es un editor de iconos que acepta información de la paleta de herramientas y las ventanas de paleta de colores.
En, la función contiene este comando:guide_inconeditor.m
guide_iconeditor_OpeningFcn
colorPalette = guide_colorpalette('iconEditor', hObject)
Los argumentos son:
Especifica que una devolución de llamada en la ventana desencadenó la ejecución de la función.'iconEditor'
guide_iconEditor
es el objeto de la ventana.hObject
Figure
guide_iconEditor
es el objeto de la ventana.colorPalette
Figure
guide_colorPalette
De forma similar, llama a la función con argumentos de entrada y salida similares.guide_iconeditor_OpeningFcn
guide_toolpalette
Pasar el objeto entre estas funciones permite que la ventana tenga acceso a la estructura de las otras dos ventanas.Figure
guide_iconEditorhandles
Del mismo modo, las otras dos ventanas pueden acceder a la estructura de la ventana.handles
guide_iconEditor