Помощь в написании студенческих работ
Антистрессовый сервис

Трёхуровневый иерархический список

ДипломнаяПомощь в написанииУзнать стоимостьмоей работы

Поле логического указателя элементов всех уровней хранит адрес в памяти следующего элемента списка. Пользуясь указателем, можно получить доступ к элементу списка, а от него к следующему элементу и т. д., пока не будет достигнут последний элемент. Поле указателя последнего элемента списка должно содержать признак пустого указателя (NIL), свидетельствующий о конце списка. Логическая структура… Читать ещё >

Трёхуровневый иерархический список (реферат, курсовая, диплом, контрольная)

данный логический управление

Любая программа представляет собой не только набор операторов и ключевых слов, но также и совокупность информационных объектов, имеющих определённую логическую структуру. Причём действия над этими объектами записаны в операторах программы. В курсе «Структуры и алгоритмы обработки данных» рассматриваются теоретические и практические вопросы описания логических структур данных, их физического размещения в памяти ЭВМ, а также алгоритмов обработки таких структур.

Для написания серьёзных программ и разработки алгоритмов обработки данных необходимо знание основных типов структур данных, алгоритмов их обработки, а также специфики их обработки.

Данные — непременный атрибут любой программы. Когда употребляется термин «программа», подразумевают не только последовательность операторов некоторого языка программирования, но и набор различных информационных объектов, над которыми выполняются действия, описанные операторами программы. Такие объекты называют данными.

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

В данном курсовом проекте базовой структурой данных является трёхуровневый иерархический список. Это динамическая структура данных, то есть количество элементов в ней может изменяться в процессе выполнения программы. Информационный объект в данной программе — это научно-производственная организация. Соответственно данными для проекта служат записи о договорах, исполнителях, отделений банка и т. д.

Состав Delphi-проекта

Формы, входящие в состав Delphi-проекта:

unitUnitMain; Модуль главной формы программы. Предназначен для организации интерфейса и взаимодействия пользователя с информационными объектами программы. Также модуль обеспечивает связь со всеми остальными, вспомогательными формами в проекте.

Рис.

Основные компоненты формы MainForm:

Компонент TPageControl — страницы вкладок, позволяющие переключаться между информационными таблицами.

Компоненты TStringGrid — таблицы, предназначенные для вывода информации о договорах, исполнителях, банках, а также из трёхуровневой иерархической структуры.

Диалоговая компонентаTOpenDialog предназначена для открытия файлов с информацией о хоз. договорах, исполнителях договора и отделений банка.

Компонент TMainMenuглавное меню, с помощью которого осуществляется управление программой (открытие файлов, выход и т. д.)

Компоненты класса TLabelразличные текстовые надписи, предназначенные для информирования пользователя.

Компоненты класса TButtonразличные кнопки, предназначенные для работы со структурой (сортировка, корректировка, поиск, формирование) unitUnitCorrect; Вспомогательная форма, позволяющая корректировать данные в иерархической структуре и обеспечивающая правильность введённых данных.

Рис.

Основные компоненты формы Correct:

Компоненты TBitBtn-Кнопки, подтверждающие внесённые изменения в структуру, или отменяющие их.

Компоненты TEditпредназначены для ввода информации о договоре.

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

Рис.

Основные компоненты формы Search:

Компонент TStringGrid-таблица, в которой отображаются найденные договоры.

Компонент TEditслужит для ввода номера договора, по которому будет вестись поиск. Поиск происходит при изменении информации в поле ввода.

Модули, входящие в состав Delphi-проекта:

unitStructures;

Модуль, содержащий описание класса трёхуровневого иерархического спискаTTHierarchList. Это класс инкапсулирует в себе все необходимые по заданию операции по обработке структуры: формирование трёхуровневого иерархического списка; добавление и изменение содержимого элементов; сортировка структуры прямым выбором, а также поиск элементов по заданному ключу и отображение списка на экране.

unitOrganizations;

Модуль, содержащий описание класса организацииTNPO, которая заключает договоры. Этот класс инкапсулирует в себе все операции для работы с данными о договорах, исполнителях и отделений банка; загрузку информации из подготовленных файлов. Также этот класс содержит в себе объект класса TTHierarchList.

Также в проект входят все модули с формами, указанные выше.

Основные процедуры, входящие в состав программных модулей:

Модуль UnitMain.

procedureTMain.FormCreate (Sender: TObject); - Созданиеобъектатипа «НПО», исозданиешапоквсехтаблиц.

procedure TMain. N4Click (Sender: TObject); - Пунктменю"Выход из программы".

procedureTMain.N9Click (Sender: TObject); - Отображение информационного окна «О программе».

procedure TMain. N5Click (Sender: TObject); - ОткрытиефайлаXD.

procedure TMain. N6Click (Sender: TObject);- ОткрытиефайлаWTK.

procedure TMain. N7Click (Sender: TObject);- ОткрытиефайлаBank.

procedureTMain.Button1Click (Sender: TObject);- Формирование трёхуровневого иерархического списка договоров на основании таблиц.

procedureTMain.Button3Click (Sender: TObject);- Сортировка трёхуровневого иерархического списка договоров по стоимости услуг по возрастанию.

procedureTMain.Button4Click (Sender: TObject);- Сортировка трёхуровневого иерархического списка договоров по стоимости услуг по убыванию.

procedureTMain.Button2Click (Sender: TObject);- Вызов вспомогательной формы проекта для поиска договора в иерархической структуре.

procedureTMain.Button5Click (Sender: TObject);- Вызов вспомогательной формы проекта для корректировки договора в иерархической структуре.

МодульUnitSearch.

procedureTSearch.FormCreate (Sender: TObject);- Заполнение шапки таблицы на форме для поиска договоров.

procedureTSearch.Edit1Change (Sender: TObject);- Поиск договора в трёхуровневом иерархическом списке по его номеру.

МодульUnitCorrect.

procedure TCorrect. Button2Click (Sender: TObject);- Кнопка «Отмена». Отменавнесённыхизмененийивыходизформыкорректировки.

procedure TCorrect. Button1Click (Sender: TObject);- Кнопка «Применить». Внесение изменений в трёхуровневую иерархию списка и выход из формы.

