Многие приложения содержат взаимозависимые элементы управления, меню и графические объекты. Поскольку каждая функция обратного вызова имеет свои собственные возможности, вы должны явным образом делиться данными с теми частями вашего приложения, которые должны получить к нему доступ. В таблице ниже описаны несколько различных методов обмена данными в вашем приложении.
Метод | Описание | Требования и компромиссы |
---|---|---|
Сохраните данные в свойствах UserData или других объектов | Получите или установите значения свойств непосредственно через объект компонента. Все компоненты пользовательского интерфейса имеют |
|
Хранение данных в качестве данных приложений | Связать данные с определенным компонентом можно используя функцию |
|
Создайте вложенные функции обратного вызова | Вложите функции обратного вызова в основную функцию. Это дает вашим функциям обратного вызова доступ ко всем переменным в основной функции. |
|
Сохраните данные с помощью функции guidata | Обменивайтесь данными с окном рисунка, используя |
|
Компоненты UI содержат полезную информацию в своих свойствах. Для примера можно найти текущее положение ползунка, запросив его 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')
извлеките значение различия из фигуры.
Можно вложить функции обратного вызова внутрь основной функции программного приложения. Когда вы делаете это, вложенные функции обратного вызова делят рабочую область с основной функцией. В результате вложенные функции имеют доступ ко всем компонентам 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; 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
, является ли любой компонент UI (обычно 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
для извлечения копии хранимой структуры. Затем отображаются два значения, хранящиеся в структуре.