5. Лекция: СУБД Microsoft Visual FoxPro. Экранные формы

Рассмотрены назначение и виды экранных форм при работе с базами данных. Разобраны последовательность разработки форм с помощью Мастера, виды и свойства объектов экранных форм, модификация их в Конструкторе с добавлением новых объектов. Цель: освоение методов создания и использования экранных форм в Visual FoxPro.

Назначение экранных форм

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

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

На рис. 5.1 - 5.5 приведены в качестве примера экранные формы нескольких основных видов в одной из наиболее крупных систем автоматизации управления предприятиями - BaanERP.


Рис. 5.1.  Множество записей в одной экранной форме, редактирование - в отдельном окне (см. рис. 5.4)


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


увеличить изображение
Рис. 5.3.  Одна запись родительской таблицы и множество записей дочерней


увеличить изображение
Рис. 5.4.  Одна запись на многостраничной экранной форме с кнопками без меню и панели инструментов

Экранная форма с командными кнопками
Рис. 5.5.  Экранная форма с командными кнопками

При работе с экранными формами существует два принципиально разных подхода:

  1. Стиль, принятый в системе FoxPro - на главной экранной форме представлена информация одной записи главной таблицы и связанные с ней данные; полный список записей можно увидеть, нажав кнопку Поиск на этой форме (см. пример рис. 5.3).
  2. Стиль, основанный на показе таблицы данных - главный экран содержит список (не редактируемых в строке) записей главной таблицы, из него можно перейти на другой экран для редактирования одной записи (см. пример рис. 5.1).

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

Использование Мастера для разработки экранных форм

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

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

Мастер экранных форм (Form Wizard) позволяет разрабатывать экранные формы, имеющие некоторый стандартный набор кнопок управления. В этом случае данные становятся доступны для редактирования только после нажатия на кнопку Правка, а по завершении редактирования надо нажать на кнопку Сохранить или Отменить.

При использовании Мастера проектов (Application Wizard) можно разрабатывать экранные формы, входящие в состав проекта, и оформленные в новом стиле - все данные на экране изначально доступны для редактирования, пользователь может в любой момент принять решение, сохранять изменения или нет. Для управления используется не набор кнопок, а панели инструментов. Система следит за изменениями: если Вы попытаетесь закончить работать с базой, не дав команды о сохранении или отмене изменений, появится соответствующий запрос (как в программах Word или в Excel при закрытии окна).

Воспользуемся способом разработки экранных форм с использованием Form Wizard. Предварительно откроем базу данных Students в эксклюзивном режиме (в окне Open должна стоять галочка у слова Exclusive). Далее нажимаем на кнопку New на стандартной панели инструментов системы VFP, выбираем тип нового файла - Form - и нажимаем на большую кнопку Wizard (см. ранее рис. 2.2 - экран New). В появившемся окне Wizard Selection выбираем вариант One-to-Many Form Wizard - разработка экранной формы для двух связанных таблиц, показывающей поля одной записи главной таблицы и множество связанных записей дочерней таблицы в виде объекта Grid. В нашем случае главная таблица базы - Spisok, связанная с ней таблица - Ocenki.

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

Шаг 1 (Step 1, рис. 5.6): выбор главной таблицы и ее полей. Экран содержит краткое описание этого шага и следующие списки: выбора базы данных и таблиц (Databases and tables), доступных полей выбранной таблицы (Available fields) и выбранных для размещения на экранной форме полей главной таблицы (Selected fields).

Шаг 1 Мастера разработки экранных форм
Рис. 5.6.  Шаг 1 Мастера разработки экранных форм

Для выбора необходимых полей служат кнопки со стрелками или может использоваться двойной щелчок мыши.

Далее нажимаем на кнопку Next > и переходим ко второму шагу, где нам необходимо выбрать на аналогичном экране таблицу, связанную с главной связью от одной записи - ко многим, и ее поля, в нашем случае это все поля таблицы Ocenki.

На третьем шаге нужно подтвердить, что выбранные таблицы действительно связаны по значению поля NZ.

Четвертый шаг - выбор стиля формы и типа кнопок (рис. 5.7). Использование кнопок с картинками (Picture buttons) имеет то преимущество, что изображение носит интернациональный характер, после усвоения назначения кнопок быстрее воспринимается, чем текст. Другой вариант в международных многоязыковых системах - сохранять все названия кнопок в отдельных файлах или в базе данных, т.е. с названиями кнопок связывать значения переменных, которые определяются при запуске системы в работу.