procedureTCorrect.Edit1KeyPress (Sender: TObject; varKey: Char);- Ограничение на ввод в поле номера символов. Допускаются только цифры.

МодульStructures.

Класстрёхуровневого иерархического списка договоров с требуемыми атрибутами. Описание его переменных и методов

//Тип — указатель на элемент третьего уровня иерархии

PLevel3 = ^TLevel3;

//Запись — элемент третьего уровня иерархии

TLevel3 = Record

Account: LongWord;//Номеррасчётногосчёта

Next:PLevel3 //Указатель на следующий элемент в третьем уровне структуры

end;

//Тип — указатель на элемент второго уровня иерархии

PLevel2 = ^TLevel2;

//Запись — элемент второго уровня иерархии

TLevel2 = Record

City: String[20]; //Названиегорода

Accounts: PLevel3; //Указатель на третий уровень иерархии

Next: PLevel2 //Указатель на следующий элемент во втором уровне структуры

end;

//Тип — указатель на элемент первого уровня иерархии

PLevel1 = ^TLevel1;

//Запись — элемент первого уровня иерархии

TLevel1 = Record

Number: Word; //Номерхоздоговора

StartDate: String[10]; //Дата заключения

Done: Boolean; //Признак завершения

Price: Word; //Цена работ по договору

Cities: PLevel2; //Указатель на второй уровень иерархии

Next: PLevel1 //Указатель на следующий элемент в первом уровне структуры

end;

//Класс 3-ёх уровневой иерархической структуры

THierarchList = class

private

Head: PLevel1; //Указатель на голову списка (первый уровень)

Current: PLevel1; //Текущий указатель в списке (первый уровень)

Count: Word; //Количество элементов в списке на первом уровне

procedure Swap (P1, P2: PLevel1); //Процедура менят местами два узла первого уровня иерархии (для сортировки)

public

property Counter: Word read Count;

//Добавление члена ВТК в иерархический список

procedure Add (S: String; D: Boolean; N, P: Word;

var City: TCities; Cnt: Byte; var Accounts: TAccounts);

procedure Show (SG: TStringGrid); //Вывод структуры на форму

procedure SortingUp; //Сортировка по возрастанию

procedure SortingDown; //Сортировка по убыванию

function SearchByNumber (N: Word): TLevel1; //Поискдоговорапономеру

function GetByNumber (N: Word): PLevel1; //Получение договора по номеру в списке (для корректировки)

end;

МодульOrganizations.

Описание класса НПО со всеми заданными таблицамии методами для работы с ними.

//Запись — ХозДоговор

TXDogovor = Record

Number: Word; //Номер договора

StartDate: String[10]; //Дата заключения договора

FinishDate: String[10]; //Дата завершения договора

Theme: String[25]; //Тема договора,

Organization: String[25]; //Наименование организации — заказчика работ

Done: Boolean; //Признак завершения

Price: Word //Стоимость договора в тыс. рублей

end;

//Запись — Исполнитель ХД и член ВТК

TMemeberWTK = Record

Surname: String[20]; //Фамилия

Name: String[20]; //Имя

Patronymic: String[20]; //Отчество

BirthYear: String[10]; //Год рождения

CodeXD: String[10]; //Код ХД

IsDirector: Boolean; //Признак руководитель/рядовой член ВТК

Premium: Word; //Причитающаяся по договору сумма

Address: String[20]; //Домашний адрес

BankNumber: Word; //Номер отделения сбербанка

Account: LongWord //Расчетный счет исполнителя

end;

//Запись — Атрибуты отделения сбербанка

TBank = Record

Number: Word; //Номер отделения

City: String[20]; //Город, в котором находится отделение

Address: String[20]; //Адрес без указания города

Partition: String[20]; //Наименование отделения

Code: Word //3-хзначный банковский код отделения

end;

TOrganization = class//Класс НПО — научно-производственная организация

private

XD: Array[1.50] ofTXDogovor; //Массив с договорами

WTK: Array[1.30] ofTMemeberWTK; //Массив и исполнителями

Bank: Array[1.20] ofTBank; //Массив с отделениями банков

XDCount: Integer; //Количество договоров

WTKCount: Integer; //Количество исполнителей

BankCount: Integer; //Количество отделений банка

XDTable: TStringGrid; //StringGrid для ХозДоговоров

WTKTable: TStringGrid; //StringGrid для исполнителей договоров

BankTable: TStringGrid; //StringGrid для отделений банков

functionGetWTKByNumber (N: Word): String; //Получение названия ВТК по номеру договора

functionGetCityByNumber (N: Word): String; //Получение города по номеру отделения банка

public

Struct: THiearchList; //Иерархический список

propertyCountXD: IntegerreadXDCount;//Свойство: Количество договоров

propertyCountWTK: IntegerreadWTKCount; //Свойство: Количество исполнителей

propertyCountBank: IntegerreadBankCount; //Свойство: Количество отделений банка

constructorCreate (SG1, SG2, SG3: TStringGrid); //Конструктор

procedure LoadXD (FileName: String); //Открытие файла хоздоговоров

procedure LoadWTK (FileName: String); //Открытие файла исполнителей

procedure LoadBank (FileName: String); //Открытие файла отделений банка

procedure ShowXD; //Вывод списка хоздоговоров на форму

procedureShowWTK; //Вывод списка исполнителей на форму

procedureShowBank; //Вывод списка отделений банков на форму

procedureCreateList; //Формирование иерархического списка

end;

Статические данные и структуры

Таблица

Имя переменной

Тип переменной

Адрес в памяти

Размер (Б)

Назначение переменной

Модуль UnitMain. pas

NPO

TNPO

$B921F0

Ссылка на объект — НПО

Модуль UnitSearch. pas

M

TLevel1

$ 12F1E8

Переменная-буфер для хранения инф. о найденном в структуре договоре

Модуль UnitCorrect. pas

P

PLevel1

$ 12F814

Указатель на корректируемую запись в структуре

Модуль Structures. pas

Head

PLevel1

$BBDDD4

Указатель на первый элемент в первом уровне списка

Current

PLevel1

$BBDDD8

Текущий указатель в первом уровне

Count

Word

$BBDDDC

Количество элементов в списке на первом уровне

