Архитектура файла bookseries.ini
Архитектура файла bookseries.ini
Таким образом, пользователю необходимо лишь добавить название новой серии в данный файл, как сделанные изменения тут же отобразятся в форме. Архитектура файла инициализации показана на рис. 22.4.
Итак, перейдем непосредственно к написанию кода процедуры. Для ввода кода программы опять необходимо перейти в окно редактора кода, для чего выделите форму и нажмите клавишу <F7>.
Диалоговое окно Add Watch
Диалоговое окно Add Watch
Для единичного просмотра значения переменной можно просто подвести к ней указатель мыши, и вы увидите всплывающую подсказку. Например, duration = 5.
Для дальнейшего пошагового выполнения программы можно воспользоваться одним из трех способов:
Step Into. При нажатии клавиши <F8> выполняется очередной оператор, после чего выполнение программы приостанавливается и программа становится доступна для корректировки.Step Over. Нажатие комбинации клавиш <Shift>+<F8> осуществляет вызов вспомогательных процедур и функций за один шаг, что дает возможность не задерживаться на их выполнении.
Step Out. Данная комбинация клавиш <Ctrl>+<Shift>+<F8> позволяет выйти из выполняемой вспомогательной процедуры, не дожидаясь конца ее пошагового выполнения.
Итак, нам необходимо нажать клавишу <F8> и посмотреть, чему стало равно значение tsk.startDate. Как и следовало ожидать, переменной было присвоено значение 21.08.01. (текущая дата 21 августа 2001 года). Следовательно, функция Now работает корректно.
Далее мы попадаем на следующую точку останова — присваивание значения переменной tsk.DueDate. После очередного нажатия клавиши <F8> проверим значения текущих переменных и окончательно обнаружим ошибку.
Значение переменной duration равно 5, прибавляя его к значению текущей даты, мы прибавляем не месяцы (как хотелось бы), а дни. Исправим эту ошибку, изменив код ошибочной строки на следующий:
.DueDate = DateAdd("m", duration, .StartDate)
Замечание
Замечание 5
Встроенная функция DateAdd предназначена для добавления или вычитания из даты указанного числа временных интервалов.
В конце рассказа об отладчике мы решили на рис. 22.10 показать панель инструментов Отладка (Debug) с кнопками, используемыми при отладке, а в табл. 22.1 привести краткую справку по всем использованным и неиспользованным средствам отладчика.
Диалоговое окно Конструктор форм
Диалоговое окно Конструктор форм
Однако попутно необходимо сделать пару замечаний.
Пользователь может создавать собственные формы только на основе стандартных форм Outlook, добавляя или удаляя поля и команды.Outlook имеет восемь стандартных форм, которые показаны на рис. 19.1. Я буду рассматривать создание пользовательской формы на основе формы Контакт. Создание форм на основе других стандартных прототипов будет аналогичным.
После открытия формы Контакт (Contact) в режиме конструктора пользователю представляется ее стандартный вид с добавленными специальными вкладками (рис. 19.2). Имена появившихся вкладок заключены в скобки, это означает, что они появляются только в режиме конструктора. Вкладки (2)—(6) являются пользовательскими, т. е. предназначены для размещения на них дополнительных элементов управления. Вкладки (Свойства) и (Команды) имеют специальное назначение, о котором пойдет речь в разделе 19.7 "Свойства формы".
Как было сказано выше, форму можно изменять, удаляя или добавляя новые поля и/или элементы управления. Для просмотра всех полей данной формы перейдите на вкладку Все поля (All Fields) и выберите значение Все поля контакта (All Contact Fields) в раскрывающемся списке Группы полей для выбора (Select From).
Диалоговое окно Microsoft Visual Basic,
Диалоговое окно Microsoft Visual Basic,
предупреждающее об ошибке
Его появление вызвано ошибкой в коде нашей программы, о поиске которой и пойдет дальше речь.
Диалоговое окно Поле формулы
Диалоговое окно Поле формулы
Помимо стандартных функций сложения (+), вычитания (-), умножения (*) и деления (/), можно задавать и более сложные из набора встроенных функций Outlook. Существует шесть типов функций.
Преобразования (Conversion). Данный набор функций служит для преобразования выражений одного типа в выражения другого. Например, Oct (число) переводит число из десятичного формата в восьмеричный.Дата/время (Date/Time). Функции для работы с датой и временем. Например, Date () возвращает текущую дату и время компьютера.
Финансовые (Financial). Набор функций для финансовых расчетов. Функция SLN (стоимость, остаточная_стоимость, время_эксплуатации) , на-пример, вычисляет обесценивание актива в течение единичного периода по линейному закону.
Общие (General). Набор специальных функций, необходимых для построения формул с разветвленной структурой. Например, iif (выражение, еслиистина, еслиложь» возвращает одно значение, если указанное выражение истинно, и другое, если — ложно.
Математические (Math). Набор формул для математических вычислений. Например, cos (число) возвращает косинус числа.
Текстовые (Text). Функции для работы с текстом и строками. Например, Len (строка) возвращает количество символов в строке.
После создания поля с формулой и добавления его на форму выделите поле и откройте диалоговое окно Свойства, а затем перейдите на вкладку Значение (Value). В разделе Начальное значение (Initial Value) установите переключатель Вычислять выражение автоматически (Calculate this formula automatically), что позволит автоматически вычислять сумму при изменении значений полей кол-во страниц.
Помимо этого, для поля можно задать дополнительные параметры проверки. Для чего перейдите на вкладку Проверка (Validation) диалогового окна Свойства (рис. 19.8).
Диалоговое окно Публикация формы
Диалоговое окно Публикация формы
После того как форма сохранена, ею можно воспользоваться для создания новых элементов.
Диалоговое окно Run-time error '91'
Диалоговое окно Run-time error '91'
Выберем Debug. В этом случае окно с кодом программы становится активным и в нем выделяется (по умолчанию желтым цветом) оператор, на котором прервалось выполнение программы. Мы выбрали Debug, поскольку имеем достаточно большой опыт и по краткому описанию ошибки можем понять, в чем дело. Но вам мы советуем до определенного момента обращаться за разъяснением к справке, в которой подробно и на примерах описана ошибка, вызвавшая прерывание хода программы.
В нашем же случае произошла семантическая ошибка: неправильное присваивание переменной значения ссылки на объект. Для устранения этой ошибки необходимо добавить оператор присваивания set перед переменной tsk. Давайте еще раз запустим программу. На этот раз она успешно завершилась, дойдя до конца и выдав сообщение "Задача успешно поручена".
Вроде бы все работает, но мы протестировали только малую часть всех возможностей приложения, не будем останавливаться и посмотрим, что же сгенерировало наше мини-приложение. На рис. 22.7 изображен примерный вариант порученной задачи.
Как видите, все параметры верны, кроме загадочного срока окончания задачи, который истекает через 5 дней, в то время как в диалоговом окне продолжительность проекта была равна 5 месяцам!!!
Итак, наша программа фактически работает, собирает данные из разных источников, создает задачу и даже назначает ее, но неверно устанавливает срок ее окончания. Надо констатировать, что мы столкнулись с последним типом ошибки — логическим. Компилятор не может отследить подобного рода ошибки автоматически, но это может сделать программист, используя, конечно, всевозможные способы и средства отладки.
Для отлова логических ошибок выполняется трассировка программы, т. е. выполнение программы или ее участка, сопровождающееся выводом в хронологической последовательности информации о событиях, связанных с выполнением программы. Давайте задумаемся, информацию о каких событиях мы хотели бы получить? Мы хотели бы получить и наблюдать измене ние переменных после выполнения операторов программы, причем желательно в пошаговом режиме, чтобы видеть процесс выполнения программы и иметь возможность тут же его исправить. Однако наблюдение всех переменных хоть и возможно, но малоэффективно.
Диалоговое окно Выбор формы
Диалоговое окно Выбор формы
Диалоговое окно Задача: Написание книги
Диалоговое окно Задача: Написание книги
Замечание
Замечание 1
Помимо создания панелей инструментов и кнопок, можно задавать "горячие" клавиши для вызова макросов пользователей или создавать дополнительные разделы меню.
Добавление элементов управления
Добавление элементов управления
Добавление полей пользователя
Добавление полей пользователя
Прежде чем добавить пользовательское поле, необходимо определить, на какой из вкладок мы его будем размещать. Поскольку наши поля достаточно специфические, то для их размещения выберем вкладку (2) и изменим ее название и параметры отображения.
Элементы управления
Элементы управления
Следующее поле, которое мы будем создавать, — Переплет. Как вы уже знаете, поле переплет может принимать только одно из двух значений: твердый или мягкий. Конечно, это поле можно создать по аналогии с двумя предыдущими и требовать от пользователя ввода его значения. Но гораздо корректнее и рациональнее использовать раскрывающийся список. Раскрывающийся список — это один из стандартных элементов управления, о которых пойдет речь в данном разделе.
Microsoft Outlook является поистине всеохватывающим
Глава IV
Программирование в Outlook
Microsoft Outlook является поистине всеохватывающим приложением в области управления информацией. Вы можете месяцами изучать его различные компоненты, исследовать новые возможности, так никогда и не столкнувшись с разработкой собственных форм и созданием макросов. Однако, если вы хотите получить от Microsoft Outlook максимум возможного, существенно облегчить выполнение своих повседневных задач, избавившись от многократного повторения одних и тех же процедур или от введения специфической информации нестандартными путями, то умение разрабатывать формы и использовать макросы вам совершенно необходимо.
Microsoft Outlook, как и любое другое приложение Microsoft Office, допускает два разных уровня использования:
применение Outlook как готового к употреблению универсального инструмента для решения стандартных задач управления информацией. Этой возможности Outlook были посвящены три предыдущих части;
применение Outlook как инструментальной среды для разработки собственных приложений, решающих специфические задачи пользователя более эффективным способом. Об этой возможности и пойдет дальше речь. Для читателя, первый раз столкнувшегося с разработкой каких-либо форм и программированием, возможно, будет трудным восприятие излагаемого ниже материала. Но как говориться — дорогу осилит идущий!
Не бойтесь, если какой-либо факт вызовет с первого раза непонимание или какая-либо возможность будет описана не полностью, поскольку вопрос разработки форм и программирования настолько широк, что заслуживает отдельной книги. Здесь же дается всего лишь попытка в доступной, понятной и как можно более полной форме рассмотреть основы программирования в Outlook. Надеемся, что полученные знания помогут вам в разработке собственных небольших приложений с достаточной степенью легкости.
В заключительной части книги будут рассмотрены следующие аспекты программирования в среде Outlook:
Разработка форм. В данной главе будут изложены основы разработки форм Outlook, использования полей пользователя и элементов управления.
Основы VBA. Приводится почти полное описание языка программирования Visual Basic for Application (VBA), посредством которого можно записывать макросы и создавать пользовательские приложения Outlook.
Объектная модель Outlook 2002. В настоящей главе описывается иерархия объектов Outlook 2002. Кроме того, рассматриваются основные классы, используемые при реализации приложений Outlook.
Разработка приложения. В последней главе будет приводится пример разработки простого пользовательского приложения Outlook, на котором будет продемонстрировано использование классов объектной модели Outlook 2002 и VBA.
IV. ПРОГРАММИРОВАНИЕ В OUTLOOK
Глава IV. ПРОГРАММИРОВАНИЕ В OUTLOOK Разработка форм Создание формы Добавление полей пользователя Элементы управления Свойства элементов управления Вычисления в форме Макет Свойства формы Опубликование формы Резюме Основы VBA Общие сведения Типы данных Операторы Структура программы Классы и объекты Редактор Visual Basic for Application Резюме Объектная модель Outlook 2002 Общие положения Объектная модель VBA Объектная модель Office XP Объектная модель Outlook 2002 Резюме Разработка приложения Постановка задачи Проектирование диалогового окна Свойства элементов управления Инициализация формы Создание и поручение задачи Отладка и тестирование программ Вызов макросов Резюме
Инициализация формы
Инициализация формы
В предыдущем разделе мы говорили о статическом изменении свойств элементов управления, но это лишь первичная настройка объектов формы. Как правило, основные свойства, связанные с инициализацией данных, переносятся в программный модуль формы.
Рассмотрением инициализации подобных свойств мы и займемся в этой главе, но для начала несколько слов о форме как таковой. Если рассматривать форму с позиций программирования, то она представляет собой не что иное, как класс VBA. Членами этого класса являются элементы управления, расположенные на форме, а методами — show (показать форму), Hide (скрыть форму) и т. д. Более того, пользователь может добавлять собственные члены и методы.
Помимо этого форма обладает и рядом процедур реакции на событие, стандартными из которых для всех классов VBA являются initialize и Terminate (см. раздел 20.5 "Классы и объекты").
Вернемся к нашей задаче и вспомним, что нам необходимо проинициализи-ровать три списка нашей формы, а именно: series, author и duration. Если duration фиксирован и состоит из 12 элементов (12 месяцев), то относительно списков авторов и серий так сказать нельзя. Количество членов в группе писателей может увеличиваться и уменьшаться, ровно также дело обстоит и с сериями. Исходя из этого пользователь должен иметь возможность, не модифицируя кода программы, изменить количество элементов любого из списков.
В следующих разделах подробно описываются способы инициализации списков.
Классы и объекты
Классы и объекты
Давайте подведем предварительные итоги. Во-первых, мы рассмотрели, что такое встроенные типы данных, какие они бывают, в чем состоит их различие, как создавать переменные этих типов и т. д. Во-вторых, мы научились создавать собственные типы данных (записи), а также пользовательские процедуры и функции. Это уже достаточно весомый багаж знаний, однако остался еще небольшой, но очень важный раздел, посвященный таким понятиям объектно-ориентированного программирования, как классы и объекты (экземпляры классов).
В самом упрощенном понимании объект — это какая-то вещь или материальная сущность реального мира. Оглянитесь вокруг, и вы увидите, что наш мир состоит из бесконечного числа объектов: стол, машина, клавиатура компьютера, дом, человек и т. д. (более того, даже мир — это объект). Если приглядеться, то каждый объект имеет свойства (машина черного цвета) и операции, которые выполняются над этими свойствами (ту же машину можно перекрасить в экзотический металлик). Почти аналогично обстоит дело с объектами в абстрактном мире программ. Например, в качестве объекта можно рассматривать файл, в качестве свойства — его размер или имя, а в качестве операций — чтение или запись.
Рассмотрим еще один пример объекта в абстрактном мире программ — переменную author типа Person CO свойствами name И birthday. Итак, естЬ объект и есть свойства, что же является операцией в данном случае? Любая пользовательская процедура или функция, изменяющая свойства объекта author или просто работающая с ними. Например, процедура инициализации полей записи или процедура вывода на экран значений полей.
А теперь представьте, что код программы испещрен как процедурами, которые относятся к работе с записью author, так и функциями, относящимися к другим переменным, которых тоже не мало. Совсем нетрудно будет заблу диться в подобном хаосе и применять нужную функцию к неверным данным или, наоборот, необходимые данные подставлять не в ту функцию. Возникает естественное желание объединить данные и способы их обработки в одно целое — так, чтобы было ясно, какие процедуры предназначены для обработки каких данных. Таким образом, мы вплотную подошли к центральным понятиям объектно-ориентированного программирования — понятиям инкапсуляции и класса.
Объектно-ориентированное программирование (ООП) — наиболее популярная в настоящее время методология программирования, являющаяся развитием структурного программирования. Центральной идеей ООП является инкапсуляция, т. е. структурирование программы на модули особого вида, объединяющие данные и процедуры их обработки (вот оно, решение всех проблем!), причем внутренние данные модуля могут быть обработаны только предусмотренными для этого процедурами. В разных вариациях ООП этот модуль называют по-разному: класс, абстрактный тип данных, кластер и др. В VBA принято называть этот модуль модулем класса, или просто классом. Каждый такой класс имеет внутреннюю часть, называемую реализацией, и внешнюю — интерфейс.
Класс, таким образом, представляет собой новый тип данных, позволяющий создавать новые переменные этого типа (объекты) (иногда их еще называют экземплярами класса) и вести связанные с ними процедуры и функции. Программист описывает класс как сложный структурированный тип, состоящий из элементов, которые могут быть как собственно данными, т. е. значениями определенного типа данных, так и функциями, реализующими операции над элементами-данными. Элементы-данные называются свойствами класса, элементы-функции — методами класса. Такое описание служит шаблоном для создания в программе конкретных экземпляров (объектов) данного класса, имеющих свои конкретные имена.
В случае с записью Person при добавлении к ней двух процедур (persinit, persPrint) мы фактически получили класс, одним из объектов которого будет author. Доступ к свойствам и методам объекта осуществляется (как и в случае с записью) посредством точечной нотации. Например, для того, чтобы вывести на экран свойства объекта author с помощью метода Print, необходимо ввести в программу выражение author. Print ().
Помимо инкапсуляции, ООП VBA характеризуется еще одним немаловажным свойством — встраиванием. Встраивание — это механизм порождения новых классов с использованием существующих.
Пусть построен класс А, тогда при объявлении нового класса В его свойствами могут быть объекты класса А. В этом случае говорят, что класс А встроен в класс В, и класс А является родителем, а класс В — потомком. Встраивание — транзитивное отношение, т. е. можно создать произвольно длинную цепочку вложенных объектов, образующих иерархию родителей и потомков. Так, в новый класс С можно встроить объект класса В, который является объектом класса А.
Для приложений Office XP характерна ситуация, когда необходимо указать шесть-восемь уровней вложенности, чтобы добраться до нужного объекта. Например, чтобы скрыть панель инструментов Стандартная, выполните следующий оператор присваивания:
Outlook.Application.ActiveExplorer.ShowPane (olOutlookBar ,True )
Механизм встраивания очень удобен и естественен. Прародитель семейства классов может задавать некоторые фундаментальные свойства и методы, а многочисленные потомки, имея родительские корни (свойства и методы), привносят собственные узкоспециальные свойства и методы.
Например, создавая класс Book со свойством Author класса Person, мы не только используем фундаментальные свойства и методы класса Person, но и вводим собственные свойства (title) и методы.
Наряду со встраиванием, существует еще один способ использования существующих классов при создании новых, он называется наследование. При наследовании указывается, что вновь создаваемый класс В на основе класса А содержит все (или некоторые) методы и свойства класса А, а также свои собственные методы и свойства. Например, на основе класса Person можно определить класс Author, который содержит все методы и свойства класса Person, а также свои собственные, например список книг данного автора.
Перейдем теперь от теоретического описания канонов ООП к практике их применения в VBA и начнем с синтаксиса. Синтаксически классы в VBA оформляются в виде специальных модулей классов (имя класса — это имя модуля), где в разделе Declarations помещается описание свойств (переменных) класса, а дальше идет описание методов (процедур) класса. Синтаксически описания свойств и методов практически не отличаются от описания обыкновенных переменных и процедур. Случаи отличия или особенностей употребления будут оговорены отдельно.
Давайте рассмотрим работу с классами на примере класса Person.
Кнопка на панели инструментов с контекстным меню
Кнопка на панели инструментов с контекстным меню
Чтобы панель инструментов приняла привычный для настоящей панели вид, необходимо отформатировать кнопки.
Макет
Макет
Итак, все намеченные поля нашей формы созданы, и если смотреть на нее с точки зрения функциональности, то можно сказать, что она готова. Однако одним из немаловажных качеств формы является наличие простого и интуитивно понятного интерфейса.
Конструирование легкодоступного и красиво оформленного интерфейса — довольно сложная задача.' Но создание простого интерфейса, не лишенного логики и вкуса, доступно любому пользователю. Более того, использование встроенных средств Outlook позволяет пользователю добиться профессионального оформления форм, диалоговых окон, панелей и т. д.
Начнем с логики в заполнении полей нашей формы. Естественно предположить, что пользователю гораздо удобнее заполнять поля в следующем порядке:
Название книги 1, Кол-во страниц 1, Переплет 1Название книги 2, Кол-во, страниц 2, Переплет 2 И Т. Д.
Таким образом, необходимо переместить соответствующие поля, расположив их в одной строке. Чтобы переместить элемент, его нужно выделить, а затем, удерживая нажатой левую кнопку мыши, перенести на требуемое место.
По умолчанию элементы создаются с определенными параметрами высоты и ширины (если вы создавали их, просто щелкая по форме, не растягивая). Но, как правило, параметры по умолчанию не удовлетворяют логике поля. Например, стандартное текстовое поле по умолчанию отображает 15 знаков, но поле для ввода количества страниц вряд ли будет содержать значение, имеющее больше 4 символов, а поле для ввода названия книги, скорее всего, будет содержать больше, чем 15. Для изменения размера поля можно либо задать соответствующие параметры на вкладке Оформление "(Display), либо воспользоваться маркерами изменения размера в виде маленьких белых квадратиков, расположенных по углам поля. Щелкнув по маркеру выделения и удерживая нажатой левую кнопку мыши, можно увеличить или уменьшить границы поля.
В крупных компаниях (например, Microsoft) над разработкой интерфейса трудятся специальные отделы дизайнерон.
Если по выделенному элементу щелкнуть еще раз, то он перейдет в режим редактирования, в этом режиме можно, например, изменять параметр Заголовок (Caption) для надписи. Измените данный параметр для объектов типа Label, удалив цифры из названий.
Вы увидите, что логика оформления формы соблюдена, но стройности и строгости в ее оформлении нет. Следующий этап в работе над интерфейсом формы — выравнивание.
Существует много способов выравнивания, но мы не будем все их подробно здесь рассматривать, т. к. большинство из них интуитивно понятны, а в случае возникновения вопросов вы всегда сможете обратиться к справочной системе Outlook. Здесь будет приведено лишь описание групп команд выравнивания.
Все команды выравнивания находятся в меню Макет (Layout). Существует пять разделов с командами:
выровнять (Align). Команды, связанные непосредственно с выравниванием. Например, по ширине или по краю формы;группировать (Group). Объединение элементов управления в одну группу;
порядок (order). Отображение объекта на переднем или на заднем плане;
сетка (grid). По умолчанию форма в режиме конструктора отображается с сеткой (маленькие точки). Благодаря сетке можно задавать положение и выравнивание объектов;
последовательность перехода (tab order). Этой командой задается последовательность перехода от поля к полю посредством нажатия клавиши <Таb>.
После того как форма создана, хочется посмотреть на нее в действии, проверить, работают ли текстовые поля, списки, формулы и т. д. Для этого выберите команду > Форма > Выполнить форму.
Объект Inspector (форма элемента)
Объект Inspector (форма элемента)
Объектная модель Office XP
Объектная модель Office XP
Объекты Microsoft Office используются в иерархической структуре других объектных моделей. Описание основных объектов Microsoft Office, собранных в библиотеке Office, приведено в табл. 21.2.
и работы со средой вы
Объектная модель Outlook 2002
Итак, после описания языка и работы со средой вы полностью готовы к полноценному программированию на Visual Basic for Application. Одной из важнейших характеристик системы программирования, определяющих ее удобство, является наличие уже готовых библиотек и компонент. В данных библиотеках описаны классы, полезные для решения стандартных задач, встречающихся в соответствующей сфере программирования. Классы Microsoft Office XP являются "золотым фондом" VBA, поскольку именно использование объектов этих классов делает VBA недосягаемым в области офисного программирования.
В этой главе мы описываем только поверхностно объектную модель Outlook 2002 и стандартные классы VBA и Office и не претендуем на подробное, исчерпывающее описание каждого объекта, свойства или метода, на это есть справочная система. Мы просто хотим показать работу с моделью и иерархией "в целом", что достаточно трудно сделать, руководствуясь только справочной информацией.
Далее в этой главе постоянно используется термин объектная модель (object model). Под этим термином подразумевается совокупность взаимосвязанных объектов, которые объединяет нечто общее, например назначение, область применения, принадлежность одной иерархии классов. Рассматривая объектную модель, мы будем приводить небольшие примеры использования ее классов в Outlook, что, надеемся, будет способствовать лучшему пониманию и усвоению излагаемого материала. Но прежде всего несколько общих положений.
Объектная модель Microsoft Outlook реализована
Объектная модель Outlook 2002
Объектная модель Microsoft Outlook реализована в виде набора объектов, собранных в библиотеке Outlook.
Общие положения
Общие положения
Любая модель, определенная в VBA, состоит из классов, каждый из которых представляет собой отдельный объект или семейство объектов. Объектов в Office, да и в Outlook достаточно много, но во всех приложениях участвует объект Application, представляющий само приложение. Application — это корневой класс Outlook, в который вложены все остштьные объекты, именно этот первый уровень вложенности мы и будем рассматривать.
Глядя на схему объектной модели, можно определить, какие объекты описывают работу приложения, как они связаны между собой и как составить ссылку для доступа к конкретному объекту. Как вы помните, VBA наряду с наследованием поддерживает встраивание объектов, таким образом, чтобы составить ссылку на объект, нужно проследить путь в иерархии объектов, начиная с объекта Application на первом уровне иерархии до целевого объекта, и записать последовательность имен, находящихся на пути объектов или семейств, отделяя их друг от друга точкой. При этом для семейств, кроме имени, необходимо указать в скобках индекс или имя элемента, т. е. задать конкретный объект в семействе. Например, для указания ссылки на объект, находящийся на третьей ступени иерархии приложения, следует использовать такую запись:
Application.Assistant.Sounds
Доступ к отдельным элементам некоторых семейств можно получить, не указывая индекс или имя объекта. Например, доступ к активному представлению Outlook, который в общем случае вызывается через указатель Application. Explorers, осуществляется с помощью свойства ActiveExpiorer объекта Application. Таким образом, чтобы отобразить панель папок в текущем представлении, следует использовать такую запись:
Application.ActiveExpiorer.ShowPane(olFolderList, True)
Завершая общие положения, нельзя не сказать о справочной информации по объектной модели Outlook, верном спутнике при программировании на VBA. Для отображения иерархии классов воспользуйтесь примером, приведенным ниже.
Окно кода
Окно кода
Для более детальной настройки интерфейса всегда можно воспользоваться диалоговым окном Options (Опции) меню Tools (Инструменты). В нем вам предоставляется возможность изменить такие установки, как автоматическая проверка и помощь при вводе кода, разделение процедур тонкой чертой, изменение параметров шрифта кода, размещение окон редактора и т. д. Настройка редактора достаточно проста, и мы не будем подробно ее описывать. Если же у вас возникнут вопросы по назначению того или иного параметра, вы всегда можете обратиться к справочной системе VBA, о работе с которой и пойдет сейчас речь.
Современные системы программирования отличаются от систем программирования прежних лет:
очень богатым набором готовых программных компонент, которые можно использовать в программах (об этом пойдет речь в главе 21 "Объектная модель Outlook 2002");очень развитой системой получения информации о среде программирования непосредственно из самого редактора (об этом рассказывается в настоящем разделе).
Нельзя объять необъятное, а точнее, невозможно (да и не нужно) в рамках этой книги описать весь VBA. Наша цель, как было сказано, краткое изложение полного вводного курса в VBA. Однако всего не опишешь. Поэтому мы советуем вам за ответом на тот или иной появившейся вопрос обращаться к встроенной справочной системе VBA. Умение пользоваться ею — это необходимое условие работы программиста и, мы думаем, не стоит уделять внимание обсуждению вопроса, насколько необходимо это условие, ибо без навыков работы со справочной системой невозможно быстрое и полноценное программирование.
Окно проекта
Окно проекта
Окно просмотра объектов
Окно просмотра объектов
Поле со списком Search Text (Образец поиска), расположенное под списком Project/Library. Позволяет ввести текст для поиска компонентов в доступных библиотеках. После ввода образца поиска необходимо нажать кнопку Search (Поиск). Так, например, на рис. 20.6 отображен результат поиска по слову Application для всех доступных библиотек приложения Outlook.
Окно Search Result (Результат поиска). В этом окне отображается результат поиска в трех списках: Library (Библиотека), Class (Класс) и Member (Компонент). Каждый элемент списка соответствует найденному компоненту — классу или элементу класса, и содержит (справа налево) название найденного компонента, название класса, которому принадлежит этот компонент, и название библиотеки, которой принадлежит этот класс. Поиск по образцу происходит без учета регистра. Для обозначения типа компонента объектной модели в Microsoft Office введена специальная система значков, представленная на рис. 20.7.
Окно редактора и диалоговое окно с надписью "Здравствуй, мир!"
Окно редактора и диалоговое окно с надписью "Здравствуй, мир!"
После рассмотрения примера вернемся к описанию языка. Для этого введем условные обозначения для описания языка.
Существует множество языков программирования, и способов их описания не намного меньше. Но какого-то определенного способа, лучшего во всех отношениях, нет. Например, неформальное описание языка для начинающего пользователя сильно отличается от формального стандарта, предназначенного для разработчиков системы программирования. Что касается нашей практики, то при изложении подобного материала мы руководствуемся описанной выше концепцией. Но это, так сказать, глобальные понятия, однако нам не обойтись и без частных принципов описания, таких как используемые обозначения и терминология.
Описания элементов языка сгруппированы по смыслу в разделы. Описание ведется исходя из концепции, изложенной в начале этой главы.Синтаксис каждой конструкции объясняется на схематическом примере, с использованием условных обозначений, приведенных в табл. 20.1.
Окно справки с объектной моделью Microsoft Outlook
Окно справки с объектной моделью Microsoft Outlook
Мы рассмотрели вариант получения информации об объектной модели и ее элементах с помощью справочной системы, но помимо этого существует специальный помощник — гид в мире объектов приложений — Object Browser (Окно просмотра объектов). Окно просмотра объектов представляет собой специальное средство редактора Visual Basic, позволяющее просматривать содержимое библиотек объектов и производить поиск справочной информации о предоставляемых ими объектах.
Окно свойств
Окно свойств
Кстати, свойства можно отображать как в алфавитном порядке, так и по категориям, посредством выбора соответствующих вкладок Alphabetic или Categorized. Следующая рассматриваемая нами панель — панель кода. Это окно занимает большую часть экрана. Данная панель — это не просто "чистый лист", предназначенный для ввода кода, а специализированный высокоинтеллектуальный текстовый редактор, существенно облегчающий введение, форматирование и редактирование кода VBA. Окно кода напрямую связано с модулем проекта и открывается при двойном щелчке мышью по необходимому модулю в окне проекта.
Замечание
Замечание 1
Вообще говоря, окно кода является "многодокументным", т. е. можно открыть одновременно несколько окон данного типа для разных модулей. На рис. 20.10 каскадно отображены три окна трех модулей соответственно. Для изменения отображения окон можно воспользоваться командами меню Window.
Здесь мы опишем главные возможности редактора кода VBA:
Автоматическое завершение ввода стандартных лексем языка. Например, после ввода ключевого слова sub имяПроцедуры и нажатия клавиши <Enter> VBA автоматически добавляет скобки и строку End Sub.Автоматическое выравнивание и отступ. К примеру, после ввода оператора присваивания р=р+1 и нажатия клавиши <Enter> редактор вставит пробелы: р = р + 1.
Автоматическое выделение цветом лексических и синтаксических конструкций. Ключевые слова VBA выделяются синим цветом, ошибочные конструкции — красным, а комментарии — зеленым.
Автоматическая проверка правильности семантики и синтаксиса конструкций. Если вы введете inputBox () и забудете присвоить значение этой функции переменной (потеря семантики), автоматически появится предупреждение об ошибке.
Автоматический вывод списка компонентов. .Позволяет избежать ошибок при вводе наименований свойств объектов, встроенных констант, типов переменных. Особенно полезна эта функция при установке свойств объекта, т. к. дает возможность не только вспомнить правильное имя свойства, но и увидеть, какие свойства объекта доступны в данный момент.
Автоматический вывод кратких сведений. Показывает в виде подсказки синтаксис встроенных процедур и функций. По мере ввода очередной параметр выделяется жирным шрифтом.
Если вы тестировали примеры предыдущего раздела, то не раз должны были встречаться со всеми свойствами редактора. Неправда ли, он умен? Но это только внутренняя часть окна кода, рассмотрим теперь его интерфейс.
В левом верхнем углу окна кода размещается раскрывающийся список Object (Объект), содержащий объекты выделенного модуля. Понятно, что для стандартного модуля этот список отсутствует, но, скажем, для модуля Этакнига данный список содержит объект workbook, для которого можно написать процедуры реакции на событие. Но и тут "умное" окно кода приходит на помощь. В правом верхнем углу в раскрывающемся списке Procedure (Процедура) содержатся все стандартные процедуры реакции на события для этого объекта. В случае со стандартным модулем этот список содержит все процедуры модуля, а также общий раздел объявлений Declarations (Объявления), в котором описываются переменные уровня модуля. При этом, выбрав одну из процедур в этом списке, вы автоматически попадете на ее начало.
С помощью кнопок в левом нижнем углу окна можно выбрать один из двух видов представления кода в окне:
представление процедуры, когда в окне отображается только выбранная процедура;представление полного модуля, когда в окне отображается сразу несколько процедур, которые отделены друг от друга тонкой линией (см. рис. 20.4).
Операторы
Операторы
Любая программа представляет собой последовательность операторов. Мы уже рассматривали те операторы, которые предназначены для объявления переменных и определения типов. В этом разделе мы расскажем об операторах для выполнения действий с данными и для управления порядком выполнения других операторов. Существует три основных типа операторов: операторы присваивания, условные операторы и операторы цикла. Рассмотрим их по порядку.
Операторы присваивания необходимы для изменения значения переменных. В VBA существует четыре вида операторов присваивания:
Let (прямое присваивание);LSet (левое присваивание);
RSet (правое присваивание);
set (объектное присваивание).
С оператором прямого присваивания мы уже встречались (=), правда, в несколько укороченном виде.
[Let] имяПеременной = <выражение>
Ключевое слово Let является наследием предшествующих версий языка Basic, его употребление ничего не добавляет и не убавляет. Подобные атавизмы — не редкость в любом языке программирования, они необходимы для совместимости разных версий программного продукта.
С помощью оператора присваивания происходит обычное присваивание значения выражения, стоящего справа от знака =, переменной, имя которой стоит слева от знака =. Причем тип присваиваемого значения должен соответствовать типу переменной. Бессмысленной будет следующая конструкция:
Dim Temp As Integer Temp = "Строка"
Встретив подобное присваивание, компилятор выдаст сообщение об ошибке. Но есть и ряд исключений. В следующей программе сначала рассматривается присваивание переменным встроенных типов стандартных значений. Затем следует объявление трех записей типа Person, после чего идет присваивание значений первым двум записям, но через прямое обращение к полям записей. В последующем же присваивании происходит одновременное присваивание значений всех полей записи peopie2 соответствующим полям записи people3.
Опубликование формы
Опубликование формы
Итак, после того как вы убедились в работоспособности формы, ее необходимо сохранить. Сохранение формы носит специальное название опубликование. Сразу же заметим, что эта процедура отлична от сохранения элемента данной формы.
Замечание
Замечание 1
Еще раз вспомним отличие между формой и элементом. Форма — это специальный шаблон, на основе которого создается некий элемент. Поэтому, открывая, например, форму Контакт, заполняя и сохраняя ее, вы сохраняете не форму, а лишь элемент этой формы.
Применяя вышеописанные способы, пользователь может изменить форму, но выбрав команду > Файл > сохранить, он сохранит не саму измененную форму, а лишь элемент, основанный на ней. Кстати, в случае с формой контакта при подобной попытке появится предупреждение о незаполненном
Применяя вышеописанные способы, пользователь может изменить форму, но выбрав команду > Файл > Сохранить, он сохранит не саму измененную форму, а лишь элемент, основанный на ней. Кстати, в случае с формой контакта при подобной попытке появится предупреждение о незаполненном поле Хранить как (поскольку элемент не заполнялся), что еще раз показывает различие в способах сохранения.
Форму можно опубликовать несколькими способами, но наиболее часто употребляемыми являются:
в качестве шаблона; в библиотеке форм.Чтобы сохранить форму в виде шаблона, необходимо выполнить действия, показанные в примере 19.9.
Основы VBA
Основы VBA
Уважаемый читатель, позвольте перед столь нелегким делом, как почти исчерпывающее описание языка VBA с нашей стороны и кропотливое его изучение — с вашей, сделать небольшое философское отступление на тему: "Что такое язык?" Надеемся, что оно будет способствовать не только пониманию структуры данной главы, но и более глубокому пониманию самого языка Visual Basic for Applications (VBA) как такового. Итак, что же такое язык?
Язык — это знаковая система, предназначенная для хранения и передачи информации. Причем в данном случае, не умаляя общности, можно говорить о том, что не имеет значения, естественный это язык или язык программирования (а может, математический или язык жестов).
Безусловно, языки различны между собой, однако большинству языков присущи общие закономерности и, так сказать, системная организация. То есть для каждого языка определены и приемлемы такие понятия, как:
алфавит, т. е. допустимые символы языка;лексика, т. е. словарь языка — способы образования слов из символов;
синтаксис, т. е. способы соединения слов в предложения (в VBA это способы соединения ключевых слов и слов пользователя в выражения и программные конструкции);
семантика, т. е. значение отдельных слов, словосочетаний и предложений (в VBA — значение и логический смысл выражений и программных конструкций);
прагматика, т. е. назначение и область применения языка.
В дальнейшем мы будем подходить к описанию структуры языка, исходя из вышеприведенных рассуждений и следующего правила очередности описания как языка в целом, так и любой программной конструкции. Сначала описывается прагматика (то есть ответ на вопрос: "Зачем нужна эта конструкция?"), после чего — лексика и синтаксис (то есть формальное описание того, как записывается эта конструкция) и, наконец, — семантика языка (то есть ответ на вопрос: "Что делает конструкция?"), подкрепленная рядом примеров."
С подобной точки зрения можно рассматривать все языки программирования. Все? Да, их много, и мы не будем вводить читателя в заблуждение, го воря, что VBA — единственный и неповторимый. Но во всем многообразии языков программирования VBA действительно выделяется своей уникальностью с точки зрения разработки офисных приложений. Почти все офисные задачи можно решить посредством VBA естественным путем.
Отладка и тестирование программ
Отладка и тестирование программ
Конечная цель программиста заключается в написании правильно работающей программы, но, к сожалению, в 99 случаях из 100 первая попытка использования программы приводит к появлению предупреждения диалогового окна с кодом ошибки, неверного результата или в худшем случае к зависанию компьютера. Приблизительно так начинается нелегкий путь отладки программы.
Отладка программы — это специальный этап в разработке программы, состоящий в выявлении и устранении программных ошибок, факт существования которых уже установлен. Программные ошибки, как правило, делятся на три вида:
Синтаксическая ошибка. Неправильное употребление синтаксических конструкций, например употребление оператора цикла For без то или Next.Семантическая ошибка. Нарушение семантики той или иной конструкции, например передача функции параметров, не соответствующих ее аргументам.
Логическая ошибка. Нарушение логики программы, приводящее к неверному результату. Это наиболее трудный для "отлова" тип ошибки, ибо подобного рода ошибки, как правило, кроются в алгоритмах и требуют тщательного анализа и всестороннего тестирования.
Поскольку безошибочное программирование почти невозможно, а ручная отладка немыслима, необходимы средства поиска ошибки (иногда это не так просто) и ее исправления. В других случаях можно просто обойти возможные появления ошибки, также используя специальные методы. Именно об этих средствах и методах пойдет речь в настоящем разделе.
В каждой современной системе программирования существует специальное средство отладки программ — отладчик (debugger), который позволяет в режиме интерпретации установить контрольные точки, выполнить отдельные участки программы и посмотреть результаты работы операторов. Естественно, что редактор Visual Basic имеет подобное средство, с которым мы сейчас и познакомимся. В вышеописанной программе мы специально допустили ошибки, на примере которых и продемонстрируем работу отладчика VBA.
Замечание
Замечание 1
Все ошибки располагаются в процедуре AssignTask, так что перед началом отладки вы можете проверить себя и попытаться отыскать их самостоятельно.
Первый шаг отладки — это запуск компилятора: Debug > compile <имяПроекта>. Компилятор, просматривая код программы, найдет ошибку и выдаст сообщение: sub or Function not defined (Процедура или функция не определены), выделив место ошибки (creatitem) в теле процедуры.
Итак, допущена синтаксическая ошибка, мы сделали опечатку (вместо createitem ввели creatitem), и компилятор стал расценивать это как вызов процедуры пользователя, которая нигде не объявлена. Быстро исправим эту оплошность, добавив злополучную е в код:
Set tsk = Createltem(olTaskltem)
Ошибка исправлена, можно возвращаться к первому пункту — запуску компилятора. На этот раз компиляция прошла успешно, и есть предпосылки к тому, что программа окончательно исправлена. Давайте запустим ее.
Замечание
Замечание 2
Вообще же, в VBA нельзя говорить о запуске программы как таковой, поскольку в отличие от других языков программирования, в которых существует предопределенный способ определения того, с чего будет начинаться выполнение программы, в VBA такого предопределения нет. В VBA никакая процедура не является главной по умолчанию, нужно как-то указывать, с чего должно начинаться выполнение программы. Типовое решение автоматического запуска программы VBA — связывание "главной" процедуры с событием открытия документа, в котором находится проект.
Запуск программы в VBA осуществляется разными способами. Уже упоминалась возможность запуска программы посредством нажатия клавиши <F5> или с помощью команды Run Sub\UserForm меню Run. Однако при таком вызове запускается активная процедура, т. е. процедура, в которой находится курсор. Другим Способом является вызов диалогового окна Macros из меню Tools. В этом окне можно выбрать запускаемую процедуру, не делая ее активной.
Итак, мы запустили программу. Что же происходит? Сразу после запуска появляется диалоговое ОКНО об ошибке: Object variable or With block variable not set (объектная переменная или переменная блока with не определена) и четыре варианта продолжения работы с программой (рис. 22.6):
Continue. Продолжить выполнение программы.End. Закончить выполнение программы.
Debug. Прервать выполнение программы и перейти в режим отладки.
Help. Вывести подробную справку об ошибке.
Замечание
Замечание 3
Хотя в данном случае кнопка Continue не активна, она бывает очень полезна в ряде случаев. Например, при прерывании хода программы комбинацией клавиш <Ctrl>+<Break> только для проверки контрольных значений в окне Immediate, когда нет необходимости переходить в режим отладки, если все значения удовлетворительны. Кнопка End используется для окончательного прерывания хода программы, как правило, когда ошибка сразу видна и не требует отладочных средств.
Панель свойств для раскрывающегося списка
Панель свойств для раскрывающегося списка
Панель Свойства элемента управления
Панель Свойства элемента управления
Постановка задачи
Постановка задачи
Работая над задачей любой сложности, необходимо четко представлять ее условия, цель, а также возможные способы решения. Ибо несогласованность и абстрактность требований может привести к затягиванию сроков реализации проекта или просто его к невыполнению. Итак, обозначим наши условия
Условие. Есть редактор издательства, одной из частных задач которого является подписание договора с автором и отслеживание хода его работы над книгой. Помимо этого, известно, что существует четыре серии книг, причем их названия могут изменяться. Также известно, что для всех писателей имеются контакты, хранящиеся в папке "Писатели".
Цель. Автоматизировать процесс работы редактора.
Способы решения. Одним из возможных способов решения является использование задач Outlook, которые абсолютно вписываются в рамки поставленного условия. Но создание однотипных задач вручную ведет к появлению ошибок и неоднозначности. Таким образом, ограничивая, с одной стороны, редактирование задачи и беря контроль над ее созданием, мы, с другой стороны, унифицируем процедуру работы редактора.
На рис. 22.1 изображена панель задач с однотипными задачами, сгенерированными нашим приложением.
Переход в режим конструктора форм
Пример 19.1. Переход в режим конструктора форм
> Сервис > Формы > Конструктор форм...
Папки Библиотека стандартных форм (рис. 19.1)
Формы Контакт
Открыть
Создание вкладки пользователя
Пример 19.2. Создание вкладки пользователя
{Вкладка (2)}
> Форма > Отображать эту страницу
> Форма > Переименовать страницу.. .
Название := Книги
ОК
Давайте теперь добавим поля название книги и количество страниц. Первый этап — это создание поля.
Создание поля пользователя
Пример 19.3. Создание поля пользователя
{Панель Выбор поля}
Создать...
Имя := Название книги 1
Тип Текст
Формат Текст
ок
Создать...
Имя := Кол-во страниц 1
Тип Целое число
Формат 1 234
ОК
Созданные поля помещаются в разделе Поля пользователя в папке (User-defined fields in folder). Тип поля определяет данные, которые могут заноситься в это поле, а формат — представление этих данных. Например, нельзя в поле количество страниц ввести текст или дробное число.
Второй этап — перенос поля на вкладку пользователя. Для этого щелкните по выбранному полю на панели Выбор поля (Field Chooser), а затем, удерживая нажатой кнопку мыши, перенесите его на вкладку формы и отпустите кнопку мыши. Поля добавляются вместе с подписями к ним.
Поскольку предполагается, что контакт может иметь несколько книг, повторите вышеприведенную процедуру, только изменяя значение в поле Имя (Name) на название книги 2, название книги з и т. д.
Замечание
Замечание 1
Пользователь может не создавать, а выбирать уже готовые поля на панели Выбор поля.
Добавление элементов управления
Пример 19.4. Добавление элементов управления
> Форма >> Элементы управления
Toolbox Label {На форме}
{На элементе Надпись} Свойства
Оформление
Заголовок := Переплет:
ОК
Toolbox ComboBox {Ha форме}
{Ha элементе Список} (рис. 14.3)
Связывание элемента управления с полем Outlook
Пример 19.5. Связывание элемента управления с полем Outlook
Создать
Имя := Переплет
Тип Текст
ОК
Тип списка Раскрывающийся список
Возможные значения := Мягкий; Твердый
Установить начальное значение поля := Мягкий (рис. 19.6)
Помимо типа Текст (Text) существует еще десять стандартных типов данных. В табл. 19.2 приведены названия типов данных и их описание.
Задание дополнительных свойств элемента управления
Пример 19.6. Задание дополнительных свойств элемента управления
{ Элемент управления }
Дополнительные свойства (рис. 19.6)
Свойство SpecialEffeet
Apply 6-Bump
Apply
Свойство MousePointer
Apply 10-UpArrow
Apply
Создание вычисляемого поля
Пример 19.7. Создание вычисляемого поля
{Панель Выбор поля}
Создать
Имя := Общее количество страниц
Тип Формула
Изменить... (рис. 19.7)
Поле > Поля пользователя в папке > Кол-во страниц1
(Ввести знак "+" и повторить для случая 2 и 3)
ОК
Установка дополнительных параметров проверки
Пример 19.8. Установка дополнительных параметров проверки
Проверить это поле перед закрытием формы
Формула проверки
Изменить...
Поле > Поля пользователя в папке >Общее кол-во страниц
Ввести "> 0"
ОК
Вывести сообщение := Значение поля "Количество страниц" не может быть отрицательным
ОК
Сохранение формы в качестве шаблона
Пример 19.9. Сохранение формы в качестве шаблона
Файл >Сохранить как. . .
Папка <Имя папки>
Имя := <Имя файла>
Тип файла Шаблон Outlook
ОК
Теперь для создания нового элемента на основе этого шаблона достаточно дважды щелкнуть по соответствующему файлу в Проводнике.
Замечание
Замечание 2
Если в диалоговом окне Сохранение элемента выбрать в раскрывающемся списке Тип файла не Шаблон Outlook, а любой другой элемент, то Outlook сохранит его с указанным типом. Другое дело, что эти форматы теряют некоторую информацию формы. Например, естественно, что рисунок формы не может храниться в текстовом формате (см. раздел 17.1.5 "Шаблон Outlook").
Для сохранения формы Outlook в библиотеке личных форм повторите действия, рассмотренные в примере 19.10.
Сохранение формы в библиотеке личных форм
Пример 19.10. Сохранение формы в библиотеке личных форм
Сервис> Формы > Опубликовать форму
Папки Библиотека личных форм (рис. 19.14}
Название := Writer
Имя формы:= Writer
Опубликовать
Создание элемента на основе пользовательской формы
Пример 19.11. Создание элемента на основе пользовательской формы
> Сервис > Формы > Выбрать форму
Папки Библиотека личных форм
Формы Book
Открыть
На рис. 19.15 изображено диалоговое окно Выбор формы (Choose Form) в представлении по категориям. Обратите внимание на нижнюю часть данного диалогового окна, в котором отображаются контакт, описание и версия формы.
По умолчанию Outlook создает элементы посредством форм из стандартной библиотеки форм. Если вы хотите, чтобы Outlook по умолчанию создавал формы на основе вашей, то необходимо установить соответствующий параметр для свойств папки, хранящей элементы (см. пример 19.12).
Теперь при создании нового элемента в папке Контакты будет использоваться созданная нами форма writer.
Задание формы, применяемой по умолчанию
Пример 19.12. Задание формы, применяемой по умолчанию
{На панели Outlook} Контакты
Свойства
Общие
Помещая в эту папку использовать Формы...
Папки Библиотек личных форм
Формы Writer
Открыть
ОК (рис. 19.16)
Создание красивых и удобных форм Outlook, безусловно, требует от разработчика наличия определенного опыта. К сожалению, рамки этой книги позволяют описать только базовые операции, используемые при работе с формами Outlook. Однако по аналогии с рассмотренным примером и справочной системой вы сможете упростить и автоматизировать процесс обработки информации на вашем компьютере.
Создание класса Person
Пример 20.1. Создание класса Person
> Insert > Class Module
Properties Name:= Person
Вход в справочную систему
Пример 20.2. Вход в справочную систему
Help > Справка по Microsoft Visual Basic {или нажмите клавишу <F1>}
Давайте рассмотрим работу со справочной системой на примере поиска информации об объекте Application. Поиск требуемой информации мы начали с вывода объектной модели Microsoft Outlook. Ее диаграмма, содержащая объект Application и подчиненные объекты, дает общее представление о составе и структуре объектной модели приложения и позволяет получить справку о каждом объекте (рис. 20.5). На этой диаграмме представлены объекты и семейства объектов в виде прямоугольников разного цвета (голубого и желтого, соответственно). Для семейства, кроме имени в скобках, указано имя объекта — элемента семейства. Иногда справа от прямоугольников отображается значок красной стрелки. Щелчок по ней позволяет спуститься на более низкие уровни иерархии объектов; щелчок по любому из прямоугольников — получить справку по этому объекту.
Получение справки
Пример 20.3. Получение справки
Мастер ответов
Выберите действие := Outlook Objects Найти
Выберите раздел := Microsoft Outlook Objects
Application
Запуск Object Browser
Пример 20.4. Запуск Object Browser
Object Browser {На панели Standard или}
View > Object Browser {или}
<F2>
Окно просмотра объекта состоит из нескольких частей:
Поле со списком Project/Library (Проект/Библиотека), расположенное в верхнем левом углу окна. Этот список предназначен для выбора одной из библиотек открытого проекта приложения. В нем отображаются только те библиотеки, на которые были установлены ссылки в приложении.Поиск в Object Browser
Пример 20.5. Поиск в Object Browser
Project/Library All Libraries
Search Text := persinit
После этого в окне Details появится описание нашего метода.
Справочная система — очень сильное оружие, но в некоторых руках оно может быть неэффективным если пользователь не знает, где и что искать. Мы.советуем вам посвятить несколько часов своеобразной тренировке по поиску той или иной информации. Это поможет попять работу справки — куда она ссылается, какой род информации выдает и т. д. Умение правильно ставить вопрос и отсекать ненужные ссылки — очень большой плюс при работе со справкой.
Перейдем к следующему объекту рассмотрения, регламентированному в начале раздела, — проекту. Как уже упоминалось, проект — это набор программных модулей, связанных с основным документом приложения (см. "Разработка приложения"). Сейчас мы рассмотрим работу с проектами. Расскажем о свойствах проекта, о том, как манипулировать структурой проекта и как управлять проектами в многодокументных приложениях.
В начале этого раздела мы говорили, что проект состоит из модулей разных типов, но не говорили о том, как добавить модуль, удалить его или переименовать.
Добавление модуля в проект осуществляется следующим образом:
Добавление модуля
Пример 20.6. Добавление модуля
>Insert > {Forms | Module | Class Module}
Для удаления какого-либо модуля из проекта необходимо его сначала выделить. При удалении модуля появится диалоговое окно, предлагающее перед удалением экспортировать модуль. Об экспорте и импорте модулей будет рассказано ниже.
Удаление модуля
Пример 20.7. Удаление модуля
> File > Remove Module Нет
Помимо вышеприведенных способов добавления и удаления модулей существует еще один, и на наш взгляд, более естественный способ. Для добавления (удаления) модуля необходимо в окне проекта выполнить следующую последовательность действий:
Insert
> (Forms | Module | Class Module}
( Remove Module)
При создании нового модуля ему присваивается имя модульы, где N — порядковый номер этого модуля. Аналогичная ситуация происходит при автоматической записи макросов, где модулю, содержащему макрос, присваивается имя NewMacros. Подобное наименование не несет никакой информативной нагрузки о содержании модуля, поэтому мы советуем всегда переименовывать стандартные имена модулей.
Переименование модуля
Пример 20.8. Переименование модуля
{В окне проекта} Modulel
{В окне свойств} Name := <Новое имя модуля>
После того как мы освоили создание и удаление модулей, давайте рассмотрим, для чего же они предназначены.
Модуль объекта приложения. Модули этого типа всегда связаны с объектами, реагирующими на события. Главное назначение подобных модулей состоит в том, что они содержат заготовки процедур реакций на события. Так, например, в Excel модуль ЭтаКнига содержит объект workBook, с которым связаны события ОТ Activate ДО WindowResize.Стандартный модуль. В модулях этого типа следует размещать обычные процедуры и функции. Как правило, это наиболее часто используемый тип модуля. При наличии большого количества процедур разумно иметь не один большой модуль, а несколько маленьких, содержащих процедуры и функции одной тематической направленности.
Модуль класса. Это специальный тип модуля, в котором следует размещать код пользовательских классов.
Модуль пользовательской формы. В этих модулях содержатся пользовательские формы вместе с процедурами реакции на события объектов этих форм.
И наконец, говоря о ведении проекта, нельзя не упомянуть о его сохранении. Безусловно, сохраняя весь документ приложения, вы сохраняете и проект, к нему присоединенный. Но, вообще говоря, можно сохранить проект и все изменения его кода прямо в редакторе.
Сохранение проекта
Пример 20.9. Сохранение проекта
> File > Save имяПроекта
Ведение современных проектов целой командой разработчиков (или даже одним человеком) зачастую требует использования кода разных модулей, лежащих в разных проектах. В таких случаях можно воспользоваться вспомогательным инструментом VBA — экспортом и импортом модулей.
Если при работе над новым проектом А вам потребовались только одна функция или один класс, описанные в проекте в, то совсем необязательно на них ссылаться. Можно экспортировать модули из одного проекта в другой. Давайте на примере класса Person рассмотрим процедуру экспорта из проекта ciassPerson в новый проект.
Сначала мы выделяем экспортируемый модуль и сохраняем его на жестком диске в виде отдельного файла с именем, после чего импортируем этот файл в новый проект. В принципе произошло простое копирование кода из проекта в проект, но более цивилизованным методом. Кстати, следующему проекту, которому будет необходим класс Person, достаточно только импортирования уже созданного файла.
Экспорт и импорт классов
Пример 20.10. Экспорт и импорт классов
{В окне проекта CiassPerson} Person Export File...
Папка := <Диск>
Имя файла := Person
Тип файла Class Files (*.cls)
Сохранить
(В окне нового проекта}
Import File...
Папка := <Диск>
Имя файла := Person
Открыть
Аналогичным способом можно экспортировать и импортировать любые модули проекта (пользовательские модули, модули форм).
Замечание
Замечание 2
Вспомните, что когда мы удаляем модуль из проекта, выводится диалоговое окно, предлагающее экспортировать модуль. Если модуль может оказаться вам полезен в будущем, но не нужен в данном проекте, сохраните его, нажав кнопку Да. В противном случае нажмите кнопку Нет.
Получение справки об объектной модели
Пример 21.1. Получение справки об объектной модели Outlook 2002
> Справка > Справка по Microsoft Outlook Содержание
Дополнительные средства настройки
Microsoft Outlook Visual Basic Reference Microsoft Outlook Objects
Также не забывайте об удобном средстве просмотра объектов Object Browser, которое заметно упростит понимание структуры объектной модели. И наконец, в случае серьезных затруднений советуем обратиться за справкой к MSDN (Microsoft Developer Networks), справочной системе, содержащей гигабайты информации, примеров, исходного кода и т. д. Помимо всего прочего, в Интернете можно найти огромное множество как российских, так и зарубежных Web-сайтов, посвященных разработке приложений в Microsoft Office.
Создание пользовательской формы
Пример 22.1. Создание пользовательской формы
> Сервис > Макрос > Редактор Visual Basic...
{В окне VBE}
> Insert > UserForm
При этом открывается окно разработки пользовательской формы с пустой пока пользовательской формой. Теперь предстоит подобрать нужные размеры будущего диалогового окна и поместить на него нужные элементы управления. Для этого откройте соответствующую панель инструментов.
Открытие панели инструментов Too/box (Элементы управления)
Пример 22.2. Открытие панели инструментов Too/box (Элементы управления)
> View > Toolbox
Дальнейший процесс проектирования пользовательского диалога состоит в том, что вы просто щелчком мыши выбираете кнопку нужного элемента управления на панели Toolbox, а затем "рисуете" этот элемент в пользовательской форме, используя технику "протаскивания" мыши. Надо установить указатель мыши на то место, где должен располагаться верхний левый угол создаваемого элемента управления, затем нажать левую кнопку мыши, и, удерживая ее нажатой, растянуть рамку до того места, где должен располагаться правый нижний угол, а затем отпустить кнопку мыши.
После того как элемент управления помещен в кадр диалога, вы можете перемещать его, изменять его размеры или даже удалить его. Щелчок по элементу управления выделяет его, после чего можно воздействовать на выделенный элемент. Если удерживать нажатой клавишу <Ctrl> во время выполнения щелчков по элементам управления, то таким образом можно будет выделить несколько элементов управления одновременно. Если же во время щелчков мышью вы будете удерживать нажатой клавишу <Shift>, то выделятся сразу все элементы управления, расположенные между теми двумя, по которым сделаны щелчки. Наконец, можно просто растянуть рамку выделения над теми элементами управления, которые вы хотите выделить.
Перетаскивание элемента управления (или сразу нескольких выделенных элементов) перемещает его в пределах пользовательской формы. Перетаскивание одного из маркеров выделения позволяет изменить размеры выделенного элемента или сразу нескольких выделенных элементов. Например, если выделить несколько элементов управления, а затем установить указатель мыши над правым маркером выделения и протащить его чуть дальше вправо, можно увеличить размеры всех выделенных элементов разом на одинаковую величину. Наконец, нажатие клавиши <Delete> удаляет все выделенные элементы.
Попробуйте подготовить представленную на рисунке пользовательскую форму для диалогового окна (рис. 22.2). Для этого надо поместить в диалоговое окно два раскрывающихся списка (comboBox), одно поле ввода (TextBox), один рисунок (image), одну кнопку(CommandButton) и наконец десяток текстовых надписей (Label), служащих для пояснения назначения активных элементов управления, на которые может воздействовать пользе-, ватель во время работы программы.
Форматирование элементов управления
Пример 22.3. Форматирование элементов управления
Номер главы
<Ctrl> + Серия
<Ctrl> + Раскрывающийся список
<Ctrl> + Название
<Ctrl> + Длительность проекта
{Трое из элементов имеют черные маркеры выделения, а "Длительность" —
былые. Именно по этому полю будет происходить выравнивание}
> Format > Align > Lefts
Когда все будет готово, вы можете посмотреть на то, как разработанное вами диалоговое окно будет выглядеть во время выполнения программы: для этого нажмите клавишу <F5>. Завершить тестовый просмотр диалогового окна позволяет кнопка закрытия в правом верхнем углу диалога.
Определение названия диалогового окна
Пример 22.4. Определение названия диалогового окна
{все диалоговое окно целиком — щелчком по свободному месту} Caption := Задача: Написание книги
Большинство свойств различных элементов управления можно установить статически только с помощью панели свойств. А некоторые свойства, например расположение и размеры, которые устанавливаются обычно с помощью мыши, не мешает проверить с помощью этой панели (рис. 22.3).
Ниже мы продемонстрировали установку свойств для объекта image (указывается путь до картинки и способ ее отображения), объекта comboBox
Если панель свойств не отображается, открыть ее можно с помощью нажатия на клавишу <F4> или с помощью команды > Вид > Окно свойств.
(отмена возможности редактирования текстового поля раскрывающегося списка, т. е. пользователь может только выбирать существующие элементы) и объекта EditBox (устанавливается максимальное число вводимых символов).
Установка свойств для элементов управления
Пример 22.5. Установка свойств для элементов управления
ComboBoxl
Name := series
Style 2-fmDropDownList
ComboBox2
Name := author
Style 2-fmDropDownList
EditBox
Name := title MaxLength := 50
ComboBoxS
Name := duration
Style 2-fmDropDownList
Функция запуска приложения
Пример 22.7. Функция запуска приложения
{В редактор VBE} > Insert > Modules
Name := AssignTask (В редактор VBE} Sub GenerateTask() UserForm.Show End Sub
Теперь все готово к созданию панели и кнопки пользователя.
22.7.1. Создание панели пользователя
Панель пользователя практически ничем не отличается от панелей инструментов Стандартная и Дополнительно.
Добавление переменной в окно Add Watch
Пример 22.8. Добавление переменной в окно Add Watch
{В окне Watch} 1R Add Watch... (рис. 22.9)
Expression := tsk.StartDate
Procedure AssignTask
OK
Итак, точки останова расставлены, окно Add Watch с наблюдаемыми переменными активно, следовательно, с замиранием сердца переходим к трассировке программы. Итак, нажимаем клавишу <F5>, как и предполагалось, перед инициализацией переменной происходит останов программы. Все правильно. Теперь давайте посмотрим, как изменились значения переменных В окне Add Watch: tsk.StartDate = 01:01:4501, tsk.StartDate = 01:01:4501, a duration = 5.
Добавление кнопки на панель инструментов
Пример 22.9. Добавление кнопки на панель инструментов
{В диалоговом окне Настройка}
Команды
Катерогии Макросы
Команды BookTask.GenerateTask (рис. 22.12)
Форматирование кнопки пользователя
Пример 22.10. Форматирование кнопки пользователя
1R BookTask.GenerateTask
Имя := Назначить задачу писателю
Значок и текст
> Выбрать значок для кнопки > [1,6]
Закрыть
После того как закрыто диалоговое окно Настройка, вы можете перемещать, пристыковывать панель и т. д. Теперь, после щелчка по кнопке Назначить задачу писателю, появится диалоговое окно Задача: Написание книги (рис. 22.14). Неправда ли просто?
Пример в самом начале раздела...
Пример в самом начале раздела поможет в дальнейшем по аналогии создавать простые программы, тестирующие приведенные листинги. Условные обозначения помогут разобраться в использовании синтаксиса языковых конструкций. Необходимость описания алфавита и лексики не требует комментариев.
Но, прежде всего, давайте попытаемся привести первое формальное определение VBA. VBA — это визуальный объектно-ориентированный язык программирования высокого уровня.
Язык программирования высокого уровня — это язык программирования, в который введены элементы, допускающие описание программы в наглядном, легко воспринимаемом человеком виде, упрощающие и автоматизирующие процесс программирования. Конструкции языка программирования высокого уровня отражают естественные для человека понятия, а не архитектуру и не систему команд компьютера. Поэтому программа, составленная на языке программирования высокого уровня, сначала особым образом обрабатывается компьютером (транслируется или интерпретируется), а затем выполняется.
В визуальном языке программирования взаимодействие пользователя с системой программирования при составлении и отладке программ реализуется диалоговыми средствами графического интерфейса пользователя (см. раздел 20.6 "Редактор Visaиl Basic for Application").
Объектно-ориентированное программирование (ООП) — наиболее популярная в настоящее время методология программирования. Центральной идеей ООП является инкапсуляция, т. е. структурирование программы на модули особого вида, объединяющие данные и процедуры их обработки, причем внутренние данные модуля могут быть обработаны только предусмотренными для этого процедурами (см. главу "Объектная модель Outlook 2002").
Если после данной расшифровки легче не стало, не волнуйтесь и не откладывайте книгу до лучших времен. В процессе изложения многие термины невозможно определять без ссылок вперед, но и оставлять термин или понятие без какого-либо внимания тоже считается некорректным. Таким образом, мы сейчас и в дальнейшем будем прибегать к следующему методу изложения: краткое, по возможности формальное определение, отражающее суть предмета, но без особых комментариев и с обязательной ссылкой вперед, где подробно, в доступной форме будет объяснен и термин, и сопутствующий ему материал.
Итак, после исторического экскурса и ряда формальных определений можно было бы перейти к описанию алфавита и лексики языка, но мы решили сделать паузу и привести пример. Для дальнейшего изучения мы сочли необходимым привести пример разработки простейшей программы, начиная с запуска редактора VBE, создания модуля, написания и выполнения кода. Без объяснения конструкций и интерфейса, но с многочисленными ссылками вперед. Это позволит вам на первых порах при необходимости и желании проверить приведенные ниже примеры в действии. Цель данного раздела — создать программу по выводу диалогового окна с надписью "Здравствуй, мир!" Этот пример неслучаен — с написания подобных элементарных программ начинаются многие учебники по языкам программирования, и мы решили не нарушать традицию.
Запустите Microsoft Outlook 2002. Выберите команду > сервис> макрос > Редактор visual Basic или просто нажмите комбинацию клавиш <Alt>+<Fl 1> (Запуск редактора).
В меню редактора выберите команду > insert> Module (Вставка модуля) и введите следующий код:
Проектирование диалогового окна
Проектирование диалогового окна
Для создания задачи и заполнения ее информационных полей необходимо открыть диалоговое окно, с помощью которого можно будет указать тип серии, выбрать автора, а также задать название книги и срок ее написания.
Для проектирования диалогового окна нам потребуется создать пользовательскую форму, на которую помещаются нужные элементы управления — раскрывающиеся списки, поля вода, кнопки, а затем написать процедуры обработки событий, связанных с этими элементами управления: что должно происходить при открытии окна, при вводе данных в поле ввода, при нажатии кнопки, при выборе элемента раскрывающегося списка и т. д.
В этом примере мы продемонстрируем создание и использование самых разных элементов управления: не только обычных полей ввода и кнопок, но и более сложных элементов, например раскрывающихся списков.
Начнем с того, что откроем проект VBA и вставим в него новую пользовательскую форму.
Проектируемое диалоговое окно
Проектируемое диалоговое окно
Для того чтобы ввести текст надписи, сначала щелкните по этой надписи, чтобы выделить ее, затем сделайте второй щелчок, чтобы войти в режим редактирования. Теперь удалите стандартный текст серия и введите нужный текст. Таким же образом можно задать значения по умолчанию для активных элементов диалогового окна, например для полей ввода.
Можно также изменить текст надписи с помощью панели свойств элементов управления — таким же образом, как и многие другие свойства этих элементов. Однако изменение свойств элементов управления с помощью панели свойств заслуживает особого разговора — мы посвятим этому следующий раздел.
Для четкой расстановки элементов управления можно воспользоваться как сеткой диалогового окна, так и командами меню Format. Например, в приведенном ниже примере мы выровняли все текстовые поля и поля редактирования по левому краю.
Программа 20.1. Вывод диалогового окна с надписью "Здравствуй, мир!"
Программа 20.1. Вывод диалогового окна с надписью "Здравствуй, мир!"
Sub hello <Enter>
<Tab> MsgBox("Здравствуй, мир!")
Замечание
Замечание 1
В коде программы есть еще одна строка (End Sub), но она появляется автоматически, вводить ее не нужно.
Программа 20.2. Комментарий
Программа 20.2. Комментарий
Sub numbBookSaie () 'Процедура подсчета количества проданных книг
В-четвертых, если строка программы не помещается целиком в окне редактора кода, то при использовании символа _ и продолжении кода на следующей строке компилятор будет воспринимать две строки за одну.
От описания идентификаторов перейдем к другим лексемам языка — строкам, числам и ключевым словам.
Строка — последовательность символов, заключенная в двойные кавычки ("..."), при этом под символами подразумеваются все вышеуказанные.
Число — это лексема, служащая для записи числовых значений (включая даты). Для записи десятичных чисел используются цифры и точка (123.456), также можно представлять число с помощью экспоненциального представления и символа Е или е. Этот символ указывает на то, что истинное число равно числу, стоящему перед Е (оно называется мантиссой), умноженному на 10 в степени числа, стоящего после Е (оно называется порядком). Например, лексема 1.234Е+6 обозначает число 1234000.
Ключевое слово — это специальная лексема, смысл которой зафиксирован правилами языка и по которой транслятор (и человек) распознает основные языковые конструкции. Ключевыми словами VBA, например, являются True, For, String И Т. Д.
Программа 20.3. Объявление переменных j
Программа 20.3. Объявление переменных j
Dim str As String, Var = 123.456
Dim str$, k&
Кстати, помимо явной инициализации переменных, например pi = 3.14, существует инициализация по умолчанию. То есть, когда вы объявляете переменную и не инициализируете ее, ей присваивается значение по умолчанию, так, например, для числовых типов это значение равно 0.
Помимо переменных, чьи значения могут меняться по ходу программы, можно использовать именованные константы. Константа — это элемент данных, не меняющий своего значения. Синтаксис объявления констант практически ничем не отличается от объявления переменных.
[Public I Private] Const имяКонстанты [As ТипДанных] = выражение
Ключевые слова Public и Private имеют такой же смысл, как и в случае с переменными. Отсутствие этих ключевых слов и описание константы внутри процедуры объявляет ее как локальную, использование же их, наоборот, объявляет ее как открытую или закрытую глобальную константу. Задание имени и типа данных аналогично случаю с переменными.
Выражение — это любое значение или формула, возвращающая значение, используемое в качестве константы. Например, мы хотим ввести константу, значением которой будет площадь — const squares = 20000. Или в виде формулы (зная длину и ширину):
Const lengths = 200
Const widths = 100
Const squares = length*width
Программа 20.4. Объявление массивов
Программа 20.4. Объявление массивов
{Первый пример}
Dim temperature( - 14 То -1)
temperature(-2) = -10
{Второй пример}
Const numbShop As Integer = 20, numbBook As Integer = 100
Dim numbBookSale (1 To numbShop, 1 To numbBook) As Integer
numbBookSale(7, 56) = 300
В приведенных примерах речь все время шла о массивах фиксированного размера, количество элементов в которых явно указано во время описания в операторе Dim. Такие массивы называются статическими. Но иногда количество элементов массива изначально не известно. Например, вы не знаете точного количества магазинов (возможно, появятся еще несколько магазинов, с которыми издательство будет сотрудничать). Как быть? Не стопорить же сбыт продукции до выявления конечного числа магазинов.
Для решения подобных проблем VBA предлагает использование динамических массивов, т. е. массивов, размеры и количество элементов которых при описании не фиксируются, но могут быть определены непосредственно при выполнении программы. Синтаксис объявления динамического массива отличается от объявления статического только тем, что после имени массива в нем стоят пустые скобки. Однако, перед тем как использовать массив, нужно выполнить оператор ReDim, который задаст размерность и диапазоны изменения индексов динамического массива.
ReDim имяМассива (размер1[, размер2 ...])
При всем обилии встроенных типов данных часто возникает желание ввести новый тип данных, содержащий некоторые определенные значения. Такой тип называется в VBA перечисляемым. Мы поясним перечисляемые типы на следующем, довольно характерном, примере.
Мы хотим ввести тип "неделя". Элементами данного типа будут только обозначения дней недели, и, соответственно, область значений будет изменяться от понедельника до воскресенья.
[Private | Public] Enum имяTипа
имяЗначения [ = Константа] имяЗначения [ = Константа]
End Enum
Синтаксис довольно прост. Операторы Private и Public объявляют область видимости для типа (кстати, перечисляемые типы могут описываться только на уровне модуля, т. е. нельзя описать перечисляемый тип внутри процедуры). Затем следует ключевое слово Enum и имятипа, после чего — перечисление значений типа (по одному на строчке). По умолчанию все значения типа перенумеровываются целыми числами, начиная с 0, но вы можете самостоятельно указать константное целое значение для значений типа.
Программа 20.5. Объявление перечисляемого типа
Программа 20.5. Объявление перечисляемого типа
Enum Week
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday End Enum
Sub Weekend()
Dim day As Week
Day = Saturday End Sub
После описания простейшего структурного типа данных (массива) перейдем к более сложному типу, а точнее, к типу, определяемому пользователем. В то время как массив представляет собой совокупность однотипных переменных, хотелось бы создать объединение элементов разных типов (запись).
Например, мы могли бы описать человека при помощи массива целых чисел: Dim Person () As Integer, где Person (1) задает рост, Person (2) — Вес, Person(3) — объем грудной клетки и т. д. Но это все элементы одного типа integer, а как же быть когда мы захотим определить не менее важный па
раметр человека — его имя, имеющее тип string, или дату рождения типа Date? Решением является создание записи. В нашем случае это будет выглядеть следующим образом: мы создаем пользовательский тип данных Person, элементами которого являются значения разных типов. Обращение же к таким переменным строится следующим образом: Person->Weight или Person->Name
Конечно, перечисляемый тип тоже определяется пользователем, но это простой тип данных.
После небольшого введения дадим точное определение записи и синтаксиса определения пользовательского типа. Запись — это структурированный тип данных, компоненты которого обычно называются полями, имеют имя и могут принадлежать к различным типам данных.
[Private |Public] Type имяТипа
имяПоля [([<размер>]}] As типДанных [имяПоля [ ( [<размер>] ) ] Аs типДанных]
End Type
Исходя из синтаксической конструкции, сразу можно сказать, что тип определяется либо на уровне модуля, либо на уровне приложения. Далее идет ключевое слово туре и собственно имя типа. После этого идет объявление полей нового типа. Это могут быть простые переменные и массивы встроенных типов, а также переменные и массивы уже определенных типов пользователя, которые в свою очередь могут иметь любую вышеуказанную структуру.
Для тех, кого последнее предложение заставило задуматься, небольшое пояснение. Определение записи можно рассматривать как дерево. Корень — это имя типа, а вершины — имена полей, которые могут являться корнями подобного же дерева. Не допускается использование рекурсивных определений, т. е. нельзя объявить тип следующим образом:
Туре Заяц
Волк Аs Заяц
End Type
В приведенной ниже программе мы объявляем тип Person, имеющий поля name (имя) и birthday (дата рождения) простых типов. Далее мы объявляем тип Book, имеющий поле author определенного выше типа Person, поле title (название книги) типа string и поле content (названия глав книги), представляющее собой динамический массив типа string. После объявления типов мы объявляем одномерный массив типа Book и полностью инициализируем второй элемент массива, используя для доступа к полям записей точечную нотацию. Небольшой нюанс при инициализации поля content: поскольку это динамический массив, его необходимо переопределить. В конце просто выводится название одной из глав книги.