Трёхуровневый иерархический список
Поле логического указателя элементов всех уровней хранит адрес в памяти следующего элемента списка. Пользуясь указателем, можно получить доступ к элементу списка, а от него к следующему элементу и т. д., пока не будет достигнут последний элемент. Поле указателя последнего элемента списка должно содержать признак пустого указателя (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.
Размещено на