I

Byte

$ 12FC2C

Переменная для организации циклов

J

Byte

$ 12FC2B

Переменная для организации циклов

NewNode

PLevel1

$ 12F1EC

Временный буфер для хранения добавляемого в список элемента

CurC

PLevel2

$ 12FC44

Текущий указатель в списке второго уровня

CurN

PLevel3

$ 12FC40

Текущий указатель в списке третьего уровня

NewL2

PLevel2

$ 12FBFC

Временный буфер для хранения добавляемого на второй уровень элемента

NewL3

PLevel3

$ 12FBE8

Временный буфер для хранения добавляемого на третий уровень элемента

Модуль Organizations. pas

XD

Array[1.50] of TXDogovor

$B6AF34

Массив для хранения информации о всех договорах

WTK

Array[1.30] of TMemWTK

$B6BED4

Массив для хранения информации о всех исполнителях

Bank

Array[1.20] of TBank

$B6CC6C

Массив для хранения информации о всех отделениях банка

XDCount

Integer

$B6D1BC

Число жильцов

WTKCount

Integer

$B6D1C0

Число главных квартиросъёмщиков

BankCount

Integer

$B6D1C4

Число квартир

Struct

THiearchList

$B6D1D4

Ссылка на объект (трёхуровневый иерархический список)

XDTable

TStringGrid

$B6D1C8

Указатель на TStringGrid, в котроый выводися информация о договорах

WTKTable

TStringGrid

$B6D1CC

Указатель на TStringGrid, в котроый выводися информация о исполнителях

BankTable

TStringGrid

$B6D1D0

Указатель на TStringGrid, в котроый выводися информ. об отделениях банка

I

Byte

$ 12FB1E

Переменная для организации циклов

J

Byte

$ 12FB1D

Переменная для организации циклов

K

Byte

$ 12FB1E

Переменная для организации циклов

Логическая структура данных

В данном курсовом проекте базовой структурой данных является трёхуровневый иерархический список (hierarchical list). В такой структуре каждый элемент (узел) состоит из информационных полей, указателя на список второго уровня и поля для размещения единственного структурного указателя. Элемент второго уровня иерархии содержит информационные поля, указатель на список третьего уровня иерархии и структурный указатель на следующий элемент во втором уровне. Элемент третьего уровня содержит информационное поле и указатель на следующий элемент в третьем уровне иерархии. В нашем случае информационными полями являются данные о договоре, городах и счетах банка.

//Запись — элемент первого уровня иерархии

TLevel1 = Record

Number: Word; //Номерхоздоговора

StartDate: String[10]; //Датазаключения

Done: Boolean; //Признак завершения

Price: Word; //Цена работ по договору

Cities: PLevel2; //Указатель на второй уровень иерархии

Next: PLevel1 //Указатель на следующий элемент

end;

//Запись — элемент второго уровня иерархии

TLevel2 = Record

City: String[20]; //Названиегорода

Accounts: PLevel3; //Указатель на третий уровень иерархии

Next: PLevel2 //Указатель на следующий элемент

end;

//Запись — элемент третьего уровня иерархии

TLevel3 = Record

Account: LongWord; //Номеррасчётногосчёта

Next: PLevel3 //Указатель на следующий элемент

end;

Поле логического указателя элементов всех уровней хранит адрес в памяти следующего элемента списка. Пользуясь указателем, можно получить доступ к элементу списка, а от него к следующему элементу и т. д., пока не будет достигнут последний элемент. Поле указателя последнего элемента списка должно содержать признак пустого указателя (NIL), свидетельствующий о конце списка. Логическая структура трёхуровневого иерархического списка представлена ниже:

Схема

Логические схемы операций в базовой структуре данных

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

Формирование.

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

//Добавление члена ВТК в иерархический список

procedure THierarchList. Add (S: String; D: Boolean; N, P: Word;

var City: TCities; Cnt: Byte; var Accounts: TAccounts);

var

NewNode: PLevel1;

CurC, NewL2: PLevel2;

CurN, NewL3: PLevel3;

I, J: Byte;

begin

New (NewNode); //Выделяем память под узел первого уровня

with NewNode^ do

begin

Next := NIL; //Заполняемполяпервогоуровня

StartDate := S;

Number := N;

Price := P;

Done := D;

Cities := NIL;

For I := 1 To Cnt do //Начинаемзаполнятьвторойуровень

begin

New (NewL2); //Выделяемпамятьподузелвторогоуровня

if (Cities = NIL) //Вставляем его во второй уровень

then Cities := NewL2

else CurC^.Next := NewL2;

NewL2^.City := City[I]; //Заполняем поле (город)

NewL2^.Next := NIL; //Указатель на следущий — NIL

NewL2^.Accounts := NIL; //Начинаем заполнять третий уровень

For J := 2 to Accounts[I, 1] do

begin

New (NewL3); //Выделяем память под узел третьего уровня

NewL3^.Account := Accounts[I, J]; //Заполняемполе (счёт)

NewL3^.Next := NIL; //Указатель на следущий — NIL

if (NewL2^.Accounts = NIL) //Вставляем его на третий уровень

then NewL2^.Accounts := NewL3

else CurN^.Next := NewL3;

CurN := NewL3

end;

CurC := NewL2

end

end;

if (Current = NIL) //Помещаем узел первого уровня в наш список

then Head := NewNode

else Current^.Next := NewNode;

Current := NewNode;

Inc (Count) //Увеличиваем количество элементов в списке Просмотр трёхуровневого иерархического списка Процедура просмотра трёхуровневого иерархического списка связана с выполнением над каждым элементом каждого уровня одной и той же операции. Просмотр списка начинается с его головы (Head) и длиться, пока структурный указатель натекущий элемент (Current) не будет равным NIL. Это означает, что предыдущий элемент был последним в списке и просмотр закончен. Просмотр второго и третьего уровня осуществляется аналогично во вложенных циклах. В качестве примера представлена процедура печати информационных полей иерархической структуры в компонент TStringGrid:

//Вывод структуры на форму в StringGrid

procedure THierarchList. Show (SG: TStringGrid);

var

I, J, L: Byte;

CurC: PLevel2;

CurN: PLevel3;

