Доступ к элементам коллекций
Чтобы воспользоваться методом ForEach мы должны сначала создать процедуру без параметров, которая осуществляет нужные действия над всеми элементами коллекции, и передать адрес этой процедуры как параметр обращения к ForEach. Например, для того чтобы вывести на экран содержимое всего нашего каталога, мы должны внести в программу следующие изменения. Поместите в раздел описаний следующий текст процедуры PrintAll:
Procedure PrintAll (Book: PCollection); {Вывод всех элементов коллекции} Procedure PrintBook(P: PBook); far; begin with Р do PrintItem (Autor, Title, PubHouse, Year, Pages) end; {PrintBook} begin {PtintAll} WriteLn; Book.ForEach (PrintBook); end; {PrintAll}
Как видите, эта процедура содержит внутреннюю процедуру PrintBook, в которой осуществляется нужное нам действие – вывод очередного элемента каталога на экран. Этот вывод достигается с помощью вызова уже использованной нами ранее процедуры PrintItem. Таким образом, описание процедуры PrintAll должно следовать после описания PrintItem, чтобы этот вызов был синтаксически правильным. Далее, вывод всех элементов коллекции в процедуре PrintAll осуществляется оператором:
Book. ForEach (PrintBook);
Который обращается к методу TCollection.ForEach, передавая ему в качестве параметра адрес процедуры PrintBook. Чтобы программа успешно выполнила нужные действия, процедура, адрес которой передается методу ForEach, должна удовлетворять двум условиям:
- она должна быть рассчитана на дальнюю модель вызова (для этих целей мы указали директиву far сразу за заголовком PrintBook);
- она должна быть локальной для процедуры, в которой реализуется вызов ForEach, именно поэтому мы разместили ее в теле процедуры PrintAll, Осталось в тело главной программы поместить оператор:
PrintAll (BookList);
- перед оператором уничтожения коллекции.
Если Вы запустите таким образом подготовленную программу на счет, на экран будет выведено:
Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT Финансы и статистика, 1991, 544 Шелдон Язык Си для профессионалов И. В. К. – СОФТ, 1991, 383 Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера Радио и связь, 1991, 336 Йенсен К., Вирт Н. Паскаль. Руководство для пользователя и описание языка Финансы и статистика, 1982, 151
Все действия по выводу содержимого коллекции реализуются методом ForEach, который для собственно вывода каждого очередного элемента обращается к процедуре PrintBook.