Данные Протокол Настройка Режим
Данные
Протокол
Настройка
а) б)
Рис. 3.4. Улучшенные варианты системы управления приложением с подчиненными формами (а) и с одним субменю и управляемыми кнопками (б)
На рис. 3.4,а меню управления приложением включает только команды, соответствующие режимам работы приложения. Подчиненные формы невидимы и показаны прерывистой линией. Выбор команды активизирует соответствующую форму и делает ее видимой в окне приложения. На рис. 3.4,б имеется меню только с одной главной командой и тремя командами на вложенном меню (обведено пунктиром). По существу, реализован переключатель режимов. В зависимости от выбранной команды становятся видимыми и доступными две или три кнопки с соответствующими надписями.
Наиболее изящным, на мой взгляд, решением проблемы является построение многостраничной формы с помощью объекта SSTab ("Вкладки"). Полный вид формы показан на рис. 3.5 (вкладки условно расположены рядом). Выносками показаны имена объектов, расшифровка имен приведена в табл. 3.5.
![]() |
Рис. 3.5. Схема формы приложения с двумя вкладками
Таблица 3.5
Описание формы приложения
Имя | Тип объекта | Имя | Тип объекта | |
Form1 | Форма | TBB | Окно Text Box | |
SST | Объект SSTab "Вкладки" | TBP | Окно Text Box | |
Tab1 | Таблица 1 объекта SST | CB1 | Кнопка Command Button | |
Tab2 | Таблица 2 объекта SST | CB2 | Кнопка Command Button | |
Frame1 | Рамка | CB3 | Кнопка Command Button | |
LB1 | Метка Label | CB4 | Кнопка Command Button | |
LB2 | Метка Label | ChB1 | Окно выбора Check Box | |
LB3 | Метка Label | OB1 | Кнопка Option Button | |
LBX | Метка Label | OB2 | Кнопка Option Button | |
TBA | Окно Text Box |
Назначение большинства объектов на обеих вкладках понятно без комментариев. Практически видны элементы, реализующие все команды управления приложением.
Переключатель на кнопках Option Button переводит приложение из режимов настройки протокола и решения уравнения в режим просмотра протокола. При включении кнопки "Просмотр" изменяются надписи на кнопках СВ1 и СВ2, а также функции кнопок. СВ1 в режиме просмотра протокола вызывает первую запись, а СВ2 – следующую запись. При обнаружении конца файла выводится соответствующее сообщение с помощью стандартного окна.
Окно ТВР предназначено для отображения спецификации файла протокола. Выбор и создание нового файла протокола выполняется при нажатии кнопки СВ3 с помощью объекта Common Dialog.
Еще более красивым решением было бы применение трехстраничной формы (рис. 3.6) с вкладками "Данные", "Протокол", "Настройка". На рис. 3.6 условно вкладки расположены рядом, но вкладка "Протокол" частично перекрывает вкладку "Данные", которая аналогична одноименной вкладке на рис. 3.5. Описание объектов, размещенных на форме, приведено в табл. 3.6.
Рис. 3.6. Трехстраничная форма
Таблица 3.6
Описание формы приложения
Имя | Тип объекта | Имя | Тип объекта | |
Form1 | Форма | TBA | Окно Text Box | |
SST | Объект SSTab "Вкладки" | TBB | Окно Text Box | |
Tab1 | Таблица 1 объекта SST | TBP | Окно Text Box | |
Tab2 | Таблица 2 объекта SST | CB1 | Кнопка Command Button | |
Tab3 | Таблица 3 объекта SST | CB2 | Кнопка Command Button | |
Frame1 | Рамка | CB3 | Кнопка Command Button | |
LB1 | Метка Label | CB4 | Кнопка Command Button | |
LB2 | Метка Label | ChB1 | Окно выбора Check Box | |
LB3 | Метка Label | FG1 | Объект Flex Grid (таблица) | |
LBX | Метка Label |
Вкладка "Протокол" предоставляет средство просмотра протокола в виде объекта Flex Grid (FG1). На этой вкладке пунктиром показана кнопка СВ2, находящаяся на вкладке "Данные". Вкладка "Настройка" аналогична вкладке "Протокол" на рис. 3.5, но с нее убраны кнопки опций ОВ1 и ОВ2. В дальнейшем будет принят последний вариант интерфейса пользователя.
3.7.6. Проектирование структуры программы
и разработка алгоритма ее работы
С учетом выполненной разработки интерфейса придется доработать
табл. 3.3 и табл. 3.4, описывающие наборы данных и алгоритм преобразования данных. Результат доработки показан в табл. 3.7, 3.8. Добавленные данные выделены жирным шрифтом. Эти таблицы по мере разработки алгоритма работы программы будут расширяться.
Таблица 3.7
Описание наборов данных
Имя | Тип | Способ организации | Видимость | Назначение |
Входные данные | ||||
A | Single | Переменная | Public | Коэффициент а |
B | Single | Переменная | Public | Коэффициент b |
Выходные данные | ||||
X | Single | Переменная | Public | Корень уравнения |
Промежуточные данные | ||||
TBA.Text | String | Свойство Text Box | Public | Ввод коэффициента а |
TBB.Text | String | Свойство Text Box | Public | Ввод коэффициента b |
LBX.Caption | String | Свойство Label | Public | Отображение корня х |
MessX | String | Функция | Public | Сообщение о корне х |
LogDisk LogPath LogFile | String String String | Переменная Переменная Переменная | Public Public Public | Данные протокола: имя диска путь имя файла |
TextMatrix | String | Массив, свойство объекта Flex Grid | Private | Отображение протокола |
TBP.Text | String | свойство Text Box | Public | Спецификация файла протокола |
ChB.Value | Boolean | Свойство ChB | Public | Статус операции "Запись в протокол" |
Разработка Р-графа программы выполнялась в следующем порядке:
· составлен список состояний программы (табл. 3.9);
· для каждого состояния определены входные и выходные ветви Р-графа;
· на рис. 3.7 расставлены узлы, соответствующие состояниям, достигаемым при пуске приложения и в результате выбора режима работы программы с помощью вкладок (узлы Вход, Стоп, 1,2,3, 11,14)[3];
· около узлов в прямоугольниках расставлены номера состояний в соответствии с табл. 3.9:
· для имеющихся узлов нанесены ветви Р-графа, осуществляющие очевидные переходы от одного узла к другому (ветви "Вход-1", "1-2",
"2-Стоп", "2-14", "14-1", "2-11")[4];
· для узлов, имеющих только входные ветви, расставлены выходные ветви ("3-4", "4-5", "11-12", "12-13") и ограничивающие их узлы 4,5,12,13;
· для узлов 5 и 13 на основании анализа вкладок "Данные" и "Настройки" составлены списки доступных команд и нанесены выходные ветви, в случае необходимости ветви разбивались промежуточными узлами на части с целью показать достигаемое состояние (узлы 6-9) или ветвление алгоритма (узел 10).
Таблица 3.8
Таблица формул к алгоритму преобразования данных
Имена данных | Обозначения формул | Вид формул |
TBA.Text | нет | ввод с клавиатуры |
TBB.Text | Нет | ввод с клавиатуры |
A | TBA.Text→a | a=val(TBA.Text) при вводе с клавиатуры, иначе читается из файла |
B | TBB.Text→b | b=val(TBB.Text) при вводе с клавиатуры, иначе читается из файла |
X | x= -b/a | x= -b/a при а≠0, иначе не определяется |
MessX | x →MessX MessX="не существует" MessX="не определено" | MessX=str(x) при а≠0, MessX="не существует" при а=0 и b≠0, MessX="не определено" при а=0 и b=0, |
LB.Caption | LB.Caption=MessX | LB.Caption=MessX |
LogDisk | LogDisk | из списка дисков |
LogPath | LogPath | из списка каталогов диска |
LogFile | LogFile | из списка файлов или с клавиатуры |
TextMatrix | Прот ®FG1 | TextMatrix[i,1]=str(a1), TextMatrix[i,2]=str(a2), TextMatrix[i,3]=a3 a1, a2, a3 читаются из файла, i – номер строки протокола |
TBP.Text | Выбор протокола | LogDisk+LogPath+LogFile |
Обычно для сложной задачи сразу получить в приемлемом виде
Р-граф алгоритма программы удается достаточно редко. Приходится неоднократно перерабатывать его в целях получения более простых путей реализации алгоритма и уменьшения числа пересечений ветвей. Полученный Р-граф программы приведен на рис. 3.7, пояснения к нему – в табл. 3.9.
На рис. 3.7 курсивом выделены условия, разрешающие движение по ветвям, жирным шрифтом – выполняемые действия, обычным шрифтом обозначены номера узлов, а цифрами в рамках – состояния программы
Таблица 3.9 Расшифровка обозначений к рис. 3.7. | Реализующая процедура (функция) | Условия | Действия | Процедура InDan() | Реализуется объектами управления формой | То же | То же | |||||||||||
Соответствующее действие или условие | Выбрана вкладка "Данные" | Выбрана вкладка "Протокол" | Выбрана вкладка "Настройка" | Нажата кнопка СВ2 "Корень" | Нажата кнопка СВ1 "Очистить" | Включена запись протокола | Отключена запись протокола | Введен символ, который можно рассматривать как допустимый при вводе чисел | Нажата кнопка СВ3 "Выбор" (протокола) | Нажата кнопка СВ4 "Очистка" (протокола) | Выбор объекта ChB "Запись" | Инициализация данных (присвоение им начальных значений) | Выбор вкладки, нажатие доступной кнопки, щелчок мыши или ввод символа | Выбор объекта ТВА | Выбор объекта ТВB | |||
Обозначение | Данные | Протокол | Протокол | Выход | Очистить | Зап. вкл. | Зап. откл | Введен символ числа | Выбор | Очистка | ChB | Init | Ввод команды | Активизация TBА | Активизация TBB |
Окончание табл. 3.9 | Реализующая процедура (функция) | Процедура NulDan() | Процедура WriteProt() | Функция MessX и оператор присваивания | Реализуется объектом Text Box | Реализуется объектом Text Box | Процедура ClFile() | Процедура SelProt() | Обработчик ChB_Click() | Процедура GetProt() | Процедура ProgEnd | Состояния | |||||||
Соответствующее действие или условие | Очистка текстовых окон ТВА, ТВВ, метки LBX и запись нулей в переменные a,b,x | Запись данных в протокол | Расчет корня уравнения и вывод в метку LBX | Добавление символа в ТВА.Техt | Добавление символа в ТВB.Техt | Стирание информации в выбранном файле протокола | Выбор протокола | Включение и отключение режима записи | Чтение протокола из файла в объект FG1 "Таблица" | Завершение программы | Начало работы программы | Открыта вкладака "Данные, активе ТВА | Открыта вкладка "Данные", активен ТВВ | Открыта вкладка "Данные", выведен корень уравнения, активен ТВА | Открыта вкладка "Протокол" | Открыта вкладка "Настройка" | Программа завершена | ||
Обозначение | Очистка формы и данных | a,b.x® Прот | LBX.Caption=MessX | Simb® TBA.Text | Simb® TBB.Text | Очистка протокола | Выбор протокола | Статус записи | Прот ®FG1 | Зав. прог | Вход | Стоп |
Определим структурные элементы программы. Для описания данных с видимостью public (табл. 3.7) потребуется специальный модуль. В состав программы должны войти процедуры и функции пользователя и обработчики событий. Последовательность разработки структуры программы:
· создадим модуль OpDan для описания данных с видимостью public, не принадлежащих к стандартным объектам формы,
· разместим в секции General кода программы формы Form1 заготовки описаний процедур из табл. 3.9,
· создадим заготовки обработчиков событий стандартных объектов управления формой, для каждого из которых выпишем заголовок процедуры, несколько пустых строк и слова end sub,
· в заготовки обработчиков событий вставим вызовы процедур, не входящих в число методов стандартных объектов.
Полученная структура программы показана в табл. 3.10.
Таблица 3.10
Структура программы
Имя модуля, объекта, секции | Содержание |
OpDan | Описание данных a,b,x |
Форма Form1 | |
Секция General | Sub InDan() 'Инициализация данных End sub sub NullDan() 'Очистка формы и данных End sub Sub WriteProt() 'Запись данных в протокол End sub Sub ClFile() 'Очистка файла протокола End sub Sub SelProt() 'Выбор протокола End sub Sub GetProt() 'Получение данных из протокола End sub Sub EndProg() 'Завершение работы программы End sub Function MessX() 'Вычисление корня End function |
Окончание табл. 3.10 | |
Form1 | Sub Form1_Load() 'Загрузка формы Call InDan End sub Sub Form1_Unload 'Выгрузка формы из памяти Call EndProg() End sub |
CB1 | Sub CB1_Click() 'Нажатие кнопки Очистить call NullDan End sub |
CB2 | Sub CB1_Click() 'Нажатие кнопки Корень LBX.Caption=MessX() End sub |
CB3 | Sub CB3_Click() 'Выбор протокола Call SelProt End sub |
CB4 | Sub CB4_Click() 'Очистка протокола Call ClFile End sub |
SST.Tab2 | Sub SST.Tab2_Click() 'Чтение протокола в FG1 call GetProt End sub |
ChB | Sub ChB_Click() ' Включение и отключение записи протокола ' в качестве признака включения записи 'использовать свойство ChB.Value 'true – запись включена, false – отключена End sub |
Теперь, имея структуру программы, описание алгоритма преобразования данных и Р-граф программы, можно приступить к составлению кода программы. Этому вопросу будет посвящена 4-я глава, в которой будут рассмотрены типовые приемы программирования.