Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ № 5 Создание приложений с GUI без среды GU...doc
Скачиваний:
12
Добавлен:
24.11.2019
Размер:
470.53 Кб
Скачать

Сохранение данных, полученных в функции обработки событий, функция guidata.

Если приложение с графическим интерфейсом программируется в файл-функции, в которой основная функция создает окно приложения и элементы управления, а подфункции предназначены для обработки событий элементов управления и объектов приложения, то часто возникает следующий вопрос. Как сохранить некоторые данные, полученные в ходе выполнения одной функции обработки события, и передать их в другую функцию? Запись данных в переменную ничего не дает, поскольку переменные подфункции являются локальными и по завершении работы подфункции они удаляются из памяти.

Один из возможных подходов к решению этой проблемы состоит в создании структуры, поля которой содержат некоторые общие данные. Назовем эту структуру handles, как и в предыдущем разделе. Для сохранения этой структуры служит функция guidata, которая часто используется в сочетании с функцией guihandles, предназначенной для получения указателей на объекты приложения. Для получения структуры handles в функции обработки события достаточно вызвать функцию guidata со входным аргументом - указателем на тот объект, событие которого выполняется (он и будет потомком графического окна приложения). После этого в структуре handles можно создать новое поле, например data, записать в него необходимые данные и сохранить обновленную структуру handles при помощи функции guidata

function ObjectCallback(src,evt)

....

% имеются некоторые данные, записанные в массив A

% получаем структуру handles

handles = guidata(src);

% добавляем в нее поле data

handles.data = A;

% сохраняем структуру

guidata(handles, src)

...

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

В качестве простого примера приведем приложение presscount, содержащее всего одну кнопку, надпись на которой содержит число нажатий на кнопку (см. рис. 4).

Рис. 4. Окно приложения presscount

В основной функции приложения presscount создается графическое окно и кнопка с надписью "You have not press me yet". Затем создается структура handles с одним полем times, которому присваивается 0 (пока кнопка ни разу не нажималась). Структура handles сохраняется при помощи функции guidata.

При каждом нажатии на кнопку в функции BtnCallback обработки события Callback кнопки вызывается функция guidata для получения структуры handles, значение ее поля times увеличивается на единицу и структура handles сохраняется. Остается изменить надпись на кнопке, прибегнув к функции num2str для преобразования числа в строку и сцеплению строк при помощи квадратных скобок.

function presscount

% создаем графическое окно

hF = figure('Name', 'presscount', 'NumberTitle','off',...

'MenuBar', 'none', 'Units', 'characters', 'Position', [10 10 100 5]);

% создаем кнопку

uicontrol('Style', 'pushbutton', 'Units','normalized',...

'Position', [0.1 0.1 0.8 0.8],...

'String', 'You have not press me yet',...

'FontSize', 16, 'Callback', @BtnCallback);

% создаем структуру handles с полем times, в которое записываем 0

% (кнопка нажималась 0 раз)

handles.times = 0;

% сохраняем структуру handles

guidata(hF, handles)

% скрываем указатели на объекты приложения

set(hF, 'HandleVisibility', 'callback');

function BtnCallback(src, evt)

% подфункция обработки нажатия на кнопку

% получаем структуру handles

handles = guidata(src);

% увеличиваем значение ее поля times на единицу

handles.times = handles.times + 1;

% сохраняем структуру handles

guidata(src, handles);

% изменяем надпись на кнопке

str = ['You pressed me ' num2str(handles.times) ' times'];

set(src, 'String', str)

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