Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания Программирование в среде FoxPro.doc
Скачиваний:
56
Добавлен:
28.06.2014
Размер:
265.73 Кб
Скачать

Свойства.

Каждый объект обладает набором свойств. Свойства могут быть как наследуемые от родительского класса, так и добавленные индивидуально для создаваемого объекта. Список всех свойств объекта и их значений отображается в диалоговом окне 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 и запустим наше приложение:

На этом можно завершить описание данного демонстрационного проекта.