Шаг 4 Мастера разработки форм
Рис. 5.7.  Шаг 4 Мастера разработки форм

Шаг 5 - задание сортировки записей главной таблицы. Можно задать сортировку по имеющемуся у таблицы индексу или указать последовательность полей для создания сложного индекса (не более трех), например, поля N_fclt, N_grup, Fio (рис. 5.8).

Шаг 5  Мастера разработки форм
Рис. 5.8.  Шаг 5 Мастера разработки форм

На шестом, последнем шаге задаем заголовок (Titul) для формы и выбираем завершающую операцию - Save form and modify it in Form Designer - Сохранить форму и модифицировать ее в дизайнере форм.

После нажатия на кнопку Finish выбираем папку для сохранения файлов экранной формы и ее название - можно оставить предлагаемое системой название, совпадающее с названием главной таблицы (у файлов таблицы и формы будут разные расширения).

В результате будет сгенерирована и открыта в дизайнере форма следующего вида (рис. 5.9):


увеличить изображение
Рис. 5.9.  Экранная форма, разработанная Мастером

Объекты экранных форм и их основные свойства

На экранной форме (объект базового класса Form) присутствуют объекты следующих классов (см. рис. 5.9):

Label - надпись на форме, обычно не изменяющаяся (но может изменяться программно);

Line - линия на форме, обычно не изменяющаяся, но, в принципе, тоже может изменяться;

Text Box - поле редактирования, служит для отображения и редактирования информации поля таблицы базы данных или переменной, его главное свойство: ControlSourse - с каким источником данных связан этот объект (см. далее рис. 5.10);

Grid - сложный объект, состоящий из столбцов, которые имеют заголовок (Header) и, обычно, редактируемые данные в виде объекта Text Box (можно заменить при необходимости на Combo Box - раскрывающийся список, Spinner - счетчик и пр.);

Container - контейнер-объект, который служит для объединения других объектов в одну группу, для которой можно задать общие свойства и события;

Command Button - командная кнопка, связанная с выполнением определенной процедуры, находится внутри контейнера.

Следует отметить, что многие из этих объектов имеют базовый класс (свойство BaseClass), соответствующий приведенному названию (из библиотеки классов Standard), а реально происходят из Wizembss.vcx - библиотеки классов, которую использует Мастер разработки экранных форм. Эта библиотека основана на стандартных объектах, но они модифицированы (добавлены и описаны новые свойства и события), что необходимо для работы Мастера.

Для создания объектов экранных форм используется панель инструментов Form Controls, для выравнивания объектов полезна панель Layout (см. рис. 5.10).

Панели инструментов для работы с объектами экранной формы
Рис. 5.10.  Панели инструментов для работы с объектами экранной формы

Полный список стандартных объектов экранных форм, присутствующих на панели Form Controls, приведен в табл. 5.1

Таблица 5.1.
НаименованиеКнопкаГлавное свойствоПример использования
Label


Caption


Text box


Control Sourse


Edit box


Control Sourse


Command button


Click Event


Option Group


Control Sourse


Check box


Control Sourse


Combo box


ControlSourse,RowSourseTip,RowSourse


List box


ControlSourse,RowSourseTip,RowSourse


Spinner


Control Sourse


Grid


см. рис. 5.9
Image Picture


Picture


Timer


Timer Event, Intervalневидимый объект
Page Frame


Многостраничная форма
ActiveX (OLE) Container


Ole ClassОбъект ActiveX
ActiveX (OLE) Bound


Control SourseОбъект поля General
Line



Shape


Curvature


Сontainer


Группа объектов
Hyperlink


Используется с объектами библиотек _hyperlink.vcx и _internet.vcxНевидимый объект

Свойства формы и всех ее объектов можно просматривать и изменять в окне Properties (рис. 5.11). Если это окно отсутствует, его можно открыть, щелкнув правой кнопкой мыши на любом объекте и выбрав в контекстном меню слово Properties.

Окно свойств объекта
Рис. 5.11.  Окно свойств объекта

В верхней части окна присутствует раскрывающийся иерархический список объектов, ниже - несколько страниц групп свойств объектов:

