Совместное использование данных между коллбэками

Обзор методов совместного использования данными

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

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

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

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

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

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

Хранение данных в качестве данных приложений

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

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

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

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

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

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

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

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

Обменивайтесь данными с окном рисунка, используя guidata функция.

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

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

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

Компоненты 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

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

Похожие темы