Файл: Задачи автоматизации и характеристика существующих бизнес процессов.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 20.05.2023

Просмотров: 447

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Рисунок 3.5. Таблица "Зал"

Особенностью данной таблицы является наличие поля счетчика "Kod_ADO". Оно не является необходимым для базы данных, но наличие ключа в таблицы является требованием технологии ADO, поэтому формальное присутствие данного поля является необходимостью. Таблица характерна большим числом полей. Каждое кресло в зале отражается полем в таблице "Zal".

3.3. Структурная схема пакета (дерево вызова программных модулей)

Рисунок 3.6. Схема вызовов программных модулей

3.4. Описание программных модулей

ОПИШИТЕ текстом программные модели, а эту схему перенесите в ПРИЛОЖЕНИЕ

Глава 4. Контрольный пример реализации проекта и его описание

ПОДПИСИ ВСЕХ РИСУНКОВ - ШРИФТ VERDANA

У каждого проекта должна быть первая запускаемая форма, которая создается автоматически. Другие формы могут создаваться на этапе выполнения из разработанных классов. В данном проекте формой запуска является frmMDI - основная форма-контейнер. остальные формы запускаются на этапе выполнения.

Рисунок 4.1. Настройка автоматически создаваемых форм в проекте.

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

procedure TfrmMDI.mSpekClick(Sender: TObject);

begin

Application.CreateForm(TfrmSpek,frmSpek);

end;

С помощью этой команды создается объект frmSpek из класса TfrmSpek. После создания объект-форма становится автоматически видимой и метод show в данном случае применять не нужно. Остальные формы вызываются аналогичным образом.


Рисунок 4.2. Основное меню на этапе разработки.

На основной форме имеются два графических объекта, рисунок в которые загружается в событии onCreate, когда происходит создание формы:

procedure TfrmMDI.FormCreate(Sender: TObject);

begin

frmMDI.mSpek.visible:=false; // Прячем меню

frmMDI.mSean.visible:=false;

frmMDI.mZal.visible:=false;

frmMDI.mAdm.visible:=false;

frmMDI.mVih.visible:=false;

TekPapka:=getcurrentdir; //Путь к текущей папке

PathBD:=getcurrentdir+'\BD\Teatr.mdb';

Application.Icon.LoadFromFile(TekPapka+'\Draws\application.ico');

img_Zal.Picture.LoadFromFile(TekPapka+'\Draws\Zal.png');

imgVihod.Picture.LoadFromFile(TekPapka+'\Draws\Vihod.png');

imgVihod.Top:=0;

imgVihod.Left:=frmMDI.Width - 100; //ставим кнопку выхода справа

end;

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

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

После события onCreate наступает событие onShow, которое показывает созданную форму. В обработчике этого события создаем окно для ввода логина и пароля

procedure TfrmMDI.FormShow(Sender: TObject);

begin

Application.CreateForm(TfrmLogPass,frmLogPass);

end;

Рисунок 4.3. Форма авторизации с установленным на ней компонентом TQuery.

Форма авторизации содержит два поля, которые связаны с полями базы данных. Поле "Логин" представляет из себя поле с раскрывающимся списком. Чтобы не допустить ошибок ввода информация в нем доступна только для чтения, то есть, можно только выбирать мышью.

Для доступа к данным таблицы используется компонент TQuery. В обработчике события OnCreate записывается строка подключения к базе данных:

procedure TfrmLogPass.FormCreate(Sender: TObject);

var

KolZap: integer;

TekZap: integer;

i: integer; // Счетчик

begin

//Подключаемся к Таблице LogPass

adoLogPass.Close;

adoLogPass.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;

Data Source='''+PathBD+'''';

adoLogPass.SQL.Clear;

adoLogPass.SQL.add('SELECT * FROM LogPass');

adoLogPass.Active:=true;

//Заполняем логинами раскрывающийся список

cboLogin.Clear;

KolZap:=adoLogPass.RecordCount;

adoLogPass.First;

TekZap:=adoLogPass.RecNo;

for i:=TekZap to KolZap do

begin

cboLogin.Items.Add(adoLogPass.fieldbyname('Login').AsString);

adoLogPass.Next;

end;

end;

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


Процедура onClick кнопки "Вход" проверяет какой логин и пароль были введены в поле. И, если был осуществлен вход под системной записью администратора, то показывается все меню. если был выполнен вход под учетной записью пользователя, то показывается только меню "Схема зала" и "Выход".

