Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2313

.pdf
Скачиваний:
1
Добавлен:
15.11.2022
Размер:
1.4 Mб
Скачать

Событийное управление

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

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

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

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

83

тонными внешними устройствами. Поэтому событийное управление называют еще асинхронным.

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

5.4. Вызов процедур и функций

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

Первый, самый простой вызов:

ИмяПроцедуры СписокФактическихАргументов

ИмяПроцедуры - это имя вызываемой Процедуры, а СписокФактическихАргументов - это список фактических аргументов, передаваемых процедуре при ее вызове. Он должен соответствовать обязательному списку формальных параметров, заданному при объявлении процедуры. Фактические аргументы, если их больше одного, перечисляются через запятую; их порядок обязан соответствовать объявленным параметрам. Заметьте, что при подобном вызове процедуры нет необходимости заключать список фактических аргументов в скобки.

Также можно вызывать процедуру, используя ключевое слово Call.

Call ИмяПроцедуры(СписокФактическихАргументов)

84

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

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

ИмяПеременной = ИмяФункции _ (СписокФактическихАргументов)

Давайте на примере вышеобъявленных процедур и функций покажем их вызов.

Листинг. Вызов процедур и функций

Public Sub TestCall_l() Dim book As TBook Dim salary As Currency book.pages = 687 book.price = 170.5 book.edition = 3000

Call InitContent(book.content) salary = getAuthorSalary(book, True) MsgBox salary

End Sub

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

85

идет фактический аргумент. Это очень удобный прием, позволяющий видеть связь формального параметра с фактическим аргументом.

Листинг. Использование именованных аргументов

Public Sub TestCall_2() Dim book As TBook Dim salary As Currency book.pages = 687 book.price = 170.5 book.edition = 3000

Call InitContent(cnt:=book.content)

salary = getAuthorSalary(book:=book, SalaryType:=False) MsgBox salary

End Sub

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

6. ВСТРОЕННЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

6.1. Функции ввода и вывода

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

Msgbox(сообщение[, кнопки] [, заголовок] _ [, файлСправки, контекст])

Здесь сообщение - это и есть тот текст, который будет отображен в диалоговом окне. Только этот параметр обязате-

86

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

 

 

 

 

Таблица 6.1

 

Константы функции MsgBox

 

Константа

 

Значение

Описание

 

 

 

 

 

VbOKOnly

 

0

Выводится только кнопка ОК

 

 

 

(принимается по умолчанию)

 

 

 

 

VbOKCancel

 

1

Выводятся кнопки ОК и Cancel

 

 

 

 

vbAbortRetrylgnore

 

2

Выводятся кнопки Abort, Retry

 

 

 

и Ignore

 

 

 

 

 

 

vbYesNoCancel

 

3

Выводятся кнопки Yes, No и

 

 

 

Cancel

 

 

 

 

 

 

vbYesNo

 

4

Выводятся кнопки Yes и No

 

 

 

 

vbRetryCancel

 

5

Выводятся кнопки Retry и

 

 

 

Cancel

 

 

 

 

 

 

vbCritical

 

16

Выводится значок Critical

 

 

 

Message

 

 

 

 

 

 

 

 

vbQuestion

 

32

Выводится

значок

Warning

 

 

 

Query

 

 

 

 

 

 

 

 

vbExclamation

 

48

Выводится

значок

Warning

 

 

 

Message

 

 

vblnformation

 

64

Выводится

значок Information

 

 

 

Message

 

 

 

 

 

 

vbDefaultButtonl

 

0

Выделяется первая кнопка

 

 

 

 

vbDefaultButton2

 

256

Выделяется вторая кнопка

 

 

 

 

 

 

87

Продолжение табл. 6.1

vbDefaultButton3

512

Выделяется третья кнопка

 

 

 

vbDefaultButton4

768

Выделяется четвертая кнопка

 

 

 

 

vbApplicationModal

0

Модальность

приложения.

 

 

Блокируется работа с прило-

 

 

жением, пока пользователь не

 

 

закроет окно.

 

 

 

 

vbSystemModal

4096

Модальность системы. Блоки-

 

 

руется работа с системой, пока

 

 

пользователь не закроет окно.

 

 

 

vbMsgBoxHelpBut-

16384

Добавляет кнопку Help

ton

 

 

 

Нужное значение параметра кнопки можно получить сложением этих констант, причем допускается выбор не более чем одной константы из каждой группы. По умолчанию принимается значение этого параметра равное 0, что соответствует выбору трех констант с нулевыми значениями:

VbOkOnly + vbDefaultButtonl + vbApplicationModal

Продолжим описание параметров функции MsgBox. заголовок - это текст, который будет помещен в строку

заголовка диалогового окна. Если этот параметр опущен, то принимается заголовок с названием приложения, из которого данная функция была вызвана, например "Microsoft Excel";

файлСправки - это текстовая строка, определяющая файл справки для этого диалогового окна.

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

