Создание программного обеспечения для работы с информационной системой расчетов по договорам
Создание баз хозяйственных договоров, банков и членов временных трудовых коллективов в среде разработки Delphi. Логическая структура линейного двусвязного списка. Способ упорядочения и алгоритм сортировки списка. Руководство пользования программой.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 14.02.2016 |
Размер файла | 749,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
26
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Создание программного обеспечения для работы с информационной системой расчетов по договорам
Введение
Данная разработка посвящена созданию программного обеспечения для работы с информационной системой расчетов по договорам. Продукт может использоваться коммерческими научно-производственными организациями (НПО), которые регистрируют хозяйственные договоры (ХД), выполняемые временными трудовыми коллективами (ВТК). В работе предусмотрены следующие моменты:
- открытие существующих и создание новых баз (хозяйственных договоров, банков и членов ВТК);
- возможно работа с каждой базой в отдельности (просмотр содержимого баз, добавление новой записи, изменение существующих данных и удаление записи из базы);
- осуществлен вывод на экран данных о членах ВТК всех незавершенных хозяйственных договоров;
- предусмотрена сортировка данных по различным аспектам;
- присутствует поиск записей по различным атрибутам, а именно: по имени члена ВТК, по фамилии, отчеству, году рождения, городу, где находится банк и по суме вознаграждения;
- сохранение всех измененных данных.
Работа выполнена на языке Object Pascal в среде разработки Delphi 2005. Object Pascal -- результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Паскаль был полностью процедурным языком, Турбо Паскаль, начиная с версии 5.5, добавил в Паскаль объектно-ориентированные свойства, а в Object Pascal -- динамическую идентификацию типа данных с возможностью доступа к метаданным классов.
Выбор среды разработки Delphi обусловлен как тем, что это наиболее популярная среда программирования, так и несомненными объективными достоинствами Delphi. Среди этих достоинств:
- простой и мощный язык программирования Pascal;
- удобная и полная объектная модель;
- достаточно удобная среда разработки;
- обширная объектная библиотека VCL;
- мощные средства разработки приложений баз данных.
1. Состав delphi-проекта
Общая структура Delphi-проекта.
Рисунок 1.1 - Состав проекта
Форма FormBank (модуль UnitBank) предназначена для работы с базой банков.
Рисунок 1.2 - Форма работы с банками
Форма FormClikBAnk (модуль UnitClikBank) предназначена для выбора записи одного из банков.
Рисунок 1.3 - Форма выбора из списка банков
Форма FormClikXD (модуль UnitClikXD) предназначена для выбора записи одного из хозяйственных договоров.
Рисунок 1.4 - Форма выбора записи из списка ХД
Форма FormCreatFile (модуль UnitCreatFile) предназначена создания файлов, которые и будут содержать в себе базы.
Рисунок 1.5 - Форма для создания файлов баз
Форма FormFind (модуль UnitFind) предназначена для выбора критериев поиска и вывод найденых записей в виде таблицы.
Рисунок 1.6 - Форма поиска записей
Форма MainForm (модуль UnitMain) является главной формой программы, откуда производится вызов всех других вспомогательных форм. Также на этой форме производится работа с базовой структурой - список всех членов ВТК незавершенных ХД.
Рисунок 1.7 - Главная форма программы
Форма FormOpenData (модуль UnitOpenData) предназначена открытия файлов, в которых находятся базы.
Рисунок 1.8 - Форма для открытия баз данных
Форма FormWTK (модуль UnitWTK) предназначена для работы с базой ВТК.
Рисунок 1.9 - Форма для работы с членами ВТК
Форма FormMainXD (модуль UnitXD) предназначена для работы с базой хозяйственных договоров.
Рисунок 1.10 - Форма для работы с базой банков
Модуль UnitRecordNfile содержит описание всех глобальных типов данных, методов и объявлений переменных необходимых при работе программы.
Модуль ClassList содержит описание базовой структуры - линейного двусвязного списка, а также класс, в котором реализованы все операции с этим списком.
2. Статические данные и структуры
Ниже приводится описание и назначение основных структур и данных, используемых в программе.
Type
TBank=record
Number:1..9999;//номер отделения банка
City:string[50];//город. Где находится отделение
Addres:string[50];//адрес отделения
NameFront:string[50];//название отделения
Cod:1..999;//код отделения (3-хзначное число)
end;
TWTK=record
FamilyName:string[50];//фамилия члена ВТК
Name:string[50];//имя члена ВТК
Patronymic:string[50];//отчество члена ВТК
Year:integer;//год рождения
Kod:string[10];//код хозяйственного договора
Sign:(Head,Radovo);//должность
SummMany:extended;//вознагрождение за работу
Addres:string[50];//адрес проживания
NumberBank:1..9999;//номер отделения сбербанка
Account:1..9999999;расчетный счет исполнителя
end;
TXD=record
Number:integer;//номер хозяйственного договора
DateCreat:TDateTime;//дата подписания договора
DataFree:TDateTime;//дата завершения договора
Tema:string[50];//тема договора
Customer:string[50];//заказчик работ
PriznakFree:Boolean;//признак готовности
Price:extended;//вознаграждение на каждого члеан ВТК выполнявшие работу
end;
var
Fbank: file of TBank;
Fwtk: file of TWTK;
Fxd: file of TXD;
XD:array of TXD;//массив записей
BTK:array of TWTK;//массив записей
BANK:array of TBank;//массив записей
NameFbank:string;//имя файла базы банков
NameFwtk:string; //имя файла базы ВТК
NameFxd:string; //имя файла базы ХД
Анализ размещения глобальных и локальных данных в памяти (объем занимаемой памяти и указания адресов)
Таблица 1
Тип |
Имя переменной |
Размер памяти в байтах |
Начальный адрес |
|
Глобальные переменные |
||||
TB |
Fbank |
332 |
$49ABA8 |
|
TW |
Fwtk |
332 |
$49ACF4 |
|
TX |
FXD |
332 |
$49AE40 |
|
Array of TXD |
XD |
4 |
$49AF8C |
|
Array of TWTk |
BTK |
4 |
$49AF90 |
|
Array of TBank |
BANK |
4 |
$49AF94 |
|
integer |
XD[0].Number |
4 |
$9D6A24 |
|
TDateTime |
XD[0]. DateCreat |
8 |
$9D6A2C |
|
TDateTime |
XD[0]. DataFree |
8 |
$9D6A34 |
|
string[50] |
XD[0]. Tema |
51 |
$9D6A3C |
|
string[50] |
XD[0]. Customer |
51 |
$9D6A6F |
|
Boolean |
XD[0]. PriznakFree |
1 |
$9D6AA2 |
|
extended |
XD[0]. Price |
10 |
$9D6AA4 |
|
1..9999 |
BANK[0]. Number |
2 |
$9D3FDC |
|
string[50] |
BANK[0]. City |
51 |
$9D3FDE |
|
string[50] |
BANK[0]. Addres |
51 |
$9D4011 |
|
string[50] |
BANK[0]. NameFront |
51 |
$9D4044 |
|
1..999 |
BANK[0]. Cod |
2 |
$9D4078 |
|
string[50] |
BTK[0]. FamilyName |
51 |
$9D737C |
|
string[50] |
BTK[0]. Name |
51 |
$9D73AF |
|
string[50] |
BTK[0]. Patronymic |
51 |
$9D73E2 |
|
Integer |
BTK[0]. Year |
4 |
$9D7418 |
|
string[10] |
BTK[0]. Kod |
11 |
$9D741C |
|
(Head,Radovo) |
BTK[0]. Sign |
1 |
$9D7427 |
|
Extended |
BTK[0]. SummMany |
10 |
$9D742C |
|
string[50] |
BTK[0]. Addres |
51 |
$9D7436 |
|
1..9999 |
BTK[0]. NumberBank |
2 |
$9D746A |
|
1..9999999 |
BTK[0]. Account |
4 |
$9D746C |
|
string |
NameFbank |
4 |
$49AF98 |
|
string |
NameFwtk |
4 |
$49AF9C |
|
string |
NameFxd |
4 |
$49AFA0 |
|
Некоторые локальные переменные |
||||
Cardinal |
i (procedure TFormBank.ButtonCutBankClick) |
4 |
$12EC94 |
|
Cardinal |
N (procedure TFormBank.ButtonDelBankClick) |
4 |
$12EC98 |
|
Word |
Year (procedure TNoFreeXD.FormingList) |
2 |
$12F606 |
3. Логические структуры данных
Основная структура данных проекта - линейный двусвязный список. Атрибутами элементов списка являются имя, фамилия и отчество члена ВТК, год рождения, код ХД, сумма вознаграждения и горо, где находится отделение банка. Кроме того, каждый элемент списка содержит два указателя, один из которых, прямой указатель (direct pointer), адресует следующий справа элемент, а другой, обратный указатель (backward pointer), адресует предыдущий элемент списка.
Ниже представлено описание элемента списка.
Type
TPointer = ^TListStore;
TListStore=record
Name: string[50];//имя
FamilyName:string[50];//фамилия
Patronymic:string[50];//отчество
Year:integer;//год рождения
Kod:string[10];//код ХД
SummMany:extended;//вознаграждение
City:string[100];//город
Dir,Back:TPointer;//указатели
end;
Начало и конец такого списка эквивалентны, так как доступ к элементу может быть осуществлен с любого конца. Поэтому вместо терминов «начало» и «конец» списка используют термины «левый конец» и «правый конец». Соответственно называются и указатели:
Var
Left, Right, Current, G, Sort:TPointer;
Рис. 1 Логическая структура списка
4. Алгоритмы обработки основных структур
Вся работа со списком определена в классе TNoFreeXD. Ниже рассмотрены все его процедуры (операции над списком).
TNoFreeXD=class(TObject)
private
Left{начало}, Right{конец}, Current, G, Sort{для сортировки}:TPointer;
procedure ElementToStringGrid(i:Cardinal;StringGrid:TStringGrid);
public
procedure FormingList;
procedure GetList(StringGrid:TStringGrid);
procedure ClearList;
procedure Sorting(Index:Integer;Increase:Boolean);
procedure Replace;
procedure Search(Index:Integer;Text:String;StringGrid:TStringGrid);
end;
1. Формирование линейного двусвязного списка членов незавершенных ХД.
Производится просмотр всех членов ВТК. Если член ВТК связан с ХД который не завершен, то он заносится в список (заполняются соответствующие поля элемента списка).
procedure TNoFreeXD.FormingList;
var
i,j,k:Cardinal;
str,_strYear:string;
Year: Word;
Month: Word;
Day: Word;
begin
ClearList;
New(Current);
Left:=Current;//указатель на начало
Current^.Back:=nil;//указатель на предыдущий должен равен быть в начале (nil)
for i:=0 to GetBTKM-1 do
begin
for j:=0 to GetXDM-1 do
begin
DecodeDate(XD[j].DateCreat,Year,Month,Day);
_strYear:=IntToStr(Year);
str:=IntToStr(XD[j].Number)+'/'+_strYear[3]+_strYear[4];
if (str=BTK[i].Kod) and (XD[j].PriznakFree=false) then
begin
Current^.Name:=BTK[i].Name;
Current^.FamilyName:=BTK[i].FamilyName;
Current^.Patronymic:=BTK[i].Patronymic;
Current^.Year:=BTK[i].Year;
Current^.Kod:=BTK[i].Kod;
Current^.SummMany:=BTK[i].SummMany;
for k:=0 to GetBANKM-1 do
begin
if BANK[k].Number=BTK[k].NumberBank then
begin
Current^.City:=BANK[i].City;
end;
end;
New(Current^.Dir);
Current^.Dir^.Back:= Current;//указатель на данный элемент
Current:=Current^.Dir;//указатель на следующий
end;
end;
end;
Current^.Back^.Dir:=nil;
Right:=Current^.Back;//указатель на конец списка(равен предыдущему)
Dispose(Current);
end;
Логические схемы операции формирования списка.
После выполнения операторов
New(Current); Left:=Current; Current^.Back:=nil;
Рис. 2
Рис. 3 После нахождения первого члена ВТК.
Рис. 4 После завершения просмотра.
После выполнения операторов
Current^.Back^.Dir:=nil; Right:=Current^.Back; Dispose(Current);
Рис. 5
2. Просмотр списка и его отображение в таблице StringGrid
Сначала производится очистка таблицы, а затем последовательный просмотр элементов списка, начиная с левого конца.
procedure TNoFreeXD.GetList(StringGrid:TStringGrid);
var
i,j:integer;
begin
for i:=1 to 25 do
for j:=0 to 8 do
StringGrid.Cells[j,i]:='';
Current:=Left;//получаем указатель на начало
i:=1;
while Current<> nil do
begin
StringGrid.Cells[0,i]:=IntToStr(i);
StringGrid.Cells[1,i]:=Current^.Name;
StringGrid.Cells[2,i]:=Current^.FamilyName;
StringGrid.Cells[3,i]:=Current^.Patronymic;
StringGrid.Cells[4,i]:=IntToStr(Current^.Year);
StringGrid.Cells[5,i]:=Current^.Kod;
StringGrid.Cells[6,i]:=FloatToStr(Current^.SummMany);
StringGrid.Cells[7,i]:=Current^.City;
Current:=Current^.Dir;//указатель на следующий элемент
Inc(i);
end;
end;
3. Поиск элементов по заданному атрибуту в списке
Пользователь задает атрибут поиска и его значение. В процедуре Search производится последовательный просмотр элементов списка в направлении от левого конца к правому. Если элемент удовлетворяет искомому значению, то он помещается в таблицу. По завершении поиска появляется сообщение о количестве найденных элементов.
Procedure TNoFreeXD.Search(Index:Integer;Text:String;StringGrid :TStringGrid);
var i, j:integer;
begin
for i:=1 to 250 do
for j:=0 to 5 do
StringGrid.Cells[j,i]:='';
Current:=Left;//получаем указатель на начало
i:=1;
while Current<> nil do
begin
case Index of
0: if Current^.Name=Text
then
begin
ElementToStringGrid(i,StringGrid);
Inc(i);
end;
1: if Current^.FamilyName=Text
then
begin
ElementToStringGrid(i,StringGrid);
Inc(i);
end;
2: if Current^.Patronymic=Text
then
begin
ElementToStringGrid(i,StringGrid);
Inc(i);
end;
3: if Current^.Year=StrToInt(Text)
then
begin
ElementToStringGrid(i,StringGrid);
Inc(i);
end;
4: if Current^.SummMany=StrToFloat(Text)
then
begin
ElementToStringGrid(i,StringGrid);
Inc(i);
end;
5: if Current^.City=Text
then
begin
ElementToStringGrid(i,StringGrid);
Inc(i);
end;
end;
Current:=Current^.Dir;
end;
MessageDlg('Поиск завершен. Найдено элементов - '+IntToStr(i-1),mtInformation,[mbOk],0);
end;
procedure TNoFreeXD.ElementToStringGrid(i:Cardinal;StringGrid :TStringGrid);
begin
StringGrid.Cells[0,i]:=IntToStr(i);
StringGrid.Cells[1,i]:=Current^.Name;
StringGrid.Cells[2,i]:=Current^.FamilyName;
StringGrid.Cells[3,i]:=Current^.Patronymic;
StringGrid.Cells[4,i]:=IntToStr(Current^.Year);
StringGrid.Cells[5,i]:=Current^.Kod;
StringGrid.Cells[6,i]:=FloatToStr(Current^.SummMany);
StringGrid.Cells[7,i]:=Current^.City;
end;
4. Сортировка списка прямым выбором
Пользователь выбирает способ упорядочения и атрибут сортировки списка.
Алгоритм этого метода сортировки следующий.
Выбирается (выделяется) элемент с наименьшим (или наибольшим - в зависимости от способа упорядочения: по возрастанию, по убыванию) значением атрибута сортировки. Затем этот элемент меняется местом с первым элементом списка. Среди остальных элементов списка (т.е. среди всех кроме первого) снова выбирается элемент с наименьшим значением атрибута сортировки. Он меняется местом со вторым элементом списка. Далее все повторяется, пока не останется один наибольший элемент списка.
procedure TNoFreeXD.Sorting(Index:Integer;Increase:Boolean);
var
XPointer:TPointer;
begin
if Left=Right then Exit;
XPointer:=Left;
while XPointer^.Dir<>nil do
begin
Sort:=XPointer;//берем указатель на элемен
XPointer:=XPointer^.Dir;//перемещаемм указатель на следующий
G:=Sort;//элемент с которым будем сравнивать
Current:=G^.Dir;//следующий элемент
while Current<>nil do//пока не пройдем весь список
begin
case Index of
0: if Increase=True//как сортировать(убыванию или увелечению)
then
begin
if G^.Name<Current^.Name
then G:=Current;
end
else if G^.Name>Current^.Name
then G:=Current;
1: if Increase=True
then
begin
if G^.FamilyName<Current^.FamilyName
then G:=Current;
end
else if G^.FamilyName>Current^.FamilyName
then G:=Current;
2: if Increase=True
then
begin
if G^.Patronymic<Current^.Patronymic
then G:=Current;
end
else if G^.Patronymic>Current^.Patronymic
then G:=Current;
3: if Increase=True
then
begin
if G^.SummMany<Current^.SummMany
then G:=Current;
end
else if G^.SummMany>Current^.SummMany
then G:=Current;
4: if Increase=True
then
begin
if G^.City<Current^.City
then G:=Current;
end
else if G^.City>Current^.City
then G:=Current;
5: if Increase=True
then
begin
if G^.Year<Current^.Year
then G:=Current;
end
else if G^.Year>Current^.Year
then G:=Current;
end;
Current:=Current^.Dir;//указываем на следующий элемент
end;
//если было изменение(одно из if сработало) то меняем указатели
if G<>Sort then Replace;
end;
end;
procedure TNoFreeXD.Replace;
begin
if G^.Dir<>nil
then G^.Dir^.Back:=Sort
else Right:=Sort;
if Sort^.Dir<>G
then
begin
Sort^.Dir^.Back:=G;
G^.Back^.Dir:=Sort;
end;
if Sort^.Back<>nil
then Sort^.Back^.Dir:=G
else Left:=G;
Current:=G^.Dir;
if Sort^.Dir=G
then G^.Dir:=Sort
else G^.Dir:=Sort^.Dir;
Sort^.Dir:=Current;
if G^.Back=Sort
then
begin
Current:=Sort^.Back;
Sort^.Back:=G;
G^.Back:=Current;
end
else
begin
Current:=G^.Back;
G^.Back:=Sort^.Back;
Sort^.Back:=Current;
end;
end;
Логические схемы операции сортировки
Рассмотрим один из шагов сортировки списка по возрастанию года рождения (первый шаг).
Стартовая структура (часть линейного двусвязного списка). Указатель G ссылается уже на элемент с минимальным значением атрибута. Требуется поменять местами первый элемент, на который указывает Sort, и элемент, на который указывает G.
Рис. 6
Рис. 7 После выполнения G^.Dir^.Back:=Sort
Рис. 8 После выполнения Sort^.Dir^.Back:=G; G^.Back^.Dir:=Sort;
Рис. 9 После выполнения Left:=G; Current:=G^.Dir;
Рис. 10 После выполнения G^.Dir:=Sort^.Dir; Sort^.Dir:=Current;
Рис. 11 После выполнения Current:=G^.Back; G^.Back:=Sort^.Back; Sort^.Back:=Current;
Рис. 12 Преобразование к более привычному виду двусвязного списка.
5. Руководство пользования
После запуска программы появится главное окно, в котором вначале пользователю доступны только две функции: “Создать файлы” и “Открыть файлы” в которых находятся базы. Также доступна функция «Перегрузить список» (перегрузка списка членов незавершенных ВТК, на данном этапе она выдаст предупреждение, так как базы не заполнены).
Рисунок 13 - Главное окно программы
При выборе первого варианта появляется вспомогательное окно, где пользователь выбирает, какой файл создать.
Рисунок 14 - Создание файлов баз
После создания файлов баз, на главной форме становятся доступны функции : «Работа с базой членов ВТК», «Работа с базой банков» и «Работа с базой ХД».
При выборе второго варианта появляется вспомогательное окно, где пользователь выбирает какие файлы необходимо открыть.
Рисунок 15 - Открытие файлов баз
После открытия файлов баз, на главной форме становятся доступны функции : «Работа с базой членов ВТК», «Работа с базой банков», «Работа с базой ХД», «Сортировка» и «Поиск». Данные из файлов загружаются и таблица «Список членов всех незавершенных договоров» заполняется соответствующими значениями.
При нажатии на «Сортировка» пользователю предоставляется возможность выбора атрибутов сортировки и способа упорядочения, после того, как был произведен вышеуказанный выбор, отсортированный список отобразится в таблице на главной форме.
Рисунок 16 - Заполнение таблицы главной формы
Нажав на «Поиск», Пользователю необходимо задать атрибут поиска и значение атрибута. После нажатия кнопки «Поиск» будет произведен просмотр всех элементов списка. Если найдутся элементы с заданным значением атрибута, то они отобразятся в таблице. После окончания поиска появится соответствующее сообщение.
Рис. 17
Рисунок 18 - Поиск
Работа с базой членов ВТК. Появляется окно, в котором пользователь может просмотреть всех членов разных ВТК, добавить нового члена, изменить информацию о существующих членах ВТК и удалить члена из ВТК. Для удаления записи необходимо нажать в таблице по информации о члене, которого необходимо удалить и нажать «Удалить». Для изменения необходимо нажать в таблице по информации о члене ВТК, информацию о котором необходимо изменить ввести новые данные и нажать «Изменить».
Рисунок 19 - Работа с базой членов ВТК
Работа с базой банков. Появляется окно, в котором пользователь может просмотреть все банки находящиеся в базе, добавить новый банк, изменить информацию о банках и удалить банк. Для удаления записи необходимо нажать в таблице по информации о банке, которого необходимо удалить и нажать «Удалить». Для изменения необходимо нажать в таблице по информации о банке, информацию о котором необходимо изменить ввести новые данные и нажать «Изменить».
Рисунок 20 - Работа с базой банков
Работа с базой хозяйственных договоров. Появляется окно, в котором пользователь может просмотреть все хозяйственные договоры, добавить новый ХД, изменить информацию о существующих ХД и удалить ХД. Для удаления записи необходимо нажать в таблице по информации о ХД, которого необходимо удалить и нажать «Удалить». Для изменения необходимо нажать в таблице по информации о ХД, информацию о котором необходимо изменить ввести новые данные и нажать «Изменить».
Рисунок 21 - Работа с базой ХД
После каждого изменения, при закрытии окна пользователю будет предлагаться сохранить произведенные изменения.
Рисунок 22 - Запрос о сохранении
Все произведенные изменения баз отражаются в таблице на главной форме при нажатии «Перегрузить список». Вообще проект имеет достаточно удобный пользовательский интерфейс и во многих случаях исключает вероятность ввода ошибочных данных пользователем.
Заключение
В рамках курсовой работы, язык Object Pascal - среда разработки Delphi 2005, был выбран платформой для реализации поставленной передо мной задачи (разработка информационной системы расчетов по договорам) так, как данный язык является удобным средством создания визуального приложения для работы с базами данными (хотя возможно было также воспользоваться языком C# - среда разработки MSVS 2011). Хранить всю информацию базы в Object Pascal возможно в файле типа .dat, который хорошо подходит для этой цели.
Тестирование программы показало, что данный продукт может использоваться коммерческими научно-производственными организациями (НПО), которые регистрируют хозяйственные договоры (ХД), выполняемые временными трудовыми коллективами (ВТК). В программе предусмотрены следующие моменты: добавление, удаление, изменение баз данных (членов ВТК, ХД и банков), поиск, сортировка записей по различным аспектам, просмотр записей в виде таблицы, создание новых баз или перезапись существующих.
Пользовательский интерфейс отличается дружественностью и позволяет работать с приложением без прохождения специального длительного обучения.
Также следует заметить, что при необходимости данную программу можно дополнить и усовершенствовать (например, создать новые функции, которые будут зависеть от новых поставленных задач).
delphi список алгоритм программа
Литература
1. Бакнелл Д.М. Фундаментальные алгоритмы и структуры данных в Delphi. СПб: ООО «ДиаСофтЮП», 2010. 506 с.
2. Вирт Н. Алгоритмы и структуры данных. СПб: Невский диалект, 2001. - 352с.
3. Гудрич М.Т. Структуры данных и алгоритмы в Java. / М.Т. Гудрич, Р. Тамассия. - Мн.: Новое знание, 2003. - 671 с.
4. Кормен Т.Х., Лейзерсон Ч.И., Ривест Р.Л., Штайн К. Алгоритмы: построение и анализ. - М.: Издательский дом «Вильямс», 2009. - 1296 с.
5. Круз Р.Л. Структуры данных и проектирование программ. - М.: БИНОМ. Лаборатория знаний, 2012. - 765 с.
6. Седжвик Р. Фундаментальные алгоритмы на С. Части 14: Анализ/Структуры данных/Сортировка/Поиск. К.: Издательство «ДиаСофт», 2012. 672 с.
7. Седжвик Р. Фундаментальные алгоритмы на С. Часть 5: Алгоритмы на графах. К.: Издательство «ДиаСофт», 2011. 496 с.
Приложение
Исходные тексты всех модулей
unit UnitMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, Menus, ExtCtrls, XPMan,UnitRecordNfile,UnitCreatFile,
UnitXD, TeeProcs, TeEngine, Chart, Series,UnitBank,UnitWTK,UnitOpenData;
type
TMainForm = class(TForm)
PanelMainGrid: TPanel;
MainMenu1: TMainMenu;
N1: TMenuItem;
StringGridMain: TStringGrid;
Label1: TLabel;
XPManifest1: TXPManifest;
ButtonOpenBANK: TButton;
GroupBox1: TGroupBox;
ButtonRedBTK: TButton;
ButtonBank: TButton;
ButtonXD: TButton;
GroupBox2: TGroupBox;
ButtonSort: TButton;
ButtonSearch: TButton;
Button1: TButton;
Button2: TButton;
RadioGroupSort: TRadioGroup;
ButtonOtSort: TButton;
RadioGroupMinMax: TRadioGroup;
N2: TMenuItem;
procedure N2Click(Sender: TObject);
procedure ButtonSearchClick(Sender: TObject);
procedure ButtonOtSortClick(Sender: TObject);
procedure ButtonSortClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ButtonRedBTKClick(Sender: TObject);
procedure ButtonBankClick(Sender: TObject);
procedure ButtonXDClick(Sender: TObject);
procedure ButtonOpenBANKClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
uses ClassList,UnitFind;
var NoFreeSotre:TNoFreeXD;
{$R *.dfm}
procedure TMainForm.FormCreate(Sender: TObject);
begin
StringGridMain.Cells[0,0]:='№';
StringGridMain.Cells[1,0]:='Имя';
StringGridMain.Cells[2,0]:='Фамилия';
StringGridMain.Cells[3,0]:='Отчество';
StringGridMain.Cells[4,0]:='Год рождения';
StringGridMain.Cells[5,0]:='Код ХД';
StringGridMain.Cells[6,0]:='Сумма вознаграждения';
StringGridMain.Cells[7,0]:='Город нахождения банка';
end;
procedure TMainForm.ButtonOpenBANKClick(Sender: TObject);
begin
Application.CreateForm(TFormCreatFile,FormCreatFile);
FormCreatFile.ShowModal;
end;
procedure TMainForm.ButtonXDClick(Sender: TObject);
begin
Application.CreateForm(TFormMainXD,FormMainXD);
FormMainXD.ShowModal;
end;
procedure TMainForm.ButtonBankClick(Sender: TObject);
begin
Application.CreateForm(TFormBank,FormBank);
FormBank.ShowModal;
end;
procedure TMainForm.ButtonRedBTKClick(Sender: TObject);
begin
Application.CreateForm(TFormWTK,FormWTK);
FormWTK.ShowModal;
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
Application.CreateForm(TFormOpenData,FormOpenData);
FormOpenData.ShowModal;
Button2Click(Self);
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
if (XD=Nil) or (BTK=Nil) or (BANK=Nil) then
begin
MessageDlg('Список сформировать нельзя ',mtConfirmation,[mbOK],0);
end
else
begin
if NoFreeSotre<>Nil then
NoFreeSotre.Free;
NoFreeSotre:=TNoFreeXD.Create;
NoFreeSotre.FormingList;
NoFreeSotre.GetList(StringGridMain);
ButtonSearch.Enabled:=true;
ButtonSort.Enabled:=true;
end;
end;
procedure TMainForm.ButtonSortClick(Sender: TObject);
begin
MainForm.Height:=618;
end;
procedure TMainForm.ButtonOtSortClick(Sender: TObject);
var
metka:boolean;
begin
MainForm.Height:=494;
if RadioGroupMinMax.ItemIndex=0 then
metka:=true
else metka:=false;
NoFreeSotre.Sorting(RadioGroupSort.ItemIndex,metka);
NoFreeSotre.GetList(StringGridMain);
end;
procedure TMainForm.ButtonSearchClick(Sender: TObject);
begin
Application.CreateForm(TFormFind,FormFind);
FormFind.NotFreeStor:=NoFreeSotre;
FormFind.ShowModal;
end;
procedure TMainForm.N2Click(Sender: TObject);
begin
MainForm.Close;
end;
end.
unit UnitOpenData;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFormOpenData = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ButtonOpenXD: TButton;
ButtonOpenWTB: TButton;
ButtonOpenBank: TButton;
OpenDialog1: TOpenDialog;
procedure ButtonOpenBankClick(Sender: TObject);
procedure ButtonOpenWTBClick(Sender: TObject);
procedure ButtonOpenXDClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormOpenData: TFormOpenData;
implementation
uses UnitMain,UnitRecordNfile;
{$R *.dfm}
procedure TFormOpenData.FormCreate(Sender: TObject);
begin
Label1.Caption:=' Файл не открыт';
Label2.Caption:=' Файл не открыт';
Label3.Caption:=' Файл не открыт';
end;
procedure TFormOpenData.ButtonOpenXDClick(Sender: TObject);
begin
if XD<>Nil then
begin
XD:=nil;
end;
OpenDialog1.Title:='Открыть файл';
if OpenDialog1.Execute then
begin
NameFxd:=OpenDialog1.FileName;
AssignFile(Fxd,NameFxd);
Reset(Fxd);
While not EOF(Fxd) do
begin
SetLenXDM;
Read(Fxd, XD[GetXDM-1]);
Label1.Caption:='Файл открыт';
end;
end;
MainForm.ButtonXD.Enabled:=true;
end;
procedure TFormOpenData.ButtonOpenWTBClick(Sender: TObject);
begin
if BTK<>Nil then
begin
BTK:=nil;
end;
OpenDialog1.Title:='Открыть файл';
if OpenDialog1.Execute then
begin
NameFwtk:=OpenDialog1.FileName;
AssignFile(Fwtk,NameFwtk);
Reset(Fwtk);
While not EOF(Fwtk) do
begin
SetLenBTKM;
Read(Fwtk, BTK[GetBTKM-1]);
Label2.Caption:='Файл открыт';
end;
end;
MainForm.ButtonRedBTK.Enabled:=true;
end;
procedure TFormOpenData.ButtonOpenBankClick(Sender: TObject);
begin
if BANK<>Nil then
begin
BANK:=nil;
end;
OpenDialog1.Title:='Открыть файл';
if OpenDialog1.Execute then
begin
NameFbank:=OpenDialog1.FileName;
AssignFile(Fbank,NameFbank);
Reset(Fbank);
While not EOF(Fbank) do
begin
SetLenBANKM;
Read(Fbank, BANK[GetBANKM-1]);
Label3.Caption:='Файл открыт';
end;
end;
MainForm.ButtonBank.Enabled:=true;
end;
end.
unit UnitWTK;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls, Buttons;
type
TFormWTK = class(TForm)
StringGridWTK: TStringGrid;
Label1: TLabel;
EditFam: TEdit;
Label2: TLabel;
EditName: TEdit;
Label3: TLabel;
EditOct: TEdit;
Label4: TLabel;
EditYear: TEdit;
Label5: TLabel;
Label6: TLabel;
EditAddres: TEdit;
Label7: TLabel;
EditSchet: TEdit;
RadioGroupDol: TRadioGroup;
Label10: TLabel;
EditNumberBank: TEdit;
ButtonAddWTK: TButton;
ButtonDelWTK: TButton;
ButtonChangWTK: TButton;
Label8: TLabel;
EditCod: TEdit;
Label9: TLabel;
EditSum: TEdit;
SpeedButtonXD: TSpeedButton;
SpeedButtonBank: TSpeedButton;
Gr: TGroupBox;
procedure SpeedButtonBankClick(Sender: TObject);
procedure SpeedButtonXDClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure StringGridWTKSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure ButtonDelWTKClick(Sender: TObject);
procedure ButtonChangWTKClick(Sender: TObject);
procedure ButtonAddWTKClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
MetkaChange:boolean;
{ Private declarations }
public
{ Public declarations }
end;
var
FormWTK: TFormWTK;
implementation
uses UnitRecordNfile,UnitClikXD,UnitClikBank;
{$R *.dfm}
procedure GetWTK();
var
i,j:cardinal;
begin
for i:=1 to 15 do
for j:=0 to 16 do
FormWTK.StringGridWTK.Cells[j,i]:='';
if BTK<>Nil then
begin
for i:=0 to GetBTKM-1 do
begin
FormWTK.StringGridWTK.Cells[0,i+1]:=IntToStr(i+1);
FormWTK.StringGridWTK.Cells[1,i+1]:=BTK[i].FamilyName;
FormWTK.StringGridWTK.Cells[2,i+1]:=BTK[i].Name;
FormWTK.StringGridWTK.Cells[3,i+1]:=BTK[i].Patronymic;
FormWTK.StringGridWTK.Cells[4,i+1]:=IntToStr(BTK[i].Year);
case BTK[i].Sign of
Head:FormWTK.StringGridWTK.Cells[5,i+1]:='Руководитель ВТК';
Radovo:FormWTK.StringGridWTK.Cells[5,i+1]:='Рядовой член ВТК';
end;
FormWTK.StringGridWTK.Cells[6,i+1]:=BTK[i].Addres;
FormWTK.StringGridWTK.Cells[7,i+1]:=IntToStr(BTK[i].Account);
FormWTK.StringGridWTK.Cells[8,i+1]:=BTK[i].Kod;
FormWTK.StringGridWTK.Cells[9,i+1]:=FloatToStr(BTK[i].SummMany);
FormWTK.StringGridWTK.Cells[10,i+1]:=IntToStr(BTK[i].NumberBank);
end;
end;
end;
procedure TFormWTK.FormCreate(Sender: TObject);
begin
StringGridWTK.Cells[0,0]:='№';
StringGridWTK.Cells[1,0]:='Фамилия';
StringGridWTK.Cells[2,0]:='Имя';
StringGridWTK.Cells[3,0]:='Отчество';
StringGridWTK.Cells[4,0]:='Год рождения';
StringGridWTK.Cells[5,0]:='Должность';
StringGridWTK.Cells[6,0]:='Домашний адрес';
StringGridWTK.Cells[7,0]:='Расчетный счет';
StringGridWTK.Cells[8,0]:='Код ХД';
StringGridWTK.Cells[9,0]:='Вознаграждение';
StringGridWTK.Cells[10,0]:='Номер отделения банка';
GetWTK;
MetkaChange:=false;
end;
procedure TFormWTK.ButtonAddWTKClick(Sender: TObject);
begin
SetLenBTKM;
BTK[GetBTKM-1].FamilyName:=EditFam.Text;
BTK[GetBTKM-1].Name:=EditName.Text;
BTK[GetBTKM-1].Patronymic:=EditOct.Text;
BTK[GetBTKM-1].Year:=StrToInt(EditYear.Text);
case RadioGroupDol.ItemIndex of
0:BTK[GetBTKM-1].Sign:=Head;
1:BTK[GetBTKM-1].Sign:=Radovo;
end;
BTK[GetBTKM-1].Addres:=EditAddres.Text;
BTK[GetBTKM-1].Account:=StrToInt(EditSchet.Text);
BTK[GetBTKM-1].Kod:=EditCod.Text;
BTK[GetBTKM-1].SummMany:=StrToFloat(EditSum.Text);
BTK[GetBTKM-1].NumberBank:=StrToInt(EditNumberBank.Text);
GetWTK;
MetkaChange:=true;
end;
procedure TFormWTK.ButtonChangWTKClick(Sender: TObject);
var
N:Cardinal;
begin
N:=StringGridWTK.Row-1;
BTK[N].FamilyName:=EditFam.Text;
BTK[N].Name:=EditName.Text;
BTK[N].Patronymic:=EditOct.Text;
BTK[N].Year:=StrToInt(EditYear.Text);
case RadioGroupDol.ItemIndex of
0:BTK[N].Sign:=Head;
1:BTK[N].Sign:=Radovo;
end;
BTK[N].Addres:=EditAddres.Text;
BTK[N].Account:=StrToInt(EditSchet.Text);
BTK[N].Kod:=EditCod.Text;
BTK[N].SummMany:=StrToFloat(EditSum.Text);
BTK[N].NumberBank:=StrToInt(EditNumberBank.Text);
GetWTK;
MetkaChange:=true;
end;
procedure TFormWTK.ButtonDelWTKClick(Sender: TObject);
var
i,j,N:Cardinal;
begin
N:=StringGridWTK.Row-1;
for i:=N to GetBTKM-1 do
begin
BTK[i]:=BTK[i+1];
end;
SetLength(BTK,GetBTKM-1);
GetWTK;
MetkaChange:=true;
end;
procedure TFormWTK.StringGridWTKSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
if ARow-1<GetBTKM then
begin
EditFam.Text:=BTK[ARow-1].FamilyName;
EditName.Text:=BTK[ARow-1].Name;
EditOct.Text:=BTK[ARow-1].Patronymic;
EditYear.Text:=IntToStr(BTK[ARow-1].Year);
case BTK[ARow-1].Sign of
Head:RadioGroupDol.ItemIndex:=0;
Radovo:RadioGroupDol.ItemIndex:=1;
end;
EditAddres.Text:=BTK[ARow-1].Addres;
EditSchet.Text:=IntToStr(BTK[ARow-1].Account);
EditCod.Text:=BTK[ARow-1].Kod;
EditSum.Text:=FloatToStr(BTK[ARow-1].SummMany);
EditNumberBank.Text:=IntToStr(BTK[ARow-1].NumberBank);
end
else
begin
CanSelect:=false;
end;
end;
procedure TFormWTK.FormClose(Sender: TObject; var Action: TCloseAction);
var
i:integer;
begin
if (NameFwtk<>'') and (MetkaChange=true) then
begin
if MessageDlg('Сохранить изменения в файле "'+NameFwtk+'" ?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
begin
Rewrite(Fwtk);
for i:=0 to GetBTKM-1 do
Write(Fwtk,BTK[i]);
end;
end;
end;
procedure TFormWTK.SpeedButtonXDClick(Sender: TObject);
begin
Application.CreateForm(TFormClikXD,FormClikXD);
FormClikXD.ShowModal;
end;
procedure TFormWTK.SpeedButtonBankClick(Sender: TObject);
begin
Application.CreateForm(TFormClikBAnk,FormClikBAnk);
FormClikBAnk.ShowModal;
end;
end.
unit UnitXD;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ComCtrls;
type
TFormMainXD = class(TForm)
StringGridXD: TStringGrid;
ButtonAddXd: TButton;
ButtonDelXD: TButton;
EditNumber: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Label4: TLabel;
Label5: TLabel;
Edit4: TEdit;
Label7: TLabel;
DateTimePickerZakl: TDateTimePicker;
DateTimePickerVkl: TDateTimePicker;
Button1: TButton;
CheckBox1: TCheckBox;
procedure StringGridXDSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure Button1Click(Sender: TObject);
procedure ButtonDelXDClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ButtonAddXdClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
MetkaChange:boolean;
procedure GetXD;
{ Private declarations }
public
{ Public declarations }
end;
var
FormMainXD: TFormMainXD;
implementation
uses UnitRecordNfile;
{$R *.dfm}
procedure TFormMainXD.GetXD;
var
i,j:integer;
begin
for i:=1 to 15 do
for j:=0 to 16 do
StringGridXD.Cells[j,i]:='';
if XD<>Nil then
begin
j:=GetXDM-1;
for i:=0 to GetXDM-1 do
begin
StringGridXD.Cells[0,i+1]:=IntToStr(i+1);
StringGridXD.Cells[1,i+1]:=IntToStr(XD[i].Number);
StringGridXD.Cells[2,i+1]:=DateToStr(XD[i].DateCreat);
StringGridXD.Cells[3,i+1]:=DateToStr(XD[i].DataFree);
StringGridXD.Cells[4,i+1]:=XD[i].Tema;
StringGridXD.Cells[5,i+1]:=XD[i].Customer;
if XD[i].PriznakFree=true then
StringGridXD.Cells[6,i+1]:='Завершен'
else StringGridXD.Cells[6,i+1]:='Не завершен';
StringGridXD.Cells[7,i+1]:=FloatToStr(XD[i].Price);
end;
end;
end;
procedure TFormMainXD.FormCreate(Sender: TObject);
begin
StringGridXD.Cells[0,0]:='№';
StringGridXD.Cells[1,0]:='Номер договора';
StringGridXD.Cells[2,0]:='Дата заключения договора';
StringGridXD.Cells[3,0]:='Дата завершения договора';
StringGridXD.Cells[4,0]:='Тема договора';
StringGridXD.Cells[5,0]:='Заказчик работ';
StringGridXD.Cells[6,0]:='Признак завершения';
StringGridXD.Cells[7,0]:='Стоимость договора';
MetkaChange:=false;
GetXD;
end;
procedure TFormMainXD.ButtonAddXdClick(Sender: TObject);
var
i:integer;
begin
SetLenXDM;
XD[GetXDM-1].Number:=StrToInt(EditNumber.Text);
XD[GetXDM-1].DateCreat:=DateTimePickerZakl.Date;
XD[GetXDM-1].DataFree:=DateTimePickerVkl.Date;
XD[GetXDM-1].Tema:=Edit1.Text;
XD[GetXDM-1].Customer:=Edit2.Text;
XD[GetXDM-1].PriznakFree:= CheckBox1.Checked;
XD[GetXDM-1].Price:=StrToInt(Edit4.Text);
XD[GetXDM-1].NumPeopl:=0;
GetXD;
MetkaChange:=true;
end;
procedure TFormMainXD.FormClose(Sender: TObject; var Action: TCloseAction);
var
i:integer;
begin
if (NameFxd<>'') and (MetkaChange=true) then
begin
if MessageDlg('Сохранить изменения в файле "'+NameFxd+'" ?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
begin
Rewrite(Fxd);
for i:=0 to GetXDM-1 do
Write(Fxd,XD[i]);
end;
end;
end;
procedure TFormMainXD.ButtonDelXDClick(Sender: TObject);
var
i,j,N:Cardinal;
Tmep:TXD;
begin
N:=StringGridXD.Row-1;
for i:=N to GetXDM-1 do
begin
XD[i]:=XD[i+1];
end;
SetLength(XD,GetXDM-1);
GetXD;
MetkaChange:=true;
end;
procedure TFormMainXD.Button1Click(Sender: TObject);
var
N:Cardinal;
begin
N:=StringGridXD.Row-1;
XD[N].Number:=StrToInt(FormMainXD.EditNumber.Text);
XD[N].DateCreat:=FormMainXD.DateTimePickerZakl.Date;
XD[N].DataFree:=FormMainXD.DateTimePickerVkl.Date;
XD[N].Tema:=FormMainXD.Edit1.Text;
XD[N].Customer:=FormMainXD.Edit2.Text;
XD[N].PriznakFree:=CheckBox1.Checked;
XD[N].Price:=StrToInt(FormMainXD.Edit4.Text);
GetXD;
MetkaChange:=true;
end;
procedure TFormMainXD.StringGridXDSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ARow-1<GetXDM then
begin
EditNumber.Text:=IntToStr(XD[ARow-1].Number);
DateTimePickerZakl.DateTime:=XD[ARow-1].DateCreat;
DateTimePickerVkl.DateTime:=XD[ARow-1].DataFree;
Edit1.Text:=XD[ARow-1].Tema;
Edit2.Text:=XD[ARow-1].Customer;
CheckBox1.Checked:=XD[ARow-1].PriznakFree;
Edit4.Text:=FloatToStr(XD[ARow-1].Price);
end
else
begin
CanSelect:=false;
end;
end;
end.
unit UnitBank;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TFormBank = class(TForm)
StringGridBank: TStringGrid;
EditNum_4: TEdit;
Label1: TLabel;
EditCity: TEdit;
Label2: TLabel;
EditAddres: TEdit;
Label3: TLabel;
EditNameOtdel: TEdit;
Label4: TLabel;
EditCod: TEdit;
Label5: TLabel;
ButtonAddBank: TButton;
ButtonCutBank: TButton;
ButtonDelBank: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ButtonDelBankClick(Sender: TObject);
procedure StringGridBankSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure ButtonCutBankClick(Sender: TObject);
procedure ButtonAddBankClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
MetkaChange:boolean;
{ Private declarations }
public
{ Public declarations }
end;
var
FormBank: TFormBank;
implementation
uses UnitRecordNfile;
{$R *.dfm}
procedure GetStrinGrid();
var
i,j:integer;
begin
for i:=1 to 15 do
for j:=0 to 16 do
FormBank.StringGridBank.Cells[j,i]:='';
if BANK<>Nil then
begin
for i:=0 to GetBANKM-1 do
begin
FormBank.StringGridBank.Cells[0,i+1]:=IntToStr(i+1);
FormBank.StringGridBank.Cells[1,i+1]:=IntToStr(Bank[i].Number);
FormBank.StringGridBank.Cells[2,i+1]:=BANK[i].City;
FormBank.StringGridBank.Cells[3,i+1]:=BANK[i].Addres;
FormBank.StringGridBank.Cells[4,i+1]:=BANK[i].NameFront;
FormBank.StringGridBank.Cells[5,i+1]:=IntToStr(BANK[i].Cod);
end;
end;
end;
procedure TFormBank.FormCreate(Sender: TObject);
begin
StringGridBank.Cells[0,0]:='№';
StringGridBank.Cells[1,0]:='Номер отделения';
StringGridBank.Cells[2,0]:='Город';
StringGridBank.Cells[3,0]:='Адрес';
StringGridBank.Cells[4,0]:='Название отделения';
StringGridBank.Cells[5,0]:='Код отделения';
MetkaChange:=false;
GetStrinGrid;
end;
procedure TFormBank.ButtonAddBankClick(Sender: TObject);
begin
SetLenBANKM;
BANK[GetBANKM-1].Number:=StrToInt(EditNum_4.Text);
BANK[GetBANKM-1].City:=EditCity.Text;
BANK[GetBANKM-1].Addres:=EditAddres.Text;
BANK[GetBANKM-1].NameFront:=EditNameOtdel.Text;
BANK[GetBANKM-1].Cod:=StrToInt(EditCod.Text);
MetkaChange:=true;
GetStrinGrid;
end;
procedure TFormBank.ButtonCutBankClick(Sender: TObject);
var
i,j,N:Cardinal;
begin
N:=StringGridBank.Row-1;
BANK[N].Number:=StrToInt(EditNum_4.Text);
BANK[N].City:=EditCity.Text;
BANK[N].Addres:=EditAddres.Text;
BANK[N].NameFront:=EditNameOtdel.Text;
BANK[N].Cod:=StrToInt(EditCod.Text);
GetStrinGrid;
MetkaChange:=true;
end;
procedure TFormBank.StringGridBankSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ARow-1<GetBANKM then
begin
EditNum_4.Text:=IntToStr(Bank[ARow-1].Number);
EditCity.Text:=BANK[ARow-1].City;
EditAddres.Text:=BANK[ARow-1].Addres;
EditNameOtdel.Text:=BANK[ARow-1].NameFront;
EditCod.Text:=IntToStr(BANK[ARow-1].Cod);
end
else
begin
CanSelect:=false;
end;
end;
procedure TFormBank.ButtonDelBankClick(Sender: TObject);
var
i,N:Cardinal;
begin
if GetBANKM-1<>0 then
begin
N:=StringGridBank.Row-1;
for i:=N to GetBANKM-1 do
begin
BANK[i]:=BANK[i+1];
end;
SetLength(BANK,GetBANKM-1);
GetStrinGrid;
MetkaChange:=true;
end
else if GetBANKM-1=0 then
begin
MessageDlg('База пуста',mtInformation,[mbOK],0);
end;
end;
procedure TFormBank.FormClose(Sender: TObject; var Action: TCloseAction);
var
i:integer;
begin
if (NameFbank<>'') and(MetkaChange=true) then
begin
if MessageDlg('Сохранить изменения в файле "'+NameFbank+'" ?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
begin
Rewrite(Fbank);
for i:=0 to GetBANKM-1 do
Write(Fbank,BANK[i]);
end;
end;
end;
end.
unit UnitClikBank;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TFormClikBAnk = class(TForm)
StringGridClikBank: TStringGrid;
ButtonOK: TButton;
procedure ButtonOKClick(Sender: TObject);
procedure StringGridClikBankSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormClikBAnk: TFormClikBAnk;
implementation
uses UnitWTK,UnitRecordNfile;
{$R *.dfm}
procedure TFormClikBAnk.FormCreate(Sender: TObject);
var
i,j:integer;
begin
for i:=1 to 15 do
for j:=0 to 16 do
StringGridClikBank.Cells[j,i]:='';
if BANK<>Nil then
begin
for i:=0 to GetBANKM-1 do
begin
StringGridClikBank.Cells[0,i+1]:=IntToStr(i+1);
StringGridClikBank.Cells[1,i+1]:=IntToStr(Bank[i].Number);
StringGridClikBank.Cells[2,i+1]:=BANK[i].City;
StringGridClikBank.Cells[3,i+1]:=BANK[i].Addres;
StringGridClikBank.Cells[4,i+1]:=BANK[i].NameFront;
StringGridClikBank.Cells[5,i+1]:=IntToStr(BANK[i].Cod);
end;
end;
StringGridClikBank.Cells[0,0]:='№';
StringGridClikBank.Cells[1,0]:='Номер отделения';
StringGridClikBank.Cells[2,0]:='Город';
StringGridClikBank.Cells[3,0]:='Адрес';
StringGridClikBank.Cells[4,0]:='Название отделения';
StringGridClikBank.Cells[5,0]:='Код отделения';
end;
procedure TFormClikBAnk.StringGridClikBankSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ARow-1>GetBANKM then
begin
CanSelect:=false;
end;
end;
procedure TFormClikBAnk.ButtonOKClick(Sender: TObject);
var
N:cardinal;
begin
N:=StringGridClikBank.Row-1;
FormWTK.EditNumberBank.Text:=IntToStr(Bank[N].Number);
FormClikBAnk.Close;
end;
end.
unit UnitClikXD;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids,StdCtrls,UnitRecordNfile;
type
TFormClikXD = class(TForm)
StringGridClikXD: TStringGrid;
ButtonOK: TButton;
procedure ButtonOKClick(Sender: TObject);
procedure StringGridClikXDSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormClikXD: TFormClikXD;
implementation
uses UnitWTK;
{$R *.dfm}
procedure TFormClikXD.FormCreate(Sender: TObject);
var
i,j:cardinal;
begin
for i:=1 to 15 do
for j:=0 to 16 do
StringGridClikXD.Cells[j,i]:='';
StringGridClikXD.Cells[0,0]:='№';
StringGridClikXD.Cells[1,0]:='Номер договора';
StringGridClikXD.Cells[2,0]:='Дата заключения договора';
StringGridClikXD.Cells[3,0]:='Дата завершения договора';
StringGridClikXD.Cells[4,0]:='Тема договора';
StringGridClikXD.Cells[5,0]:='Заказчик работ';
StringGridClikXD.Cells[6,0]:='Признак завершения';
StringGridClikXD.Cells[7,0]:='Стоимость договора';
if XD<>Nil then
begin
for i:=0 to GetXDM-1 do
begin
StringGridClikXD.Cells[0,i+1]:=IntToStr(i+1);
StringGridClikXD.Cells[1,i+1]:=IntToStr(XD[i].Number);
StringGridClikXD.Cells[2,i+1]:=DateToStr(XD[i].DateCreat);
StringGridClikXD.Cells[3,i+1]:=DateToStr(XD[i].DataFree);
StringGridClikXD.Cells[4,i+1]:=XD[i].Tema;
StringGridClikXD.Cells[5,i+1]:=XD[i].Customer;
if XD[i].PriznakFree=true then
StringGridClikXD.Cells[6,i+1]:='Завершен'
else StringGridClikXD.Cells[6,i+1]:='Не завершен';
StringGridClikXD.Cells[7,i+1]:=FloatToStr(XD[i].Price);
end;
end;
end;
procedure TFormClikXD.StringGridClikXDSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ARow-1>GetXDM then
begin
CanSelect:=false;
end;
end;
procedure TFormClikXD.ButtonOKClick(Sender: TObject);
var
N:Cardinal;
str,_strYear:string;
Year: Word;
Month: Word;
Day: Word;
begin
N:=StringGridClikXD.Row-1;
XD[N].NumPeopl:=XD[N].NumPeopl+1;
FormWTK.EditSum.Text:=FloatToStr(XD[N].Price);
DecodeDate(XD[N].DateCreat,Year,Month,Day);
_strYear:=IntToStr(Year);
str:=IntToStr(XD[N].Number)+'/'+_strYear[3]+_strYear[4];
FormWTK.EditCod.Text:=str;
FormClikXD.Close;
end;
end.
unit UnitCreatFile;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,UnitRecordNfile;
type
TFormCreatFile = class(TForm)
ButtonCreatXD: TButton;
ButtonCreatWTB: TButton;
ButtonCreatBank: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
SaveDialogCreatFile: TSaveDialog;
procedure ButtonCreatBankClick(Sender: TObject);
procedure ButtonCreatWTBClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ButtonCreatXDClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormCreatFile: TFormCreatFile;
implementation
uses UnitMain;
{$R *.dfm}
procedure TFormCreatFile.ButtonCreatXDClick(Sender: TObject);
begin
SaveDialogCreatFile.Title:=' Создать базу';
if SaveDialogCreatFile.Execute then
begin
NameFxd:=SaveDialogCreatFile.FileName;
AssignFile(Fxd,NameFxd);
Rewrite(Fxd);
Label1.Caption:=' Файл создан';
MainForm.ButtonXD.Enabled:=true;
end;
end;
procedure TFormCreatFile.FormCreate(Sender: TObject);
begin
Label1.Caption:=' Файл не создан';
Label2.Caption:=' Файл не создан';
Label3.Caption:=' Файл не создан';
end;
procedure TFormCreatFile.ButtonCreatWTBClick(Sender: TObject);
begin
SaveDialogCreatFile.Title:=' Создать базу';
if SaveDialogCreatFile.Execute then
begin
NameFwtk:=SaveDialogCreatFile.FileName;
AssignFile(Fwtk,NameFwtk);
Rewrite(Fwtk);
Label2.Caption:=' Файл создан';
MainForm.ButtonRedBTK.Enabled:=true;
end;
end;
procedure TFormCreatFile.ButtonCreatBankClick(Sender: TObject);
begin
SaveDialogCreatFile.Title:=' Создать базу';
if SaveDialogCreatFile.Execute then
begin
NameFbank:=SaveDialogCreatFile.FileName;
AssignFile(Fbank,NameFbank);
Rewrite(Fbank);
Label3.Caption:=' Файл создан';
MainForm.ButtonBank.Enabled:=true;
end;
end;
end.
unit UnitFind;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Grids,ClassList,UnitMain;
type
TFormFind = class(TForm)
RadioGroupfind: TRadioGroup;
StringGridFind: TStringGrid;
Label1: TLabel;
Edit1: TEdit;
ButtonSeach: TButton;
procedure ButtonSeachClick(Sender: TObject);
procedure RadioGroupfindClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
NotFreeStor:TNoFreeXD;
{ Public declarations }
end;
var
FormFind: TFormFind;
implementation
{$R *.dfm}
procedure TFormFind.FormCreate(Sender: TObject);
begin
StringGridFind.Cells[0,0]:='№';
StringGridFind.Cells[1,0]:='Имя';
StringGridFind.Cells[2,0]:='Фамилия';
StringGridFind.Cells[3,0]:='Отчество';
StringGridFind.Cells[4,0]:='Год рождения';
StringGridFind.Cells[5,0]:='Код ХД';
StringGridFind.Cells[6,0]:='Сумма вознаграждения';
StringGridFind.Cells[7,0]:='Город нахождения банка';
end;
procedure TFormFind.RadioGroupfindClick(Sender: TObject);
begin
case RadioGroupfind.ItemIndex of
0:begin
Label1.Caption:='Имя члена ВТК';
end;
1:begin
Label1.Caption:='Фамилия члена ВТК';
end;
2:begin
Label1.Caption:='Отчество члена ВТК';
end;
3:begin
Label1.Caption:='Год рождения члена ВТК';
end;
4:begin
Label1.Caption:='Вознаграждение за работу';
end;
5:begin
Label1.Caption:='Город банка где находится расчетный счет';
end;
end;
end;
procedure TFormFind.ButtonSeachClick(Sender: TObject);
begin
NotFreeStor.Search(RadioGroupfind.ItemIndex,Edit1.Text,StringGridFind);
end;
end.
unit ClassList;
interface
uses Grids, SysUtils, Dialogs;
//двусвязный список
Type
TPointer = ^TListStore;
TListStore=record
Name: string[50];
FamilyName:string[50];
Patronymic:string[50];
Year:integer;
Kod:string[10];
SummMany:extended;
City:string[100];
Dir,Back:TPointer; //Указатели на следующий и предыдущий элементы
end;
TNoFreeXD=class(TObject)
private
Left{начало}, Right{конец}, Current, G, Sort{для сортировки}:TPointer;
procedure ElementToStringGrid(i:Cardinal;StringGrid:TStringGrid);
public
procedure FormingList;
procedure GetList(StringGrid:TStringGrid);
procedure ClearList;
procedure Sorting(Index:Integer;Increase:Boolean);
procedure Replace;
procedure Search(Index:Integer;Text:String;StringGrid:TStringGrid);
end;
implementation
uses UnitRecordNfile;
procedure TNoFreeXD.FormingList;
var
i,j,k:Cardinal;
str,_strYear:string;
Year: Word;
Month: Word;
Day: Word;
begin
New(Current);
Left:=Current;//указатель на начало
Current^.Back:=nil;//указатель на предыдущий должен равен быть в начале (nil)
for i:=0 to GetBTKM-1 do
begin
for j:=0 to GetXDM-1 do
begin
DecodeDate(XD[j].DateCreat,Year,Month,Day);
_strYear:=IntToStr(Year);
str:=IntToStr(XD[j].Number)+'/'+_strYear[3]+_strYear[4];
if (str=BTK[i].Kod) and (XD[j].PriznakFree=false) then
begin
Current^.Name:=BTK[i].Name;
Current^.FamilyName:=BTK[i].FamilyName;
Current^.Patronymic:=BTK[i].Patronymic;
Current^.Year:=BTK[i].Year;
Current^.Kod:=BTK[i].Kod;
Current^.SummMany:=BTK[i].SummMany;
for k:=0 to GetBANKM-1 do
begin
if BANK[k].Number=BTK[i].NumberBank then
begin
Current^.City:=BANK[k].City;
end;
end;
New(Current^.Dir);
Current^.Dir^.Back:= Current;//указатель на данный элемент
Current:=Current^.Dir;//указатель на следующий
end;
end;
end;
Current^.Back^.Dir:=nil;
Right:=Current^.Back;//указатель на конец списка(равен предыдущему)
Dispose(Current);
end;
procedure TNoFreeXD.GetList(StringGrid:TStringGrid);
var
i,j:integer;
begin
for i:=1 to 25 do
for j:=0 to 8 do
StringGrid.Cells[j,i]:='';
Current:=Left;//получаем указатель на начало
i:=1;
while Current<> nil do
begin
StringGrid.Cells[0,i]:=IntToStr(i);
StringGrid.Cells[1,i]:=Current^.Name;
StringGrid.Cells[2,i]:=Current^.FamilyName;
StringGrid.Cells[3,i]:=Current^.Patronymic;
StringGrid.Cells[4,i]:=IntToStr(Current^.Year);
StringGrid.Cells[5,i]:=Current^.Kod;
StringGrid.Cells[6,i]:=FloatToStr(Current^.SummMany);
StringGrid.Cells[7,i]:=Current^.City;
Current:=Current^.Dir;//указатель на следующий элемент
Inc(i);
end;
end;
procedure TNoFreeXD.ClearList;
begin
Dispose(Left);
Dispose(Right);
Dispose(Current);
end;
procedure TNoFreeXD.Sorting(Index:Integer;Increase:Boolean);
var
XPointer:TPointer;
begin
if Left=Right then Exit;
XPointer:=Left;
while XPointer^.Dir<>nil do
begin
Sort:=XPointer;//берем указатель на элемен
XPointer:=XPointer^.Dir;//перемещаемм указатель на следующий
G:=Sort;//элемент с которым будем сравнивать
Current:=G^.Dir;//следующий элемент
while Current<>nil do//пока не пройдем весь список
begin
case Index of
0: if Increase=True//как сортировать(убыванию или увелечению)
then
begin
if G^.Name<Current^.Name
then G:=Current;
end
else if G^.Name>Current^.Name
then G:=Current;
1: if Increase=True
then
begin
if G^.FamilyName<Current^.FamilyName
then G:=Current;
end
else if G^.FamilyName>Current^.FamilyName
then G:=Current;
2: if Increase=True
then
begin
if G^.Patronymic<Current^.Patronymic
then G:=Current;
end
else if G^.Patronymic>Current^.Patronymic
then G:=Current;
3: if Increase=True
then
begin
if G^.SummMany<Current^.SummMany
then G:=Current;
end
else if G^.SummMany>Current^.SummMany
then G:=Current;
4: if Increase=True
then
begin
if G^.City<Current^.City
then G:=Current;
end
else if G^.City>Current^.City
then G:=Current;
5: if Increase=True
then
begin
if G^.Year<Current^.Year
then G:=Current;
end
else if G^.Year>Current^.Year
then G:=Current;
end;
Current:=Current^.Dir;//указываем на следующий элемент
end;
//если было найдено наименьшое значение (то меняем указатели)
if G<>Sort then Replace;
end;
end;
procedure TNoFreeXD.Replace;
begin
if G^.Dir<>nil
then G^.Dir^.Back:=Sort
else Right:=Sort;
if Sort^.Dir<>G
then
begin
Sort^.Dir^.Back:=G;
G^.Back^.Dir:=Sort;
end;
if Sort^.Back<>nil
then Sort^.Back^.Dir:=G
else Left:=G;
Current:=G^.Dir;
if Sort^.Dir=G
then G^.Dir:=Sort
else G^.Dir:=Sort^.Dir;
Sort^.Dir:=Current;
if G^.Back=Sort
Подобные документы
Расположение элементов списка в памяти. Информация о полях структуры TMember. Логическая структура двусвязного кольцевого списка. Логические схемы наиболее важных операций со списками. Алгоритмы обработки основных структур. Руководство пользователя.
курсовая работа [2,3 M], добавлен 27.08.2012Исследование программного средства для управления базой данных с информацией о фильмах. Составление алгоритма удаления и добавления элемента в указанное место двунаправленного списка. Характеристика поиска, вывода на экран и сортировки элементов списка.
курсовая работа [94,5 K], добавлен 23.09.2011Представление (построение, создание) списка данных в виде линейного однонаправленного списка. Формирование массива данных. Вывод данных на экран. Алгоритм удаления, перемещения данных. Сортировка методом вставки. Алгоритм загрузки данных из файла.
курсовая работа [2,1 M], добавлен 16.05.2015Общая характеристика Delphi как интегрированной среды разработки программного обеспечения. СУБД Access, ее возможности. Создание базы данных в Access для комиссионного букинистического магазина. Создание запросов и фильтров. Описание работы программы.
курсовая работа [3,1 M], добавлен 25.05.2015Структура программы в среде Delphi в процессе проектирования приложения, ее модульный принцип. Объявление списка используемых модулей и нескольких операторов. Размещение на форме компонентов и изменение их свойств. Создание кода - обработчика события.
лабораторная работа [19,1 K], добавлен 15.07.2009Правила формирования списка на рабочем листе. Что понимается под структурой списка. Как осуществляется ввод данных. Простая сортировка списка. Интерфейс и функции приложения PowerPoint. Создание, редактирование и форматирование текстового документа.
лабораторная работа [25,1 K], добавлен 16.01.2015Теоретическое описание линейного списка с алгоритмами реализации основных операций. Понятия, механизмы объектно-ориентированного программирования. Возможности проектируемого контейнера пользователей, его реализация на основе линейного списка с заголовком.
курсовая работа [475,2 K], добавлен 26.02.2015Разработка программного приложения в среде Delphi. Создание таблиц и их заполнение. Форма редактирования записи. Реализация SQL запросов и поиска. Создание отчётов по БД. Руководство пользователя. Требования к составу и параметрам технических средств.
курсовая работа [1,3 M], добавлен 03.11.2014Особенности алгоритмов, критерии качества. Создание и применение программного продукта на языке Delphi. Тип операционной системы. Внутренняя структура программного продукта. Руководство пользователя и программиста, расчет себестоимости и цены программы.
дипломная работа [1,5 M], добавлен 12.06.2009Приложение для организации и контроля разработки программного обеспечения, сокращающее сроки проектирования программных продуктов и оптимизирующее данный процесс. Технологии создания приложений на платформе .NET. Алгоритм получения и обновления списка.
дипломная работа [861,9 K], добавлен 27.11.2014