Иллюстрированный самоучитель по Turbo Pascal

Доступ к элементам коллекций

Точно таким же образом реализуется обращение к методам FirstThat и LastThat. Например, если нам потребуется отыскать в каталоге запись, содержащую слово "Вирт" в поле Autor, можно добавить в программу следующие строки:

Procedure SearchAutor(BookList: Pcollection; A: String);
Function FindAutor(P: PBook): Boolean; far;
begin
FindAutor: = pos(А, Р.Autor) < >0
end; {FindAutor}
var
Book: PBook;
begin {SearchAutor}
Book: = BookList.FirstThat(FindAutor);
if Book = NIL then
WriteLn('Heт автора ',А)
else with Book do
begin
WriteLn;
PrintItern(Autor,Title,PubHouse,Year,Pages)
end
end; {SearchAutor}

В тело главной программы следует добавить оператор:

SearchAutor(BookList,'Вирт');

Собственно поиск элемента коллекции реализуется оператором:

Book: = BookList.FirstThat(FindAutor);

Который для этих целей обращается к методу TCollection.FirstThat. В этом методе реализуется последовательный анализ всех элементов коллекции, начиная с самого первого (с индексом 0), причем для анализа используется вызов функции FindAutor. Как видим, эта функция нужным образом анализирует очередную запись и возвращает True, если условие поиска удовлетворено. Метод FirstThat возвращает указатель на элемент коллекции, для которого удовлетворено условие поиска, или NIL, если этому условию не отвечает ни один элемент. Таким образом, оператор:

if Book = NIL then
…..
else
…..

Проверяет результат поиска и выводит на печать найденный элемент коллекции или сообщение "Нет автора…", если условие поиска не удовлетворено.

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

Любой элемент коллекции можно удалить или заменить новым. Для удаления используется метод AtFree, которому в качестве параметра передается индекс удаляемого элемента. При удалении элемента предполагается, что коллекция содержит указатели на объекты, порожденные от TObect и размещенные в куче, поэтому автоматически вызывается метод TObject.Done. Индексы всех элементов, размещенных в коллекции после удаляемого элемента, уменьшаются на 1.

С помощью метода DeleteAll удаляются все элементы из коллекции, но сама коллекция при этом сохраняется, т.е. очищенная коллекция будет иметь Count = 0. Для очистки коллекции вызывается AtFree для каждого элемента.

Чтобы заменить существующий элемент новым, используется метод AtPut (Index, Item), где Index – индекс заменяемого элемента, a Item – указатель на новый элемент.

Метод Atlnsert (Index, Item) вставляет новый элемент в коллекцию в позицию Index и увеличивает индексы всех ранее существовавших в коллекции элементов от элемента Index до конца коллекции на единицу, т.е. "раздвигает" коллекцию.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.