События, методы, свойства

С появлением ОС Windows распространился иной принцип программирования и создания алгоритмических языков — объектно-ориентированный. Типичный представитель этого языка — Visual Basic for Application. Его основные понятия — объект, свойство, метод и событие.

Объект — это все то, над чем может совершаться какое-либо действие или то, что имеет определенные характеристики. Например, к объектам можно отнести открытый документ, запущенную программу, какой-нибудь файл на диске и даже Word. Почти каждый из них включает подобъекты, которые, в свою очередь, также являются полноценными объектами и могут иметь свои подобъекты. С помощью Visual Basic можно обратиться к любому объекту, если известны все те объекты, чьим подобъектом он является.

Свойство — любая характеристика объекта. Даже у такого объекта, как первая буква документа, есть свои свойства: выделение курсивом, полужирным или цветом, подчеркивание и т. д., а у самого документа — свои: автоматическая расстановка переносов, проверка грамматики и т. д. Большинство свойств объектов Visual Basic можно задавать программно, однако отдельные, в частности Read-Only, не допускают изменений. Кроме того, определять свойства объектов Word можно и с помощью его стандартных диалоговых окон (например, «Файл?Параметры страницы» или «Сервис?Параметры»), а затем использовать их при записи макроса. Это даст возможность просмотреть синтаксис команды на задание того или иного свойства.

Метод — какое-либо действие над объектом. Так, им можно считать печать или поиск текста в документе. У многих методов есть свои параметры, позволяющие задать определенный алгоритм действия. Например:

With Selection.Find
.Text = «Этот текст надо заменить»
.Replacement.Text = «Заменить на этот текст»
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

Здесь сначала объекту Find, являющемуся подобъектом Selection, задаются необходимые свойства: .Text, .Forward, .Format и др. Затем выполняется метод .Execute для объекта Selection.Find с параметром Replace:=wdReplaceAll (т. е. «Заменить все»). Команда With ... End With позволяет не писать для каждого свойства или подобъекта полное название соответствующего ему объекта, что экономит место и ускоряет выполнение программы.

Свойства и методы по-разному отображаются в контекстной подсказке. Так, рядом с названием свойств стоит символ в виде указывающей руки серого цвета, а рядом с названиями методов — в виде зеленой летящей коробки.

Событие — все то, что «происходит с объектом помимо его воли», «результат действия какого-то другого метода». В случае, когда пользователь указывает кнопку на форме, происходит событие ее нажатия. Для каждого события можно написать программу, которая начнет работать именно тогда, когда оно произойдет. Особое значение понятие событие имеет при создании программы реакций формы на изменения ее компонентов, а также при описании новых классов.

Типы данных и объявление переменных

Все переменные в программе, написанной на Visual Basic, содержат какую-нибудь информацию: текст, число, утверждение истинности и др. В зависимости от ее вида они подразделяются на текстовые, числовые или булевые типы данных. Так, переменная типа Integer — целое число от -32 768 до 32 767, а типа String — строка текста длиной до 2 млн. символов. В справочной системе языка Visual Basic подробно описаны все возможные типы данных. В зависимости от них с переменными можно производить различные действия: с числовыми — математические вычисления; с текстовыми — обработку текста.

Чтобы переменная могла использоваться в программе, она должна быть указана в соответствующем разделе модуля под названием «Описания» (в самой верхней его части, до начала первой программы). Для этого нужно вставить описание переменной вида Dim x (переменная) As (тип данных): Dim a As Integer. Вместо Dim применимо также слово Public или Private. Переменная, объявленная как Public, может применяться программами из других модулей и форм, причем она своего значения не теряет. Переменные, установленные как Private или Dim, подходят лишь программам того модуля, в котором она объявлена.

Переменная Public или Private может быть объявлена только в разделе описаний переменных. С помощью же инструкции (команда, не выполняющая реальных действий) Dim ее можно установить и в тексте программы, но тогда ее другие модули уже использоваться не смогут. Можно вообще не задавать переменные заранее, а просто включать их по мере надобности в текст программы. В таких случаях Visual Basic присваивает им специальный тип Variant, который позволяет автоматически преобразовывать переменные в требуемый вид. Например, если переменная х имеет тип Variant и значение 2 (число), то после команды x=Str(x), преобразующей число в строку, она уже будет иметь значение «2», т. е. получится текстовая строка с цифрой «2». Это было бы невозможно, если бы переменная х была объявлена как Integer. Может даже показаться, что лучше все переменные задавать как Variant или вообще не включать в модуль раздел описаний. Однако такие переменные занимают очень много места в памяти, а необъявленные в принципе нельзя использовать в других модулях или формах. Чтобы запретить применение необъявленных переменных, достаточно вставить инструкцию Option Explicit в начало модуля, вверху раздела описаний, — как только программа «наткнется» на такую переменную, то остановится и перейдет в режим отладки.

