Читаем без скачивания VBA для чайников - Стив Каммингс
Шрифт:
Интервал:
Закладка:
Так или иначе, чтобы отобразить форму и сделать ее доступной пользователю, в VBA-программе вам придется добавить программный код.
Загрузка и отображение форм
Процесс отображения формы в VBA состоит из двух шагов;
* загрузка формы в память;
* отображение формы на экране.
Оба этих шага можно осуществить с помощью одного оператора VBA, Но иногда полезно разделить эти шаги и использовать для них отдельные операторы.
Отображение форм осуществляется методом Show. Например, если именем формы является FormICa, то нужно просто напечатать:
FormICa.Show
Заметьте, что Show - это метод объекта Us er Form, поэтому метод добавляется к имени формы после точки-разделителя. Если указанная форма еще не загружена в память, метод Show сначала загрузит форму, а потом сделает ее видимой.
Чтобы загрузить форму в память перед отображением, используйте оператор Load. Load - это не метод, поэтому в данном случае синтаксис другой (по сравнению с использованием Show):
Load ФормАльДеГид
Зачем загружать форму, не отображая ее? Загрузка формы происходит намного дольше, чем ее отображение. Программа любой сложности выполняет немало процедур инициализации (типа чтения данных из файлов, вычисления начальных значений переменных и создания объектов), поэтому при запуске программы некоторая задержка весьма привычна. Если в это время вы загрузите и свои формы, пользователь отнесется к задержке благосклоннее, чем к такой же задержке во время работы программы. Единственный недостаток предварительной загрузки форм заключается в том, что для них нужна память, которая могла бы использоваться для других целей.
Можно загрузить форму и без оператора Load, выполнив оператор, в котором вызывается свойство либо метод формы или любого из помещенных в нее элементов управления. При этом можно вносить в форму изменения перед тем, как она отображается на экране, Хотя окно свойств редактора Visual Basic позволяет безо всякого программирования управлять тем, как форма будет выглядеть и вести себя на экране, здесь нужно отметить следующее: часто вообще нельзя узнать, как должна выглядеть и что должна делать форма (или ее элементы управления), пока программа не начнет выполняться.
Предположим, например, что в заголовке формы должны отображаться текущие дата и время. Вы не можете предугадать, когда именно пользователь запустит вашу программу, поэтому вам придется поручить VBA указать дату и время за вас. Это можно сделать, например, так:
Sub DisplayDateCaptionedForm()
DateCaptionedForm.Caption = Now
DateCaptionedForm.Show
End Sub
Аналогично можно заставить надпись или текстовое поле формы отображать информацию о том, что в данный момент выделено в VBA-приложении. На рис. 10.24 показано то, что можно увидеть в результате выполнения следующей процедуры VBA, связанной с подходящей формой в Visio:
Sub DisplayShowSelectionForm()
Dim ItemCount As integer, Message As String
Items = ActiveWindow.Selection.Count
Message = "Выделено объектов: " & CStr(Items) S "."
ShowSelectionForm.lblCountOfItems.Caption = Message
ShowSelectionForm.Show
End Sub
Рис. 10.24. В этой программе содержание текста надписи выясняется непосредственно перед отображением формы
Обратите внимание на строку программного кода, в которой изменяется свойство элемента управления "'надпись" в форме:
ShowSelectionForm.lblCountOfItems.Caption = Message
Технически невозможно получить доступ к свойству или методу формы до тех пор, пока форма не будет загружена, Однако вам не нужно писать для этого явный оператор. VBA автоматически загружает форму, как только потребуется выполнить оператор, ссылающийся на одно из ее свойств или на один из ее методов. Ссылка на свойство или метод любого из элементов управления в форме порождает тот же эффект.
Пример из предыдущего раздела демонстрирует один из способов внесения изменений в форму перед ее отображением на экране - из стандартной процедуры обычного модуля.
Но, как говорится, содрать с капусты листья можно многими способами. В нашем случае есть варианты- события Initialize (Инициализация) и Activate (Активизация) формы.
Программный код, помещенный в процедуры обработки этих событий, выполняется автоматически, когда случаются соответствующие события. Выбрать между этими событиями помогут следующие правила.
* Используйте событие Initialize для программного кода, который должен выполняться только при первой загрузке формы.
* Используйте событие Activate для программного кода, который должен выполняться при каждом отображении формы на экране (включая и первое отображение).
Создание программного кода для процедур обработки событий обсуждается ниже, в разделе "Главные события".
Используйте метод Hide (Скрыть), чтобы закрыть форму и таким образом получить возможность вернуться в документ VBA-приложения или активизировать другую форму. Это делается следующим оператором:
FormErly.Hide
Правда, метод Hide можно использовать не в любом месте программы. Если форма модальная, метод Hide нужно поместить в процедуру обработки события, принадлежащую самой форме.
Как упоминалось раньше в настоящей главе, если открыта модальная форма, выполняться могут только процедуры, связанные с этой формой.
И кстати, при вызове метода Hide в процедуре обработки события, принадлежащей этой форме, имя формы указывать не требуется - VBA достаточно сообразителен, чтобы понять, что в данном случае метод Hide принадлежит именно этой форме. Поэтому в процедуре обработки события, принадлежащей форме, можно просто напечатать Hide и эта форма исчезнет.
Чаше всего оператор Hide размещают в конце процедуры обработки события Click (Щелчок) для КНОПОК ОК, Отмена или Закрыть. Примеры вы найдете ниже, в разделах
"Добавление кнопок Закрыть и Отмена" и "Программирование кнопки ОК".
Скрытая форма не удаляется из памяти, вы сможете отобразить ее снова без лишних задержек с помощью метода Show в любое время.
Если известно, что форма больше в программе не понадобится, уничтожьте ее совсем, удалив из памяти. В небольших VBA-программах в этом нет необходимости, но когда ваши программы станут большими и память будет как награда, уничтожение ненужных форм приобретет очевидный смысл.
Как и для загрузки формы, для выгрузки формы из памяти используется не метод, я оператор Unload Formation.
Выгрузка формы удаляет ее и с экрана, если до этого форма была видима.
Если известно, что форма больше в программе не понадобится, замените метод Hide в процедурах обработки событий формы на оператор Unload. В этом случае оператор Unload Me эквивалентен оператору Unload имя_формы, поскольку ключевое слово Me представляет текущую форму.
Однако, в отличие от метода Hide, оператор Unload применим и к модальным формам, которые не присутствуют на экране. С помощью оператора Unl oad, размещенного в главной части программы (т.е. в процедуре, не связанной с формами), можно выгружать любые формы, в том числе и скрытые модальные формы.
Главные события
Когда выполняется процедура типа Sub, не отображающая форм, ваш программный код полностью контролирует, что и когда делает программа. Но если на экране отображается форма, программа переходит в каком-то смысле в пассивное состояние, ожидая инструкций от пользователя.
После каждого нажатия клавиши, перемещения мыши или щелчка на кнопке генерируется программное событие. Ваша программа регистрирует каждое такое событие и проверяет, не содержит ли программный код формы процедуру, связанную с этим событием. Если подходящей процедуры нет, событие пройдет для программы бесследно. Но если форма имеет процедуру, соответствующую событию, то программа сразу же оживет и честно выполнит эту процедуру.
Процедура обработки события может делать все, что и любая другая процедура: вычислять значения переменных, манипулировать свойствами и методами объектов, загружать и отображать другие формы. После завершения выполнения процедуры обработки события контроль возвращается к форме. Программа перейдет в состояние ожидания следующего события.
Формы VBA и элементы управления в них могут распознавать самые различные события. (На жаргоне VBA, когда говорится, что объект "имеет" события, подразумевается, что объект может регистрировать и распознавать эти события.) У форм и элементов управления есть одинаковые события, но набор событий каждого объекта индивидуален. Часто встречающиеся события приведены в табл. 10.1.
Таблица 10.1. Избранные события форм и элементов управления
Событие
Объекты, которые распознают событие
Когда происходит событие
Activate
Формы
Каждый раз, когда форма активизируется (получает фокус ввода)
AddControl
Формы, фреймы и формы с множеством страниц
При добавлении в объект элемента управления во время выполнения формы