begin

For I := 1 to 30 do //Чистим StringGrid

For J := 0 to 10 do

SG.Cells[J, I] := '';

L := 1;

Current := Head;

For I := 1 to Count do //Проход по первому уровню

begin

SG.Cells[0, L] := IntToStr (Current^.Number);//Выводим поля первого уровня

SG.Cells[1, L] := Current^.StartDate;

if (Current^.Done)

then SG. Cells[2, L] := 'Завершён'

elseSG.Cells[2, L] := 'Незавершён';

SG.Cells[3,L] := IntToStr (Current^.Price);

CurC := Current^.Cities;//Начинаем просматривать второй уровень структуры

While (CurC<>NIL) do

begin

SG.Cells[4,L] := CurC^.City; //Выводим поле узла второго уровня (город)

CurN := CurC^.Accounts; //И начинаем просматривать третий уровень

While (CurN<>NIL) do

begin

//Выводим поле третьего уровня (счёт)

SG.Cells[5,L] := SG. Cells[5,L] + IntToStr (CurN^.Account) + ', ';

CurN := CurN^.Next//И движемся дальше по третьему уровню

end;

Inc (L);

CurC := CurC^.Next//Здесь движемся дальше по второму уровню

end;

Current := Current^.Next //А здесь по первому…

end

end;

Сортировка прямым выбором Сортировка с помощью прямого выбора основана на следующем алгоритме:

· выбираем (выделяем) элемент с наименьшим (среди всех N элементов) ключом;

· элемент с наименьшим ключом меняется местами с первым элементом.

· Затем выбираем элемент с наименьшим ключом среди всех элементов, кроме первого элемента; меняем его местами со вторым элементом и т. д.

Эти операции затем повторяются с оставшимися N?2 элементами, затем с N?3 элементами, пока не останется только один элемент? наибольший.

Реализация этого алгоритма в трёхуровневой иерархической структуре приведена ниже:

//Cортировка прямым выбором по возрастанию

procedureTHierarchList.SortingUp;

var

I, J: Word;

Min: PLevel1;

begin

Min := Head;

For I := 1 to Count-1 do

begin

Current := Min^.Next;

For J := 1 to Count — I do

begin //Сравниваем текущий элемент с первым неупорядоченным

if (Min^.Price > Current^.Price) then

Swap (Min, Current); //Меняем их местами если надо

Current := Current^.Next //И движемся дальше по списку

end;

Min := Min^.Next

end

Руководство пользователя Исполняемым файлом данного курсового проекта является файл «KursWork.exe», после запуска которого на экране появляется главное окно приложения:

Рис.

Управление программой происходит с помощью главного меню и кнопок. Пункт меню Файл содержит 2 пункта:

Рис.

Открыть — открытие подготовленных файлов с данными о хоз. договорах, исполнителях и отделениях банка. При этом вся информация с файла загрузится в таблицы класса TNPO и на экран.

Выход — завершить работу с приложением.

Пункт меню О программе вызывает небольшое диалоговое окно, показывающее краткую информацию о проекте:

Рис.

После того, как будут открыты информационные файлы, станет доступной кнопка на вкладке «3-ёх уровневая иерархия»: Сформировать.

Рис.

По нажатию на эту кнопку происходит формирование трёхуровневого иерархического списка и отображение его на экране. Также после этого станут доступны Несколько других кнопок. Корректировка — изменение информационных полей в узлах первого уровня иерархического спика. При этом появиться следующее окно редактирования:

Рис.

Поиск — поиск в трёхуровневом иерархическом списке договора по его номеру. Форма для поиска будет иметь такой вид:

Рис.

Сортировка — сортировка трёхуровневого иерархического списка прямым выбором по стоимости услуг. Сортировка может производиться как по возрастанию, так и по убыванию. Сразу после сортировки содержимое таблицы на экране обновится.

Заключение

В результате работы была создана информационная модель информационной систем расчёта по договорам. Программа была разработана в визуальной среде BorlandDelphi7.0, работающей под управлением ОС семейства Windows. Программа показала стабильные результаты работы с различными тестовыми примерами.

Была изучена и реализована логическая структура трёхуровневого иерархического списка. Кроме того, был реализован механизм ввода всей информации с внешнего накопителя (файлыXD.dat, WTK. dat, Bank. dat). Наконец, был рассмотрен метод сортировки прямым выбором, тестирование которой показало положительные результаты при работе с различными исходными данными.

Разработанная в ходе курсового проектирования программа удовлетворяет следующим, предусмотренным заданием, требованиям:

1. реализованы операции формирования, просмотра, добавления, корректировки, сортировки и поиска в трёхуровневой иерархической структуре;

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

3. Трёхуровневый иерархический список реализован в отдельном классе (THirarchList).

1.Бакнелл Д. М. Фундаментальные алгоритмы и структуры данных в Delphi.? СПб: ООО «ДиаСофтЮП», 2003.? 506 с.

2.Вирт Н. Алгоритмы и структуры данных.? СПб: Невский диалект, 2001. — 352 с.

3.Альфред В. Ахо и др. Структуры данных и алгоритмы. — М.: Вильямс, 2001.

4.Р. Л. Структуры данных и проектирование программ. — М.: БИНОМ. Лаборатория знаний, 2008. — 765 с.

Приложение

(Исходные тексты всех модулей) МодульUnitMain.

unit UnitMain;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, ComCtrls, Menus, Organizations, StdCtrls, XPMan,

UnitSearch, UnitCorrect;

type

TMain = class (TForm)

PageControl1: TPageControl;

MainMenu1: TMainMenu;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

TabSheet3: TTabSheet;

StringGrid1: TStringGrid;

StringGrid2: TStringGrid;

StringGrid3: TStringGrid;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

N9: TMenuItem;

OpenDialog1: TOpenDialog;

TabSheet4: TTabSheet;

StringGrid4: TStringGrid;

XPManifest1: TXPManifest;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Button5: TButton;

procedure FormCreate (Sender: TObject);

procedure N4Click (Sender: TObject);

procedure N9Click (Sender: TObject);

procedure N5Click (Sender: TObject);

procedure N6Click (Sender: TObject);

procedure N7Click (Sender: TObject);