procedure TfrmLogPass.cmdVhodClick(Sender: TObject);

var

cLogin: String; //Содержит в себе выбранный пользователем логин

cPassword: String; //Содержит введенный пароль

lTip: Boolean;

begin

cLogin:=cboLogin.Text;

cPassword:=trim(txtPassword.Text);

//Проверяем пароль на истинность

adoLogPass.First;//Ставим указатель на первую запись таблицы

adoLogPass.Locate('Login', cLogin,[]);// Находим в таблице запись с выбранным логином

lTip:=adoLogPass.fieldbyname('Status').AsBoolean; //Считываем текущий статус логина

if adoLogPass.fieldbyname('Password').AsString = cPassword then //Если пароль совпадает с введенным, то

begin

if lTip=true then //Если найденный логин является администратором, то

begin // Показываем все меню

Admin_User:='Admin';

frmMDI.mSpek.visible:=true;

frmMDI.mSean.visible:=true;

frmMDI.mZal.visible:=true;

frmMDI.mAdm.visible:=true;

frmMDI.mVih.visible:=true;

end

else //Иначе скрываем пункты Мероприятия, Сеансы и Администрирование

begin

Admin_User:='User';

frmMDI.mSpek.visible:=false;

frmMDI.mSean.visible:=false;

frmMDI.mZal.visible:=true;

frmMDI.mAdm.visible:=false;

frmMDI.mVih.visible:=true;

end;

frmLogPass.close; //Закрываем форму логина/пароля

end else //Иначе

begin

showmessage('Пароль не верный! Обратитесь к администратору системы!');

end;

end;

После входа необходимо заполнить данные о мероприятиях.

Рисунок 4.4. Форма "Мероприятия"

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

procedure TfrmSpek.cmd_Load_AfishaClick(Sender: TObject);

var

jpg: TJPEGImage;

bmp: TBitmap;

begin

//if openpicturedialog1.Execute then

//dbimage1.Picture.LoadFromFile(openpicturedialog1.filename);

if OpenpictureDialog1.Execute then

begin

jpg := TJPEGImage.Create;

bmp := TBitmap.Create;

try

jpg.LoadFromFile(OpenpictureDialog1.FileName);

bmp.Assign(jpg);

ADOSpek.Edit;

ADOSpek.FieldByName('Afisha_Spek').Assign(bmp);

ADOSpek.Post;

finally

jpg.Free;

bmp.Free;

end;

end;

end;

Поскольку этот компонент может работать только с файлами формата BMP, а для удобства нужен формат JPEG, то в данной процедуре происходит "отождествление" этих форматов.

Процедура кнопки удалить афишу:

procedure TfrmSpek.Button9Click(Sender: TObject);

begin


ADOSpek.Edit;

ADOSpek.FieldByName('Afisha_Spek').asvariant:=Null;

ADOSpek.Post;

end;

Для добавления записи используется кнопка "Добавить":

procedure TfrmSpek.cmdDobClick(Sender: TObject);

begin

ADOSpek.append; //Добавляем запись в набор данных

txtName_Spek.SetFocus;//Устанавливаем фокус на первое поле

end;

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

procedure TfrmSpek.Button7Click(Sender: TObject);

begin

if txtName_Spek.text='' then

showmessage('Не указано наименование спектакля!')

else

try

if (ADOSpek.state=dsedit) or (ADOSpek.State=dsinsert) then ADOSpek.post;

lblKol.Caption:='Всего записей: '+inttostr(ADOSpek.RecordCount);//Считываем количество записей в таблице

lblTek.Caption:='Текущая запись: '+inttostr(ADOSpek.recno);//Считываем номер текущей записи

except

//showmessage('Заготовка под возможный код ошибки');

end;

end;

Подобным образом работаю кнопки "Удалить" и кнопки навигации по записям. Только в каждой из них используется свой метод.

В нижней части окна имеется блок с поиском записей.

Процедура кнопки фильтр:

procedure TfrmSpek.cmdFilterClick(Sender: TObject);

begin

if rbName.Checked=true then

begin;

adoSpek.close;

adoSpek.SQL.Clear;

//Отбираем записи, которые содержат символы, введенные в поле Наименование

adoSpek.SQL.add('SELECT * FROM Spek WHERE Name_Spek like ''%'+txtName_Spek_Poisk.text+'%''');

adoSpek.Open;

lblKol.Caption:='Всего записей: '+inttostr(adoSpek.RecordCount);//Считываем количество записей в таблице