Data - данные, важнейшее свойство в этом разделе - Control Sourse для объектов, связанных с редактированием каких-либо данных;

Metods - методы, т.е. процедуры (программные модули), выполняющиеся для объекта, чаще всего, при наступлении определенных событий (Events). Примеры событий: Load Event - происходит перед созданием объекта (но после открытия таблиц, если это задано в Data Environment для формы); Activate Event - при активизации объекта; When Event - перед тем, как курсор переместится на текущий объект, выбранный мышкой, или при переходе на него с предыдущего объекта с использованием клавиш TAB или Enter; Valid Event - перед тем, как курсор переместится c текущего на другой объект; Click Event - при щелчке мышкой на объекте и пр.;

Layout - все, что связано с внешним видом объекта: расположение, размеры, шрифт, цвет, тип выравнивания, ShowTips - показывать или нет всплывающие подсказки, ScrollBars - показывать или нет полосы скроллинга и пр.;

Other - прочие свойства;

Favorites - избранное, раздел, куда можно помещать список самых важных свойств объекта (в версии VFP 9.0).

Следует отметить важность события Valid Event для всех объектов, связанных с редактированием данных, - оно не только позволяет выполнить проверку правильности ввода данных, но, что особенно ценно, позволяет автоматизировать выполнение расчетов после редактирования данных и выхода из поля редактирования.

Для использования экранной формы нужно запустить ее в работу, что можно сделать из системы FoxPro несколькими способами: нажатием на кнопку Run


на стандартной панели инструментов, горячими клавишами Ctrl+E, командой Run Form в пункте меню Form (этот пункт присутствует в меню только при активном окне Form Designer) или командой Do Form Spisok, написанной в окне Command (при этом папка, в которой расположены файлы экранной формы Spisok.scx и Spisok.sct должна быть Default Directory или в команде нужно указать полный путь и название файла). После чего начинает работать программа, отображающая на экране тот вид, что описан вами с использованием Конструктора форм, дающая возможность редактировать данные в полях формы и выполнять процедуры, связанные с объектами этой формы (рис. 5.12).

Экранная форма, запущенная в работу с базой данных
Рис. 5.12.  Экранная форма, запущенная в работу с базой данных

Как мы видим, на форме отсутствуют названия факультетов, специальностей и предметов. В объекте Grid Мастер не показал имеющиеся в таблице Ocenki заголовки полей таблицы (Caption). Следует устранить эти недостатки и создать возможность выбора факультетов, специальностей и предметов из соответствующих справочников.

Модификация экранной формы в Конструкторе

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

Для использования информации из справочных таблиц необходимо добавить их в Data Environment - окно, связанное с экранной формой и описывающее, какие таблицы связаны с формой, как они открываются и закрываются при запуске формы в работу (см. свойства в окне Properties). Другой вариант - в событии Load экранной формы самому написать команды открытия таблиц, задания порядка по индексам и установления связей.

Для начинающих программистов проще воспользоваться первым, визуальным способом. Окно Data Environment можно открыть, щелкнув на соответствующем названии в пункте главного меню View или выбрав команду Data Environment в контекстном меню экранной формы. Вид этого окна показан на рис. 5.13. Щелкнув правой кнопкой мыши на пустом месте окна Data Environment, выберем команду Add в контекстном меню, добавим таблицы Fclt, Spect, Predmеts и зададим правильно связи между ними перетаскиванием мышкой названия поля к названию индекса, как показано на рисунке.

Окно данных экранной формы Data Environment
Рис. 5.13.  Окно данных экранной формы Data Environment

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

Найдем на панели Form Controls объект Combo Box, щелкнем на нем мышкой и покажем область размещения и размер этого объекта на экранной форме Spisok. Затем щелкаем правой кнопкой мыши на нем и в контекстном меню выбираем пункт Builder. В результате в VFP открывается окно Combo Box Builder (рис. 5.14.). Это окно состоит из четырех страниц для выбора исходных данных, стиля и внешнего вида списка и задания, какую колонку и где сохранять при выборе пункта списка. Опишем свойства Combo Box для работы со справочником факультетов.

Страница 1 построителя объекта
Рис. 5.14.  Страница 1 построителя объекта

Наиболее важны первая и четвертая страницы Builder. На первой странице выбираем таблицу базы - FCLT и поля - сначала Name_f, затем N_fclt.