Для проверки возвращаемого значения также можно воспользоваться встроенными константами VBA.

88

Таблица 6.2 Константы, возвращаемые функцией MsgBox

Имя константы

Значение

Нажатая кнопка

 

 

 

VbOK

1

OK

 

 

 

VbCancel

2

Cancel

 

 

 

VbAbort

3

Abort

 

 

 

VbRetry

4

Retry

 

 

 

Vblgnore

5

Ignore

 

 

 

VbYes

6

Yes

 

 

 

VbNo

7

No

 

 

 

При всем многообразии возможностей функции MsgBox она, по большому счету, только выводит информацию (функция вывода). Конечно, она получает некоторую информацию в виде значения нажатой кнопки, но мы хотим большего, мы хотим вводить собственную информацию. Для этого используется стандартная функция ввода inputBox.

InputBox ( сообщение [, заголовок] _

[, значениеПоУмолчанию] [, позицияХ] [, позицияY] _ [, файлСправки, контекст])

Первые два и последние два параметра (сообщение, заголовок, и контекст) уже знакомы, и их назначение аналогично предыдущему случаю. Интерес представляют остальные параметры:

-значениеПоУмолчанию - это значение, которое автоматически появится в поле ввода; если этот параметр опущен, то в поле ввода будет пустая строка;

-позицияХ и позицияY - это расстояние от левого верхнего угла диалогового окна до левой и верхней границ экрана соответственно. Если этот параметр опущен, то окно будет выводиться по центру.

89

6.2. Процедуры и функции работы с файлами

Помимо визуального ввода и вывода посредством функций MsgBox и InputBox, часто требуется обращаться к данным, хранящимся в файлах пользователя. В VBA есть широкий набор процедур и функций для доступа данным файла, их чтению и записи. Работа с файлом начинается только после его открытия или создания посредством процедуры open.

Open имяФайла For способДоступа [Access доступ] _ [ограничение] Аs [#]номерФайла [Len = длинаЗаписи]

Параметр имяФайла - это строка, содержащая имя открываемого файла и путь к нему; если указание пути отсутствует, по умолчанию считается, что файл находится в текущей папке приложения. Если указанный файл не существует, то он создается.

После ключевого слова For идет параметр способДоступа, определяющий режим доступа к файлу. Его значением могут быть только следующие константы: Input, Output, Append, Random, Binary. Чтобы пояснить эти значения, необходимо рассказать о разнице в способах доступа к разным файлам.

В VBA существует три способа доступа к файлу:

1. Последовательный.

При таком доступе к файлу используются три режима доступа: Input (ввод или чтение), Output (вывод или запись), Append (присоединение или запись в конец). Подобный доступ не имеет определенных средств поиска информации. Чтобы ее найти, необходимо последовательно читать или писать все данные - сначала и до нужного места. Подобный доступ рационально применять для простых текстовых файлов.

2. Произвольный.

Данный доступ уместен, если файл состоит из записей постоянной длины, что позволяет эффективно работать с данными - быстро их находить, изменять, не переписывая весь файл. В этом случае параметр способДоступа должен иметь значение Random. Как правило, удобно применять данный

90

доступ к файлам, хранящим типы данных, определенные пользователем.

3. Бинарный.

Бинарный доступ к данным файла позволяет считывать и записывать информацию побайтно. В этом случае параметр способДоступа должен иметь значение Binary. Подобный доступ применим к файлам произвольной структуры, например к графическим файлам.

Продолжим описание процедуры.

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

-Read (только чтение);

-Write (только запись);

-Readwrite (и чтение, и запись).

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

·Shared (без ограничений);

·Lock Read (блокировка чтения);

·Lock write (блокировка записи);

·Lock Readwrite (блокировка и чтения, и записи). Следующий параметр номерфайла - это целое число от 1

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

FreeFile.

Необязательный параметр длинаЗаписи - это число не больше 32767, задающее длину одной записи в байтах для произвольного доступа; размер буфера для последовательного доступа; параметр игнорируется для бинарного доступа.

После открытия файла и работы с ним необходимо его закрыть. Для закрытия файла используются две функции Close

и Reset.

91

Close [ [#] номерФайла] [, [#] номерФайла]...

Параметр номерФайла - это номер открытого файла. После его закрытия этот номер можно повторно использовать в процедуре Open. Если этих параметров нет, то закрываются все открытые файлы. Аналогично действует безаргументная функция Reset.

В следующем примере мы просто создадим текстовый файл с названием books и тут же закроем его.

Листинг. Открытие и закрытие файлов

Sub OpenFile() Dim fl

fl = FreeFile

Open "C:\books.txt" For Output As #fl Close #fl

End Sub

Перейдем теперь непосредственно к работе над данными файла, т. е. к чтению и записи. Вначале мы рассмотрим процедуры ввода/вывода для последовательного доступа к файлу, а затем перейдем к произвольному и бинарному.

Последовательный доступ к файлу

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

Print #номерФайла [, списокВывода]

92

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]