lblTek.Caption:='Текущая запись: '+inttostr(adoSpek.recno);//Считываем номер текущей записи

end;

if rbOpis.Checked=true then

begin;

adoSpek.close;

adoSpek.SQL.Clear;

//Отбираем записи, которые содержат символы, введенные в поле Описание

adoSpek.SQL.add('SELECT * FROM Spek WHERE Opis_Spek like ''%'+txtOpis_Spek_Poisk.text+'%''');

adoSpek.Open;

lblKol.Caption:='Всего записей: '+inttostr(adoSpek.RecordCount);//Считываем количество записей в таблице

lblTek.Caption:='Текущая запись: '+inttostr(adoSpek.recno);//Считываем номер текущей записи

end;

end;

Фильтр ищет записи по неполному совпадению. За это отвечает оператор like в команде SELECT при отборе записей в набор данных.

В зависимости от того, какой переключатель установлен, поиск осуществляется либо по описанию, либо по наименованию мероприятия.

Кнопка "Все" возвращает набор данных к исходному состоянию:

procedure TfrmSpek.cmdVseClick(Sender: TObject);

begin

adoSpek.Close;

adoSpek.SQL.Clear;

adoSpek.SQL.add('SELECT * FROM Spek');

adoSpek.Open;

//Считываем число записей и номер текущей записи в таблице

lblKol.Caption:='Всего записей: '+inttostr(adoSpek.RecordCount);//Считываем количество записей в таблице

lblTek.Caption:='Текущая запись: '+inttostr(adoSpek.recno);//Считываем номер текущей записи


end;

При закрытии формы происходит событие onClose. В нем необходимо предусмотреть закрытие всех наборов данных, которые открывались при создании формы. Это предотвратит утечку памяти компьютера.

procedure TfrmSpek.FormClose(Sender: TObject; var Action: TCloseAction);

begin

adoSpek.Close;

action:=caFree;

end;

ПО умолчанию формы в Delphi не закрываются, а сворачиваются. Поэтому для их уничтожения из памяти в MDI приложении следует прописывать параметр action:=caFree;

Форма "Сеансы" работает аналогичным образом. Ее особенностью является использование объекта DBGrid для табличного представления данных из полей таблиц.

Рисунок 4.5. Форма "Сеансы"

Следующей основной формой является форма "Схема зала"

Рисунок 4.6. Форма "Схема зала"

На этапе разработки у данной формы видны множества объектов доступа к данным TQuery.

Один объект осуществляет доступ к таблице Zal и связывает каждое кресло формы frmZal с логическим полем таблицы Zal. Состояние True данного поля свидетельствует о том, что кресло занято, False - что свободно.

Запись значения из False в True осуществляется нажатием мышью на кресле и записано в процедуре:

procedure TfrmZal.pMesto_1_1Click(Sender: TObject);

var

nkod_Sean: integer;

begin

try

nkod_Sean:=dbLookup_Name_Sean.keyvalue;

//Переходим к первой записи набора adoZal

adozal.First;

//Ищем запись с кодом сеанса, который выбран в списке сеансов

if adozal.locate('Kod_Sean', nKod_Sean,[]) then

begin

adozal.Edit; //Переводим запись в режим редактирования

//Если место 1_1 фальшь, то устанавливаем его в истину

// и меняем цвет на зеленый.

if adozal.FieldByName('Mesto_1_1').AsBoolean=false then

begin

adozal.FieldByName('Mesto_1_1').AsBoolean:=True;

pMesto_1_1.Color:=clGreen;

end;

adozal.Post;

end;

except

showmessage('Выберите сеанс из списка!');

end;

end;

Такой обработчик прописан у каждого кресла.

Набор данных ADOLookup_Name_Sean служит для заполнения поля "Сеансы". для этого в диспетчере свойств устанавливаются следующие значения:

Рисунок 4.7. Привязка поля списка к набору данных через объект Data Source.

Остальные наборы данных служат для печати билета, для вывода афиши и подсчета статистики.

Ниже приведен фрагмент кода кнопки "обновить статистику"

procedure TfrmZal.cmd_Obn_StatClick(Sender: TObject);

var

iStetchik: integer;

iProd: integer; //Число проданных билетов

nkod_Sean: integer; //Код сеанса

iRad: integer;

iMesto: integer;

sRad: string;

sMesto: string;

sMestoPolnoe: string;

begin

nkod_Sean:=dbLookup_Name_Sean.keyvalue;