Основная программа
program Project_ObjectList;
{$APPTYPE CONSOLE}
uses
SysUtils,
Dialogs,
Contnrs,
Classes,
MyClasses in 'MyClasses.pas';
////////////////////////////////////////////////////////////////////////////////
// Объявление записи, которая необходима для работы с типизированными файлами
////////////////////////////////////////////////////////////////////////////////
type
Rec = record
Name: string20;
Age: Integer;
Group: string10;
end;
var
MyList: TMyObjectList;
MyObject1, MyObject2: TMyObject;
////////////////////////////////////////////////////////////////////////////////
// Метод Sort класса TObjectList определен так:
// procedure Sort(Compare: TListSortCompare);
// где type TListSortCompare = function (Item1, Item2: Pointer): Integer;
// Т. о. функция CompareByName определяет, по какому признаку будет сортироваться
// список и в каком порядке
////////////////////////////////////////////////////////////////////////////////
function CompareByName(X: Pointer; Y: Pointer): Integer;
begin
if TMyObject(X).Name < TMyObject(Y).Name then Result := -1
else if TMyObject(X).Name > TMyObject(Y).Name then Result := 1
else Result := 0;
end;
////////////////////////////////////////////////////////////////////////////////
// Процедура сохранения списка в типизированном файле
////////////////////////////////////////////////////////////////////////////////
procedure Save(List: TMyObjectList; FileName: string);
var
F: file of Rec;
R: Rec;
I: Integer;
begin
AssignFile(F, FileName);
try
Rewrite(F);
for I := 0 to List.Count - 1 do
begin
R.Name := TMyObject(List.Items[I]).Name;
R.Age := TMyObject(List.Items[I]).Age;
R.Group := TMyObject(List.Items[I]).Group;
Write(F, R);
end;
finally
CloseFile(F);
end;
end;
////////////////////////////////////////////////////////////////////////////////
// Процедура построения списка, чтением его из типизированного файла
////////////////////////////////////////////////////////////////////////////////
procedure Load(List: TMyObjectList; FileName: string);
var
F: file of Rec;
R: Rec;
begin
AssignFile(F, FileName);
try
Reset(F);
try
while not Eof(F) do
begin
Read(F, R);
List.Add(TMyObject.Create(R.Name, R.Age, R.Group));
end;
finally
CloseFile(F);
end;
except
on EInOutError do
ShowMessage('Ошибка доступа к файлу '+FileName+'!');
end;
end;
begin
////////////////////////////////////////////////////////////////////////////////
// Создаем пустой список
MyList := TMyObjectList.Create;
////////////////////////////////////////////////////////////////////////////////
// Печатаем длину списка и убеждаемся, что он пустой
Writeln('Длина пустого списка = ', MyList.Count);
try
////////////////////////////////////////////////////////////////////////////////
// Добавляем к списку три элемента
MyList.Add(TMyObject.Create('Ivanov', 17, 'BMT2-21'));
MyList.Add(TMyObject.Create('Petrov', 17, 'IU1-22'));
MyList.Add(TMyObject.Create('Sidorov', 18, 'IU4-23'));
////////////////////////////////////////////////////////////////////////////////
// Печатаем список
Writeln('*** Список из трех студентов ***');
MyList.Print;
////////////////////////////////////////////////////////////////////////////////
// Добавляем к списку еще два элемента: один с начала, а другой с конца
MyList.AddAtHead(TMyObject.Create('Golfand', 17, 'RL2-21'));
MyList.AddAtTail(TMyObject.Create('Gelfand', 18, 'IBM3-21'));
////////////////////////////////////////////////////////////////////////////////
// Печатаем список
Writeln('*** Список из пяти студентов ***');
MyList.Print;
////////////////////////////////////////////////////////////////////////////////
// Перемещаем элемент со второй позиции на четвертую
MyList.Move(2, 4);
////////////////////////////////////////////////////////////////////////////////
// Печатаем список
Writeln('*** Список из пяти студентов после применения метода Move(2, 4) ***');
MyList.Print;
////////////////////////////////////////////////////////////////////////////////
// Меняем местами элементы в позициях 1 и 3
MyList.Exchange(1, 3);
////////////////////////////////////////////////////////////////////////////////
// Печатаем список
Writeln('*** Список из пяти студентов после применения метода Exchange(1, 3) ***');
MyList.Print;
////////////////////////////////////////////////////////////////////////////////
// Вставляем новый элемент в позицию 2
MyList.Insert(2, TMyObject.Create('Skovoroda', 18, 'MT6-21'));
////////////////////////////////////////////////////////////////////////////////
// Печатаем список
Writeln('*** Список из шести студентов после применения метода Insert(2, ...) ***');
MyList.Print;
////////////////////////////////////////////////////////////////////////////////
// Удаляем элементы с концов списка
MyList.DelFromHead;
MyList.DelFromTail;
////////////////////////////////////////////////////////////////////////////////
// Печатаем список
Writeln('*** Список из четырех студентов после удаления первого и последнего ***');
MyList.Print;
////////////////////////////////////////////////////////////////////////////////
// Вводим данные для двух элементов и добавляем их в конец списка
MyObject1 := TMyObject.Create;
MyObject1.Read;
MyList.Add(MyObject1);
MyObject2 := TMyObject.Create;
MyObject2.Read;
MyList.Add(MyObject2);
////////////////////////////////////////////////////////////////////////////////
// Печатаем список
Writeln('*** Список из шести студентов после добавления двух ***');
MyList.Print;
////////////////////////////////////////////////////////////////////////////////
// Печатаем элемент в третьей позиции
Writeln('*** В третьей позиции находится студент ***');
TMyObject(MyList.Items[3]).Print;
////////////////////////////////////////////////////////////////////////////////
// Определяем, в какой позиции находится элемент MyObject2
Writeln('*** Студент ***');
MyObject1.Print;
Writeln('*** находится в позиции ', MyList.IndexOf(MyObject1));
////////////////////////////////////////////////////////////////////////////////
// Сортируем список по признаку Name в порядке возрастания
MyList.Sort(CompareByName);
////////////////////////////////////////////////////////////////////////////////
// Печатаем отсортированный список
Writeln('*** Отсортированный список из шести студентов ***');
MyList.Print;
////////////////////////////////////////////////////////////////////////////////
// Сохраняем полученный список в файле 'MY.DAT'
Save(MyList, 'MY.DAT');
////////////////////////////////////////////////////////////////////////////////
// Очищаем (опустошаем) список
MyList.Clear;
////////////////////////////////////////////////////////////////////////////////
// Печатаем длину опустошенного список
Writeln('Длина опустошенного = ', MyList.Count);
////////////////////////////////////////////////////////////////////////////////
// Восстанавливаем список, читая его из файла 'MY.DAT'
Load(MyList, 'MY.DAT');
////////////////////////////////////////////////////////////////////////////////
// Печатаем восстановленный список
Writeln('*** Список, полученный чтением его из файла ***');
MyList.Print;
////////////////////////////////////////////////////////////////////////////////
// Снова очищаем (опустошаем) список
MyList.Clear;
finally
////////////////////////////////////////////////////////////////////////////////
// Уничтожаем список
MyList.Free;
end;
Write('Press <Enter>...');
Readln;
end.