Объекты программного проекта. Программирование на лету
Объекты программного проекта. Программирование на лету
Всюду, где только можно, я не уставал повторять, как заклинание, что для офисного программиста целью работы является создание документа, частью которого является программный проект, неразрывно связанный с документом. Более того, в серьезных разработках речь всегда идет о создании системы документов, а, следовательно, и о системе программных проектов, связанных с этими документами, так и с помощью ссылок непосредственно друг с другом. Программные проекты в такой системе могут иметь общий пул памяти, общие процедуры, вызываемые из любого проекта. Я хочу рассмотреть отношения между документами и проектами с объектной точки зрения, рассмотреть основной объект VBProject, задающий проект, его компоненты, его связь с объектом Document и коллекцией VBProjects, хочу рассмотреть вопросы программной работы с этими объектами. Всюду в этом тексте, где речь идет о документах, я буду рассматривать документы Word, а, следовательно, с ними связывать программные проекты. Но нужно понимать, что объектная модель проектов практически одна и та же для всех документов Office 2000. Объекты, о которых пойдет речь, являются общими и находятся в общей библиотеке VBIDE.
В отличие от других документов Office документы Word обладают той особенностью, что с каждым из них связаны два проекта. Один - Normal - стандартный проект, общий для всех документов, а второй - отражает специфику документа. Этот второй проект обычно и называют проектом данного документа, и именно о нем пойдет основной наш разговор. Но прежде несколько слов о проекте Normal. Все документы Word открываются по умолчанию на основе шаблона Normal, частью этого шаблона и является, связанный с шаблоном проект Normal. Все макросы, хранимые в проекте Normal, являются доступными для любого из документов Word. Именно сюда может поместить программист все макросы, стандартные модули или модули классов, которые, по его мнению, будут использоваться всеми документами Word на данном компьютере. Нужно, однако, понимать, что при размещении макроса в проекте Normal, речь должна идти действительно только об общезначимых программных инструментах. В остальных случаях все программные компоненты должны быть связаны с проектом конкретного документа или включены в специальную надстройку - AddIn. Замечу, кстати, что иногда помещение программных компонент, чаще всего макросов, в проект Normal происходит по недоразумению, поскольку по умолчанию местом размещения создаваемых MacroRecorder макросов является именно проект Normal, а не проект данного документа. Так что будьте внимательны в таких ситуациях. Но давайте перейдем к рассмотрению объектной модели проекта. Но вначале несколько слов о том, как связаны на объектном уровне документы с проектами и как связаны между собой проекты разных документов.
Документы и проекты с объектной точки зрения
Объект Document имеет свойство VBProject, возвращающее объект, задающий программный проект данного документа. С другой стороны, объект VBProject является элементом коллекции VBProjects, содержащей проекты всех открытых документов. Коллекция VBProjects, в свою очередь, вложена в объект VBE. Поэтому давайте поднимемся на несколько этажей выше проекта. Я напомню, что корневым объектом, содержащим все объекты VBA, является объект VBE (Visual Basic Environment или Editor). У этого объекта есть только свойства, позволяющие получить доступ к объектам VBA, лежащим на нижних уровнях иерархии. В справочной системе приведена следующая объектная модель VBE:
Эта модель далеко не полная. Она отражает только коллекции, входящие на верхнем уровне в объект VBE. Рассмотрим коротко эти коллекции:
- Конечно, основной является коллекция проектов - VBProjects. Эту коллекцию составляют все проекты открытых документов приложения. Заметьте, если одновременно открыто N документов Word, то коллекция VBProjects будет содержать не менее чем N+1 элемент, по одному проекту на документ плюс общий для всех проект Normal. Заметьте также, проекты разных приложений, например, Excel и Word входят, к сожалению, в разные коллекции, что затрудняет программную работу в проекте документа Word с проектом Excel. Совместная работа с разными проектами внутри одного приложения не вызывает особых трудностей. Достаточно просто иметь общие переменные, вызывать общие процедуры.
- О том, как создать собственные надстройки - AddIn, разговор пойдет в последующих лекциях. Сейчас же замечу, что коллекция надстроек, доступных в приложении Word 2000, не пуста. В настоящий момент у меня на компьютере доступны восемь таких надстроек, среди них WinApiViewer, AddIn для построения строк, задающих SQL-операторы, AddIn, реализующий множественный импорт- экспорт объектов за одну операцию и другие.
- Коллекция окон Windows содержит объекты, задающие окна в Редакторе Visual Basic. Восемь окон входит в эту коллекцию, - окно проекта и окно кода, окно отладки, окно локальных переменных и другие.
- Коллекция CodePanes содержит подокна, задающие активные окна кода, обычно таких открытых окон в процессе работы одно, но может быть и несколько ведется параллельная отладка нескольких проектов.
- Коллекция CommandBars содержит, как правило, несколько десятков элементов, задающих инструментальные панели в среде Редактора VBA.
Помимо пяти коллекций в объект VBE вложено большое число других объектов, не являющихся коллекциями. Отмечу среди них лишь некоторые объекты.
Объект Events напоминает коллекцию. Каждое из его свойств возвращает объект, тип которого совпадает с именем свойства. Возвращаемые объекты обладают определенным набором событий, которые могут быть подключены в создаваемых надстройках Addins, позволяя реагировать на те или иные действия. Большинство событий связано с добавлением, удалением, переименованием объектов в коллекциях. Так свойство ReferencesEvents объекта Events возвращает объект ReferencesEvents, обладающий двумя событиями - ItemAdded, ItemRemoved, возникающими при добавлении или удалении ссылок - элементов коллекции References.
Три Active-свойства объекта VBE возвращают соответствующие активные объекты - ActiveVBProject, ActiveWindow, ActiveCodePane. Похожим является свойство SelectedVBComponent, возвращающее выбранную компоненту проекта