Приступим к разработке формы Employee. Это будет двухстраничная форма, на
первой вкладке которой – список работников предприятия, а на второй подробности
по выбранному работнику. В окружении данных формы (Data Environment) разместим таблицу User. Вы уже умеете это делать. Добавить объект Page Frame не сложно. Откройте панель Form Controls (элементы управления формы). Она показана на рис.
4.9. Если панель отсутствует на экране – выберите в главном меню Visual FoxPro пункт View, а
в открывшемся подменю пункт Toolbars.
Откроется окно Toolbars.
Сделайте отметку напротив названия панели - Form Controls и щелкните кнопку OK.
Выберите на панели значок Page Frame, а в нужном месте активной области формы при помощи
левой кнопки мыши отведите место для этого объекта.
Форма Employee с активной первой страницей и окружением данных в конструкторе
форм показана на рис. 4.11.
Добавим код, который будет запушен на
выполнение при наступлении события Load формы:
* Описание глобальной переменной IND
(Индикатор)
* Признак выбора работника из списка на
первой странице формы
PUBLIC IND
IND=0 && Начальное значение
* Отображение фамилий работников предприятия
по алфавиту
SELECT
USER
SET ORDER
TO TAG LastName
Код события Activate первой страницы формы Employee:
* Если в процессе работы с формой
выбор работника уже был
* сделан, (IND=1 или IND=2)то при
наступлении этого события
* значение Индикатора принять
равным единице
IF IND>=1
IND=1
ENDIF
* Сделать активным поле со
списком LIST1
THISFORM.PAGEFRAME1.PAGE1.LIST1.SETFOCUS
*
Перерисовать форму
THISFORM.PAGEFRAME1.PAGE1.LIST1.REFRESH
Событие Interactive Change поля со списком List1:
IND=1 && Выбор сделан
* Переход на вторую страницу формы при помощи кода не нужен
Событие DblClick поля со списком List1:
IND=1 && Выбор в поле List1 сделан
* Перейти на вторую страницу
формы
THISFORM.PAGEFRAME1.ACTIVEPAGE=2
Событие Click кнопки Добавить:
IND=2 && Была выбрана кнопка Добавить
* Перейти на вторую страницу
формы
THISFORM.PAGEFRAME1.ACTIVEPAGE=2
Перейдем на вторую страницу Page
Frame1 формы Employee и разместим на ней класс Worker. Для размещения класса в форме
необходимо проделать следующее. Выберите
на панели Form
Controls (элементы управления формы)
значок View
Classes (рис. 4.9). Откроется меню,
выберите в нем первый пункт Add. В
открывшемся диалоговом окне Open найдите
библиотеку классов Worker.vcx и класс Worker.
После щелчка по кнопке OK окна Open на панели Form Controls появится пиктограмма класса Worker,
а сама панель станет значительно меньше. Исчезнут стандартные классы (Standard). Новый вид панели показан на рис. 4.12.
Щелкните по пиктограмме класса. В нужном месте
активной области формы при помощи левой кнопки мыши отведите место для класса Worker. После того, как вы отпустите левую кнопку мыши,
класс появится в форме. Добавим справа от класса четыре кнопки (рис. 4.13) и
займемся написанием кода для обработки событий.
Код события Activate второй страницы формы Employee:
DO CASE
CASE IND=0 &&
Выбор не сделан
=MESSAGEBOX('Ни один работник не выбран!
',;
48,' Внимание!')
* Вернуться на первую страницу формы
THISFORM.PAGEFRAME1.ACTIVEPAGE=1
* Кнопка Стереть пароль доступна
THISFORM.PAGEFRAME1.PAGE2.COMMAND2.ENABLED=.T.
* Надпись на кнопке 3 - Сохранить
THISFORM.PAGEFRAME1.PAGE2.COMMAND3.CAPTION=[Сохранить]
* Кнопка Удалить доступна
THISFORM.PAGEFRAME1.PAGE2.COMMAND4.ENABLED=.T.
* Создать переменные памяти
SCATTER MEMVAR
CASE IND=2 &&
Занесение нового работника
* Кнопка Стереть пароль недоступна
THISFORM.PAGEFRAME1.PAGE2.COMMAND2.ENABLED=.F.
* Надпись на кнопке 3 - Записать
THISFORM.PAGEFRAME1.PAGE2.COMMAND3.CAPTION=[Записать]
* Кнопка Удалить недоступна
THISFORM.PAGEFRAME1.PAGE2.COMMAND4.ENABLED=.F.
* Создать переменные памяти с пустыми значениями
SCATTER MEMVAR BLANK
THISFORM.PAGEFRAME1.PAGE2.Worker1.TxtLastName.SETFOCUS
ENDCASE
* Перерисовать вторую страницу
формы
This.Refresh
Добавим код события Interactive
Change переключателя
Optiongroup1 класса Worker. В отличие от формы Access форма Employee предназначена не только для просмотра, но
и для корректировки прав доступа. Текст этого события будет храниться и
работать только в форме Employee.
* Общие права доступа для всех категорий работников
ThisForm.PageFrame1.Page2.Worker1.chkAccess01.Value=
.T.
ThisForm.PageFrame1.Page2.Worker1.chkAccess02.Value=
.T.
ThisForm.PageFrame1.Page2.Worker1.chkAccess03.Value=
.F.
ThisForm.PageFrame1.Page2.Worker1.chkAccess04.Value=
.F.
ThisForm.PageFrame1.Page2.Worker1.chkAccess05.Value=
.T.
ThisForm.PageFrame1.Page2.Worker1.chkAccess06.Value=
.F.
ThisForm.PageFrame1.Page2.Worker1.chkAccess07.Value=
.F.
ThisForm.PageFrame1.Page2.Worker1.chkAccess08.Value=
.F.
ThisForm.PageFrame1.Page2.Worker1.chkAccess09.Value=
.F.
ThisForm.PageFrame1.Page2.Worker1.chkAccess10.Value=
.F.
ThisForm.PageFrame1.Page2.Worker1.chkAccess11.Value=
.F.
ThisForm.PageFrame1.Page2.Worker1.chkAccess12.Value=
.F.
ThisForm.PageFrame1.Page2.Worker1.chkAccess13.Value=
.F.
ThisForm.PageFrame1.Page2.Worker1.chkAccess14.Value=
.F.
* Индивидуальные права доступа
DO CASE
CASE THIS.Value=1 && Отдел недвижимости
* Поиск зданий
ThisForm.PageFrame1.Page2.Worker1.chkAccess06.Value=.T.
* Добавление зданий
ThisForm.PageFrame1.Page2.Worker1.chkAccess07.Value=.T.
* Работа с квартирами
ThisForm.PageFrame1.Page2.Worker1.chkAccess08.Value=.T.
* Работа с отчетами
ThisForm.PageFrame1.Page2.Worker1.chkAccess10.Value=.T.
* Работа с адресным планом
ThisForm.PageFrame1.Page2.Worker1.chkAccess11.Value=.T.
* Работа со справочником материалов
ThisForm.PageFrame1.Page2.Worker1.chkAccess13.Value=.T.
CASE THIS.Value=2
&& Отдел платежей
* Поиск зданий
ThisForm.PageFrame1.Page2.Worker1.chkAccess06.Value=.T.
* Работа с квартирами
ThisForm.PageFrame1.Page2.Worker1.chkAccess08.Value=.T.
* Работа с лицевыми счетами
ThisForm.PageFrame1.Page2.Worker1.chkAccess09.Value=.T.
CASE THIS.Value=3
&& Дирекция предприятия
* Поиск зданий
ThisForm.PageFrame1.Page2.Worker1.chkAccess06.Value=.T.
* Работа с квартирами
ThisForm.PageFrame1.Page2.Worker1.chkAccess08.Value=.T.
* Работа с отчетами
ThisForm.PageFrame1.Page2.Worker1.chkAccess10.Value=.T.
CASE THIS.Value=4
&& Администратор комплекса
* Удаленные записи
ThisForm.PageFrame1.Page2.Worker1.chkAccess03.Value=.T.
* Объем базы данных
ThisForm.PageFrame1.Page2.Worker1.chkAccess04.Value=.T.
* Работа с формой прав доступа
ThisForm.PageFrame1.Page2.Worker1.chkAccess14.Value=.T.
ENDCASE
Особое место среди кнопок, размещенных на второй
странице формы, занимает кнопка Стереть пароль. Она нужна только
администратору информационной системы в случае, если работник забыл свой пароль.
Программный код для этой кнопки предусматривает не только стирание пароля, но и
занесение нового (5 нулей рядом) в зашифрованном виде. Это сделано на тот
случай, если злоумышленник через ODBC, подключив
любого клиента, или установив на рабочей станции Visual FoxPro, получит доступ к таблице User. Уничтожение пароля одного из пользователей ему
ничего не даст, так как при регистрации под чужим именем сработает код кнопки Вход
формы Login и на экране нарушитель получит сообщение (рис. 4.14).
Попытка подсмотреть пароль в таблице User также ничего не даст. Он хранится там в зашифрованном
виде.
Код события Click кнопки Стереть
пароль имеет вид:
lnMsgResult=MESSAGEBOX('Подтвердите
свои действия',;
36,' Удаление пароля ')
IF lnMsgResult=6 && Кнопка Да
* Стереть пароль - занести пять нулей
M.PassWord=[00000]
M.PassWord=CrKod(M.PassWord)
&& Зашифровка пароля
M.Inspector=FAMILY
&& Фамилия удалившего пароль
M.Date_Up=DATE()
&& Дата удаления пароля
M.Time_Up=TIME() && Время удаления пароля
* Занести значения переменных памяти в поля текущей записи
GATHER MEMVAR
* Перейти на первую страницу формы
THISFORM.PAGEFRAME1.ACTIVEPAGE=1
ENDIF
Код
события Click кнопки Удалить имеет вид:
lnMsgResult=MESSAGEBOX('Подтвердите свои действия',;
36,' Удаление работника ')
IF lnMsgResult=6 && Кнопка Да
* Удаление текущей записи
DELETE
* Перейти к первой записи в таблице User
GOTO TOP
* Перейти на первую страницу формы
THISFORM.PAGEFRAME1.ACTIVEPAGE=1
ENDIF
Кнопка Сохранить в случае занесения нового работника имеет название Записать
(смотри событие Activate второй страницы формы). Для нового работника, кроме
учетной информации и прав доступа заносится еще и пароль – опять же 00000 в
зашифрованном виде. Смена начального пароля отныне на совести “новичка”.
Код
события Click кнопки Сохранить имеет вид:
*
Выполнение присваивания значений переменным памяти
*
Контроль ввода фамилии
M.LastName=ThisForm.PageFrame1.Page2.Worker1.TxtLastName.Value
IF
LEN(ALLTRIM(M.LastName))=0
=MESSAGEBOX('
Вы забыли про фамилию!',;
48,' Ошибка')
ThisForm.PageFrame1.Page2.Worker1.TxtLastName.SetFocus
RETURN
ENDIF
* Контроль ввода имени
M.FirstName=ThisForm.PageFrame1.Page2.Worker1.TxtFirstName.Value
IF
LEN(ALLTRIM(M.FirstName))=0
=MESSAGEBOX('
Вы забыли про имя работника!',;
48,' Ошибка')
ThisForm.PageFrame1.Page2.Worker1.TxtFirstName.SetFocus
RETURN
ENDIF
* Контроль ввода отчества
M.SecondName=;
ThisForm.PageFrame1.Page2.Worker1.TxtSecondName.Value
IF
LEN(ALLTRIM(M.SecondName))=0
=MESSAGEBOX('
Вы забыли про отчество работника!',;
48,' Ошибка')
ThisForm.PageFrame1.Page2.Worker1.TxtSecondName.SetFocus
RETURN
ENDIF
* Контроль ввода должности
M.Post=ThisForm.PageFrame1.Page2.Worker1.TxtPost.Value
IF
LEN(ALLTRIM(M.Post))=0
=MESSAGEBOX('
Вы забыли про должность работника!',;
48,' Ошибка')
ThisForm.PageFrame1.Page2.Worker1.TxtPost.SetFocus
RETURN
ENDIF
* Контроль ввода кода доступа
M.Range=ThisForm.PageFrame1.Page2.Worker1.OptionGroup1.Value
IF M.Range=0
=MESSAGEBOX(' Вы забыли про код доступа!',;
48,' Ошибка')
RETURN
ENDIF
lnMsgResult=MESSAGEBOX('Подтвердите свои
действия',;
36,' Запись на сервер ')
IF lnMsgResult=6 && Кнопка Да
M.Inspector=FAMILY && Фамилия выполнившего ввод
информации
M.Date_Up=DATE() && Дата ввода информации
M.Time_Up=TIME() && Время ввода информации
* Права доступа
M.Access01=ThisForm.PageFrame1.Page2.Worker1.chkAccess01.Value
M.Access02=ThisForm.PageFrame1.Page2.Worker1.chkAccess02.Value
M.Access03=ThisForm.PageFrame1.Page2.Worker1.chkAccess03.Value
M.Access04=ThisForm.PageFrame1.Page2.Worker1.chkAccess04.Value
M.Access05=ThisForm.PageFrame1.Page2.Worker1.chkAccess05.Value
M.Access06=ThisForm.PageFrame1.Page2.Worker1.chkAccess06.Value
M.Access07=ThisForm.PageFrame1.Page2.Worker1.chkAccess07.Value
M.Access08=ThisForm.PageFrame1.Page2.Worker1.chkAccess08.Value
M.Access09=ThisForm.PageFrame1.Page2.Worker1.chkAccess09.Value
M.Access10=ThisForm.PageFrame1.Page2.Worker1.chkAccess10.Value
M.Access11=ThisForm.PageFrame1.Page2.Worker1.chkAccess11.Value
M.Access12=ThisForm.PageFrame1.Page2.Worker1.chkAccess12.Value
M.Access13=ThisForm.PageFrame1.Page2.Worker1.chkAccess13.Value
M.Access14=ThisForm.PageFrame1.Page2.Worker1.chkAccess14.Value
IF
THIS.CAPTION=[Записать]
*
При занесении нового работника пароль - пять нулей
M.PassWord=[00000]
M.PassWord=CrKod(M.PassWord)
APPEND
BLANK
ENDIF
GATHER
MEMVAR
*
Переход на первую страницу формы
THISFORM.PAGEFRAME1.ACTIVEPAGE=1
ENDIF