procedure Button1Click (Sender: TObject);

procedure Button3Click (Sender: TObject);

procedure Button4Click (Sender: TObject);

procedure Button2Click (Sender: TObject);

procedure Button5Click (Sender: TObject);

public

NPO: TNPO;

end;

var Main: TMain;

implementation

{$R *.dfm}

//ЗаполняемшапкитаблицисоздаёмНПО

procedure TMain. FormCreate (Sender: TObject);

begin

with StringGrid1 do

begin

Cells[0,0] := ' № дог.';

Cells[1,0] := ' Дата закл.';

Cells[2,0] := ' Дата зав.';

Cells[3,0] := ' Тема';

Cells[4,0] := ' Организация';

Cells[5,0] := ' Признак';

Cells[6,0] := ' Стоимость'

end;

with StringGrid2 do

begin

Cells[0,0] := ' Фамилия';

Cells[1,0] := ' Имя';

Cells[2,0] := ' Отчество';

Cells[3,0] := ' Год рожд';

Cells[4,0] := ' Код XD';

Cells[5,0] := ' Признак';

Cells[6,0] := ' Сумма';

Cells[7,0] := ' Адрес';

Cells[8,0] := ' Банк';

Cells[9,0] := ' Счет'

end;

with StringGrid3 do

begin

Cells[0,0] := ' № отделения';

Cells[1,0] := ' Город';

Cells[2,0] := ' Адрес отделения';

Cells[3,0] := ' Наимен. отделения';

Cells[4,0] := ' Код отделения'

end;

with StringGrid4 do

begin

Cells[0,0] := ' Номер';

Cells[1,0] := ' Дата закл.';

Cells[2,0] := ' Признак';

Cells[3,0] := ' Стоимость';

Cells[4,0] := ' Города';

Cells[5,0] := ' Счета'

end;

NPO := TNPO. Create (StringGrid1, StringGrid2, StringGrid3)

end;

//Пункт меню «Выход»

procedure TMain. N4Click (Sender: TObject);

begin

Close

end;

//Пункт меню «О программе»

procedure TMain. N9Click (Sender: TObject);

begin

