Тайны и секреты компьютера
Шрифт:
Sub TeploCount
Teplotok.Show
End Sub
Зададим модулю красивое имя ("Teplo", например, через свойство «Name» обьекта «Модуль1», если модуль для программы вызова формы был вставлен с помощью пункта "Вставить"-"Модуль" контекстного меню правой кнопки мыши в Менеджере проектов) и назначим в Word кнопку для вызова макроса "Normal.Teplo.TeploCount".
Вот и все — наша программа готова! Если вы последовательно выполняли на своем компьютере все приведенные здесь шаги, то можете проверить ее работу. Теперь программу можно вызывать на выполнение соответствующей кнопкой. При желании можно скопировать форму и модуль в отдельный шаблон и создать в нем панель инструментов с кнопкой вызова макроса, — тогда программу можно будет установить и на другие компьютеры, скопировав шаблон с макросом в
Глава 5.Советы и секреты программирования Что такое API?
Для того, чтобы облегчить труд своих коллег и обеспечить всем программам для Windows универсальный интерфейс, программисты Microsoft создали такую вещь, как API — "Application Programming Interface".
Это — набор функций и процедур, которые могут наиболее часто использоваться программами: отображение дерева каталогов, поиск файлов, отображение стандартного окна с кнопками закрытия, минимизации и развертывания на весь экран и многих других. В итоге разработчик, создающий программу для Windows, не должен продумывать и разрабатывать специальные подпрограммы для отображения окна программы, окна для выбора папки и остальных подобных элементарных операций, — ему достаточно просто вызвать из библиотек kernel32.dll или user32.dll, содержащих функции и процедуры API, нужную ему функцию, а она уже все сделает за него сама. Таких функций и процедур много — порядка 600.
В операционной системе MS-DOS такого понятия, как API, не было, — тот, кто брался писать программу для этой операционной системы, обязан был сам, от начала до конца, продумать и реализовать способы выдачи на экран изображения, получения данных от пользователя, путешествия по файловой системе, рисования графики, если таковая возможность была необходимой. [8] Это делало процесс разработки программ с удобным для пользователя интерфейсом весьма трудоемким процессом, зачастую затраты времени и сил на создание приемлемого графического интерфейса программы превосходили затраты на реализацию собственного алгоритма программы, ради которого она и создавалась. Недаром были очень распространены так называемые «консольные» приложения, то есть программы, работающие только из командной строки, без интерфейса, — ввод данных происходил в той же командной строке или производился из указанного в ней файла, а вывод результатов шел в простом текстовом режиме.
8
В MS-DOS, впрочем, присутствовала возможность включать в программу так называемые "Esc-последовательности", определяющие внешний вид окна программы, вместо того, чтобы самостоятельно прорисовывать все его элементы. Однако аналогом API данное средство считать нельзя, — все же слишком мало функций было доступно программисту.
С появлением операционной системы Windows каторжный труд программистов по разработке внешнего вида программы и удобных способов ввода и вывода информации резко облегчился, — уже в Windows 3.0 использовались функции API. Теперь программист, если он, например, желал создать окно ввода текста или полосу прокрутки, должен был всего лишь написать вызов функции отображения такого окна с необходимыми ему параметрами, так же, как и любой другой функции языка, на котором он писал свою программу, а не вводить огромные обьемы кода ради создания программы, заново рисующей такое окно или полосу (сознавая при этом, что при разработке следующей программы, в которой тоже будут использоваться такие объекты, ему придется вновь разрабатывать такой код или пытаться частично использовать старый, приспосабливая его к нуждам этой новой программы). Поэтому появление API совершило революционный прорыв в технологии программирования, позволяя создавать нужные программы с привычным удобным интерфейсом гораздо быстрее, не заботясь о таких рутинных деталях, как программирование стандартных объектов интерфейса для ввода и вывода информации.
В языке Visual Basic for Applications (VBA) многие функции и процедуры API вызываются сами при выполнении программы интерпретатором, так что использовать их для отображения окон ввода и вывода текста, рисования на экране геометрических фигур и других простых действий совершенно нет необходимости, — их VBA вызывает по мере надобности, а программе на нем достаточно использовать соответствующие функции этого языка. Однако иногда возникает необходимость в некоторых действиях, для которых либо нет аналогов во встроенных функциях VBA, либо они работают нерационально или слишком медленно. Например, окно выбора папки с изображением дерева каталогов (рис. 5.1) или программа поиска файлов (аналог на функциях VBA — объект "Application.FileSearch" — работает слишком медленно при больших количествах файлов). Для таких случаев в VBA предусмотрена возможность вызова функций API.
Рис. 5.1. Это окно вызывается функцией API.
К сожалению, использование функций API в VBA не документировано в справке, вследствие чего для изучения способов их применения приходится либо искать книги или источники в Интернете по офисному программированию, либо анализировать код программ, в которых имеются вызовы функций API. О некоторых из таких программ рассказано в следующей главе.
В подавляющем большинстве случаев при программировании для Office можно обойтись без использования API, но иногда только вызов API-функции может привести к достижению нужного результата. Скажем, вам надо обеспечить вызов разных макросов при простом нажатии мышью кнопки на какой-либо панели инструментов Word и в случае одновременного нажатия этой кнопки и клавиши Shift или Control. Вот фрагмент кода, делающего это:
Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal kState As Long) As Integer
Sub Program
GetAsyncKeyState (vbKeyShift Or vbKeyControl)
If GetAsyncKeyState(vbKeyShift) Then
Call macro1: Exit Sub
ElseIf GetAsyncKeyState(vbKeyControl) Then
Call macro2: Exit Sub
End If
Call macro3
End Sub
Первая строчка — это как бы «резервирование» функции API для использования в программе на VBA. Видно, что вызывается функция GetAsyncKeyState из библиотеки (файла, содержащего программы, предназначенные только для использования другими программами) user32.dll, причем в эту функцию передается номер клавиши, а возвращает она целое число (а именно — 0, если клавиша с соответствующим номером не нажата, и -32767 или 1, если нажата). Любую функцию или процедуру, вызываемую из библиотек, не относящихся к VBA, необходимо так резервировать с помощью команды Declare.
Фраза vbKeyShift в команде — это заменитель кода клавиши Shift (его значение — 16), а vbKeyControl, как нетрудно понять — заменитель кода клавиши Control. Структура инструкций "If…Then", думается, ясна, [9] а если нет — посмотрите в справке VBA. Команда Call перед именем макроса, как вы помните, означает его запуск.
В Интернете есть русские сайты, посвященные API. [10] Посетите их, чтобы узнать больше об этом наборе функций.
9
Двоеточие — разделитель команд, расположенных в одной строке.
10
Например,Также про API и использование его в VBA есть немало информации на сайте программы Microsoft Office Extensions .
Настройка вызова программы. Последние штрихи
Когда программа написана и отлажена, необходимо придать ей "товарный вид", — убрать лишние команды и модули, сделать способ вызова программы — кнопку или пункт меню, может быть, создать панель инструментов для кнопок. Без этого даже с очень хорошо написанной программой сможет работать лишь ее создатель, да и то не всегда. К тому же красивая обложка всегда радует глаз.
Для начала нужно просмотреть весь код и выкинуть все лишнее — закомментированные ненужные команды, излишние комментарии. Потом следует определить, какие модули и формы являются компонентами готовой программы, а какие, возможно, были написаны для других программ или в качестве экспериментальных и запомнить их названия.