На второй странице заменим стиль drop-down combo на drop-down list. Разница между стилями: первый позволяет писать информацию в поле ввода; она станет значением ControlSourse, если соответствует одной из строк данных в списке выбора; второй позволяет только открыть список и выбрать из него данные.

На третьей можно задать ширину полей.

На четвертой странице (рис. 5.15.) нужно задать:

  1. колонку списка, значения из которой вы хотите сохранять, - N_Fclt;
  2. поле, в котором будет сохраняться выбранное значение, - Spisok.N_fclt.

Страница 4 Построителя объекта
Рис. 5.15.  Страница 4 Построителя объекта

Нажмем на кнопку OK и посмотрим в окне Properties на странице Data свойство BoundTo. Значение этого свойства следует задать равным True, тогда в поле Spisok.N_fclt будет заноситься номер из справочника, иначе заносился бы порядковый номер строки в списке.

Кроме того, следует изменить свойство UserControlMode группы кнопок экранной формы на значение .T. - в этом случае список будет доступен для редактирования только после нажатия на кнопку Редактировать.

Аналогичным образом добавим объект Combo Box для работы со справочником специальностей.

Более сложная операция - замена в колонке Grid объекта Text Box на Combo Box для выбора названия предмета из справочника. Grid - иерархический объект, состоит из колонок, в каждой колонке есть ее название и содержание. Чтобы перейти к свойствам колонки 3, откроем окно свойств (Properties), щелкнем правой кнопкой на этой колонке и выберем команду Edit - входим в редактирования колонки. После этого выбираем в окне Properties объект Text1 колонки 3, щелкаем мышкой на 3-й колонке в Grid-е и нажимаем на клавишу Delete на клавиатуре - поле редактирования колонки 3 удалено. Далее выбираем на панели Form Controls объект Combo Box и щелкаем мышкой на 3-ей колонке Grid-а - в колонку 3 вставлен объект Combo Box вместо Text Box. Затем надо описать свойства вставленного в колонку 3 объекта с именем Combo1:

  • ControlSourse - если для колонки было задано ocenki.n_predm и BoundTo = .T., это свойство автоматически становится таким же, как свойство колонки, т.е. ocenki.n_predm;
  • RowSourseType 6 - Fields;
  • RowSourse predmets.n_predm, name_p;
  • ColumnCount 2;
  • ColumnWidths 20, 180;
  • BorderStyle 0 - None;
  • SpecialEffect 1 - Plain.

Для показа названия предмета в таблице добавим количество колонок (для объекта Grid свойство ColumnCount изменим на 7), переместим колонку перетаскиванием мышкой за заголовок на четвертое место в таблице после колонки N_predm и опишем свойства колонки 7: ControlSourse - Predmets.name_p (выбором из списка доступных полей); ReadOnly - .T. (делаем эту колонку нередактируемой).

Далее отредактируем заголовки (Header) у всех колонок объекте Grid, цвет фона экранной формы и объекта Grid (BackColor) и цвета объектов Combo box - DisabledBackColor и DisabledForeColor.

В результате экранная форма (после запуска ее в работу) будет иметь вид, показанный на рис. 5.16.


Рис. 5.16.  Экранная форма после модификации в Конструкторе

Работа с базой данных с использованием экранной формы

Следующая задача - научиться пользоваться той экранной формой, основу которой предложил Мастер и которая содержит некоторый набор кнопок для работы с информацией базы данных. Для последующей работы с отчетами с группировкой данных нам необходимо, используя ее правила заполнения, занести в базу данных информацию о студентах не менее 2 факультетов, на каждом факультете должно быть 2-3 группы, в каждой группе несколько студентов, у каждого студента - 3-5 оценок.

Назначение кнопок, на которых вместо надписей мы задали показ картинок (см. рис. 5.7.), поясняется подсказками у курсора мыши (ToolTipText) и на строке состояния (StatusBarText), однако эти сообщения в библиотечном объекте написаны на английском языке. Если использовать в дальнейшем библиотеки из папки VFP Wizards, следует перевести на русский язык сообщения и надписи на экранных формахэтих библиотек. В табл. 5.2. приведено назначение стандартных кнопок экранной формы.

