Создание, использование и уничтожение динамических переменных. Графическое изображение списка. Разработка программного средства, которое имеет список заказов на покупку товаров. Организация пользовательского интерфейса для редактирования информации.
Аналитический обзор литературы 1.1 Динамические структурыгде: имя - имя переменной-указателя; Тип - тип переменной, на которую указывает переменная-указатель; ^ - объявляемая переменная является указателем. Например, если в программе объявлен указатель р: ^integer, то говорят: ^р - "указатель целого типа" или "р - это указатель на целое". Помимо адреса переменной, указателю можно присвоить значение другого указателя при условии, что они являются указателями на переменную одного типа. Указатель можно использовать для доступа к переменной, адрес которой содержит указатель. Например, если р является указателем на тип real, то в результате выполнения процедуры new(p); будет выделена память для переменной типа real (создана переменная типа real), и переменная-указатель р будет содержать адрес памяти, выделенной для этой переменной.Чтобы предоставить пользователю возможность быстрого доступа к данным и комфортного их использования, в программе было задействовано минимальное количество элементов, на которые и возложено все управление программой. В частности такими элементами является таблица LISTZAKSTRINGGRID, в которую выводится список существующих заказов и информация о них, текстовая область MEMOCOUR, которая используется для вывода заказов текущего курьера, списки FIOCOURLISTBOX, OTTIMECOURLISTBOX, DOTIMECOURLISTBOX, WEIGHTCOURLISTBOX и VOLUMECOURLISTBOX для вывода данных о курьере и панели с несколькими кнопками: кнопки добавления, редактирования и удаления.Для работы с информацией, полученной из текстовых файлов, используются односвязные списки, такие как списки заказов и курьеров. В записи zakaz определены следующие поля, содержащие данные о заказе: - name:string; - название товара; dohour:time; - до какого времени необходимо доставить заказ; В записи courier определены следующие поля, характеризующие курьера: - number:integer; - номер курьера; Поле POINTZAK записи courier содержит следующие поля: - zak:Tzakaz; - указатель заказ данного курьера;При запуске программы пользователь увидит окно с управляющими элементами (кнопками), таблицей и несколькими списками (рисунок 5.1). Перемещение между кнопками осуществляется курсором. Выбор конкретной функции происходит по нажатию на кнопку. Для добавления заказа необходимо нажать на пункт Добавление, после чего в появившемся окне (Рисунок 5.2.) ввести нужную информацию и нажать кнопку подтверждения. После нажатия кнопки Сохранить окно автоматически закроется.SHOWMESSAGEPOS("Wrong FIO",Left Width div 2-50,top Height div 2-50); if(OTHOUR23) then raise Exception.Create("error with hour"); SHOWMESSAGEPOS("Ioeaea a iiea ?anu aey ia?aea a?aiaie ?aaiou",Left Width div 2-50,top Height div 2-50); SHOWMESSAGEPOS("Ioeaea a iiea Ieioou aey ia?aea a?aiaie ?aaiou",Left Width div 2-50,top Height div 2-50); SHOWMESSAGEPOS("Ioeaea a iiea ?anu aey eiioa a?aiaie ?aaiou",Left Width div 2-50,top Height div 2-50);SHOWMESSAGEPOS("Wrong volume",Left Width div 2-50,top Height div 2-50); try begin if WEIGHTCOUREDIT.Text="" then raise Exception.Create("error with weight"); SHOWMESSAGEPOS("Ioeaea a iiea Aan",Left Width div 2-50,top Height div 2-50); SHOWMESSAGEPOS("Wrong weight",Left Width div 2-50,top Height div 2-50); SHOWMESSAGEPOS("Wrong name",Left Width div 2-50,top Height div 2-50);SHOWMESSAGEPOS("Wrong volume",Left Width div 2-50,top Height div 2-50); try begin if VESEDIT.Text="" then raise Exception.Create("error with weight"); SHOWMESSAGEPOS("Ioeaea a iiea Aan",Left Width div 2-50,top Height div 2-50); SHOWMESSAGEPOS("Wrong weight",Left Width div 2-50,top Height div 2-50); SHOWMESSAGEPOS("Wrong FIO",Left Width div 2-50,top Height div 2-50);SHOWMESSAGEPOS("Wrong volume",Left Width div 2-50,top Height div 2-50); try begin if EDITWEIGHTCOUREDIT.Text="" then raise Exception.Create("error with weight"); SHOWMESSAGEPOS("Ioeaea a iiea Aan",Left Width div 2-50,top Height div 2-50); SHOWMESSAGEPOS("Wrong weight",Left Width div 2-50,top Height div 2-50); SHOWMESSAGEPOS("Wrong name",Left Width div 2-50,top Height div 2-50);Begin SHOWMESSAGEPOS("Wrong volume",Left Width div 2-50,top Height div 2-50); try begin if CHANGEVESEDIT.Text="" then raise Exception.
Список литературы
Приложение
ВВЕДЕНИЕ
В современном обществе курьерские услуги перестали быть роскошью, превратившись в суровую необходимость. При нынешнем темпе жизни все чаще возникают ситуации, когда важные документы или товары требуется срочно переправить в другой город или даже страну. Но у современных курьерских служб огромное количество времени уходит на распределение заказов между курьерами. В данной работе я постаралась создать программное средство, способное помочь курьерским службам экономить свое время на действия такого характера.
На добавление курьеру конкретного заказа может влиять огромное количество различных факторов. Так в своей работе я выделила следующие причины их распределения: · Время доставки заказа и время работы курьера;
· Объем заказа и максимальный объем, который может доставить курьер;
· Вес заказа и грузоподъемность автомобиля курьера;
Соответственно, исходя из заданных параметров, будут формироваться два списка: список курьеров и для каждого из них список заказов. Данная работа посвящена программной реализации такой структуры на языке Delphi.
В работе задействованы динамические списки записей и типизированные файлы. Так же организован удобный пользовательский интерфейс для просмотра и редактирования информации. Этому способствовали методы, используемые средой разработки Delphi7. список программный пользовательский интерфейс1.Бобровский, С.И., Delphi 7. Учебный курс. - СПБ.: Питер, 2004.- 736с.
3.Глухова Л. А., ФАДЕЕВАЕ.П., ФАДЕЕВАЕ.Е. Основы алгоритмизации программирования: Лаб. Практикум для студ. спец. I-40 01 01 "Программное обеспечение информационных технологий" дневной формы обуч. В 4 ч. Ч.2. -Мн.: БГУИР, 2005.
function GETCOURIERBYINDEX(index:integer;var PREVCOUR:Tcourier):TCOURIER;
procedure CHANGECOURBUTTONCLICK(Sender: TOBJECT);
procedure DELETECOURBUTTONCLICK(Sender: TOBJECT);
procedure CHANGEZAKBUTTONCLICK(Sender: TOBJECT);
procedure DELETEZAKBUTTONCLICK(Sender: TOBJECT);
private
{ Private declarations } public
{ Public declarations } end;
var
MAINWIND: TMAINWIND;
zak:zakaz;
cour:courier;
LISTZAK:Tzakaz;
LISTCOUR:TCOURIER;
implementation
{$R *.dfm}
{Добавление нового заказа} procedure TMAINWIND.ADDZAKBUTTONCLICK(Sender: TOBJECT);
var temp,current,prev:Tzakaz;
i:integer;
begin
NEWZAKFORM.SHOWMODAL;
if(NEWORDERUNIT.IFADDBUTCLICK=true) then begin temp:=NEWORDERUNIT.NEWZAK;
temp.ADDTOCOUR:=false;
ADDZAKAZTOCUR(temp);
If LISTZAK=nil then begin
LISTZAK:=temp;
LISTZAK.number:=1;
LISTZAK.next:=nil;
end else begin i:=1;
current:=LISTZAK;
While currentnil do begin if current.dohour.hour>temp.dohour.hour then break else if current.dohour.hour=temp.dohour.hour then if current.dohour.min>=temp.dohour.min then break;
prev:=current;
current:=current.next;
inc(i);
end;
if i=1 then begin temp.next:=LISTZAK;
LISTZAK:=temp;
end else begin temp.next:=current;
prev.next:=temp;
end;
end;
NUMBERZAK;
DISPLAYZAKLIST;
end;
end;
{Добавление нового курьера} procedure TMAINWIND.ADDCOURBUTTONCLICK(Sender: TOBJECT);
var
TEMPCOUR,CURRCOUR,PREVCOUR:TCOURIER;
j:integer;
begin
NEWCOURFORM.SHOWMODAL;
if(NEWCOURIERUNIT.IFADDBUTCLICK=true) then begin
TEMPCOUR:=NEWCOURIERUNIT.NEWCOUR;
If LISTCOUR=nil then begin
LISTCOUR:=TEMPCOUR;
LISTCOUR.number:=1;
LISTCOUR.next:=nil;
end else begin j:=1;
CURRCOUR:=LISTCOUR;
While CURRCOURNIL do begin if CURRCOUR.dotime.hour>TEMPCOUR.dotime.hour then break else if CURRCOUR.dotime.hour=TEMPCOUR.dotime.hour then if CURRCOUR.dotime.min>=TEMPCOUR.dotime.min then break;
PREVCOUR:=CURRCOUR;
CURRCOUR:=CURRCOUR.next;
inc(j);
end;
if j=1 then begin
TEMPCOUR.next:=LISTCOUR;
LISTCOUR:=TEMPCOUR;
end else begin
TEMPCOUR.next:=CURRCOUR;
PREVCOUR.next:=TEMPCOUR;
end;
end;
Number;
DISPLAYCOURLIST;
end;
end;
{Сохранение данных в файл} procedure TMAINWIND.FORMCLOSE(Sender: TOBJECT; var Action: TCLOSEACTION);
var f1:textfile;
CURRZAK:Tzakaz;
CURRCUR:TCOURIER;
begin assignfile(f1,"zakaz.txt");
rewrite(f1);
CURRZAK:=LISTZAK;
while CURRZAKNIL do begin writeln(f1,CURRZAK.number);
writeln(f1,CURRZAK.name);
writeln(f1,CURRZAK.adress);
writeln(f1,CURRZAK.othour.hour);
writeln(f1,CURRZAK.othour.min);
writeln(f1,CURRZAK.dohour.hour);
writeln(f1,CURRZAK.dohour.min);
writeln(f1,CURRZAK.volume);
writeln(f1,CURRZAK.ves);
CURRZAK:=CURRZAK.next;
end;
closefile(f1);
assignfile(f1,"courier.txt");
rewrite(f1);
CURRCUR:=LISTCOUR;
while CURRCURNIL do begin writeln(f1,CURRCUR.number);
writeln(f1,CURRCUR.fiocour);
writeln(f1,CURRCUR.ottime.hour);
writeln(f1,CURRCUR.ottime.min);
writeln(f1,CURRCUR.dotime.hour);
writeln(f1,CURRCUR.dotime.min);
writeln(f1,CURRCUR.volume);
writeln(f1,CURRCUR.weight);
CURRCUR:=CURRCUR.next;
end;
closefile(f1);
end;
{Считывание данных при открытии} procedure TMAINWIND.FORMCREATE(Sender: TOBJECT);
var f1:textfile;
CURRZAK,PREVZAK:Tzakaz;
CURRCUR,PREVCUR:TCOURIER;
begin assignfile(f1,"zakaz.txt");
reset(f1);
PREVZAK:=nil;
while not eof(f1) do begin new(CURRZAK);
readln(f1,CURRZAK.number);
readln(f1,CURRZAK.name);
readln(f1,CURRZAK.adress);
readln(f1,CURRZAK.othour.hour);
readln(f1,CURRZAK.othour.min);
readln(f1,CURRZAK.dohour.hour);
readln(f1,CURRZAK.dohour.min);
readln(f1,CURRZAK.volume);
readln(f1,CURRZAK.ves);
CURRZAK.ADDTOCOUR:=false;
if(prevzak=nil) then
LISTZAK:=CURRZAK else
PREVZAK.next:=CURRZAK;
PREVZAK:=CURRZAK;
end;
if(PREVZAKNIL) then
PREVZAK.next:=nil;
closefile(f1);
NUMBERZAK;
DISPLAYZAKLIST;
assignfile(f1,"courier.txt");
reset(f1);
PREVCUR:=nil;
while not eof(f1) do begin new(CURRCUR);
readln(f1,CURRCUR.number);
readln(f1,CURRCUR.fiocour);
readln(f1,CURRCUR.ottime.hour);
readln(f1,CURRCUR.ottime.min);
readln(f1,CURRCUR.dotime.hour);
readln(f1,CURRCUR.dotime.min);
readln(f1,CURRCUR.volume);
readln(f1,CURRCUR.weight);
CURRCUR.NOWWEIGHT:=0;
CURRCUR.NOWVOLUME:=0;
CURRCUR.POINTZAK:=nil;
if(PREVCUR=nil) then
LISTCOUR:=CURRCUR else
PREVCUR.next:=CURRCUR;
PREVCUR:=CURRCUR;
end;
if(PREVCURNIL) then
PREVCUR.next:=nil;
closefile(f1);
CURRZAK:=LISTZAK;
while(CURRZAKNIL) do begin
ADDZAKAZTOCUR(CURRZAK);
CURRZAK:=CURRZAK.next;
end;
Number;
DISPLAYCOURLIST;
end;
{Вывод списка курьеров в форму} procedure TMAINWIND.DISPLAYCOURLIST;
{Добавление заказов курьерам} function TMAINWIND.ADDZAKAZTOCUR(zak:TZAKAZ):boolean;
var
CURCUR:Tcourier;
CURCURZAK,PREVCURZAK,temp:TCURZAKAZ;
Begin if(zak = nil) then exit;
CURCUR:=LISTCOUR;
while(CURCURNIL)do begin if (zak.ADDTOCOUR) then break;
if(CURCUR.Volume-CURCUR.NOWVOLUME>=zak.volume) then if(CURCUR.weight-CURCUR.NOWWEIGHT>=zak.ves) then if (((CURCUR.ottime.hour<zak.othour.hour) or((CURCUR.ottime.hour=zak.othour.hour) and (CURCUR.ottime.min<=zak.othour.min))) and ((CURCUR.dotime.hour>zak.othour.hour) or (( CURCUR.dotime.hour=zak.othour.hour) and (CURCUR.dotime.min>=zak.othour.min)))) or (((CURCUR.ottime.hour<zak.dohour.hour) or((CURCUR.ottime.hour=zak.dohour.hour) and (CURCUR.ottime.min<=zak.dohour.min))) and ((CURCUR.dotime.hour>zak.dohour.hour) or (( CURCUR.dotime.hour=zak.dohour.hour) and (CURCUR.dotime.min>=zak.dohour.min)))) or (((CURCUR.ottime.hour>zak.othour.hour) or((CURCUR.ottime.hour=zak.othour.hour) and (CURCUR.ottime.min>=zak.othour.min))) and ((CURCUR.dotime.hour<zak.othour.hour) or (( CURCUR.dotime.hour=zak.othour.hour) and (CURCUR.dotime.min<=zak.othour.min)))) then begin new(temp);