Основы офисного программирования и документы Word



              

Программирование на лету


Сейчас я хочу рассмотреть одну важную тему при работе с программными проектами. Иногда работа программиста с проектом заключается в том, что он программно должен изменить сам текст проекта, добавляя новые модули, новые процедуры и обработчики событий, корректируя текст модуля и его отдельных процедур, создавая или меняя свой проект, как говорят, "на лету". Я уже говорил о том, что, благодаря коллекции VBComponents, можно добраться до каждого модуля проекта, а благодаря свойству CodeModule, получить код модуля. Свойством CodeModule обладает объект VBComponents("NameofModule"), задающий модуль проекта с именем NameOfModule. При вызове этого свойства возвращается объект CodeModule, определяющий код модуля. У этого объекта много важных и полезных свойств и методов, необходимых при программной работе с кодом проекта. Благодаря таким свойствам как CountOfLines, CountOfDeclarationsLines, ProcCountLines, можно узнать число строк в модуле, число строк в разделе объявлений, число строк в процедуре модуля с заданным при вызове именем. Работая со свойством Members, можно получить полную информацию обо всех элементах модуля. Свойства ProcBodyLine и ProcStartLine возвращают номер строки, с которой начинается процедура или предшествующей ей строки. Свойство Lines возвращает заданное число строк процедуры, свойство ProcOfLine возвращает имя процедуры, содержащей заданную при вызове строку. Если свойства объекта CodeModule позволяют проанализировать состав модуля и добраться до каждой из его процедур, то методы объекта позволяют вставлять, заменять и удалять строки кода, так что можно "на лету" провести коррекцию процедуры, удалить или добавить новую процедуру и/или объявление переменной.

Методы AddFromFile и AddFromString позволяют добавить в модуль текст, сохраненный либо в файле, либо непосредственно в строке. Первый метод, как правило, используется для введения больших изменений в модуле, второй при небольших корректировках. Заметим, что если нужно полностью добавить новый модуль, то удобнее пользоваться методом AddFile или AddFromTemplate коллекции VBComponents. Методы InsertLines, DeleteLines и ReplaceLines позволяют вставить, удалить или заменить строки программного текста в указанной точке. Функция CreateEventProc позволяет создавать процедуры указанных событий. Функция Find позволяет осуществлять полномасштабный поиск в модуле.

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

Необходимо создать шаблон документа, такой, чтобы все документы, открывающиеся на основе шаблона, содержали обработчик события Open, одинаково реагируя на каждое открытие документа. Замечу, что хотя сам шаблон может содержать обработчик этого события, но документы, открываемые на его основе, обладать этим обработчиком не будут. Однако добавить этот обработчик в документ можно программным путем, в тот момент, когда создается документ на основе шаблона. Понятно, что для этого необходимо задать соответствующий код в обработчике события New нашего шаблона. Чтобы чуть усложнить задачу и сделать ее более конкретной, будем также полагать, что документы, создаваемые на основе шаблона должны иметь переменную - счетчик, следящую за числом открытия документа. Такие счетчики полезны, когда пользователю предоставляется демо-версия, рассчитанная на фиксированное число открытий документа. Таким образом, шаблон должен гарантировать также появление переменной, назовем ее Counter, в коллекции Variables каждого нового документа, создаваемого на основе шаблона.

Итак, наша цель состоит в том, чтобы создать шаблон документа. В обработчике события New для этого шаблона, вызываемого в тот момент, когда на основе шаблона создается новый документ, предусмотреть решение следующих задач:

  • Добавить переменную - счетчик в коллекцию Variables нового документа.
  • Добавить процедуру - обработчик события Open для нового документа.
  • Добавить стандартный модуль, содержащий процедуры, вызываемые из обработчика события Open.




Содержание  Назад  Вперед