Много приложений содержат взаимозависимые средства управления, меню и графические объекты. Поскольку каждая функция обратного вызова имеет свой собственный осциллограф, необходимо явным образом осуществлять обмен данными с теми частями приложения, которое должно получить доступ к ней. Приведенная ниже таблица описывает несколько различных методов для обмена данными в рамках вашего приложения.
| Метод | Описание | Требования и компромиссы |
|---|---|---|
| Храните данные в UserData или других свойствах объектов | Получите или установите значения свойств непосредственно через объект компонента. Все компоненты пользовательского интерфейса имеют |
|
| Храните данные как данные приложения | Объединенные данные с определенным компонентом с помощью |
|
| Создайте вложенные функции обратного вызова | Вложите свои функции обратного вызова в вашей основной функции. Это предоставляет ваш доступ к функциям обратного вызова ко всем переменным в основной функции. |
|
| Хранение Данных Используя Функцию guidata | Осуществляйте обмен данными с окном рисунка с помощью |
|
Компоненты пользовательского интерфейса содержат полезную информацию в своих свойствах. Например, можно найти текущее положение ползунка путем запроса его Value свойство. Кроме того, все компоненты имеют UserData свойство, которое может сохранить любую переменную MATLAB. Все функции обратного вызова могут получить доступ к значению, сохраненному в UserData свойство пока те функции может получить доступ к компоненту.
Используйте запись через точку, чтобы установить и запросить свойства традиционной фигуры.
hfig = figure; figname = hfig.Name; 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; end function button_callback(hObject,eventdata) h = findobj('Tag','slider1'); data = h.UserData; display([data.val data.diffMax]); end
slider_callback использование эти команды, чтобы хранить данные в структуре:
data = struct('val',sval,'diffMax',diffMax) хранит значения, sval и diffMax, в структуре под названием data.
hObject.UserData = data хранит значение data в UserData свойство ползунка.
Когда пользователь кликает по кнопке, button_callback использование эти команды, чтобы получить данные:
h = findobj('Tag','slider1') находит компонент ползунка.
data = h.UserData получает значение UserData ползунка свойство.
Чтобы сохранить данные приложения, вызовите setappdata функция:
setappdata(obj,name,value);
obj, объект компонента, в котором можно хранить данные. Второй вход, name, дружественное имя, которое описывает значение. Третий вход, value, значение, которое вы хотите сохранить.Чтобы получить данные приложения, используйте getappdata функция:
data = getappdata(obj,name);
obj, должен быть объект компонента, содержащий данные. Второй вход, name, должен совпадать с именем, вы раньше хранили данные. В отличие от UserData свойство, которое только содержит только одну переменную, можно использовать setappdata сохранить несколько переменных.Это приложение использует данные приложения, чтобы совместно использовать два значения. Чтобы видеть, как это работает, скопируйте и вставьте этот код в редактор и запустите его.
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); end function button_callback(hObject,eventdata) currentval = getappdata(hObject.Parent,'slidervalue'); diffval = getappdata(hObject.Parent,'difference'); display([currentval diffval]); end
slider_callback функция вычисляет diffMax. Затем это использует эти команды, чтобы изменить данные приложения:
setappdata(hObject.Parent,'slidervalue',hObject.Value) хранит текущее значение ползунка в фигуре, использующей имя, 'slidervalue'. В этом случае, hObject.Parent фигура.
setappdata(parentfig,'difference',diffMax) хранилища diffMax в фигуре, использующей имя, 'difference'.
Когда пользователь кликает по кнопке, button_callback функция получает данные с помощью этих команд:
currentval = getappdata(hObject.Parent,'slidervalue') получает текущее значение ползунка от фигуры. В этом случае, hObject.Parent фигура.
diffval = getappdata(hObject.Parent,'difference') получите значение различия от фигуры.
Можно вложить функции обратного вызова в основной функции программного приложения. Когда вы делаете это, вложенные функции обратного вызова совместно используют рабочую область с основной функцией. В результате вложенные функции имеют доступ ко всем компонентам пользовательского интерфейса и переменным, заданным в основной функции. Следующий пример кода использует вложенные функции, чтобы осуществлять обмен данными о положении ползунка. Чтобы видеть, как это работает, скопируйте и вставьте этот код в редактор и запустите его.
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; data.val = sval; data.diffMax = diffMax; end function button_callback(hObject,eventdata) display([data.val data.diffMax]); end end
struct массив под названием data. Когда пользователь перемещает ползунок, slider_callback функционируйте обновляет val и diffMax поля data структура. Когда конечный пользователь кликает по кнопке, button_callback функционируйте отображает значения, сохраненные в data.guidata функция обеспечивает способ осуществлять обмен данными с окном рисунка. Можно сохранить или получить данные в любом коллбэке через hObject компонент. Это означает это, в отличие от работы с UserData или данные приложения, вам не нужен доступ к одному определенному компоненту, чтобы установить или получить данные. Вызовите guidata с двумя входными параметрами, чтобы хранить данные:
guidata(object_handle,data);
object_handle, любой компонент пользовательского интерфейса (обычно hObject). Второй вход, data, переменная должна сохранить. Каждый раз вы вызываете guidata с помощью двух входных параметров MATLAB перезаписывает любые ранее хранимые данные. Это означает, что можно только сохранить одну переменную за один раз. Если вы хотите совместно использовать несколько значений, то храните данные как struct массив или массив ячеек.Чтобы получить данные, вызовите guidata использование одного входного параметра и одного выходного аргумента:
data = guidata(object_handle);
Если ваши данные хранятся как struct массив или массив ячеек, и вы хотите обновить один элемент, не изменяя другие элементы, затем получить данные и заменить его на модифицированный массив:
data = guidata(hObject); data.myvalue = 2; guidata(hObject,data);
guidata сохранить и осуществлять обмен даннымиИспользовать guidata в программном приложении храните данные с некоторыми начальными значениями в основной функции. Затем можно получить и изменить данные в любой функции обратного вызова.
Следующий код является простым примером программного приложения, которое использует guidata совместно использовать структуру, содержащую два поля. Чтобы видеть, как это работает, скопируйте и вставьте этот код в редактор и запустите его.
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; 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 получать копию сохраненной структуры. Затем это отображает эти два значения, сохраненные в структуре.