Процедуры и функции

Любая программа может быть написана в виде одного длинного блока текста, однако такой подход будет крайне нерациональным. Например, в программе необходимо несколько раз подсчитать сумму всех членов арифметической прогрессии для разных чисел. Можно, конечно, каждый раз применять известную формулу, но тогда текст очень усложнится. А если неизвестно, для скольких чисел надо считать сумму (например, это определяет пользователь), то написать программу станет вообще невозможно. Поэтому в Visual Basic, как и в другие современные языки программирования, введены понятия процедур и функций.

Процедура — программа, которая может быть вызвана из другой программы, причем ей может быть передана определенная информация. Так, можно написать процедуру, которая вычисляла бы сумму всех членов арифметической прогрессии и помещала бы результат в текст активного документа. При этом процедуре передавалось бы число, для которого сумма и рассчитывалась.

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

Можно сказать, что та программа, где нет вызова процедур, состоит из одной большой процедуры. В Visual Basic любая процедура, получающая данные из другой программы, имеет следующий формат:

Sub «Название процедуры» («Получаемая
 переменная» As «Тип данных получаемой
 переменной»)
«Текст процедуры»
End Sub

Получаемых переменных может быть несколько, причем для каждой желательно — но не обязательно — указать тип. Если задать перед именем переменной инструкцию ByVal, то процедура не будет изменять ее значение в исходной программе. Процедуру можно вызывать так же, как и любую команду Visual Basic, указав ее название и представив соответствующие значения переменных:

Sub Main()
Dim a As Integer
a = 1
uvelich a, 3
MsgBox a
End Sub
Sub uvelich(b As Integer, c As Integer)
b = b + c
End Sub

В этом примере из процедуры Main вызывается uvelich, которой передаются два параметра: a (равно 1) и число 3. Процедура uvelich увеличивает первую переданную переменную на значение второго переданного числа, а затем Main отображает результат вычислений. Помните, что если в заглавии процедуры указываются типы данных переменных, то и в вызывающей процедуре передаваемые значения должны быть определены с тем же типом.

Если бы заголовок процедуры uvelich имел вид Sub uvelich(ByVal b As Integer, c As Integer), то никакого увеличения переменной a не произошло бы и программа в качестве результата выдала бы число 1. Однако в самой процедуре uvelich соответствующая переменная увеличилась бы на 3, а если бы ее последней командой была MsgBox b, то она показала бы значение 4.

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

Sub Main()
Dim a As Integer
Dim d As Integer
a = 1
d = uvelich(a, 3)
MsgBox d
End Sub
Function uvelich(ByVal b As Integer, ByVal
 c As Integer) As Integer
uvelich = b + c
End Function

Нетрудно видеть, что программа присваивает переменной d значение, вычисленное функцией. При создании функции следует помнить, что если перед описаниями переменных в ее заголовке не указана инструкция ByVal, то соответствующие переменные могут быть изменены. Так, если бы данный пример имел вид:

Sub Main()
Dim a As Integer
Dim d As Integer
a = 1
d = uvelich(a, 3)
MsgBox d
MsgBox a
End Sub
Function uvelich(b As Integer,
c As Integer) As Integer
uvelich = b + c
a=1555
End Function

то программа в качестве значения переменной а отобразила не 1, а число 1555.

Если в программе есть вложенные процедуры или функции, то их взаимоотношения («кто кого вызывает?») при отладке удобно отслеживать с помощью окна «Стек вызова», в котором видны все произошедшие вызовы.

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

Чтобы при отладке программы во время пошагового ее исполнения отказаться от прохода по всем командам той или иной процедуры или функции, нужно вызвать из меню «Отладка» команду «Шаг с обходом» или нажать кнопку на одноименной панели.

Орлов Антон Александрович, antorlov@inbox.ru, http://antorlov.chat.ru