p align="left">Delphi 7 - мощная система визуального объектно-ориентированного программмирования. С ее помощью даже начинающие программисты могут создавать оконные интерфейсы, удовлетворяющие стандартам Windows, причем очень быстро. Спектр отраслей, в которых можно применять Delphi, достаточно широк: инженерные, офисные, торговые и др. К тому же Delphi является одним из самых распространенных средств создания приложений баз данных. Простота языка и эффективность (небольшие размеры и высокая производительность) создаваемых с его помощью программ сделали Delphi незаменимым средством разработки приложений для доступа к базам данных. Delphi используется для генерирования и вывода на печать сложных отчетов баз данных, а также предоставляет возможность связываться из своего приложения с такими продуктами Microsoft, как Word, Excel и другие, используя их возможности в создании мощных систем помощи. Занимает 16 Мб дискового пространства. Оперативная память должна быть 64 Мб минимум. 3.2 Описание программных модулей и их взаимодействие Данный программный продукт состоит из 4 основных вычисляющих модулей: а) поиск всех возможных рейсов, последовательно проходящих через заданные начальную и конечную точки маршрута. Для каждого из существующих рейсов указываются станции, через которые поезд проходит последовательно, к примеру, Москва - Санкт-Петербург - Казань - Воронеж. Следует отметить, что поезд может идти только в одном направлении (из Москвы в Воронеж). Задаются пункт отправления и пункт прибытия, указанные пассажиром. Рейс считается подходящим, если в его маршруте содержатся пункты отправления и прибытия, причем пункт прибытия следует после пункта отправления. Например, если пассажир следует из Санкт-Петербурга в Воронеж, то указанный выше рейс считается подходящим. Если же пункт его отправления Казань, а пункт назначения Санкт-Петербург, то рейс №100 не будет соответствовать заданному условию. Листинг программного модуля: if (ComboBox1.Text <> '') and (ComboBox2.Text <> '') and (RzDateTimeEdit1.Text <> '') then begin Query1.Destroy; DS1.Destroy; Query1:=CreateQuery('select * from reis'); Query1.Open; nomera:=''; Query1.First; while not Query1.Eof do begin m:=-1; n:=-1; trains:= TStringList.Create; trains.Text:= StringReplace(Query1.FieldValues['stancii'],'-',#13#10,[rfReplaceAll]); for i:=0 to trains.Count-1 do begin if trains[i] = ComboBox1.Text then m:=i; if trains[i] = ComboBox2.Text then n:=i; end; if (m <> -1) and (n <> -1) then if (m < n) then begin nomera:=nomera+Query1.Fields[0].AsString+','; end; trains.Destroy; Query1.Next; end; if nomera = '' then begin Application.MessageBox('Таких рейсов нет','Внимание',MB_OK+MB_ICONERROR); DS1:= CreateDataSource(Query1); // DBGrid1.DataSource:= DS1; end else begin Delete(nomera,length(nomera),1); Query1.SQL.Clear; SQLString:='select * from reis where no_reisa in ('+nomera+')'; Query1.SQL.Add(SQLString); Query1.Open; DS1:=CreateDataSource(Query1); DBGrid1.DataSource:= DS1; end; end; Результатом работы программного модуля является список подходящих рейсов. б) визуальное отображение всех занятых и свободных мест выбранного рейса с учетом даты отправления, проверка освободившихся мест. После выбора необходимого рейса и даты отправления пассажира таблично отображаются занятые и свободные места. Для каждого занятого места запоминаются пункт назначения и дата прибытия. Место считается освободившимся для данного пассажира, если выполняется два условия: запомненный для места пункт назначения находится до пункта отправления пассажира или совпадает с ним; запомненная дата прибытия для места совпадает с датой отправления пассажира или дата отправления является более поздней. Листинг программного модуля: SQLString:= 'select * from typevag where no_reisa="'+DBGrid1.Fields[0].Text+'"'; Query2:= CreateQuery(SQLString); Query2.Open; plackart:= TStringList.Create; kupe:= TStringList.Create; plackart.Text:=StringReplace(Query2.Fields[1].AsString,' ',#13#10,[rfReplaceAll]); kupe.Text:=StringReplace(Query2.Fields[2].AsString,' ',#13#10,[rfReplaceAll]); StringGrid1.RowCount:=plackart.Count+kupe.Count+1; for i:=0 to plackart.Count-1 do begin StringGrid1.Cells[0,StrToInt(plackart[i])]:=plackart[i]+' плацкарт'; for j:=1 to 55 do StringGrid1.Cells[j,i]:=''; end; for i:=0 to kupe.Count-1 do begin StringGrid1.Cells[0,StrToInt(kupe[i])]:=kupe[i]+' купе'; // for j:=1 to 55 do StringGrid1.Cells[j,i]:=''; for j:=37 to 55 do StringGrid1.Cells[j,StrToInt(kupe[i])]:='X'; end; plackart.Destroy; kupe.Destroy; with Query2 do begin SQLString:='select * from tickets where no_reisa="'+DBGrid1.Fields[0].Text+'"and startdate="'+FormatDateTime('dd.mm',RzDateTimeEdit1.Date)+'"'; SQL.Clear; SQL.Add(SQLString); Open; end; Query2.First; while not Query2.Eof do begin v:= Query2.Fields[8].AsInteger; p:= Query2.Fields[9].AsInteger; StringGrid1.Cells[p,v]:='*'; pnaz:= Query2.FieldValues['EndPoint']; SQLString:= 'select * from stationofreis where No_reisa="'+DBGrid1.Fields[0].AsString+'"'; Query3:= CreateQuery(SQLString); Query3.Open; Query3.First; while Query3.Fields[1].AsString <> pnaz do begin if Query3.FieldByName('station').AsString = ComboBox1.Text then {if FormatDateTime() < FormatDateTime() then} goto m1; Query3.Next; end; Query3.Destroy; StringGrid1.Cells[p,v]:=''; m1: Query2.Next; end; Query2.Destroy; в) вычисление основных параметров для заданного маршрута: даты прибытия, времени в пути, стоимости билета. Для каждого пункта маршрута в отдельной таблице указываются следующие параметры: стоимость участка пути от предыдущей до текущей станции и время его прохождения, время прибытия, стоянки и отправления. Для того, чтобы вычислить стоимость маршрута, по которому следует пассажир, нужно суммировать стоимости участков пути, составляющих данный маршрут. К цене маршрута добавляется наценка за класс вагона и обязательный страховой сбор. Чтобы вычислить время .проведенное в пути, нужно суммировать время прохождения каждого участка пути и время стоянки в каждом пункте. Дата прибытия вычисляется прибавлением времени в пути к дате отправления. Листинг программного модуля: if (StringGrid1.Cells[ACol,ARow] <> '*') and (StringGrid1.Cells[ACol,ARow] <> 'X') then begin if (ComboBox1.Text <> '') and (ComboBox2.Text <> '') and (RzDateTimeEdit1.Text <> '') then begin if MessageDlg('Приступить к гегистрации пассажира?',mtConfirmation,[mbYes,mbNo],0) = mrYes then begin Application.CreateForm(TFormTicket, FormTicket); with FormTicket do begin Label2.Caption:= DBGrid1.Fields[0].Text; Label3.Caption:= DBGrid1.Fields[2].Text; Label6.Caption:= FormatDateTime('dd.mm',RzDateTimeEdit1.Date); Label17.Caption:= IntToStr(ACol); Label15.Caption:= IntToStr(ARow); Label10.Caption:= ComboBox1.Text; Label11.Caption:= ComboBox2.Text; time:=TStringList.Create; time.Text:=StringReplace(StringGrid1.Cells[0,ARow],' ',#13#10,[rfreplaceall]); Label13.Caption:= time[1]; time.Destroy; Label19.Caption:= FormatDateTime('dd.mm',RzDateTimeEdit1.Date); SQLString:='select * from stationofreis where no_reisa="'+DBGrid1.Fields[0].Text+'"'; Query2:= CreateQuery(SQLString); Query2.Open; Query2.First; hour:=0; minute:=0; price:=0; s:='0'; while not Query2.Eof do begin if Query2.Fields[1].AsString = ComboBox1.Text then begin Label21.Caption:=Query2.Fields[6].AsString; s1:= Query2.Fields[6].AsFloat; while not Query2.Eof do begin Query2.Next; s2:= Query2.Fields[4].AsFloat; if s1>s2 then begin Label6.Caption:= FormatDateTime('dd.mm',RzDateTimeEdit1.Date+1); s1:=s2; end; if Query2.Fields[1].AsString = ComboBox2.Text then begin if s = '' then begin s:= Query2.Fields[3].AsString; end; Label23.Caption:=Query2.Fields[4].AsString; s:= FloatToStr(sumhhmm(StrToFloat(s),Query2.Fields[3].AsFloat)); Label25.Caption:= s; priceway:= price; GetDir(0,Path); with TIniFile.Create(Path+'\zd.ini') do try price:= price+Query2.Fields[2].AsFloat+StrToFloat(ReadString('cash',Label13.Caption,'no val ues'))+StrToFloat(ReadString('cash','сбор','no values')); finally Free; end; Label27.Caption:= FloatToStr(price); // Edit3.Text:= StringReplace(Label27.Caption,',','.',[rfReplaceAll]); {!!!!!добавить указание стоимости проезда!!!!!} goto m1; end; price:=price+Query2.Fields[2].AsFloat; s:= FloatToStr(sumhhmm(StrToFloat(s),Query2.Fields[3].AsFloat)); s:= FloatToStr(sumhhmm(StrToFloat(s),Query2.Fields[5].AsFloat)); s1:=s2; end; end; Query2.Next; end; m1: end; FormTicket.ShowModal; end; end; end; г) регистрация пассажира и формирование проездного документа. После заполнения данных пассажира (фамилии, имени, отчества, номера документа, удостоверяющего личность) происходит регистрация пассажира на данный рейс и формируется проездной документ, в котором указываются рейс, вычисленные ранее стоимость билета, время пути, время отправления и прибытия, дата прибытия, данные пассажира, пункт отправления и пункт следования. Листинг программного модуля: if (Edit1.Text <> '') or (MaskEdit1.Text <> '') then begin dat:= FormatDateTime('ddmmyyhhmm',Now); SQLString:='insert into tickets values("'+FormatDateTime('ddmmyyhhmm',Now)+'","'+Edit1.Text+'","'+MaskEdit1.Text+'","'+Label2.Caption+'","'+Label10.Caption+'","'+Label11.Caption+'","'+Label19.Caption+'","'+Label6.Caption+'","'+Label15.Caption+'","'+Label17.Caption+'","'+Label13.Caption+'","'+StringReplace(Label27.Caption,',','.',[rfReplaceAll])+'")'; if ExecuteSQL(SQLString) then begin GetDir(0,Path); with TIniFile.Create(Path+'\zd.ini') do try SQLString:= 'insert into prices values("'+Label21.Caption+'","'+Label23.Caption+'","'+Label25.Caption+'","'+StringReplace(ReadString('cash',Label13.Caption,'no values'),',','.',[rfReplaceAll])+'","'+StringReplace(ReadString('cash','сбор','no values'),',','.',[rfReplaceAll])+'","'+StringReplace(FloatToStr(priceway),',','.',[rfReplaceAll])+'")'; finally Free; end; ExecuteSQL('delete from prices'); if ExecuteSQL(SQLString) then begin // ShowMessage('Успешная регистрация'); FormTicket.Close; SQLString:= 'select * from tickets, prices where tickets.no_ticket="'+dat+'"'; QReport.SQL.Clear; QReport.SQL.Add(SQLString); QReport.Open; frReport1.LoadFromFile(Path+'\ticket.frf'); frReport1.ShowReport; with FormPay do begin ComboBox1.Text:= ''; ComboBox2.Text:= ''; RzDateTimeEdit1.Text:= ''; // RzToolButton1Click(sender); with StringGrid1 do begin RowCount:= 2; ColCount:=55; for i:=1 to ColCount-1 do begin ColWidths[i]:=20; Cells[i,0]:=IntToStr(i); end; end; end; end; end; end else ShowMessage('Не введены обязательные данные!'); 3.3 Описание интерфейса пользователя При запуске программы на выполнение на экране компьютера появляется следующее меню изображённое на рисунке 3. Рисунок 3 - Главное окно Меню состоит из пунктов «Продажа билетов», «Администратор». При выборе пункта меню «Продажа билетов» появляется следующее подменю, изображённое на рисунке 4. Рисунок 4 - Форма продажи билетов На форме указаны «Номер рейса», «Пункт отправления», «Пункт назначения», «Дата отправления» - это поля, которые заполняются оператором; поля «Рейсы», «Состав» - отображаются сразу после запроса. Как только информация отобразилась, оператор приступает к регистрации пассажира, рисунок 5. Рисунок 5 - Форма регистрации пассажира После регистрации идёт оформление документа, представленного на рисунке 6. Рисунок 6 - Проездной документ При выборе пункта меню «Администратор», необходимо ввести пароль. Так как обычный оператор не вправе что-либо менять или исправлять в самой базе данных. Вид окошка представлен на рисунке 7. Рисунок 7 - Ввод пароля Появляется форма администратора с вкладками «Станции», «Рейсы», «Стоимость класса вагона», «Поезда», «Стоимость участка пути», форма изображена на рисунке 8. Рисунок 8 - Форма администратора (вкладка «Станции») При выборе команды «Рейсы» на экране появляется новое окно, отображённое на рисунке 9. В данном окне администратор может добавлять новые рейсы, внося их номер и полный путь, а название рейса формируется автоматически - из начальной заданной станции и конечной прописанной в пути. Рисунок 9 - Рейсы (добавление) В списке, изображенных в окне, отражаются все операции, произведенные по каждому рейсу, будь то добавление, редактирование или удаление станций и его номера. Кнопка «Добавить» предназначена для добавления из списка станций нового маршрута, содержащего полный путь рейса. Если после какой-либо корректировки данных кнопка не будет нажата, рейс не будет добавлен. При нажатии на кнопку на кнопку «Отмена» происходит возврат в предыдущее окно без сохранения. После выбора вкладки «Стоимость класса вагона» появляется новое окно, изображённое на рисунке 10. Рисунок 10 - Вкладка «Стоимость класса вагона» Вносятся необходимые изменения, и нажимается кнопка «Применить». Рассмотрим вкладку «Поезда», представленную на рисунке 10. Здесь отмечаются сколько вагонов находится в составе и под каким номером какие типы вагонов. После нажатия кнопки «Применить», информация заносится в таблицу. Рисунок 11 - Вкладка «Поезда» На вкладке «Стоимость участка пути», изображённой на рисунке 11, администратор вносит необходимые данные: время в пути, время прибытия, стоянка, время отправления, стоимость участка. После нажатия кнопки «Применить», вне-сённые данные отображаются в верхней таблице. Рисунок 11 - Вкладка «Стоимость пути» Заключение Разработанный нами программный продукт является удобным и надежным средством для быстрой регистрации пассажиров для проезда на железнодорожном транспорте. Программный продукт выполняет следующие функции: - возможность заказа билета из любой точки мира при наличии подключения к внутренней компьютерной сети; - возможность добавления и редактирования маршрутов, цен на билеты. - заказ билета на любую дату. - быстрый расчет времени в пути. Возможные улучшения: - выбор пассажиром места в вагоне (верхняя, нижняя полка) - выдача рекомендаций по оптимальному с точки зрения времени, проведенному в пути и стоимости билета, маршруту между двумя пунктами. Список литературы: 1. ГОСТ 2.105-95 ЕСКД - общие требования к текстовым документам; 2. ГОСТ 2.304-81 ЕСКД - шрифты чертёжные; 3. ГОСТ 2.106-68 ЕСКД - текстовые документы; 4. Общие требования и правила оформления выпускных квалификационных работ, курсовых проектов, отчетов ОГУ; 5. Программирование на Delphi 6, Глушаков С.В.
Страницы: 1, 2
|