MessageBox (Handle, PChar ('Курсовой проект' + #13 + 'ст. гр. 107 218 Горбачёв П. И.'),

'Информация', MB_ICONINFORMATION)

end;

//Пункт меню «Открыть файл ХозДоговоры»

procedure TMain. N5Click (Sender: TObject);

begin

if OpenDialog1. Execute then

begin

NPO.LoadXD (OpenDialog1.FileName);

NPO.ShowXD

end

end;

//Пункт меню «Открыть файл Исполнители»

procedure TMain. N6Click (Sender: TObject);

begin

if OpenDialog1. Execute then

begin

NPO.LoadWTK (OpenDialog1.FileName);

NPO.ShowWTK

end

end;

//Пункт меню «Открыть файл Отделения Банков»

procedure TMain. N7Click (Sender: TObject);

begin

if OpenDialog1. Execute then

begin

NPO.LoadBank (OpenDialog1.FileName);

NPO.ShowBank

end

end;

//Сформировать список

procedure TMain. Button1Click (Sender: TObject);

begin

if ((NPO.CountXD = 0) or (NPO.CountWTK = 0) or (NPO.CountBank = 0)) then

begin

MessageBox (Handle, 'Не хватате данных', 'Ошибка', MB_ICONERROR);

Exit

end;

//Создём список и выводим его

NPO.CreateList;

NPO.Struct.Show (StringGrid4);

Button1.Enabled := False;

Button2.Enabled := True;

Button3.Enabled := True;

Button4.Enabled := True;

Button5.Enabled := True;

end;

//Кнопка «Сортировать по возрастанию»

procedure TMain. Button3Click (Sender: TObject);

begin

NPO.Struct.SortingUp; //Сортируем иерархический список

NPO.Struct.Show (StringGrid4) //и выводим

end;

//Кнопка «Сортировать по убыванию»

procedure TMain. Button4Click (Sender: TObject);

begin

NPO.Struct.SortingDown; //Сортируем иерархический список

NPO.Struct.Show (StringGrid4) //и выводим

end;

//Кнопка «Поиск»

procedure TMain. Button2Click (Sender: TObject);

begin

Search.ShowModal

end;

//Кнопка «Корректировать»

procedure TMain. Button5Click (Sender: TObject);

begin

Correct.ShowModal;

NPO.Struct.Show (StringGrid4)

end;

end.

МодульUnitSearch.

unit UnitSearch;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, Structures;

type

TSearch = class (TForm)

StringGrid1: TStringGrid;

Label1: TLabel;

Edit1: TEdit;

procedure FormCreate (Sender: TObject);

procedure Edit1Change (Sender: TObject);

procedure Edit1KeyPress (Sender: TObject; var Key: Char);

end;

var Search: TSearch;

implementation

{$R *.dfm}

uses UnitMain;

procedure TSearch. FormCreate (Sender: TObject);

begin

with StringGrid1 do

begin

Cells[0,0] := ' Номер';

Cells[1,0] := ' Дата закл.';

Cells[2,0] := ' Признак';

Cells[3,0] := ' Стоимость';

end;

end;

//Поиск договоров

procedure TSearch. Edit1Change (Sender: TObject);

var

M: TLevel1;

begin

M := Main.NPO.Struct.SearchByNumber (StrToInt (Edit1.Text));//Ищем договор

withStringGrid1 do

begin //И выводим информацию о найденном договоре

Cells[0,1] := IntToStr (M.Number);

Cells[1,1] := M. StartDate;

if (M.Done)

then Cells[2,1] := 'Завершён'

else Cells[2,1] := 'Не завершён';

Cells[3,1] := IntToStr (M.Price)

end;

end;

//Ограничение на ввод букв

procedure TSearch. Edit1KeyPress (Sender: TObject; var Key: Char);

begin

if Not (Key in ['0'.'9', #8]) then Key := #0

end;

end.

МодульUnitCorrect.

unit UnitCorrect;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Structures;

type

TCorrect = class (TForm)

Label1: TLabel;

Edit1: TEdit;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Label5: TLabel;

Edit5: TEdit;

Button1: TButton;

Button2: TButton;

procedure Button2Click (Sender: TObject);

procedure Edit1KeyPress (Sender: TObject; var Key: Char);

procedure Edit1Change (Sender: TObject);

procedure Button1Click (Sender: TObject);

procedure FormShow (Sender: TObject);

end;

var Correct: TCorrect;

implementation

{$R *.dfm}

uses UnitMain;

Var P: PLevel1;

//Кнопка «Отмена»

procedure TCorrect. Button2Click (Sender: TObject);

begin

Close

end;

//Ограничение на ввод букв

procedure TCorrect. Edit1KeyPress (Sender: TObject; var Key: Char);

begin

if Not (Key in ['0'.'9', #8]) then Key := #0

end;

//Получаем договор по его номеру в списке

procedure TCorrect. Edit1Change (Sender: TObject);

begin

if (Edit1.Text = '') then Exit;

if (StrToInt (Edit1.Text) > Main.NPO.Struct.Counter) then

Exit;

P := Main.NPO.Struct.GetByNumber (StrToInt (Edit1.Text));

Edit2.Text := IntToStr (P^.Number);

Edit3.Text := P^.StartDate;

if (P^.Done)

then Edit4. Text := 'Завершён'

else Edit4. Text := 'Не завершён';

Edit5.Text := IntToStr (P^.Price)

end;

//Кнопка «Применить»

procedure TCorrect. Button1Click (Sender: TObject);

begin

P^.Number := StrToInt (Edit2.Text);

P^.StartDate := Edit3. Text;

if (Edit4.Text = 'Завершён')

then P^.Done := True

else P^.Done := False;

P^.Price := StrToInt (Edit5.Text);

Close

end;

procedure TCorrect. FormShow (Sender: TObject);

begin

Edit1.Text := '1';

Edit1Change (Sender);

end;

end.

МодульStructures.

unit Structures;

interface

uses

Grids, //Модуль для работы с TStringGrid

SysUtils; //Модуль с функциями StrToInt и т. д.

type

//Типы массивов для передачи информации о втором и первом уровнях иерархии

TCities = Array[1.20] of String[20];

TAccounts = Array[1.20, 1.6] of LongWord;

//Тип — указатель на элемент третьего уровня иерархии

PLevel3 = ^TLevel3;

//Запись — элемент третьего уровня иерархии

TLevel3 = Record

Account: LongWord; //Номер расчётного счёта

Next: PLevel3 //Указатель на следующий элемент в третьем уровне структуры

end;

//Тип — указатель на элемент второго уровня иерархии

PLevel2 = ^TLevel2;

//Запись — элемент второго уровня иерархии

TLevel2 = Record

City: String[20]; //Название города

Accounts: PLevel3; //Указатель на третий уровень иерархии (список номеров отделений банка в городе)

Next: PLevel2 //Указатель на следующий элемент во втором уровне структуры

end;

//Тип — указатель на элемент первого уровня иерархии

PLevel1 = ^TLevel1;

//Запись — элемент первого уровня иерархии

TLevel1 = Record

Number: Word; //Номер хоздоговора

StartDate: String[10]; //Дата заключения

Done: Boolean; //Признак завершения

Price: Word; //Цена работ по договору

Cities: PLevel2; //Указатель на второй уровень иерархии

Next: PLevel1 //Указатель на следующий элемент в первом уровне структуры

end;

//Класс 3-ёх уровневой иерархической структуры

THierarchList = class

private

Head: PLevel1; //Указатель на голову списка (первый уровень)

Current: PLevel1; //Текущий указатель в списке (первый уровень)

Count: Word; //Количество элементов в списке на первом уровне

procedureSwap (P1, P2: PLevel1); //Процедура менят местами два узла первого уровня иерархии (для сортировки)

public

property Counter: Word read Count;

//Добавление члена ВТК в иерархический список (параметры — это все нужные поля в структуре)

procedure Add (S: String; D: Boolean; N, P: Word;

var City: TCities; Cnt: Byte; var Accounts: TAccounts);

procedureShow (SG: TStringGrid); //Вывод структуры на форму

procedureSortingUp; //Сортировка по возрастанию

procedureSortingDown; //Сортировка по убыванию

function SearchByNumber (N: Word): TLevel1; //Поиск договора по номеру

functionGetByNumber (N: Word): PLevel1; //Получение договора по номеру в списке (для корректировки)

end;

implementation

//Добавление члена ВТК в иерархический список

procedure THierarchList. Add (S: String; D: Boolean; N, P: Word;

var City: TCities; Cnt: Byte; var Accounts: TAccounts);

var

NewNode: PLevel1;

CurC, NewL2: PLevel2;

CurN, NewL3: PLevel3;

I, J: Byte;

begin

New (NewNode); //Выделяем память под узел первого уровня

with NewNode^ do

begin

Next := NIL; //Заполняем поля первого уровня

StartDate := S;

Number := N;

Price := P;

Done := D;

Cities := NIL;

For I := 1 To Cnt do //Начинаем заполнять второй уровень

begin

New (NewL2); //Выделяем память под узел второго уровня

if (Cities = NIL) //Вставляем его во второй уровень

then Cities := NewL2

else CurC^.Next := NewL2;

NewL2^.City := City[I]; //Заполняем поле (город)

NewL2^.Next := NIL; //Указатель на следущий — NIL

NewL2^.Accounts := NIL; //Начинаем заполнять третий уровень

For J := 2 to Accounts[I, 1] do

begin

New (NewL3); //Выделяем память под узел третьего уровня

NewL3^.Account := Accounts[I, J]; //Заполняем поле (номер отделения банка)

NewL3^.Next := NIL; //Указатель на следущий — NIL

if (NewL2^.Accounts = NIL) //Вставляем его на третий уровень

then NewL2^.Accounts := NewL3

else CurN^.Next := NewL3;

CurN := NewL3

end;

CurC := NewL2

end

end;

if (Current = NIL) //Помещаем узел первого уровня в наш список

then Head := NewNode

else Current^.Next := NewNode;

Current := NewNode;

Inc (Count) //Увеличиваем количество элементов в списке

end;

//Возвращает указатель на исполнителя по номеру в списке

function THierarchList. GetByNumber (N: Word): PLevel1;

var

I: Word;

begin

Current := Head;

For I := 2 to N do

Current := Current^.Next;

Result := Current

end;

//Поиск по фамилии

function THierarchList. SearchByNumber (N: Word): TLevel1;

begin

Result.Number := 0;

Result.StartDate := '';

Result.Done := False;

Result.Price := 0;

//Начинаем двигаться по списку

Current := Head;

While (Current<>NIL) do

begin //Сравниваем текущую фамилию с заданной

if (Current^.Number = N) then

begin //Если совпадает, то запоминаем результат и выходим

Result := Current^;

Break

end;

Current := Current^.Next //Иначе двигаемся по списку дальше

end

end;

//Вывод структуры на форму в StringGrid

procedure THierarchList. Show (SG: TStringGrid);

var

I, J, L: Byte;

CurC: PLevel2;

CurN: PLevel3;

begin

For I := 1 to 30 do //Чистим StringGrid

For J := 0 to 10 do

SG.Cells[J, I] := '';

L := 1;

Current := Head;

For I := 1 to Count do //Проход по первому уровню

begin

SG.Cells[0, L] := IntToStr (Current^.Number); //Выводим поля узла первого уровня

SG.Cells[1, L] := Current^.StartDate;

if (Current^.Done)

then SG. Cells[2, L] := 'Завершён'

elseSG.Cells[2, L] := 'Не завершён';

SG.Cells[3,L] := IntToStr (Current^.Price);

CurC := Current^.Cities; //Начинаем просматривать второй уровень структуры

While (CurC<>NIL) do

begin

SG.Cells[4,L] := CurC^.City; //Выводим поле узла второго уровня (город)

CurN := CurC^.Accounts; //И начинаем просматривать третий уровень

While (CurN<>NIL) do

Begin//Выводим поле третьего уровня (счёт)

SG.Cells[5,L] := SG. Cells[5,L] + IntToStr (CurN^.Account) + ', ';

CurN := CurN^.Next //И движемся дальше по птрьему уровню

end;

Inc (L);

CurC := CurC^.Next //Здесь движемся дальше по второму уровню

end;

Current := Current^.Next //А здесь по первому…

end

end;

//Cортировка прямым выбором по убыванию

procedure THierarchList. SortingDown;

var

I, J: Word;

Max: PLevel1;

begin

Max := Head;

For I := 1 to Count-1 do

begin

Current := Max^.Next;

For J := 1 to Count — I do

begin //Сравниваем текущий элемент с первым неупорядоченным

if (Max^.Price < Current^.Price) then

Swap (Max, Current); //Меняем их местами если надо

Current := Current^.Next //И движемся дальше по списку

end;

Max := Max^.Next

end

end;

//Cортировка прямым выбором по возрастанию

procedureTHierarchList.SortingUp;

var

I, J: Word;

Min: PLevel1;

begin

Min := Head;

For I := 1 to Count-1 do

begin

Current := Min^.Next;

For J := 1 to Count — I do

begin //Сравниваем текущий элемент с первым неупорядоченным

if (Min^.Price > Current^.Price) then

Swap (Min, Current); //Меняем их местами если надо

Current := Current^.Next //И движемся дальше по списку

end;

Min := Min^.Next

end

end;

//Обмен местами в списке первого уровня

procedure THierarchList. Swap (P1, P2: PLevel1);

var

TempStartDate: String[10];

TempDone: Boolean;

TempNumber: Word;

TempPrice: Word;

TempCities: PLevel2;

begin

//Запомнили первый договор

TempStartDate := P1^.StartDate;

TempDone := P1^.Done;

TempNumber := P1^.Number;

TempPrice := P1^.Price;

TempCities := P1^.Cities;

//Записали в него второй

P1^.StartDate := P2^.StartDate;

P1^.Done := P2^.Done;

P1^.Number := P2^.Number;

P1^.Price := P2^.Price;

P1^.Cities := P2^.Cities;

//А во второй записали сохранённый первый

P2^.StartDate := TempStartDate;

P2^.Done := TempDone;

P2^.Number := TempNumber;

P2^.Price := TempPrice;

P2^.Cities := TempCities;

//В итоге договоры поменялись местами

end;

end.

МодульOrganizations.

unit Organizations;

interface

uses

Grids, //Модуль для работы с TStringGrid

SysUtils, //Модуль с функциями StrToInt и т. д.

Structures; //Модуль с классом 3-ёх уровневой иерархической структуры

type

//Запись — ХозДоговор

TXDogovor = Record

Number: Word; //Номер договора

StartDate: String[10]; //Дата заключения договора

FinishDate: String[10]; //Дата завершения договора

Theme: String[25]; //Тема договора,

Organization: String[25]; //Наименование организации — заказчика работ

Done: Boolean; //Признак завершения

Price: Word //Стоимость договора в тыс. рублей

end;

//Запись — Исполнитель ХД и член ВТК

TMemeberWTK = Record

Surname: String[20]; //Фамилия

Name: String[20]; //Имя

Patronymic: String[20]; //Отчество

BirthYear: String[10]; //Год рождения

CodeXD: String[10]; //Код ХД

IsDirector: Boolean; //Признак руководитель/рядовой член ВТК

Premium: Word; //Причитающаяся по договору сумма вознаграждения

Address: String[20]; //Домашний адрес

BankNumber: Word; //Номер отделения сбербанка

Account: LongWord //Расчетный счет исполнителя

end;

//Запись — Атрибуты отделения сбербанка

TBank = Record

Number: Word; //Номер отделения

City: String[20]; //Город, в котором находится отделение

Address: String[20]; //Адрес без указания города

Partition: String[20]; //Наименование отделения

Code: Word //3-хзначный банковский код отделения

end;

TNPO = class //Класс НПО — научно-производственная организация

private

XD: Array[1.50] ofTXDogovor; //Массив с договорами

WTK: Array[1.30] ofTMemeberWTK; //Массив и исполнителями

Bank: Array[1.20] ofTBank; //Массив с отделениями банков

XDCount: Integer; //Количество договоров

WTKCount: Integer; //Количество исполнителей

BankCount: Integer; //Количество отделений банка

XDTable: TStringGrid; //StringGrid для ХозДоговоров

WTKTable: TStringGrid; //StringGrid для исполнителей договоров

BankTable: TStringGrid; //StringGrid для отделений банков

functionGetCityByNumber (N: Word): String; //ПОлучение города по номеру отделения банка

public

Struct: THierarchList; //Иерархический список

propertyCountXD: IntegerreadXDCount; //Свойство: Количество договоров

propertyCountWTK: IntegerreadWTKCount; //Свойство: Количество исполнителей

propertyCountBank: IntegerreadBankCount; //Свойство: Количество отделений банка

constructorCreate (SG1, SG2, SG3: TStringGrid); //Конструктор

procedure LoadXD (FileName: String); //Открытие файла хоздоговоров

procedure LoadWTK (FileName: String); //Открытие файла исполнителей

procedure LoadBank (FileName: String); //Открытие файла отделений банка

procedure ShowXD; //Вывод списка хоздоговоров на форму

procedureShowWTK; //Вывод списка исполнителей на форму

procedureShowBank; //Вывод списка отделений банков на форму

procedureCreateList; //Формирование иерархического списка

end;

implementation

//Сохраняем StringGrid’ы для всех таблиц

constructor TNPO. Create (SG1, SG2, SG3: TStringGrid);

begin

XDTable := SG1;

WTKTable := SG2;

BankTable := SG3

end;

//Формирование иерархического списка (по условию задания)

procedure TNPO. CreateList;

var

I, J, K: Byte;

P: Boolean;

Cities: TCities; //Массив с городами для 2-ого уровня иерархии

Accounts: TAccounts; //Массив со счетами для 3-его уровня иерархии

CountC: Byte; //Количество городов

begin

Struct := THierarchList. Create; //Создаём структуру

ForI := 1 toXDCountdo //Просматриваем всех договоров

withXD[I] do

begin //Начинаем формировать для него иерархию

FillChar (Accounts, sizeof (Accounts), 0);

CountC := 0; //Сначала количество городов = 0

ForJ := 1 toWTKCountdo //Просматриваем всех исполнителей

if (Number = StrToInt (Copy (WTK[J]. CodeXD, 1, 2))) then//И если совпал номер договора

begin

P := False; //То добавляем в структуру город и/или счёт

For K := 1 to CountC do

if (Cities[K] = GetCityByNumber (WTK[J]. BankNumber)) then

begin

P := True;

Inc (Accounts[K, 1]);

Accounts[K, Accounts[K, 1]] := WTK[J]. Account;

Break

end;

if Not (P) then

begin

Inc (CountC);

Cities[CountC] := GetCityByNumber (WTK[J]. BankNumber);

Accounts[CountC, 1] := 2;

Accounts[CountC, 2] := WTK[J]. Account

end

end;

Struct.Add (StartDate, Done, Number, Price, Cities, CountC, Accounts) //Добавляем получившуюся информацию в структуру

end

end;

//Возвращает название города по номеру отделения банка

function TNPO. GetCityByNumber (N: Word): String;

var

I: Byte;

begin

Result := '';

For I := 1 to BankCount do

if (Bank[I]. Number = N) then

begin

Result := Bank[I]. City;

Exit

end

end;

//Открытие файла отделений банка

procedure TNPO. LoadBank (FileName: String);

var

F: File of TBank;

begin

AssignFile (F, FileName);

Reset (F);

BankCount := 0;

While Not (EoF (F)) do

begin

Inc (BankCount);

Read (F, Bank[BankCount])

end;

CloseFile (F)

end;

//Открытие файла исполнителей

procedure TNPO. LoadWTK (FileName: String);

var

F: File of TMemeberWTK;

begin

AssignFile (F, FileName);

Reset (F);

WTKCount := 0;

While Not (EoF (F)) do

begin

Inc (WTKCount);

Read (F, WTK[WTKCount])

end;

CloseFile (F)

end;

//Открытие файла хоздоговоров

procedure TNPO. LoadXD (FileName: String);

var

F: File of TXDogovor;

begin

AssignFile (F, FileName);

Reset (F);

XDCount := 0;

While Not (EoF (F)) do

begin

Inc (XDCount);

Read (F, XD[XDCount])

end;

CloseFile (F)

end;

//Вывод списка отделений банков на форму

procedure TNPO. ShowBank;

var

I: Byte;

begin

For I := 1 to BankCount do

begin

With Bank[I] do

begin

BankTable.Cells[0,I] := IntToStr (Number);

BankTable.Cells[1,I] := City;

BankTable.Cells[2,I] := Address;

BankTable.Cells[3,I] := Partition;

BankTable.Cells[4,I] := IntToStr (Code)

end;

end;

end;

//Вывод списка исполнителей на форму

procedure TNPO. ShowWTK;

var

I: Byte;

begin

For I := 1 to WTKCount do

begin

With WTK[I] do

begin

WTKTable.Cells[0,I] := Surname;

WTKTable.Cells[1,I] := Name;

WTKTable.Cells[2,I] := Patronymic;

WTKTable.Cells[3,I] := BirthYear;

WTKTable.Cells[4,I] := CodeXD;

if (IsDirector)

then WTKTable. Cells[5,I] := 'Руководитель'

else WTKTable. Cells[5,I] := 'Рядовой член';

WTKTable.Cells[6,I] := IntToStr (Premium);

WTKTable.Cells[7,I] := Address;

WTKTable.Cells[8,I] := IntToStr (BankNumber);

WTKTable.Cells[9,I] := IntToStr (Account)

end

end

end;

//Вывод списка договоров на форму

procedure TNPO. ShowXD;

var

I: Byte;

begin

For I := 1 to XDCount do

begin

With XD[I] do

begin

XDTable.Cells[0,I] := IntToStr (Number);

XDTable.Cells[1,I] := StartDate;

XDTable.Cells[2,I] := FinishDate;

XDTable.Cells[3,I] := Theme;

XDTable.Cells[4,I] := Organization;

if (Done)

then XDTable. Cells[5,I] := 'Завершён'

else XDTable. Cells[5,I] := 'Не завершён';

XDTable.Cells[6,I] := IntToStr (Price)

end

end

end;

end.

Размещено на

Показать весь текст
Заполнить форму текущей работой