Программная реализация курьерского заказа
Создание, использование и уничтожение динамических переменных. Графическое изображение списка. Разработка программного средства, которое имеет список заказов на покупку товаров. Организация пользовательского интерфейса для редактирования информации.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 16.09.2012 |
Размер файла | 618,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
СОДЕРЖАНИЕ
Введение
1. Аналитический обзор литературы
1.1 Динамические структуры
1.2 Постановка задачи
2. Разработка алгоритма
3. Разработка программного средства
4. Руководство пользователя
Список литературы
Приложение
ВВЕДЕНИЕ
В современном обществе курьерские услуги перестали быть роскошью, превратившись в суровую необходимость. При нынешнем темпе жизни все чаще возникают ситуации, когда важные документы или товары требуется срочно переправить в другой город или даже страну. Но у современных курьерских служб огромное количество времени уходит на распределение заказов между курьерами. В данной работе я постаралась создать программное средство, способное помочь курьерским службам экономить свое время на действия такого характера.
На добавление курьеру конкретного заказа может влиять огромное количество различных факторов. Так в своей работе я выделила следующие причины их распределения:
· Время доставки заказа и время работы курьера;
· Объем заказа и максимальный объем, который может доставить курьер;
· Вес заказа и грузоподъемность автомобиля курьера;
Соответственно, исходя из заданных параметров, будут формироваться два списка: список курьеров и для каждого из них список заказов. Данная работа посвящена программной реализации такой структуры на языке Delphi.
В работе задействованы динамические списки записей и типизированные файлы. Так же организован удобный пользовательский интерфейс для просмотра и редактирования информации. Этому способствовали методы, используемые средой разработки Delphi7.
список программный пользовательский интерфейс
1. АНАЛИТИЧЕСКИЙ ОБЗОР ЛИТЕРАТУРЫ
1.1 Динамические структуры данных
Динамические структуры данных - данные, размер которых может меняться во время работы программы.
Обычно переменная хранит некоторые данные. Однако помимо обычных, существуют переменные, которые ссылаются на другие переменные. Такие переменные называются указателями. Указатель -- это переменная, значением которой является адрес другой переменной или структуры данных. Графически указатель может быть изображен так, как на рисунке 1.
Рисунок 1. Переменная-указатель
Указатель, как и любая другая переменная программы, должна быть объявлена в разделе объявления. В общем виде объявление указателя выглядит следующим образом: Имя: ^ Тип;
где: имя -- имя переменной-указателя; Тип -- тип переменной, на которую указывает переменная-указатель; ^ - объявляемая переменная является указателем.
Примеры объявления указателей: p1: ^integer; р2: ^real;
p1 -- это указатель на переменную типа integer, a p2 -- указатель на переменную типа real.
Тип переменной, на которую ссылается указатель, называют типом указателя. Например, если в программе объявлен указатель р: ^integer, то говорят: ^р -- "указатель целого типа" или "р -- это указатель на целое".
В начале работы программы переменная-указатель "ни на что не указывает". В этом случае говорят, что значение указателя равно NIL. Зарезервированное слово NIL соответствует значению указателя, который ни на что не указывает.
Идентификатор NIL можно использовать в инструкциях присваивания и в условиях. Например, если переменные p1 и р2 объявлены как указатели, то инструкция p1 := NIL;
устанавливает значение переменной, а инструкция if р2 = NIL then ShowMessage('Указатель р2 не инициализирован!');
проверяет, инициализирован ли указатель р2.
Указателю можно присвоить значение -- адрес переменной соответствующего типа (в тексте программы адрес переменной -- это имя переменной, перед которым стоит оператор @). Ниже приведена инструкция, после выполнения которой переменная р будет содержать адрес переменной n, р := @n;
Помимо адреса переменной, указателю можно присвоить значение другого указателя при условии, что они являются указателями на переменную одного типа. Например, если переменные p1 и р2 являются указателями типа integer, то в результате выполнения инструкции: p2 := p1;
Указатель можно использовать для доступа к переменной, адрес которой содержит указатель. Например, если р указывает на переменную i, то в результате выполнения инструкции: р^ : = 5;
значение переменной i будет равно пяти. В приведенном примере значок ^ показывает, что значение пять присваивается переменной, на которую указывает переменная-указатель.
Динамической переменной называется переменная, память для которой выделяется во время работы программы.
Выделение памяти для динамической переменной осуществляется вызовом процедуры new. У процедуры new один параметр -- указатель на переменную того типа, память для которой надо выделить. Например, если р является указателем на тип real, то в результате выполнения процедуры new(p); будет выделена память для переменной типа real (создана переменная типа real), и переменная-указатель р будет содержать адрес памяти, выделенной для этой переменной.
У динамической переменной нет имени, поэтому обратиться к ней можно только при помощи указателя.
Процедура, использующая динамические переменные, перед завершением своей работы должна освободить занимаемую этими переменными память или, как говорят программисты, "уничтожить динамические переменные". Для освобождения памяти, занимаемой динамической переменной, используется процедура Dispose, которая имеет один параметр -- указатель на динамическую переменную.
Например, если р -- указатель на динамическую переменную, память для которой выделена инструкцией new(p), то инструкция dispose (р) освобождает занимаемую динамической переменной память.
Создание, использование и уничтожение динамических переменных
Var p1,p2,p3:^ Integer; // указатели на переменные типа integer
begin
// создание динамических переменных типа integer
// выделение памяти для динамических переменных
New(p1);
New(p2);
New(p3);
р1^ := 5;
р2^ := 3;
р3^ := р1^ + р2^;
ShowMessage('Суммачиселравна ' + IntToStr(р3^));
// уничтожение динамических переменных, освобождение памяти
Dispose(p1);
Dispose(р2);
Dispose(р3);
end;
В начале работы процедура создает три динамические переменные. Две переменные, на которые указывают p1 и р2, получают значение в результате выполнения инструкции присваивания. Значение третьей переменной вычисляется как сумма первых двух.
Списки
Указатели и динамические переменные позволяют создавать сложные динамические структуры данных, такие как списки и деревья.
Список можно изобразить графически, как показано на рисунке 2.
Рисунок 2. Графическое изображение списка.
Каждый элемент списка (узел) представляет собой запись, состоящую из двух частей. Первая часть -- информационная. Вторая часть отвечает за связь со следующим и, возможно, с предыдущим элементом списка. Список, в котором обеспечивается связь только со следующим элементом, называется односвязным.
Для того чтобы программа могла использовать список, надо определить тип компонентов списка и переменную-указатель на первый элемент списка. Ниже приведен пример объявления компонента списка студентов:
type
TPStudent = ^TStudent; // указатель на переменную типа TStudent
// описание типа элемента списка
TStudent = record
FIO: string[60]; // фамилия
group: integer; // номергруппы
address: string[60]; // домашний адрес
next: TPStudent; // указатель на следующий элемент списка
end;
var head: TPStudent; // указатель на первый элемент списка
Добавлять данные можно в начало, в конец или в нужное место списка. Во всех этих случаях необходимо корректировать указатели. На рисунке 3 изображен процесс добавления элементов в начало списка.
Добавление элемента в начало динамического списка
type
TPStudent=^TStudent; // указательнатип TStudent
TStudent = record
f_name:string[20]; // фамилия
l_name: string[20]; // имя
next: TPStudent; // следующийэлементсписка
end;
var head: TPStudent; // начало (голова) списка, добавить элемент в начало списка
procedure add;
var
curr: TPStudent; // новыйэлементсписка
begin
new(curr); // выделить память для элемента списка
curr^.f_name := `Сидоров';
curr^. l _ name := `Иван';
// добавление в начало списка
curr^.next := head; head := curr;
end;
Рисунок 3. Добавление элементов в список
Вывод целого списка:
var
curr: TPStudent; // текущий элемент списка
n:integer; // длина (кол-во элементов) списка
st:string; // строковое представление списка
begin
n := 0; st := '';
curr := head; // указатель на первый элемент списка
while curr <> NIL do begin
n := n + 1;
st := st + curr^.f_name + ' ' + curr^.1_name+#13;
curr := curr^.next; // указатель на следующий элемент
end;
Добавление элемента в список выполняет процедура add, которая создает динамическую переменную-запись, присваивает ее полям значения, соответствующие содержимому полей ввода диалогового окна, и корректирует значение указателя head.
Удаление элемента из списка
Для того чтобы удалить узел, необходимо скорректировать значение указателя узла, который находится перед удаляемым узлом (рисунок 4).
Рисунок 4. Удаление элемента из списка.
Поскольку узел является динамической переменной, то после исключения узла из списка занимаемая им память должна быть освобождена. Освобождение динамической памяти, или, как иногда говорят, "уничтожение переменной", выполняется вызовом процедуры dispose. У процедуры dispose один параметр -- указатель на динамическую переменную. Память, занимаемая этой динамической переменной, должна быть освобождена. Для примера:
Var р: ^integer;
begin
new(p);
{ инструкции программы }
dispose(p);
end
1.2 Постановка задачи
Разработать программное средство, которое имеет список заказов на покупку товаров на следующие сутки. Каждая запись списка содержит: номер заказа, адрес доставки, время доставки (от… ,до …), объем заказа в м3, вес в кг. Также имеется список курьеров. Каждая запись списка содержит: номер курьера, ФИО курьера, время работы (от… ,до …), грузоподъемность автомобиля, max объем груза за одну перевозку. Требуется:
· Наиболее эффективно распределить заказы между курьерами;
· Выдать список всех заказов курьера;
· Предусмотреть возможность добавлять, удалять и корректировать записи из списков, а так же просматривать списки полностью
2. РАЗРАБОТКА АЛГОРИТМА
При разработке представленной программы значительное внимание было уделено интерфейсу. Чтобы предоставить пользователю возможность быстрого доступа к данным и комфортного их использования, в программе было задействовано минимальное количество элементов, на которые и возложено все управление программой. В частности такими элементами является таблица ListZakStringGrid, в которую выводится список существующих заказов и информация о них, текстовая область MemoCour, которая используется для вывода заказов текущего курьера, списки FIOCourListBox, OtTimeCourListBox, DoTimeCourListBox, WeightCourListBox и VolumeCourListBox для вывода данных о курьере и панели с несколькими кнопками: кнопки добавления, редактирования и удаления. Все это позволило сделать программу очень наглядной и простой, не в ущерб ее функциональности.
Условно программу можно разделить на 3 этапа:
1) Первый этап заключается в загрузке в таблицу и списки из файлов данных о курьерах и заказах, если таковые имеются.
2) В качестве второго этапа можно принять этап распределения заказов между курьерами.
3) На третьем этапе, этапе завершения, происходит сохранение данных обратно в текстовые файлы.
Работу процедуры сохранения данных в файл отображает рисунок 4.1.
3. РАЗРАБОТКА ПРОГРАММНОГО СРЕДСТВА
Для работы с информацией, полученной из текстовых файлов, используются односвязные списки, такие как списки заказов и курьеров.
В записи zakaz определены следующие поля, содержащие данные о заказе:
- name:string; - название товара;
- number:integer; - номер товара;
- adress:string; - адрес доставки заказа;
- othour:time; - с какого времени осуществляется доставка;
- dohour:time; - до какого времени необходимо доставить заказ;
- ves:integer; - вес товара;
- volume:integer; - объем товара;
- next:Tzakaz; - указатель на следующий элемент списка;
- addToCour:boolean; - логический элемент, отображающий добавление заказа какому-либо курьеру;
В записи courier определены следующие поля, характеризующие курьера:
- number:integer; - номер курьера;
- fiocour:string; - ФИО курьера;
- ottime:time; - с какого времени работает курьер;
- dotime:time; - до которого времени работает курьер;
- Volume:integer; - максимальный объем заказа, перевозимого курьером;
- weight:integer; - грузоподъемность автомобиля курьера;
- next:Tcourier; - указатель на следующий элемент списка;
- NowWeight:integer; - текущий вес заказов, добавленных курьеру;
- NowVolume:integer; - текущий объем, добавленный курьеру;
- PointZak:TCurZakaz; - указатель на список заказов данного курьера;
Поле PointZak записи courier содержит следующие поля:
- zak:Tzakaz; - указатель заказ данного курьера;
- next:TCurZakaz; - указатель на следующий элемент списка;
В программе используются следующие переменные:
istZak, listCour - указатели на начало списков курьеров и заказов;
temp, current, prev - указатели для работы со списками
Все остальные переменные являются вспомогательными или производными от выше изложеных.
В таблице 1 приведены основные процедуры и функции, используемые в программе.
Таблица 1 "Основные процедуры и функции"
Подпрограмма |
Назначение |
|
TMainWind.FormCreate(Sender: TObject); |
Считывание данных с файлов, создание списков курьеров и заказов. |
|
TMainWind.AddZakButtonClick(Sender: TObject); |
Добавление нового заказа. |
|
TMainWind.AddCourButtonClick; |
Добавление нового курьера. |
|
TMainWind.FormClose; |
Сохранение данных в файлы. |
|
TMainWind.DisplayCourList; |
Вывод списка курьеров в форму. |
|
TMainWind.DisplayZakList; |
Вывод списка заказов в таблицу. |
|
TMainWind.GetCourierByIndex; |
Нахождение записи выделенного курьера. |
|
TMainWind.FIOCourListBoxClick |
Вывод в форму всех заказов курьера. |
|
TMainWind.AddZakazToCur(zak:TZakaz):boolean; |
Распределение заказов по курьерам. |
|
TMainWind.ChangeCourButtonClick(Sender: TObject); |
Редактирование записи курьера. |
|
TMainWind.DeleteCourButtonClick(Sender: TObject); |
Удаление записи курьера. |
|
TMainWind.ChangeZakButtonClick(Sender: TObject); |
Редактирование записи заказа. |
|
TMainWind.DeleteZakButtonClick(Sender: TObject); |
Удаление заказа. |
4. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
При запуске программы пользователь увидит окно с управляющими элементами (кнопками), таблицей и несколькими списками (рисунок 5.1).
Рисунок 5.1
Перемещение между кнопками осуществляется курсором. Выбор конкретной функции происходит по нажатию на кнопку.
Для добавления заказа необходимо нажать на пункт Добавление, после чего в появившемся окне (Рисунок 5.2.) ввести нужную информацию и нажать кнопку подтверждения. Далее произойдет добавление новой записи и ее распределение курьеру. После нажатия кнопки Сохранить окно автоматически закроется.
Таким же методом происходит и добавление нового курьера. После сохранения результата данные о нем выводятся в список формы.
При редактировании вызываются формы такого же типа, что и при добавление курьера/заказа. После подтверждения выполнения данные сохраняются в новом виде.
Рисунок 5.2.
Удаление. Для того, чтобы удалить нужный элемент, предварительно выделяется нужное поле, а затем по нажатию кнопки удалить происходит перезапись существующих форм.
Выход из программы. Для осуществления выхода из программы достаточно закрыть окно главной формы.
Прочее. Для корректной работы программного средства в папке с программой должны находиться файлы courierи zakaz с символьным представлением данных записей.
СПИСОК ЛИТЕРАТУРЫ
1.Бобровский, С.И., Delphi 7. Учебный курс. - СПб.: Питер, 2004.- 736с.
2.Фаронов, В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие / В.В.Фаронов. М. : Издательство "ОМД групп", 2003. - 616с.
3.Глухова Л. А., ФадееваЕ.П., ФадееваЕ.Е. Основы алгоритмизации программирования: Лаб. Практикум для студ. спец. I-40 01 01 "Программное обеспечение информационных технологий" дневной формы обуч. В 4 ч. Ч.2. -Мн.: БГУИР, 2005.
ПРИЛОЖЕНИЕ
ТЕКСТ ПРОГРАММЫ
unit MainWindowUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, NewOrderUnit, GlobalTypes, NewCourierUnit,
EditCourUnit, Grids, EditZakUnit;
type
TMainWind = class(TForm)
TableGroupBox: TGroupBox;
GroupBox2: TGroupBox;
ZakazGroupBox: TGroupBox;
AddCourButton: TButton;
ChangeCourButton: TButton;
DeleteCourButton: TButton;
AddZakButton: TButton;
ChangeZakButton: TButton;
DeleteZakButton: TButton;
MemoCour: TMemo;
FIOCourListBox: TListBox;
OtTimeCourListBox: TListBox;
DoTimeCourListBox: TListBox;
VolumeCourListBox: TListBox;
WeightCourListBox: TListBox;
FIOCourLabel: TLabel;
OtTimeCourLabel: TLabel;
DoTimeCourLabel: TLabel;
VolumeCourLabel: TLabel;
WeightCourLabel: TLabel;
ZakListLabel: TLabel;
ListZakStringGrid: TStringGrid;
procedure AddZakButtonClick(Sender: TObject);
procedure AddCourButtonClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure DisplayCourList;
Procedure DisplayZakList;
Procedure Number;
Procedure NumberZak;
procedure FIOCourListBoxClick(Sender: TObject);
procedure OtTimeCourListBoxClick(Sender: TObject);
procedure DoTimeCourListBoxClick(Sender: TObject);
procedure VolumeCourListBoxClick(Sender: TObject);
procedure WeightCourListBoxClick(Sender: TObject);
function AddZakazToCur(zak:TZakaz):boolean;
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 current<>nil 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 currCour<>nil 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 currZak<>nil 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 currCur<>nil 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(prevZak<>nil) 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(prevCur<>nil) then
prevCur.next:=nil;
closefile(f1);
currZak:=listZak;
while(currZak<>nil) do
begin
AddZakazToCur(currZak);
currZak:=currZak.next;
end;
Number;
DisplayCourList;
end;
{Вывод списка курьеров в форму}
procedure TMainWind.DisplayCourList;
var
CurrCourList:TCourier;
begin
FIOCourListBox.Clear;
OtTimeCourListBox.Clear;
DoTimeCourListBox.Clear;
VolumeCourListBox.Clear;
WeightCourListBox.Clear;
CurrCourList:=ListCour;
while CurrCourList<>nil do
begin
FIOCourListBox.Items.Add(IntToStr(CurrCourList.number)+')'+CurrCourList.fiocour);
OtTimeCourListBox.Items.Add('Hour:'+IntToStr(CurrCourList.ottime.hour)+' Min:'+IntToStr(CurrCourList.ottime.min));
DoTimeCourListBox.Items.Add('Hour:'+IntToStr(CurrCourList.dotime.hour)+' Min:'+IntToStr(CurrCourList.dotime.min));
VolumeCourListBox.Items.Add(IntToStr(CurrCourList.Volume));
WeightCourListBox.Items.Add(IntToStr(CurrCourList.Weight));
CurrCourList:=CurrCourList.next;
end;
end;
//вывод списка заказов в таблицу//
Procedure TMainWind.DisplayZakList;
var
currZak:TZakaz;
i:integer;
begin
for i:=0 to ListZakStringGrid.RowCount-1 do
ListZakStringGrid.Rows[i].Clear;
with ListZakStringGrid do
begin
Cells[0,0]:='?';
Cells[1,0]:='Eiy';
Cells[2,0]:='aa?an';
Cells[3,0]:='a?aiy ';
Cells[4,0]:='ainoaaee n:';
Cells[5,0]:='ai:';
Cells[7,0]:='aan';
Cells[8,0]:='iauai';
end;
currZak:=ListZak;
while currZak<>nil do
begin
with ListZakStringGrid do
begin
Cells[0,currZak.number]:=IntToStr(currZak.number);
Cells[1,currZak.number]:=currZak.name;
Cells[2,currZak.number]:=currZak.adress;
Cells[3,currZak.number]:=IntToStr(currZak.othour.hour);
Cells[4,currZak.number]:=IntToStr(currZak.othour.min);
Cells[5,currZak.number]:=IntToStr(currZak.dohour.hour);
Cells[6,currZak.number]:=IntToStr(currZak.dohour.min);
Cells[7,currZak.number]:=IntToStr(currZak.ves);
Cells[8,currZak.number]:=IntToStr(currZak.volume);
end;
currZak:=currZak.next;
end;
end;
{Присваивание номеров курьерам}
Procedure TMainWind.Number;
var
CurrCourList:Tcourier;
i:integer;
begin
i:=1;
CurrCourList:=ListCour;
while CurrCourList<>nil do
begin
CurrCourList.number:=i;
CurrCourList:=CurrCourList.next;
inc(i);
end;
end;
{Присваивание номеров заказам}
Procedure TMainWind.NumberZak;
var
CurrZakList:TZakaz;
i:integer;
begin
i:=1;
CurrZakList:=ListZak;
while CurrZakList<>nil do
begin
CurrZakList.number:=i;
CurrZakList:=CurrZakList.next;
inc(i);
end;
end;
procedure TMainWind.FIOCourListBoxClick(Sender: TObject);
var
curZak:TCurZakaz;
prev:Tcourier;
begin
IF FIOCourListBox.ItemIndex>=0 then
begin
DoTimeCourListBox.ItemIndex:=FIOCourListBox.ItemIndex;
OtTimeCourListBox.ItemIndex:=FIOCourListBox.ItemIndex;
VolumeCourListBox.ItemIndex:=FIOCourListBox.ItemIndex;
WeightCourListBox.ItemIndex:=FIOCourListBox.ItemIndex;
MemoCour.Clear;
curZak:=GetCourierByIndex(FIOCourListBox.ItemIndex,prev).PointZak;
while(curZak<>nil)do
begin
MemoCour.Lines.Add(curZak.zak.name+' '+curZak.zak.adress+' n:'+IntToStr(curZak.zak.othour.hour)+'.'+IntToStr(curZak.zak.othour.min)+' ai:'+IntToStr(curZak.zak.dohour.hour)+'.'+IntToStr(curZak.zak.dohour.min)+' aan:'+IntToStr(curZak.zak.ves)+' iauai:'+IntToStr(curZak.zak.volume));
curZak:=curZak.next;
end;
end;
end;
{нахождение записи выделенного курьера}
function TMainWind.GetCourierByIndex(index:integer;var prevCour:Tcourier):TCourier;
var
temp, curCour:Tcourier;
i:integer;
begin
curCour:=listCour;
i:=0;
while (i<index) and (curCour<>nil) do
begin
prevCour:=CurCour;
CurCour:=curCour.next;
inc(i);
end;
GetCourierByIndex:=curCour;
end;
procedure TMainWind.OtTimeCourListBoxClick(Sender: TObject);
var
curZak:TCurZakaz;
prev:Tcourier;
begin
IF OtTimeCourListBox.ItemIndex>=0 then
begin
FIOCourListBox.ItemIndex:=OtTimeCourListBox.ItemIndex;
DoTimeCourListBox.ItemIndex:=OtTimeCourListBox.ItemIndex;
VolumeCourListBox.ItemIndex:=OtTimeCourListBox.ItemIndex;
WeightCourListBox.ItemIndex:=OtTimeCourListBox.ItemIndex;
MemoCour.Clear;
curZak:=GetCourierByIndex(OtTimeCourListBox.ItemIndex,prev).PointZak;
while(curZak<>nil)do
begin
MemoCour.Lines.Add(curZak.zak.name+' '+curZak.zak.adress+' n:'+IntToStr(curZak.zak.othour.hour)+'.'+IntToStr(curZak.zak.othour.min)+' ai:'+IntToStr(curZak.zak.dohour.hour)+'.'+IntToStr(curZak.zak.dohour.min)+' aan:'+IntToStr(curZak.zak.ves)+' iauai:'+IntToStr(curZak.zak.volume));
curZak:=curZak.next;
end;
end;
end;
procedure TMainWind.DoTimeCourListBoxClick(Sender: TObject);
var
curZak:TCurZakaz;
prev:Tcourier;
begin
IF DoTimeCourListBox.ItemIndex>=0 then
begin
FIOCourListBox.ItemIndex:=DoTimeCourListBox.ItemIndex;
OtTimeCourListBox.ItemIndex:=DoTimeCourListBox.ItemIndex;
VolumeCourListBox.ItemIndex:=DoTimeCourListBox.ItemIndex;
WeightCourListBox.ItemIndex:=DoTimeCourListBox.ItemIndex;
MemoCour.Clear;
curZak:=GetCourierByIndex(DoTimeCourListBox.ItemIndex,prev).PointZak;
while(curZak<>nil)do
begin
MemoCour.Lines.Add(curZak.zak.name+' '+curZak.zak.adress+' n:'+IntToStr(curZak.zak.othour.hour)+'.'+IntToStr(curZak.zak.othour.min)+' ai:'+IntToStr(curZak.zak.dohour.hour)+'.'+IntToStr(curZak.zak.dohour.min)+' aan:'+IntToStr(curZak.zak.ves)+' iauai:'+IntToStr(curZak.zak.volume));
curZak:=curZak.next;
end;
end;
end;
procedure TMainWind.VolumeCourListBoxClick(Sender: TObject);
var
curZak:TCurZakaz;
prev:Tcourier;
begin
IF VolumeCourListBox.ItemIndex>=0 then
begin
FIOCourListBox.ItemIndex:=VolumeCourListBox.ItemIndex;
OtTimeCourListBox.ItemIndex:=VolumeCourListBox.ItemIndex;
DoTimeCourListBox.ItemIndex:=VolumeCourListBox.ItemIndex;
WeightCourListBox.ItemIndex:=VolumeCourListBox.ItemIndex;
MemoCour.Clear;
curZak:=GetCourierByIndex(VolumeCourListBox.ItemIndex,prev).PointZak;
while(curZak<>nil)do
begin
MemoCour.Lines.Add(curZak.zak.name+' '+curZak.zak.adress+' n:'+IntToStr(curZak.zak.othour.hour)+'.'+IntToStr(curZak.zak.othour.min)+' ai:'+IntToStr(curZak.zak.dohour.hour)+'.'+IntToStr(curZak.zak.dohour.min)+' aan:'+IntToStr(curZak.zak.ves)+' iauai:'+IntToStr(curZak.zak.volume));
curZak:=curZak.next;
end;
end;
end;
procedure TMainWind.WeightCourListBoxClick(Sender: TObject);
var
curZak:TCurZakaz;
prev:Tcourier;
begin
IF WeightCourListBox.ItemIndex>=0 then
begin
FIOCourListBox.ItemIndex:=WeightCourListBox.ItemIndex;
OtTimeCourListBox.ItemIndex:=WeightCourListBox.ItemIndex;
DoTimeCourListBox.ItemIndex:=WeightCourListBox.ItemIndex;
VolumeCourListBox.ItemIndex:=WeightCourListBox.ItemIndex;
MemoCour.Clear;
curZak:=GetCourierByIndex(WeightCourListBox.ItemIndex,prev).PointZak;
while(curZak<>nil)do
begin
MemoCour.Lines.Add(curZak.zak.name+' '+curZak.zak.adress+' n:'+IntToStr(curZak.zak.othour.hour)+'.'+IntToStr(curZak.zak.othour.min)+' ai:'+IntToStr(curZak.zak.dohour.hour)+'.'+IntToStr(curZak.zak.dohour.min)+' aan:'+IntToStr(curZak.zak.ves)+' iauai:'+IntToStr(curZak.zak.volume));
curZak:=curZak.next;
end;
end;
end;
{Добавление заказов курьерам}
function TMainWind.AddZakazToCur(zak:TZakaz):boolean;
var
curCur:Tcourier;
curCurZak,prevCurZak,temp:TCurZakaz;
Begin
if(zak = nil) then exit;
curCur:=listCour;
while(curCur<>nil)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);
temp.zak:=zak;
temp.next:=curCur.PointZak;
curCur.PointZak:=temp;
curCur.NowWeight:=curCur.NowWeight+zak.ves;
curCur.NowVolume:=CurCur.NowVolume+zak.volume;
zak.addToCour:=true;
break;
end;
curCur:=curCur.next;
end;
AddZakazToCur:=zak.addToCour;
end;
{Редактирование курьеров}
procedure TMainWind.ChangeCourButtonClick(Sender: TObject);
var
CurrListZak:TCurZakaz;
CurrZak:TZakaz;
Prev:Tcourier;
begin
tempBuffer:=GetCourierByIndex(FIOCourListBox.ItemIndex,prev);
EditCourForm.ShowModal;
if EditCourUnit.ifEditButClick=true then
begin
CurrListZak:=tempBuffer.PointZak;
tempBuffer.PointZak:=nil;
while CurrListZak<>nil do
begin
CurrListZak.zak.addToCour:=false;
CurrListZak:=CurrListZak.next;
end;
currZak:=ListZak;
while currZak<>nil do
begin
AddZakazToCur(currZak);
currZak:=currZak.next;
end;
DisplayCourList;
end;
end;
{Удаление курьеров}
procedure TMainWind.DeleteCourButtonClick(Sender: TObject);
var
DelCour,PrevCour:TCourier;
CourZakBuff:TCurZakaz;
begin
PrevCour:=nil;
DelCour:=GetCourierByIndex(FIOCourListBox.ItemIndex,prevCour);
if FIOCourListBox.ItemIndex=0 then
begin
CourZakBuff:=DelCour.PointZak;
ListCour:=DelCour.next;
dispose(DelCour);
end
else
begin
CourZakBuff:=DelCour.PointZak;
prevCour.next:=DelCour.next;
end;
while courZakBuff<>nil do
begin
CourZakBuff.zak.addToCour:=false;
AddZakazToCur(CourZakBuff.zak);
CourZakBuff:=CourZakBuff.next;
end;
number;
DisplayCourList;
end;
{Редактирование заказов}
procedure TMainWind.ChangeZakButtonClick(Sender: TObject);
var
currZak,temp:Tzakaz;
begin
If ListZakStringGrid.Row>=0 then
begin
currZak:=listZak;
while currZak.number<>ListZakStringGrid.Row do
currZak:=currZak.next;
tempBufZak:=currZak;
ChangeZakForm.ShowModal;
end;
DisplayZakList;
AddZakazToCur(tempBufZak);
end;
{Удаление заказов}
procedure TMainWind.DeleteZakButtonClick(Sender: TObject);
var
Prev,DelZak,curZakCour:Tzakaz;
PrevZak,CurrZak:TCurZakaz;
CurrCour:Tcourier;
ifZakDelete:boolean;
begin
ifZakDelete:=false;
DelZak:=ListZak;
Prev:=nil;
while DelZak.number<>ListZakStringGrid.Row do
begin
prev:=delZak;
DelZak:=DelZak.next;
end;
currCour:=ListCour;
while CurrCour<>nil do
begin
prevZak:=nil;
currZak:=CurrCour.PointZak;
While currZak<>nil do
begin
If currZak.zak.number=DelZak.number then
begin
if prevZak=nil then
begin
CurrCour.PointZak:=CurrZak.next;
dispose(currZak);
end
else
begin
PrevZak.next:=currZak.next;
dispose(currZak);
end;
ifZakDelete:=true;
break;
end;
PrevZak:=CurrZak;
currzak:=currzak.next;
end;
if not ifZakDelete then
CurrCour:=CurrCour.next
else
break;
end;
if prev=nil then
begin
listZak:=DelZak.next;
dispose(DelZak);
end
else
begin
Prev.next:=DelZak.next;
dispose(DelZak);
end;
NumberZak;
DisplayZakList;
curZakCour:=ListZak;
while curZakCour<>nil do
begin
AddZakazToCur(CurZakCour);
curZakCour:=curZakCour.next;
end;
MemoCour.Clear;
DisplayCourList;
end;
end.
unit GlobalTypes;
interface
Type
time=record
hour:integer;
min:integer;
end;
Tzakaz=^zakaz;
zakaz=record
name:string;
number:integer;
adress:string;
othour:time;
dohour:time;
ves:integer;
volume:integer;
next:Tzakaz;
addToCour:boolean;
end;
TCurZakaz=^curZakaz;
curZakaz=record
zak:Tzakaz;
next:TCurZakaz;
end;
Tcourier=^courier;
courier=record
number:integer;
fiocour:string;
ottime:time;
dotime:time;
//time:integer;
Volume:integer;
weight:integer;
next:Tcourier;
NowWeight:integer;
NowVolume:integer;
PointZak:TCurZakaz;
end;
var
tempBuffer:Tcourier;
tempBufZak:Tzakaz;
implementation
end.
unit NewCourierUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, GlobalTypes;
type
TNewCourForm = class(TForm)
AddCourGroupBox: TGroupBox;
FIOCourEdit: TEdit;
OtHourCourEdit: TEdit;
DoHourCourEdit: TEdit;
VolCourEdit: TEdit;
WeightCourEdit: TEdit;
OtMinCourEdit: TEdit;
DoMinCourEdit: TEdit;
AddCourButton: TButton;
FIOCourLabel: TLabel;
OtTimeLabel: TLabel;
DoTimeLabel: TLabel;
VolCourLabel: TLabel;
WeightCourLabel: TLabel;
procedure FormCreate(Sender: TObject);
procedure AddCourButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
NewCourForm: TNewCourForm;
NewCour:TCourier;
ifAddButClick: boolean;
implementation
{$R *.dfm}
procedure TNewCourForm.FormCreate(Sender: TObject);
begin
ifAddButClick:=false;
end;
procedure TNewCourForm.AddCourButtonClick(Sender: TObject);
var
FIO:string;
OtHour,OtMinute,DoHour,DoMinute,Volume,Weight:integer;
begin
ifAddButClick:=false;
FIO:=FIOCourEdit.Text;
If FIO='' then
begin
ShowMessagePos('Wrong FIO',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
OtHour:=StrToInt(OtHourCourEdit.Text);
if(OtHour<0)or(OtHour>23) then
raise Exception.Create('error with hour');
end;
except
ShowMessagePos('Ioeaea a iiea ?anu aey ia?aea a?aiaie ?aaiou',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
OtMinute:=StrToInt(OtMinCourEdit.Text);
if(OtMinute<0)or(OtMinute>59) then
raise Exception.Create('error with minute');
end;
except
ShowMessagePos('Ioeaea a iiea Ieioou aey ia?aea a?aiaie ?aaiou',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
DoHour:=StrToInt(DoHourCourEdit.Text);
if(DoHour<0)or(DoHour>23) then
raise Exception.Create('error with Hour');
end;
except
ShowMessagePos('Ioeaea a iiea ?anu aey eiioa a?aiaie ?aaiou',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
DoMinute:=StrToInt(DoMinCourEdit.Text);
if(DoMinute<0)or(DoMinute>59) then
raise Exception.Create('error with minute');
end;
except
ShowMessagePos('Ioeaea a iiea Ieioou aey ia?aea a?aiaie ?aaiou',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
try
begin
if OtHour>DoHour then
raise Exception.Create('error with time');
end;
except
ShowMessagePos('Ioeaea ?acieou a?aiaie',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
try
begin
if (OtHour=DoHour) and (OtMinute>DoMinute) then
raise Exception.Create('error with time');
end;
except
ShowMessagePos('Ioeaea ?acieou a?aiaie',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
try
begin
if VolCourEdit.Text='' then
raise Exception.Create('error with volum');
end;
except
ShowMessagePos('Ioeaea a iiea Iauai',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
Volume:=StrToInt(VolCourEdit.Text);
If Volume<=0 then
Begin
ShowMessagePos('Wrong volume',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
if WeightCourEdit.Text='' then
raise Exception.Create('error with weight');
end;
except
ShowMessagePos('Ioeaea a iiea Aan',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
Weight:=StrToInt(WeightCourEdit.Text);
If Weight<=0 then
Begin
ShowMessagePos('Wrong weight',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
ifAddButClick:=true;
//создание списка курьеров
new(NewCour);
NewCour.fiocour:=fio;
NewCour.ottime.hour:=OtHour;
NewCour.ottime.min:=OtMinute;
NewCour.dotime.hour:=DoHour;
NewCour.dotime.min:=DoMinute;
NewCour.Volume:=volume;
NewCour.weight:=Weight;
NewCour.NowWeight:=0;
NewCour.NowVolume:=0;
NewCour.PointZak:=nil;
NewCourForm.Close();
end;
end.
unit NewOrderUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, GlobalTypes;
type
TNewZakForm = class(TForm)
ChangeZakGroupBox: TGroupBox;
NameZakEdit: TEdit;
AdrZakEdit: TEdit;
OtHourEdit: TEdit;
DoHourEdit: TEdit;
VolEdit: TEdit;
VesEdit: TEdit;
NameZakLabel: TLabel;
AdrLabel: TLabel;
OtTimeZakLabel: TLabel;
DoTimeZakLabel: TLabel;
VolZakLabel: TLabel;
WeightZakLabel: TLabel;
NewAddZakButton: TButton;
OtMinuteEdit: TEdit;
DoMinuteEdit: TEdit;
procedure FormCreate(Sender: TObject);
procedure NewAddZakButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
NewZakForm: TNewZakForm;
newZak:Tzakaz;
ifAddButClick:boolean;
implementation
{$R *.dfm}
procedure TNewZakForm.FormCreate(Sender: TObject);
begin
ifAddButClick:=false;
end;
procedure TNewZakForm.NewAddZakButtonClick(Sender: TObject);
var
name,adress:string;
OtHour,OtMinute,DoHour,DoMinute,Volume,Weight:integer;
begin
ifAddButClick:=false;
name:=NameZakEdit.Text;
If name='' then
begin
ShowMessagePos('Wrong name',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
adress:=AdrZakEdit.Text;
If adress='' then
begin
ShowMessagePos('Wrong adress',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
OtHour:=StrToInt(OtHourEdit.Text);
if(OtHour<0)or(OtHour>23) then
raise Exception.Create('error with hour');
end;
except
ShowMessagePos('Ioeaea a iiea ?anu aey ia?aea a?aiaie ainoaaee',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
OtMinute:=StrToInt(OtMinuteEdit.Text);
if(OtMinute<0)or(OtMinute>59) then
raise Exception.Create('error with minute');
end;
except
ShowMessagePos('Ioeaea a iiea Ieioou aey ia?aea a?aiaie ainoaaee',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
DoHour:=StrToInt(DoHourEdit.Text);
if(DoHour<0)or(DoHour>23) then
raise Exception.Create('error with Hour');
end;
except
ShowMessagePos('Ioeaea a iiea ?anu aey eiioa a?aiaie ainoaaee',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
DoMinute:=StrToInt(DoMinuteEdit.Text);
if(DoMinute<0)or(DoMinute>59) then
raise Exception.Create('error with minute');
end;
except
ShowMessagePos('Ioeaea a iiea Ieioou aey ia?aea a?aiaie ainoaaee',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
try
begin
if OtHour>DoHour then
raise Exception.Create('error with time');
end;
except
ShowMessagePos('Ioeaea ?acieou a?aiaie',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
try
begin
if (OtHour=DoHour) and (OtMinute>DoMinute) then
raise Exception.Create('error with time');
end;
except
ShowMessagePos('Ioeaea ?acieou a?aiaie',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
try
begin
if VolEdit.Text='' then
raise Exception.Create('error with volum');
end;
except
ShowMessagePos('Ioeaea a iiea Iauai',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
Volume:=StrToInt(VolEdit.Text);
If Volume<=0 then
Begin
ShowMessagePos('Wrong volume',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
if VesEdit.Text='' then
raise Exception.Create('error with weight');
end;
except
ShowMessagePos('Ioeaea a iiea Aan',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
Weight:=StrToInt(VesEdit.Text);
If Weight<=0 then
Begin
ShowMessagePos('Wrong weight',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
//nicaaiea nienea
ifAddButClick:=true;
New(NewZak);
NewZak.name:= name;
NewZak.adress:=adress;
NewZak.othour.hour:=othour;
NewZak.othour.min:=otminute;
NewZak.dohour.hour:=dohour;
NewZak.dohour.min:=dominute;
NewZak.volume:=volume;
NewZak.ves:=weight;
NewZakForm.Close();
end;
end.
unit EditCourUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, GlobalTypes;
type
TEditCourForm = class(TForm)
EditCourGroupBox: TGroupBox;
EditFIOCourLabel: TLabel;
EditOtTimeLabel: TLabel;
EditDoTimeLabel: TLabel;
EditVolCourLabel: TLabel;
EditWeightCourLabel: TLabel;
EditFIOCourEdit: TEdit;
EditOtHourCourEdit: TEdit;
EditDoHourCourEdit: TEdit;
EditVolCourEdit: TEdit;
EditOtMinCourEdit: TEdit;
EditDoMinCourEdit: TEdit;
EditCourButton: TButton;
EditWeightCourEdit: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure EditCourButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
EditCourForm: TEditCourForm;
EditCour:TCourier;
ifEditButClick: boolean;
implementation
{$R *.dfm}
procedure TEditCourForm.FormCreate(Sender: TObject);
begin
ifEditButClick:=false;
end;
procedure TEditCourForm.FormActivate(Sender: TObject);
begin
EditFIOCourEdit.Text:=GlobalTypes.tempBuffer.fiocour;
EditOtHourCourEdit.Text:=IntToStr(tempBuffer.ottime.hour);
EditOtMinCourEdit.Text:=IntToStr(tempBuffer.ottime.min);
EditDoHourCourEdit.Text:=IntToStr(tempBuffer.dotime.hour);
EditDoMinCourEdit.Text:=IntToStr(tempBuffer.dotime.min);
EditVolCourEdit.Text:=IntToStr(tempBuffer.Volume);
EditWeightCourEdit.Text:=IntToStr(tempBuffer.weight);
end;
procedure TEditCourForm.EditCourButtonClick(Sender: TObject);
var
FIO:string;
OtHour,OtMinute,DoHour,DoMinute,Volume,Weight:integer;
begin
ifEditButClick:=false;
FIO:=EditFIOCourEdit.Text;
If FIO='' then
begin
ShowMessagePos('Wrong FIO',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
OtHour:=StrToInt(EditOtHourCourEdit.Text);
if(OtHour<0)or(OtHour>23) then
raise Exception.Create('error with hour');
end;
except
ShowMessagePos('Ioeaea a iiea ?anu aey ia?aea a?aiaie ?aaiou',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
OtMinute:=StrToInt(EditOtMinCourEdit.Text);
if(OtMinute<0)or(OtMinute>59) then
raise Exception.Create('error with minute');
end;
except
ShowMessagePos('Ioeaea a iiea Ieioou aey ia?aea a?aiaie ?aaiou',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
DoHour:=StrToInt(EditDoHourCourEdit.Text);
if(DoHour<0)or(DoHour>23) then
raise Exception.Create('error with Hour');
end;
except
ShowMessagePos('Ioeaea a iiea ?anu aey eiioa a?aiaie ?aaiou',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
DoMinute:=StrToInt(EditDoMinCourEdit.Text);
if(DoMinute<0)or(DoMinute>59) then
raise Exception.Create('error with minute');
end;
except
ShowMessagePos('Ioeaea a iiea Ieioou aey ia?aea a?aiaie ?aaiou',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
try
begin
if OtHour>DoHour then
raise Exception.Create('error with time');
end;
except
ShowMessagePos('Ioeaea ?acieou a?aiaie',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
try
begin
if (OtHour=DoHour) and (OtMinute>DoMinute) then
raise Exception.Create('error with time');
end;
except
ShowMessagePos('Ioeaea ?acieou a?aiaie',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
try
begin
if EditVolCourEdit.Text='' then
raise Exception.Create('error with volum');
end;
except
ShowMessagePos('Ioeaea a iiea Iauai',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
Volume:=StrToInt(EditVolCourEdit.Text);
If Volume<=0 then
Begin
ShowMessagePos('Wrong volume',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
if EditWeightCourEdit.Text='' then
raise Exception.Create('error with weight');
end;
except
ShowMessagePos('Ioeaea a iiea Aan',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
Weight:=StrToInt(EditWeightCourEdit.Text);
If Weight<=0 then
Begin
ShowMessagePos('Wrong weight',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
ifEditButClick:=true;
tempBuffer.fiocour:=fio;
tempBuffer.ottime.hour:=OtHour;
tempBuffer.ottime.min:=OtMinute;
tempBuffer.dotime.hour:=DoHour;
tempBuffer.dotime.min:=DoMinute;
tempBuffer.Volume:=volume;
tempBuffer.weight:=Weight;
tempBuffer.NowWeight:=0;
tempBuffer.NowVolume:=0;
Close();
end;
end.
unit EditZakUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, GlobalTypes, Grids;
type
TChangeZakForm = class(TForm)
AddGroupBox: TGroupBox;
NameZakLabel: TLabel;
AdrLabel: TLabel;
OtTimeZakLabel: TLabel;
DoTimeZakLabel: TLabel;
VolZakLabel: TLabel;
WeightZakLabel: TLabel;
NameChangeZakEdit: TEdit;
AdrChangeZakEdit: TEdit;
ChangeOtHourEdit: TEdit;
ChangeDoHourEdit: TEdit;
ChangeVolEdit: TEdit;
ChangeVesEdit: TEdit;
ChangeZakButton: TButton;
ChangeOtMinuteEdit: TEdit;
ChangeDoMinuteEdit: TEdit;
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ChangeZakButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
ChangeZakForm: TChangeZakForm;
IfChangeButClick: boolean;
implementation
{$R *.dfm}
procedure TChangeZakForm.FormCreate(Sender: TObject);
begin
IfChangeButClick:=false;
end;
procedure TChangeZakForm.FormActivate(Sender: TObject);
begin
NameChangeZakEdit.Text:=tempBufZak.name;
AdrChangeZakEdit.Text:=tempBufZak.adress;
ChangeOtHourEdit.Text:=IntToStr(tempBufZak.othour.hour);
ChangeOtMinuteEdit.Text:=IntToStr(tempBufZak.othour.min);
ChangeDoHourEdit.Text:=IntToStr(tempBufZak.dohour.hour);
ChangeDoMinuteEdit.Text:=IntToStr(tempBufZak.dohour.min);
ChangeVesEdit.Text:=IntToStr(tempBufZak.ves);
ChangeVolEdit.Text:=IntToStr(tempBufZak.volume);
end;
procedure TChangeZakForm.ChangeZakButtonClick(Sender: TObject);
var
name,adress:string;
OtHour,OtMinute,DoHour,DoMinute,Volume,Weight:integer;
begin
ifChangeButClick:=false;
name:=NameChangeZakEdit.Text;
If name='' then
begin
ShowMessagePos('Wrong name',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
adress:=AdrChangeZakEdit.Text;
If adress='' then
begin
ShowMessagePos('Wrong adress',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
OtHour:=StrToInt(ChangeOtHourEdit.Text);
if(OtHour<0)or(OtHour>23) then
raise Exception.Create('error with hour');
end;
except
ShowMessagePos('Ioeaea a iiea ?anu aey ia?aea a?aiaie ainoaaee',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
OtMinute:=StrToInt(ChangeOtMinuteEdit.Text);
if(OtMinute<0)or(OtMinute>59) then
raise Exception.Create('error with minute');
end;
except
ShowMessagePos('Ioeaea a iiea Ieioou aey ia?aea a?aiaie ainoaaee',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
DoHour:=StrToInt(ChangeDoHourEdit.Text);
if(DoHour<0)or(DoHour>23) then
raise Exception.Create('error with Hour');
end;
except
ShowMessagePos('Ioeaea a iiea ?anu aey eiioa a?aiaie ainoaaee',Left+Width div 2-50,top + Height div 2-50);
exit;
end;
try
begin
DoMinute:=StrToInt(ChangeDoMinuteEdit.Text);
if(DoMinute<0)or(DoMinute>59) then
raise Exception.Create('error with minute');
end;
except
ShowMessagePos('Ioeaea a iiea Ieioou aey ia?aea a?aiaie ainoaaee',Left+Width div 2-50,top+Height div 2-50);
exit;
end;
try
begin
if OtHour>DoHour then
Подобные документы
Создание автоматизированной системы – "Агентство по трудоустройству". Проектирование таблиц для хранения данных. Разработка запросов и отчетов, предназначенных для просмотра, редактирования и вывода информации. Разработка пользовательского интерфейса.
курсовая работа [4,9 M], добавлен 29.01.2011Технология разработки пользовательского интерфейса в среде Delphi. Создание таблицы, меню, форм для ввода и редактирования данных. Принципы организации меню как элемента интерфейса пользователя. Реализация сортировки, фильтрации, вычислений в таблице.
курсовая работа [1,6 M], добавлен 13.11.2012Формирование требований к системе. Описание входной и выходной информации. Концептуальное и логическое проектирование структуры и пользовательского интерфейса. Выбор средств реализации подсистемы. Реализация функциональности программного средства.
курсовая работа [1,3 M], добавлен 28.08.2012Формирование на экране меню для выбора функций. Элементы пользовательского интерфейса. Описание внутренних переменных, входных и выходных данных языка программирования Си. Выбор пользователем функции. Создание программы "Список коммерческих банков".
курсовая работа [491,9 K], добавлен 17.03.2015Разработка и программная реализация сайта и базы данных, наполнение базы данных тестовой информацией о товарах. Инструментальные средства создания сайта. Организация тестирования сайта, модуль визуализации интерфейса. Создание запросов в базе данных SQL.
курсовая работа [1,4 M], добавлен 24.12.2012Программная реализация настольного приложения с использованием языка программирования C#. Проектирование и структура пользовательского интерфейса, требования к нему и оценка функциональности. Разработка руководства пользователя и его использование.
курсовая работа [297,6 K], добавлен 10.03.2015Требования к составу и параметрам технических средств. Выбор языка программирования. Структурная схема программного продукта. Проектирование пользовательского интерфейса. Создание системы и заполнение базы данных. Разработка форм ввода-вывода информации.
курсовая работа [1,2 M], добавлен 30.01.2016Создание программы для составления оптимального плана закупки товара у поставщиков, его реализация с помощью простого и модифицированного симплекс-методов. Проектирование математического обеспечения решения задачи. Описание пользовательского интерфейса.
курсовая работа [1,2 M], добавлен 21.01.2011Структурная диаграмма программного модуля. Разработка схемы программного модуля и пользовательского интерфейса. Реализация программного модуля: код программы; описание использованных операторов и функций. Вид пользовательской формы с заполненной матрицей.
курсовая работа [215,3 K], добавлен 01.09.2010Средства для отображения информации в виде отчетов для редактирования и занесения новых данных в систему. Графическая диаграмма IDEFO функциональной модели предметной области. Связи между атрибутами. Разработка пользовательского интерфейса системы.
курсовая работа [2,3 M], добавлен 21.10.2012