Многие приложения содержат взаимозависимые элементы управления, меню и графические объекты. Поскольку каждая функция обратного вызова имеет собственную область действия, необходимо явно предоставить доступ к данным тем частям приложения, которые должны получить к ней доступ. В таблице ниже описаны несколько различных методов совместного использования данных в приложении.
| Метод | Описание | Требования и компромиссы |
|---|---|---|
| Сохранить данные в 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 для извлечения копии сохраненной структуры. Затем отображаются два значения, сохраненные в структуре.