Научимся делать
доступными пользователю только те пункты меню и кнопки, с которыми ему положено
работать в соответствии с правилами разграничения доступа (ПРД), существующими
на предприятии. Для этих целей создадим форму Login. Эта форма запускается на выполнение до активации
меню программного комплекса и либо вообще запрещает регистрацию работника, если
его данных (фамилия и пароль) нет в базе, либо ограничивает доступ в
соответствии с ПРД.
Создадим форму Login в
режиме конструктора форм. Microsoft Visual FoxPro имеет в своем арсенале еще
одно средство для создания формы за несколько минут – Мастер форм. Однако позволю себе порекомендовать
вам не работать с ним. Это инструмент для непрофессионалов. Времени
потратите немного, но и хорошего результата не получите!
Рис. 4.2. Форма контроля доступа к
программного комплексу
Перед Вами самый
распространенный вид формы (рис. 4.2), созданной в Microsoft Visual FoxPro. Обратите внимание на то,
что до завершения процесса регистрации главное меню программного комплекса
отсутствует. Вместо него – светлая полоса над картинкой. Это сделали две строки
из RealEstate.prg:
SET SYSMENU TO && Убрать системное меню
DO FORM LOGIN && Запуск формы контроля
доступа
Для создания формы в
главном меню Visual FoxPro щелкните пункт File и выберите команду New. В открывшемся окне щелкните радиокнопку Form и нажмите кнопку New file. На экране дисплея появится окно Form Designer. Это окно конструктора форм. В нем наша первая форма
с именем Form1.
Справа увидите еще одно окно – окно Propertis (Свойства). В окне свойств несколько десятков
строчек. Все содержат значения по умолчанию. В нашем случае следует изменить
всего несколько из них. На рис. 4.3 показаны только измененные свойства.
Остальные удалены для наглядности. Если значение свойства изменялось, то его
система выделяет жирным цветом.
Рис. 4.3. Окно свойств формы Login.
Значком молнии отмечены события. Для двух из них Activate и Load написан
текст (User procedure), который запускается на выполнение при наступлении
события. Activate – появление формы на экране. Текст события Activate имеет
вид:
* Создать переменные памяти с
пустыми значениями
SCATTER MEMVAR BLANK
* Дать некоторым из них начальные
значения
M.LastName=
[]
M.Post= [ Добро пожаловать!]
M.FirstName= [Уважаемый гость,]
M.SecondName=[Зарегистрируйтесь!]
PAROL= []
* Определение полного пути к
картинке с приглашением
SET
EXACT ON
IF
ALLTRIM(SYS(2003))=[\]
RealDirectory=[]
ELSE
RealDirectory=[\]
ENDIF
SET
EXACT OFF
* Размещение картинки-приглашения
в объекте IMAGE1
THISFORM.IMAGE1.PICTURE=DISK+RealDirectory+[PHOTO\Welcome.jpg]
*
Перерисовать форму
THISFORM.REFRESH
*
Запуск обработчика событий Visual
FoxPro
READ EVENTS
Текст
события Load (загрузка
формы) имеет вид:
* Установить в таблице Пользователей
отображение фамилий
* по алфавиту
SELECT USER
SET ORDER
TO TAG LastName
Форма Login работает с таблицей User, которая не включена в базу данных Real Estate и является в терминах Visual FoxPro
свободной таблицей. Это сделано из
соображений безопасности. Права доступа к ней устанавливаются средствами
операционной системы отдельно для каждого пользователя локальной вычислительной
сети.
Добавим таблицу User в
окружение формы. Сделайте щелчок правой кнопки мыши в любом месте окна Form Designer. Появится меню. Выберите в нем третий пункт Data Environment. Еще один щелчок правой кнопкой, но уже в появившемся
окне Data Environment активизирует
очередное меню. Выберите в нем первый пункт Add. Появится окно Open. Найдите в нем таблицу User. Она находится в одноименной папке User. Состав полей приведен в
табл. 4.1.
№ |
Поле |
Тип |
Размер |
Описание |
1 |
LastName |
Character |
15 |
Фамилия
пользователя |
2 |
FirstName |
Character |
12 |
Имя |
3 |
SecondName |
Character |
10 |
Отчество |
4 |
Post |
Character |
25 |
Занимаемая
должность |
5 |
PassWord |
Character |
10 |
Зашифрованное
значение пароля |
6 |
File |
Character |
8 |
Имя
файла с фотографией |
7 |
Access01 |
Logical |
1 |
Настройка картинки в главном окне |
8 |
Access02 |
Logical |
1 |
Возможность смены своего пароля |
9 |
Access03 |
Logical |
1 |
Показ удаленных записей |
10 |
Access04 |
Logical |
1 |
Просмотр объема базы данных |
11 |
Access05 |
Logical |
1 |
Просмотр своих прав доступа |
12 |
Access06 |
Logical |
1 |
Возможность поиска зданий |
13 |
Access07 |
Logical |
1 |
Возможность добавления зданий |
14 |
Access08 |
Logical |
1 |
Возможность работы с квартирами |
15 |
Access09 |
Logical |
1 |
Работа с лицевыми счетами |
16 |
Access10 |
Logical |
1 |
Возможность работы с отчетами |
17 |
Access11 |
Logical |
1 |
Работа с адресным планом |
18 |
Access12 |
Logical |
1 |
Работа со списком районов |
19 |
Access13 |
Logical |
1 |
Доступ к материалу стен зданий |
20 |
Access14 |
Logical |
1 |
Установка прав доступа всем
работникам |
21 |
Inspector |
Character |
15 |
Фамилия
предоставившего доступ |
22 |
Date_up |
Date |
8 |
Дата
последней корректировки |
23 |
Time_up |
Character |
10 |
Время
последней корректировки |
24 |
Range |
Numeric |
1 |
Типовой
код доступа |
После добавления таблицы в окружение данных формы нам не нужно
беспокоиться о своевременном ее открытии и закрытии. Все теперь Visual FoxPro сделает сам.
Создадим текстовое поле для отображения имени работника
(рис. 4.4). Это однострочное текстовое поле, присоединенное к полю FirstName таблицы User.
Порядок действий следующий. Если на экране дисплея отсутствует окно списка
полей таблицы User,
откройте окружение данных (Data Environment). В списке полей выделите поле FirstName (рис. 4.4). Нажмите левую кнопку мыши и
«перетащите» выделенный элемент на форму. В активной области формы указатель
мыши превратится в символ текстового поля. Расположение символа поля указывает
верхний левый угол его метки. «Перетащите» текстовое поле в нужное место формы. У вас есть возможность изменить размеры как элемента, так и метки при помощи клавиатуры.
Выделите нужный объект и добейтесь необходимых результатов. При помощи
клавиатуры такие действия выполняются гораздо точнее, чем при использовании
мыши. Используйте для этого сочетание клавиш Shift + стрелка (вверх, вниз, вправо и влево).
Для выбора фамилии работника нам понадобится Combo Box (поле
со списком). Найдите его на панели Form Controls
(элементы управления формы). Она показана на рис. 4.5. Если панель отсутствует
на экране – выберите в главном меню Visual FoxPro пункт View, а
в открывшемся подменю пункт Toolbars.
Откроется окно Toolbars.
Сделайте отметку напротив названия панели - Form Controls и щелкните кнопку OK.
Выберите на панели значок Combo Box, а в нужном месте активной области формы при помощи
левой кнопки мыши отведите место для этого объекта. Теперь можно запустить построитель.
Он ускорит нашу работу. Несколько окон, около десятка ответов и мы у цели. Для
запуска построителя щелкните по созданному на форме новому объекту правой
кнопкой мыши. Появится подменю. Выберите в нем пятый пункт Builder.
На рис. 4.6 показано окно свойств объекта Combo1.
Значения этих свойств – результат работы построителя. Впрочем, построитель
можно и не запускать. Выполните назначения самостоятельно – результат тот же.
На рисунке показаны только измененные свойства. Остальные удалены для наглядности.
Если пользователь изменит выбранное в поле
значение, то наступит событие InteractiveChange. Немедленно будет запущена процедура (User Procedure). Текст ее приведен ниже:
*
Определение местоположения фотографий
SET EXACT ON
IF ALLTRIM(SYS(2003))=[\]
RealDirectory=[]
ELSE
RealDirectory=[\]
ENDIF
SET EXACT OFF
* Есть фотография - значение переменной FileName
FileName=DISK+RealDirectory+[PHOTO\]+ALLTRIM(User.File)+[.jpg]
* Нет фотографии - значение переменной NoFileName
NoFileName=DISK+RealDirectory+[PHOTO\]+[NoFoto.jpg]
IF FILE(FileName)
*
Если фотография имеется в папке PHOTO
* Разместить ее на месте картинки IMAGE1
THISFORM.IMAGE1.PICTURE=FileName
ELSE
* Если нет - взять картинку NoFoto.jpg
THISFORM.IMAGE1.PICTURE=NoFileName
ENDIF
SCATTER
MEMVAR
* Сохраняем фамилию в глобальной переменной
на время сеанса
FAMILY=M.LastName
* Расшифровка пароля и занесение его как
подсказку
* в демонстрационных целях под полем пароля
THISFORM.LABEL3.CAPTION=UnKod(M.Password)
THISFORM.REFRESH
Пароль пользователя хранится в зашифрованном виде в поле PassWord таблицы User.
Для его зашифровки используется процедура-функция CrKod,
а для расшифровки UnKod. Находятся они в процедурном файле FileProc. Текст файла приведен в приложении.
Последний этап - добавление в форму двух кнопок Вход и Отказ.
Найдите на панели Form Controls
(элементы управления формы) (рис. 4.5) значок кнопки Command Button.
В нужном месте активной области формы при помощи левой кнопки мыши отведите
место для этого объекта. В окне свойств укажите Picture (расположение
файла с иконкой), высоту Height,
ширину Width (точные размеры в пикселах)
и Caption (название кнопки). Понадобится текст
для обработки события Click
(щелчок по кнопке). Он приведен ниже:
*- Кнопка Вход
SCATTER MEMVAR
&& Создание переменных памяти
Parol=ALLTRIM(Parol)
IF LEN(ALLTRIM(M.PassWord))=0
*
Если в таблице USER был стерт пароль (Например через
ODBC)
SuperVisor=.F.
&& Идентификация не выполнена
=MESSAGEBOX('Пароль в таблице идентификации '+;
'отсутствует. Операция
сравнения паролей '+;
'не может быть выполнена. Обратитесь к '+;
'администратору! ',48,'
Внимание!')
ELSE
IF
LEN(PAROL)=0
=MESSAGEBOX('Вы забыли ввести пароль.',48,'
Внимание!')
*
Установка курсора в поле TEXT5 и возврат в форму
THISFORM.TEXT5.SetFocus
RETURN
ENDIF
Parol=CrKod(Parol)
&& Зашифровка введенного пароля
SET EXACT ON && Точное соответствие
IF Parol= M.PassWord && Пароль
SuperVisor=.T. && Идентификация выполнена
FAMILY= M.LastName && Фамилия работника
*
Права доступа к пунктам меню и кнопкам форм
ChangePicture=
M.Access01 && Смена картинки главного окна
ChangePassword= M.Access02 && Смена пароля
SetDeleted=
M.Access03 && Удаленные
записи
CountRecords=
M.Access04 &&
Заполнение таблиц
RightAccess=
M.Access05 && Просмотр
прав доступа
SeekBuilding=
M.Access06 && Поиск
зданий по параметрам
AddBuilding=
M.Access07 && Занесение
нового здания
WorkFlats=
M.Access08 && Обработка
квартир
AccountWork=
M.Access09 && Работа с
лицевым счетом
WordExcel=
M.Access10 && Работа с
внешними отчетами
StreetTown=
M.Access11 && Работа с
улицами
DistrictTown=
M.Access12 && Работа с
районами
MaterialWall=
M.Access13 && Материал
стен зданий
Staff=
M.Access14 && Работа с
пользователями
=MESSAGEBOX('Инспектор
'+ALLTRIM(FAMILY)+;
'!
Доступ разрешен.',48,'Результат идентификации')
*
Проверка срока действия пароля (100 - число дней)
IF DATE()>M.Date_Up+100
=MESSAGEBOX('
Срок действия пароля истек! '+;
'Его
необходимо сменить! ',48,' Внимание!')
DO FORM ChangPas && Запуск формы смены пароля
ENDIF
ELSE
SuperVisor=.F.
&& Идентификация не выполнена
=MESSAGEBOX('Доступ запрещен.',;
48,'
Результат идентификации')
ENDIF
ENDIF
THISFORM.Release && Закрыть форму LOGIN
CLEAR EVENTS && Остановить обработчик
событий Visual FoxPro
*- Конец процедуры
*- Кнопка Отказ
SuperVisor=.F.
&& Идентификация не выполнена
THISFORM.Release && Закрыть форму LOGIN
CLEAR EVENTS && Остановить обработчик
событий Visual FoxPro
*- Конец процедуры