49943 (597467), страница 3
Текст из файла (страница 3)
Рис. 11. SliderStep
Листинг 8. Изменение толщины линии
function scrWidth_Callback(hObject, eventdata, handles)
% Получаем текущее значение value скроллбара
w = get(hObject,'Value');
% Устанавливаем в качестве толщины линии округленное значение value set(handles.line,'LineWidth',round(w));
Область ввода текста
Обычные текстовые области, использовавшиеся на протяжении предыдущих разделов, позволяют лишь вывести некоторый текст в окно приложения. Обмен текстовой информацией между пользователем и приложением осуществляется при помощи областей ввода текста. Предоставьте пользователю возможность размещать заголовок на графике. Текст заголовка пользователь вводит в соответствующей строке.
Добавьте в окно приложения область ввода текста, установите значение editTitle свойству Tag области ввода и снабдите ее пояснением в текстовой области, расположенной выше так, как показано на рис. 12. В редакторе свойств удалите из String строку Edit Text, для чего нажмите кнопку в строке с названием свойства и сотрите текст в окне String.
Листинг 9. Изменение заголовка графика
function btnPlot_Callback(hObject, eventdata, handles)
%
% Операторы, отвечающие за построение графика и т.д.
%
title(get(handles.editTitle,'String'))
Рис. 12. Окно с областью ввода текста
Диалоговые окна и меню приложения
Виды диалоговых окон
Удобный интерфейс приложения во многом определяется диалоговыми окнами, облегчающими работу с файлами, или предназначенными для предостережения пользователя о событиях, которые могут повлечь его действия. MatLab предоставляет разработчику приложения возможность использовать стандартные диалоговые окна Windows.
Окно подтверждения
Некоторые действия приложения требуют повторного подтверждения пользователя. Например, пользователь приложения mygui может случайно нажать кнопку Очистить, предназначенную для очистки осей. Следует вывести диалоговое окно, в котором пользователь укажет, действительно ли требуется очистить оси.
Диалоговое окно подтверждения создается функцией questdlg, которая в самом простом случае имеет два входных параметра - строки с текстом внутри диалогового окна и заголовком окна. Окно, создаваемое таким образом, имеет три кнопки - Yes, No и Cancel. Выбор пользователя возвращается в строковом выходном аргументе функции questdlg, его значение совпадает с надписью на кнопке.
Усовершенствуйте обработку нажатия кнопки Очистить так, чтобы соответствующие операторы выполнялись только в том случае, если пользователь нажал кнопку Yes в появляющемся диалоговом окне с текстом Очистить оси? и заголовком mygui. Используйте условный оператор if и функцию strcmp для сравнения выходного аргумента questdlg со строкой Yes (листинг 6).
Листинг 10. Программирование диалогового окна запроса
button = questdlg('Очистить оси?','mygui');
if strcmp(button, 'Yes')
% здесь размещаются все операторы,
% обрабатывающие нажатие на кнопку Очистить
end
Нажатие на кнопку Очистить приводит к появлению диалогового окна, изображенного на рис. 13. Выбор пользователя определяет дальнейшие действия приложения mygui.
Рис. 13. Диалоговое окно подтверждения
Функция questdlg позволяет управлять видом диалогового окна. Строка с названием кнопки, переданная в третьем дополнительном аргументе, определяет кнопку окна, которая может быть нажата пользователем при помощи клавиши
Button = questdlg('Очистить оси?','mygui', 'Yes');
предполагает, что в диалоговом окне нажатие клавиши
Число кнопок и надписи на них определяются создателем приложения, например, следующая форма обращения к функции questdlg
Button = questdlg('Очистить оси?', 'mygui','Да','Нет','Нет')
приводит к появлению диалогового окна с текстом Очистить оси?, заголовком mygui и двумя кнопками Да и Нет, причем нажатие
Окно с сообщением об ошибке
Некоторые действия пользователя, в частности открытие файла с данными в неизвестном формате, могут привести к ошибке в работе приложения. Такие исключительные ситуации следует предусматривать при написании алгоритма приложения и сопровождать их сообщением об ошибке. Лучше всего выводить сообщение в диалоговое окно, которое автоматически размещается поверх всех остальных окон и требует нажатия кнопки ОК для продолжения работы.
Функция errordlg предназначена для создания диалогового окна с сообщением об ошибке. Входными аргументами errordlg являются строки с текстом и заголовком окна.
Дополните построение графика данных проверкой на размерность и тип содержимого массива Mas при помощи функций size, ndims и isnumeric и выведите сообщение в случае несоответствующего формата данных. Заключите считывание и визуализацию данных в блок try...catch end для предотвращения ошибки при обращении к load (листинг 7). При работе в MatLab 6.x следует записать указатель на линию в структуру handles.line и сохранить, используя функцию guidata.
Листинг 11. Обработка исключительных ситуаций с сообщением об ошибке
try
% Считывание данных из файла в массив
Mas = load('data.txt');
% Определение размеров массива
SMas = size(Mas);
% Проверка массива данных
if ((SMas(2) ~= 2) | (ndims(Mas) ~= 2) | ~isnumeric(Mas))
errordlg('Неизвестный формат файла с данными', 'Ошибка!')
else
% Графическое отображение данных
headers.line = plot(Mas(:,1), Mas(: , 2) ) ;
end
catch
% Произошла ошибка при выполнении load
errordlg('Неизвестный формат файла с данными', 'Ошибка!')
end
Меню графического окна
Приложение MatLab может использовать стандартное меню графического окна. Среда GUIDE позволяет программисту дополнять стандартное меню или создать собственные меню. Свойство MenuBar окна приложения (объекта figure) отвечает за наличие стандартных меню File, Edit, Tools, Window и Help в работающем приложении. Значение figure данного свойства соответствует отображению стандартных меню, а none приводит к приложению без строки с меню. Вне зависимости от значения свойства MenuBar, разработчик приложения имеет возможность размещать собственные меню, которые в случае значения figure добавляются к стандартным меню графического окна. Размещение и программирование меню производится при помощи редактора меню.
Создание меню в редакторе
Перейдите в режим редактирования приложения в среде GUIDE. Принцип конструирования меню проще всего понять, создавая новое меню - убедитесь, что свойство MenuBar графического окна установлено в none. Запустите редактор меню из панели управления (или выбором пункта меню Tools->Menu Editor…), появляется окно Menu Editor, изображенное на рис. 14.
Окно редактора меню содержит две вкладки: Menu Bar, предназначенную для создания строки меню приложения, и Context Menus для контекстного меню. Области навигатора и свойств элементов меню пока пустые. Создайте меню, нажав соответствующую кнопку на панели инструментов редактора меню (убедитесь, что выбрана вкладка Menu Bar), в навигаторе появилась строка Untitled 1, сделайте ее текущей щелчком мыши. В области свойств находятся строки ввода (рис. 15).
Рис.14 Редактор меню Guide Menu Editor
Рис. 15. Задание свойств меню в редакторе
Строка Label служит для задания надписи меню или пункта меню, a Tag -для определения названия созданного объекта. Введите текст "График" в строку Label (без кавычек) и задайте имя mnGraph. Запустите приложение mygui и убедитесь в наличии меню График. Выбор меню График в работающем приложении не приводит к раскрытию меню, следует создать пункты меню. Перейдите в режим редактирования, сделайте текущей строку График в навигаторе редактора меню и добавьте пункт, нажав соответствующую кнопку на панели инструментов редактора меню. Установите надпись пункта Построить и дайте ему имя mnGraphPlot. Добавьте еще один пункт меню, сделав предварительно текущей строку График в навигаторе. Аналогичным образом задайте надпись Очистить и имя mnGraphClear. Навигатор меню должен содержать структуру, изображенную на рис. 16. Меню График имеет первый уровень, а пункты Построить, Очистить - второй.
Рис.16 Иерархия элементов меню
Запустите приложение mygui. Выбор меню График приводит к раскрытию меню. Пока при обращении к пунктам Построить и Очистить ничего не происходит, следует запрограммировать события Callback пунктов меню. Событие Callback самого меню График не требует обработки, т. к. происходит автоматическое раскрытие меню.
Программирование пунктов меню
Выбор элемента меню в навигаторе редактора меню приводит к отображению его свойств на панели Properties. Строка ввода Callback предназначена для вызова подфункции М-файла приложения, содержащего обработку событии элементов интерфейса.
В соответствующем приложению M-файле автоматически создаются подфункции обработки Callback созданных элементов меню. Программисту, как и в случае создания других элементов управления, следует наполнить их содержимым - операторами, производящими требуемые действия.
Откройте файл mygui.m в редакторе М-файлов и определите две подфункции для созданных элементов меню.
Листинг 12. Программирование пунктов меню
function mnGraphPlot_Callback(hObject, eventdata, handles)
% Вызываем обработчик нажатия кнопки Построить
btnPlot_Callback(hObject, eventdata, handles)
% Кнопка Построить должна быть недоступна
set(handles.btnPlot,'Enable','off')
% Кнопка Очистить должна быть доступна
set(handles.btnClear,'Enable','on')
function mnGraphClear_Callback(hObject, eventdata, handles)
% Вызываем обработчик нажатия кнопки Очистить
btnClear_Callback(hObject, eventdata, handles)
% Кнопка Построить должна быть доступна
set(handles.btnPlot,'Enable','on')
% Кнопка Очистить должна быть недоступна
set(handles.btnClear,'Enable','off')
Контекстное меню объектов
Объекты, в том числе и созданные в ходе работы приложения, могут иметь собственное контекстное меню, которое активизируется щелчком левой кнопки мыши. Контекстное меню позволяет получить быстрый доступ к часто используемым свойствам объекта. Конструирование контекстного меню состоит в создании его в редакторе меню, определении событий Callback пунктов меню и последующем связывании меню с объектом.
Создание меню
Перейдите к вкладке Context Menus в редакторе меню и нажмите кнопку создания контекстного меню (см. рис. 17), в навигаторе меню появляется строка для меню. Задайте ему имя cmLine. Обратите внимание, что на панели свойств нет строки ввода Label, т. к. раскрывающееся меню не должно иметь надписи. Создайте три пункта меню при помощи той же кнопки, что применяется для добавления пунктов меню окна приложения. Определите для них надписи синий, красный, зеленый и имена cmLineBlue, cmLineRed, cmLineGreen соответственно. В результате навигатор меню должен содержать структуру, приведенную на рис. 17.
Рис. 17 Отображение контекстного меню в навигаторе объектов
В работающем приложении щелчок правой кнопкой мыши по линии графика не приводит к отображению контекстного меню. Сейчас контекстное меню cmLine присутствует в приложении как объект, но другой объект - линия, создаваемая при нажатии, например, на кнопку Построить, "не знает" о том, что у нее есть собственное контекстное меню. Следующий этап состоит в связывании линии с созданным меню cmLine.
Связывание контекстного меню с объектом
Любой объект, размещенный в окне приложения, имеет свойство UIContextMenu, значением которого может являться указатель на имеющееся контекстное меню. Для того чтобы созданный объект, т. е. линия графика, обладал контекстным меню, следует установить свойству UIContextMenu значение указателя на меню cmLine, содержащееся в структуре handles. Построение линии в приложении mygui производится или при нажатии пользователем кнопки Построить, или при выборе пункта Построить меню График. Присвойте свойству линии UIContextMenu требуемое значение во всех блоках М-файла, связанного с mygui, которые отвечают за отображение графика функции (листинг 8).
Листинг 13. Связывание контекстного меню с линией
handles.line = plot (x, у);