exponenta event banner

Обмен данными между обратными вызовами

Обзор методов обмена данными

Многие приложения содержат взаимозависимые элементы управления, меню и графические объекты. Поскольку каждая функция обратного вызова имеет собственную область действия, необходимо явно предоставить доступ к данным тем частям приложения, которые должны получить к ней доступ. В таблице ниже описаны несколько различных методов совместного использования данных в приложении.

МетодОписаниеТребования и компромиссы
Сохранить данные в UserData или других свойствах объекта

Получение или установка значений свойств непосредственно через объект компонента.

Все компоненты пользовательского интерфейса имеют UserData свойство, которое может хранить любые данные MATLAB ®.

  • Требуется доступ к компоненту для установки или извлечения свойств.

  • UserData содержит только одну переменную за раз, но можно сохранить несколько значений как struct массив или массив ячеек.

Сохранить данные как данные приложения

Связывание данных с определенным компонентом с помощью setappdata функция. Вы можете получить доступ к нему позже с помощью getappdata функция.

  • Требуется доступ к компоненту для установки или извлечения данных приложения.

  • Может совместно использовать несколько переменных.

Создание вложенных функций обратного вызова

Вложите функции обратного вызова в основную функцию. Благодаря этому функции обратного вызова получают доступ ко всем переменным в основной функции.

  • Требуется кодирование функций обратного вызова в том же файле, что и основная функция.

  • Может совместно использовать несколько переменных.

Сохранение данных с помощью функции guidata

Совместное использование данных в окне рисунка с помощью guidata функция.

  • Сохраняет или извлекает данные через любой компонент пользовательского интерфейса.

  • Сохраняет только одну переменную за один раз, но можно сохранять несколько значений как struct массив или массив ячеек.

Сохранить данные в UserData или других свойствах объекта

Компоненты пользовательского интерфейса содержат полезную информацию в свойствах. Например, можно найти текущее положение ползунка, запросив его 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

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 для извлечения копии сохраненной структуры. Затем отображаются два значения, сохраненные в структуре.

Связанные темы