Свойства.
Каждый объект обладает набором свойств. Свойства могут быть как наследуемые от родительского класса, так и добавленные индивидуально для создаваемого объекта. Список всех свойств объекта и их значений отображается в диалоговом окне Properties. Это окно имеет пять вкладок для отображения списка всех свойств и определенных подгрупп свойств.
Ссылка на свойство записывается как Имя_объекта.Свойство.
Методы.
Для каждого объекта в Visual FoxPro существует свой набор методов. Методом называется некоторая процедура в Visual FoxPro. Список методов отображается совместно со всеми свойствами в диалоговом окне Properties. Существуют стандартные методы, наследуемые создаваемыми объектами из базовых классов Visual FoxPro, и определяемые пользователем методы.
События.
В Visual FoxPro для каждого объекта возможен определенный набор событий. На каждое событие любого объекта можно добавить исполняемую процедуру.
2. Практическая часть.
В качестве практической части создадим простейшую модель базы данных с помощью Erwin, отобразим модель в FoxPro и затем создадим простейшее приложение в среде Visual FoxPro, реализующее данную модель.
2.1. Модель базы данных на Erwin.
При создании модели выберем тип модели как Logical/Physical, а в качестве целевой базы данных выберем FoxPro. Это позволит нам в дальнейшем перенести модель в среду FoxPro.
Создание модели базы данных подробно описано в лабораторной работе №2. Здесь приведем только саму логическую и физическую модель.
В качестве предметной области выберем часть модели, рассмотренной в лабораторной работе №1.
Логическая модель:
Физическая модель:
2.2. Отображение модели данных из Erwin в FoxPro.
Для отображения модели в среду FoxPro следует выбрать пункт меню
Tools->Forward Engineer/Shema Generation…
Затем следует нажать кнопку «Generate» и указать папку, куда будут сгенерированы файлы таблиц базы данных:
В указанной директории появятся файлы таблиц FoxPro с расширением .dbf: branch.dbf и staff.dbf, которые мы сможем использовать при создании приложения на Visual FoxPro.
2.3. Создание приложения на FoxPro.
Первое, что необходимо сделать, это запустить Visual FoxPro и создать новый проект.
File->New появится окно, в котором следует выбрать Project и нажать New file:
В новом окне следует указать директорию для проекта и дать название файлу проекта. Будет создан новый проект:
Второе, что мы сделаем, это создадим базу данных и добавим в нее наши файлы, созданные ранее. Для этого перейдем в окне проекта на вкладку Data (данные), и нажмем на кнопку New. В появившемся окне выберем New Database.
Создастся пустая база данных. В нее необходимо добавить наши таблицы через пункт меню Add table. Получим базу данных, состоящую из двух таблиц.
Теперь создадим первую форму с помощью Visual FoxPro. На этой форме будем добавлять отделения фирмы в базу данных.
Для создания формы прейдем на вкладку Documents->Forms и нажмем на кнопку New. Создастся новая пустая форма. Расположим на ней элементы Label, TextBox, EditBox и Command Button как показано на рисунке:
При нажатии на кнопку Выход будем выходить из формы, на кнопку Добавить – добавлять отделение фирмы в базу данных. Сделаем двойной щелчок на кнопке Выход и добавим код, закрывающий форму:
Выполнение данного кода закрывает активную форму.
Рассмотрим код для кнопки «Добавить».
close tables all
cod=thisform.text1.value
SELECT count(*) FROM branch INTO ARRAY ccount WHERE bno=cod
IF EMPTY(ccount)
IF !(cod=='').and.!(thisform.text2.value=='').and.!(thisform.text3.value==''
).and.!(thisform.edit1.value=='').and.!(thisform.text5.value=='')
insert into branch values (cod,thisform.text5.value, val(thisform.text2.value),thisform.text3.value,thisform.edit1.value,thisform.text4.value)
messagebox('Отделение добавлено')
_screen.ActiveForm.Release
ELSE
messagebox('Ошибка! Введены не все данные')
ENDIF
ELSE
MESSAGEBOX('Отделение с таким номером уже есть')
ENDIF
В данном коде мы сначала закрываем все открытые таблицы. Это делается, чтобы избежать возможных исключительных ситуаций. Затем мы запоминаем в переменную cod номер отделения, который должен быть уникальным. Затем с помощью первого запроса проверяем, нет ли уже отделения с таким номером. Если нет, то добавляем новое отделение, выводим сообщение о том, что отделение добавлено, и закрываем форму, иначе – выводим сообщение об ошибке.
Теперь можно попробовать просмотреть работу созданной формы. Для этого необходимо в контекстном меню формы выбрать пункт Run Form. Введем данные и добавим отделение.
Теперь создадим еще одну форму, на которой будем отображать отделения фирмы, занесенные в базу данных. Внешний вид формы:
В раскрывающемся списке будут уникальные номера отделений. При выборе номера отделения будут выводиться данные об этом отделении, а также число сотрудников данного отделения.
Загрузку номеров отделений будем проводить при активизации формы (событие Form.Activate):
thisform.combo1.clear
dimension Br(100)
close tables all
USE branch.dbf in A
SELECT bno FROM branch INTO ARRAY Br order by bno
FOR i=1 to alen(Br)
IF !EMPTY(Br(i))
thisform.combo1.additem(Br(i))
ENDIF
ENDFOR
Теперь на событие «Выбор элемента в ComboBox» добавим код, выводящий данные о выбранном отделении. Но прежде создадим в таблице branch индексное поле для более эффективного поиска. Индексным полем будет номер отделения (bno).
А теперь приведем код для события Combo1.Click:
close tables all
USE 'branch.dbf' in A
set index to 'branch' order bno
seek(alltrim(thisForm.combo1.value)) in branch
if found() then
thisform.text3.value=branch.pcode
thisform.text1.value=branch.city
thisform.text2.value=branch.tel_no
thisform.edit1.value=branch.adress
thisform.text6.value=branch.name
endif
use staff.dbf in B
select B
select count(*) from staff into array A where bno=thisform.combo1.value
thisform.text5.value=A(1)
Поясним данный код. В начале мы ищем по индексному полю нужную запись и выводим в текстовые поля данные. Затем мы ищем число сотрудников, числящихся в данном отделении.
Рассмотрим теперь код кнопки «Удалить»:
close tables all
cod=thisform.combo1.Value
if thisform.text5.value>0
messagebox("Нельзя удалить отделение, в котором числятся сотрудники")
else
use branch.dbf
delete from branch where bno=cod
pack
thisform.combo1.clear
thisform.text1.value=''
thisform.text2.value=''
thisform.edit1.value=''
thisform.text3.value=''
thisform.text5.value=''
thisform.combo1.Value=''
dimension Br(100)
select distinct bno from branch into array Br
for i=1 to alen(Br)
IF !EMPTY(Br(i))
thisform.combo1.additem(Br(i))
endif
endfor
endif
В данной процедуре будем удалять отделение в том случае, если в нем нет сотрудников. После удаления отделения очистим все текстовые поля и заново заполним раскрывающийся список значениями номеров отделений.
Код кнопки «Сохранить»:
close tables all
use branch.dbf
cod=thisform.combo1.Value
delete from branch where bno=cod
pack
insert into branch values (alltrim(thisform.combo1.value),thisform.text4.Text,thisform.text3.value,alltrim(thisform.text1.value),alltrim(thisform.edit1.value),thisform.text2.value)
PACK
MESSAGEBOX('Изменения сохранены')
В данной процедуре мы удаляем старую запись и добавляем новую с таким же номером, но новыми данными.
На кнопку добавить мы поместим просто код запуска формы «Добавление отделения»:
close tables all
do form branch2dobav
Создадим еще одну форму для просмотра и изменения информации о сотрудниках. Форма будет иметь вид:
Заметим, что поле Text8 будет невидимым для пользователя. В нем мы будем дублировать пол сотрудника при клике на радиокнопки «М» и «Ж».
Вывод информации, как и в форме «Отделения фирмы», будем производить при выборе номера сотрудника:
close tables all
USE 'staff.dbf' in A
set index to 'staff' order sno
seek(alltrim(thisForm.combo2.value))
if found() then
thisform.combo1.value=staff.bno
thisform.text2.value=staff.Lname
thisform.text3.value=staff.Name
thisform.text4.value=staff.city
thisform.edit1.value=staff.adress
thisform.text5.value=staff.salary
thisform.text6.value=staff.dob
thisform.text7.value=staff.tel_no
thisform.text8.value=staff.sex
if alltrim(staff.sex)=="МÌ" then
thisform.optiongroup1.option1.value=1
thisform.optiongroup1.option2.value=0
else
thisform.optiongroup1.option1.value=0
thisform.optiongroup1.option2.value=1
endif
endif
Данная форма практически не отличается от предыдущей, поэтому не будем заострять на ней внимание. Лучше перейдем к созданию меню для приложения FoxPro.
Рассмотрим программный способ создания меню. Для этого во вкладке Code->Program нажмем кнопку New. Откроется пустой файл, в котором создадим три процедуры.
Первая процедура – создание меню программы. Меню будет состоять из двух пунктов. В первом пункте «Меню» будет еще четыре пункта, а во втором «Выход» - еще один. Рассмотрим код:
procedure prog1
SET SYSMENU SAVE
SET SYSMENU TO
ON KEY LABEL ESC KEYBOARD CHR(13)
DEFINE MENU m BAR AT LINE 0
DEFINE PAD men OF m PROMPT 'Меню' COLOR SCHEME 3 ;
KEY ALT+m, ''
DEFINE PAD exit1 OF m PROMPT 'Выход ' COLOR SCHEME 3 ;
KEY ALT+E, ''
ON PAD men OF m ACTIVATE POPUP Меню
ON PAD exit1 OF m ACTIVATE POPUP Выход
DEFINE POPUP Меню MARGIN RELATIVE COLOR SCHEME 4
DEFINE BAR 1 OF Меню PROMPT 'Отделения’
DEFINE BAR 2 OF Меню PROMPT 'Сотрудники'
DEFINE BAR 3 OF Меню PROMPT 'Добавить отделение'
DEFINE BAR 4 OF Меню PROMPT 'Добавить сотрудника'
ON SELECTION POPUP Меню do prog2 IN 'menu.prg' WITH PROMPT( ), POPUP( )
DEFINE POPUP Выход MARGIN RELATIVE COLOR SCHEME 4
DEFINE BAR 1 OF Выход PROMPT 'Выход' ;
KEY CTRL+V, ''
ON SELECTION POPUP Выход do prog3 IN 'menu.prg'
ACTIVATE MENU m
Во второй процедуре мы укажем реакцию на выбор пунктов меню «Меню»:
procedure prog2
PARAMETERS mprompt, mpopup
SET SYSMENU TO DEFAULT
DEACTIVATE MENU m
RELEASE MENU m EXTENDED
IF mprompt = 'Отделения'
do form 'viewbranch'
ENDIF
IF mprompt = 'Сотрудники'
do form 'viewstaff'
ENDIF
IF mprompt = 'Добавить отделение'
do form 'addbranchform'
ENDIF
IF mprompt = 'Добавить сотрудника'
do form 'addsotrform'
ENDIF
do prog1 IN 'menu.prg'
Третья процедура выполняет завершение приложения:
procedure prog3
clear events
DEACTIVATE MENU m
RELEASE MENU m EXTENDED
DEACTIVATE POPUP m
RELEASE POPUP m
SET SYSMENU TO DEFAULT
Сохраним данный файл как menu.prg.
Также создадим еще один программный файл, который будет производить запуск нашего приложения. В нем напишем:
set default to curdir()
do prog1 IN 'menu.prg'
Сохраним этот файл как run.prg и отметим его как основной (Set Main).
Теперь нажмем кнопку run и запустим наше приложение:
На этом можно завершить описание данного демонстрационного проекта.