Таблица 5.2. Назначение кнопок базового класса pictbtns библиотеки wizbtns.vcx
НазначениеToolTipTextStatusBarText
1.Перейти к первой записиTop recordGo to top of table
2.Перейти к предыдущей записиPrevious recordSkip to previous record
3.Перейти к следующей записиNext recordSkip to next record
4.Перейти к последней записиBottom recordGo to bottom of table
5.Поиск записейFind recordsSearch for records
6.Напечатать отчетPrint reportPrint to report
7.Добавить/сохранить записьAdd/Save recordAdd new record/Save edits
8.Редактировать/отменить измененияEdit/Revert recordEdit existing record/Revert edits
9.Удалить записьDelete recordDelete existing record
10.Выйти из формыExit formExit input form

Как видно из табл. 5.2., кнопки 7 и 8 имеют двойное назначение, которое изменяется после нажатия на кнопку. Текст процедур, связанных с методом ClickEvent для кнопок, находится в классе txtbtns библиотеки wizbtns.vcx, где его можно изучить. Если для кнопки 7 возникнет необходимость использовать нестандартную команду добавления данных, нужно скопировать процедуру библиотечного объекта в метод ClickEvent своей кнопки и отредактировать фрагмент программы (в фигурных скобках - комментарии к программе):

IF THIS.Parent.EditMode	{если нажата кнопка и мы в режиме редактирования}
   THIS.Parent.UpdateRows()	{сохранить запись, процедура группы кнопок - родительского объекта}
ELSE
   IF !THIS.Parent.AddRec()	{иначе - к процедуре добавления записей}
      RETURN 
   ENDIF
ENDIF
THIS.Parent.EditMode = !THIS.Parent.EditMode	{изменение свойства EditMode }
THIS.Parent.AddMode = THIS.Parent.EditMode	{изменение свойства AddMode }
THIS.Parent.TopFile = .F.
THIS.Parent.ButtonRefresh()	{обновление параметров кнопок 5 -10 }
THIS.Parent.NavRefresh()	{обновление параметров кнопок 1-4 и объектов формы}

Наиболее сложные функции - у кнопок 7 в режиме добавления данных, кнопок 5 и 6. Эти кнопки вызывают запуск в работу библиотечных экранных форм для добавления, поиска записей и вывода отчетов, вид которых в Конструкторе (после перевода надписей на русский язык и модификации формы поиска) приведен на рис. 5.17-5.19.

Экранная форма GridAddForm библиотеки wizbtns.vcx
Рис. 5.17.  Экранная форма GridAddForm библиотеки wizbtns.vcx

Экранная форма SearchForm библиотеки wizbtns.vcx(добавлен объект Grid1 для показа таблицы, в которой выполняется поиск)
Рис. 5.18.  Экранная форма SearchForm библиотеки wizbtns.vcx(добавлен объект Grid1 для показа таблицы, в которой выполняется поиск)

Экранная форма вывода отчета библиотеки _report.vcx
Рис. 5.19.  Экранная форма вывода отчета библиотеки _report.vcx

Порядок ввода новых данных с использованием разработанной формы следующий:

  1. запускаем в работу экранную форму;
  2. нажимаем кнопку 7 - "Добавить запись", выбираем, что будем добавлять - нового студента (главная таблица) или оценку студента (дочерняя таблица); в последнем случае значение ключевого поля в дочернюю таблицу заносится автоматически;
  3. выполняем ввод новых данных;
  4. нажимаем кнопку 7, которая изменила картинку и превратилась в команду "Сохранить запись";
  5. при необходимости повторяем все со второго пункта.

Пример простейшего расчета при работе с базой данных

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

Дополним экранную форму новой кнопкой для выполнения небольшого расчетного примера.

На рис. 5.20. приведен текст процедуры метода ClickEvent новой кнопки для расчета и показа средней оценки студента.


увеличить изображение
Рис. 5.20.  Процедура метода ClickEvent кнопки расчета средней оценки

Написание текста программ облегчается системой IntelliSense, которая позволяет делать выбор из всплывающих списков выбора продолжения команд или показывает подсказки по синтаксису команд, как показано на рис. 5.20..

Результат выполнения процедуры расчета показан на рис. 5.21..

Результат работы кнопки "Расчет средней оценки"
Рис. 5.21.  Результат работы кнопки "Расчет средней оценки"

Более сложные расчеты выполняются обычно с использованием запросов для отбора информации из базы, о которых будет рассказано в следующей лекции.