Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delphi_02_06 [2012].doc
Скачиваний:
2
Добавлен:
28.08.2019
Размер:
89.09 Кб
Скачать

Основная программа

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]