Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3490 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 3:

Документы и проекты

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >

Документ и его программный проект

От глобальных вопросов проектирования документов спустимся на землю и рассмотрим один единственный документ Office 2000. Сейчас нас будет интересовать, что собой представляет программный проект одного документа.

Каждый вновь создаваемый документ обладает определенной архитектурой, поскольку строится на основе каркаса документов, заданного совокупностью библиотек Office 2000. Каркас каждого конкретного документа определяется, прежде всего, тем, в каком приложении создается документ, - корневым объектом Application. Частью архитектуры вновь создаваемого документа является и создаваемый по умолчанию программный проект. Здесь и в дальнейшем, если только не будет делаться специальных оговорок, под программным проектом понимается совокупность модулей. Модули, составляющие программный проект, могут быть следующих типов:

  1. Модули, связанные с объектами приложения, реагирующими на события
  2. Программные модули, создаваемые программистом, так называемые стандартные модули.
  3. Модули классов, создаваемые программистом.
  4. Модули макросов, создаваемые Macrorecorder.

Модули - обработчики событий

Модули первого типа всегда связаны с объектами, реагирующими на события. Их главное назначение состоит в том, что они содержат обработчики таких событий. Объектов, имеющих события, довольно много, но только с некоторыми из них связываются модули. Попробуем с этим разобраться подробнее.

Когда создается документ Word, то появляется один такой объект с именем ThisDocument, задающий сам документ. При создании документа Excel наряду с объектом ThisWorkbook, задающим рабочую книгу, появляется коллекция объектов Sheets, задающих каждую страницу этой книги. Все упомянутые объекты могут реагировать на события, они являются основными объектами, с ними и связываются модули. Но, заметьте, при создании презентации в приложении Power Point объект ThisPresentation, задающий презентацию, и связанный с ним модуль автоматически не появляется. В этот момент должен возникнуть вопрос, а почему? Дело в том, что объект класса Presentation не реагирует на события, следовательно, и модуль не может появиться. Это же касается и объектов класса Slide, - у них тоже нет событий.

Есть и другие объекты, с которыми логично было бы связать модули, но по умолчанию этого не делается. В каждом из приложений, наряду с объектом, задающим сам объект - презентацию, документ, рабочую книгу, присутствует и корневой объект Application, задающий само приложение. Этот объект, как известно, также реагирует на события. Почему же нет модуля, ему соответствующего? Здесь есть одна тонкость. Создаваемые по умолчанию объекты Application не реагируют на события. На события реагируют объекты специального класса, - ApplicationWithEvents. Чуть позже мы рассмотрим, как создаются такие объекты и как появляются для них соответствующие модули.

До сих пор мы говорили о модулях, создаваемых по умолчанию для новых документов. Но такие модули могут появляться и в процессе работы над существующим документом. Наиболее известным видом таких модулей являются модули форм (диалоговых окон), составляющие в проекте отдельную папку Forms. Всякий раз, когда Вы добавляете в проект новую форму, появляется модуль, связанный с этой формой. Есть и другие ситуации, при которых появляются новые модули проекта, например, при добавлении нового листа в книгу Excel, появляется и соответствующий ему модуль.

Далеко не со всяким объектом, который может реагировать на события, связывается модуль. Для всех элементов управления ( Controls ), размещаемых в форме или непосредственно в документе Word, листе рабочей книги, слайде презентации, соответствующие обработчики появятся в модуле, связанном с "родительским объектом". Чуть выше мы сказали, что объекты класса Slide не имеют событий и потому с ними не связаны модули в момент создания презентации. Сейчас мы опровергнем это утверждение, уточним его. Если на слайде размещаются элементы управления - кнопки списки и прочее, то появляется модуль, связанный с этим слайдом, и обработчики событий, связанных с элементами управления размещаются в этом модуле.

Есть еще одна группа объектов, имеющих обработчиков событий в обязательном порядке, но не имеющая "своих" модулей. Возможно, Вы уже догадались, что речь идет о командах меню, командных кнопках и других элементах управления, размещаемых на панелях - объектах класса CommandBar. Макросы, задающие обработку событий, связанных с этими элементами, помещаются в стандартные модули.

Стандартные модули

Модули этого типа не создаются по умолчанию. Их создает программист явным образом. Каково их назначение? Можно ли без них обойтись? Сколько таких модулей следует создавать? Вот типичные вопросы, стоящие перед программистом в процессе работы над программным проектом. Постараемся сейчас на них ответить.

Стандартные модули - это основной вид модулей. Большую часть всех процедур и функций, которые пишет программист, следует размещать в стандартных модулях. Разумно иметь не один большой стандартный модуль, а некоторое множество относительно небольших модулей. В один модуль следует помещать набор функций, совместно вызывающих друг друга, связанных общей темой, общей функциональной направленностью. В модулях первого типа, связанных с объектами, следует помещать только те процедуры и функции, которые непосредственно обрабатывают события. Все общие процедуры следует выносить в стандартные модули. Вот три основные причины, по которым следует создавать небольшие стандартные модули:

  • Эффективность. В соответствии с принятой по умолчанию стратегией вычислений в VBA - стратегией компиляции "по требованию" (on demand) при вызове какой-либо процедуры модуля происходит его трансляция и трансляция всех зависимых модулей, содержащих процедуры, вызываемые по ходу исполнения первоначально вызванной процедуры. Именно поэтому следует создавать небольшие модули, помещая в них процедуры так, чтобы было как можно меньше перекрестных межмодульных вызовов.

    Замечание:

    Опцию "On demand" можно включить или выключить на вкладке General в меню VBE Tools|Options. Если временная эффективность критична для Вас, и Вам требуется уменьшить время работы, то следует провести соответствующие эксперименты с опциями компиляции на этой вкладке, а также подобрать наилучшую структуру модулей проекта.

  • Переиспользование (Reusability). Если стандартный модуль содержит процедуры общего назначения, то велика вероятность его дальнейшего использования и в других документах. Заметьте, что стандартные модули легко экспортировать и импортировать. Стандартный модуль VBA легко встроить не только в любой другой документ Office 2000, но и в чистый VB, поскольку экспорт - импорт модулей между проектами VBA и VB происходит также как и внутри VBA.
  • Понимание и Читабельность. Небольшие модули, решающие определенную задачу, гораздо легче подаются чтению с пониманием смысла данных и процедур их обработки. Конечно, для достижения этой важной цели следует использовать и другие известные приемы - мнемонические имена переменных, комментарии, структуризацию текста модуля.

Итак, подводя итог, заметим, что разумно иметь набор стандартных модулей, располагая в них все содержательные процедуры обработки данных документа. И, конечно, если таких процедур много, то модули должны быть специализированными, объединяя под одной крышей данные и функционально связанные с ними процедуры и функции. Хотя все модули имеют одинаковый уровень иерархии, реально всегда выделяется головной модуль, в котором следует сосредоточить описание глобальных переменных, используемых всеми модулями документа. Во многих ситуациях стандартный модуль следует оформить как модуль класса.

Модули классов

Специальный тип модуля - модуль класса является той синтаксической формой, которая используется для создания классов, разработанных программистом для решения своей задачи. Учитывая важность темы, мы посвятили созданию классов отдельную лекцию этой книги.

Модуль макросов

Этот модуль создается автоматически при первом вызове Macrorecoder. В приложении Word все созданные Macrorecoder макросы размещаются в модуле с именем NewMacros. При создании макроса требуется указать, в модуль какого из проектов - Normal.dot или проекта, связанного с документом, должен быть записан макрос. В приложении Excel каждый новый макрос записывается в отдельный модуль. Это не всегда удобно и, зачастую, руками макросы объединяются в одном модуле, особенно, если все они решают некоторую общую задачу. Единственное отличие модулей макросов от стандартных модулей состоит в том, что они создаются системой, а не программистом. Поскольку это не столь существенно, то мы не будем в дальнейшем выделять этот тип модулей, и будем рассматривать их далее как стандартные модули.

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >
полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.