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

информатика_2_3

.pdf
Скачиваний:
24
Добавлен:
12.03.2015
Размер:
1.19 Mб
Скачать

 

бирается из раскрывающегося списка

Center Horizontally(no

Центрирование элементов управления: вертикаль-

центру)

ное или горизонтальное. Конкретный вариант вы-

 

бирается из раскрывающегося списка

Make Width Same Size

Приведение элементов управления к одинаковому

(Выровнять размер)

размеру: по ширине, по высоте или и то, и другое

 

вместе. Конкретный вариант выбирается из раскры-

 

вающегося списка

Zoom (Масштаб)

Масштаб отображения формы (и всех ее элементов

 

управления)

А сейчас мы сделаем так, чтобы командные кнопки имели одинаковые размеры.

Щелкните на кнопке Сохранить, чтобы выбрать ее.

Нажав и удерживая клавишу <Ctrl>, щелкните на кнопке Отмена. Обе кнопки будут выделены одновременно.

С помощью команды

View Toolbars UserFor m (Вид Панели инструментов Экранная фор-

ма) откройте панель инструментов UserForm и на этой панели щелкните на

маленькой кнопке со стрелкой, направленной вниз (экранная подсказка выводит название данной кнопки — Make Same size (Выровнять размер)).

Откроется небольшая палитра из трех кнопок. Щелкните на кнопке Both (Оба). Выбранные кнопки примут размер кнопки Отмена — последняя выбранная кнопка становится эталоном для всех остальных выбранных кнопок.

Для переключателей в группе Способ оплаты прежде всего надо указать, какой из них будет выбран по умолчанию. Для этого надо задать значение True для свойства Value. Установим его для первого переключателя Включить в счет. Отметим, что в группе только один переключатель может иметь значение True свойства Value.

Выровняем все переключатели по левой стороне. Щелкните на первом переключателе.

Нажав и удерживая клавишу <Ctrl>, щелкните на всех остальных переключателях.

Щелкните на маленькой кнопке со стрелкой, направленной вниз, панели инструментов UserForm (название этой кнопки Align (Выровнять)). Откроется палитра кнопок выравнивания.

11

Щелкните на кнопке Lefts (Влево). Все переключатели будут выровнены по левой стороне.

Для выравнивания остальных элементов группы Способ оплаты примените описанную здесь процедуру.

В нашей экранной форме есть несколько элементов управления, которые необходимы только тогда, когда выбраны другие элементы управления. Например, поле Сумму потребуется только тогда, когда установлен флажок Включить. Аналогично, поля для ввода сведений о кредитной карте будут востребованы, если выбран переключатель Кредитная карта. Чтобы элементы управления были недоступны пользователю, а также отображались серым цветом (такой цвет сигнализирует о недоступности элемента), надо свойство Enabled (Разблокировка) положить равным False. Если соответствующий элемент выбран, то свойство Enabled блокированных элементов должно поменять значение на True.

Экранные подсказки — это небольшие окошки с поясняющим текстом, которые появляются, если поместить указатель мыши на элемент управления. Текст этих подсказок задается как значение свойства

ControlTipText (Текст экранной подсказки) элемента управле-

ния.

Задание порядка обхода элементов формы Снова выполните экранную форму и нажмите несколько раз кла-

вишу <Таb>. При нажатии клавиши <Таb> поочередно будут выбраны все элементы управления, но совсем не в том порядке, как вы ожидаете или как вам хотелось бы. Дело в том, что по умолчанию элементы будут выбираться в том порядке, в каком они создавались. Для того чтобы задать свой порядок обхода элементов формы, необходимо установить соответствующие значения свойства TabIndex (Tabуказатель) элементов управления. Это свойство может принимать значения 0, 1, 2, 3 и т.д.

При открытии формы будет выбран элемент, у которого значение свойства TabIndex равно 0. При нажатии клавиши < Таb > управление переходит к элементу со значением 1 свойства TabIndex. При следующем нажатии клавиши < Таb > будет выбран элемент, у которого свойство TabIndex имеет значение 2, и т.д. Итак, задавая последовательные значения свойству TabIndex элементов управления, можно задать порядок обхода элементов экранной формы.

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

12

обратном порядке, не пропуская надписи и рамки, устанавливайте для всех элементов значение свойства TabIndex в 0. Таким образом вы зададите нужный порядок обхода элементов. Но как это получилось, если значение свойства TabIndex всех элементов равно 0? Если во время этой процедуры вы вернетесь к элементу, который прошли ранее, и посмотрите значение его свойства TabIndex, то увидите, что оно не равно 0. Дело в том, что, при установке в 0 этого свойства для любого элемента, у остальных элементов значение свойства TabIndex автоматически увеличивается на 1. Таким образом, у элемента, для которого первое значение TabIndex было положено равным 0, в конце описанной процедуры будет самое большое значение этого свойства.

После задания значений свойству TabIndex элементов формы прямым или обратным способом снова выполните форму и проверьте правильность обхода элементов.

Пользователи, которые предпочитают работать с клавиатурой, а не с мышью, сразу заметят, что в названии элементов управления нет подчеркнутых букв. Другими словами, элементам не назначены быстрые клавиши, позволяющие выбирать элементы в любой последовательности, а не только в порядке их обхода с помощью клавиши <Таb>. Быстрые клавиши назначаются путем задания значения свойству Accelerator (Акселератор). В качестве значения этого свойства используются буквы, которые затем будут отображаться подчеркнутыми в названиях элементов управления.

Вы должны заранее подумать о том, что произойдет при загрузке экранной формы. Например, желательно поместить текущую дату в поле ввода Дата —тогда отпадет необходимость вводить дату. Чтобы сделать это и все остальное, что должно выполняться при открытии формы, нужно создать процедуру загрузки формы (назовем ее ЗагрузкаФормы). В этой процедуре должен быть код, задающий значения для элементов управления формы.

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

Перейдите в текущую рабочую книгу. Переименуйте рабочий лист Лист2 на Списки.

На рабочем листе Списки перейдите в ячейку А1 и введите заголовок Типы расходов.

Начиная с ячейки В2, введите следующие значения:

вячейку В2: Пляжный зонтик,

вячейку В3: Аренда велосипеда,

13

вячейку В4: Уроки гольфа,

вячейку В5: Гольф, 18 лунок,

вячейку В6: Гольф, 9 лунок,

вячейку В7: Полотенце для бассейна,

вячейку В8: Теннисный корт,

вячейку В9: Уроки тенниса.

Выделите диапазон В2:В9 и задайте ему имя Расходы. Чтобы задать имя диапазону ячеек, выделите этот диапазон и в поле Имя (с левой стороны в строке формул) введите имя диапазона. Нажмите кла-

вишу <Enter>.

Перейдите в ячейку Е1 и введите заголовок Типы кредитных карт. Начиная с ячейки F2, введите следующие значения:

вячейку F2: Mastercard,

вячейку F3: Visa,

вячейку F4: Russian Express,

вячейку F5: Maestro.

Выделите диапазон F2:F5 и задайте ему имя ТипКарты. Сохраните рабочую книгу.

Нажмите <Alt+F11> для возврата в редактор Visual Basic.

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

1. Дважды щелкните на экранной форме (не на элементах управления, а именно на форме). Откроется окно кода с заголовком процедуры

UserForm_Click (Щелчок на экранной форме).

2. Нам пока не нужна процедура UserForm_click, которая вызывается на исполнение после щелчка на экранной форме. Нам нужна

14

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

UserForm_Activate.

3.Введите код процедуры: UserForm_Activate.

With cmbТипРасходов

.RowSource = "Расходы"

.ListIndex = 0 End With

txtДата.Text = Format(Now, "dd/mm/yy")

With cmbТипКарты

.RowSource = "ТипКарты"

.ListIndex = 0 End With

4.Нажмите клавишу <F5> для выполнения процедуры. Отобразится экранная форма с заполненными списками Типы расходов и Типы карт, а также заполненным полем Дата.

5.Закройте форму и вернитесь в редактор Visual Basic.

Ключевой момент при инициализации значений в форме — использование процедуры, реагирующей на событие Activate (откры-

15

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

Вызов экранной формы

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

frmГостевыеРасходы.Show

Метод Show загружает экранную форму в память компьютера и выводит ее на экран. Для создания такой процедуры выполните следующее.

Перейдите в редактор Visual Basic (если вы находитесь не в нем) и вставьте новый модуль в рабочую книгу.

Создайте новую процедуру и назовите ее ЗагрузкаФормы. Введите код процедуры

frmГостевыеРасходы.Show

Перейдите в рабочую книгу на Лист1 и вставьте в этот рабочий лист командную кнопку.

Когда откроется диалоговое окно Назначить макрос объекту, выберите в списке Имя макроса пункт ЗагрузкаФормы.

Задайте название командной кнопке Карточка гостевых расходов и щелкните вне кнопки, чтобы снять с нее выделение.

Щелкните на этой командной кнопке. Откроется наша форма. Отметьте, что списки Типы расходов и Тип карты заполнены, как и поле Дата.

Закройте форму.

Создание процедур обработки событий

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

16

хотите, чтобы объект реагировал на некоторые события, процедуры обработки таких событий создавать не следует.

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

Private CommandButton1_Click

Процедура с типом Private может вызываться только из программного кода, связанного с данной формой. Однако если удалить ключевое слово Private и указать вместо него Public, тогда можно будет вызвать соответствующую процедуру обработки события и из любой другой части программы. Но прежде чем вызывать открытые (Public) процедуры формы, форму следует загрузить в память, причем вовсе не обязательно показывать ее при этом на экране.

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

CommandButton1_Click.

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

CommandButton1_Click

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

17

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

1. Откройте окно программного кода формы либо двойным щелчком на форме или на любом из ее элементов управления, либо выделив форму и выбрав команду View Code из контекстного меню формы (раскрываемого щелчком правой кнопки мыши), либо нажав клавишу <F7> при условии, что форма выделена в окне UserForm.

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

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

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

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

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

18

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

Для проверки текущих значений элементов управления можно использовать операторы If. . . Then и Select Case. Пусть в форме присутствует элемент управления счетчик (SpinButtonl), связанный с текстовым полем (TextBoxl). Исходное значение счетчика, которое отображается в текстовом поле, равно 1. Щелчок на верхней кнопке счетчика увеличивает (а на нижней — уменьшает) значение в текстовом поле на единицу. Допустим, что это поле предназначено для ввода номера месяца года и, следовательно, может иметь значение от 1 до 12. В приведенной ниже процедуре обработки события Change счетчика, которое генерируется по щелчку на любой из его кнопок, проверяется на допустимость новое значение его свойства Value, которое VBA предварительно автоматически изменяет на единицу. Если новое значение выходит за пределы допустимого, то выполняется его замена на максимально (или минимально) возможное. Далее текущее значение счетчика присваивается свойству Value текстового поля.

Private Sub SpinButtonl_Change() If SpinButtonl.Value = 13 Then

SpinButtonl.Value = 12 'Номер месяца не может превышать 12

End If

If SpinButtonl.Value = 0 Then

SpinButtonl.Value = 1 'Номер месяца не может быть меньше 1

End If

TextBoxl.Value = SpinButtonl.Value End Sub

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

19

зователем щелчками на кнопках счетчика. Однако если пользователь щелкнет на кнопке увеличения значения, когда в поле уже содержится значение 12, новое значение счетчика 13 будет обнаружено программой и вновь заменено на 12. В результате, сколько бы пользователь ни щелкал на кнопке увеличения значения счетчика, значение в текстовом поле будет по-прежнему 12. Аналогичный эффект достигается и для нижней границы допустимого диапазона — достигнув 1, значение в текстовом поле перестанет уменьшаться.

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

Управление поведением формы

Процедура, выводящая форму на экран, создана. Теперь надо подумать о том, как форма будет себя вести на экране, т.е. продумать реакцию ее элементов на различные события, вызываемые действиями пользователя. Например, при установке флажка Включить в группе элементов Дополнительно надо снять блокировку с поля ввода сумму. Надо также снять блокировку с полей, принимающих информацию о кредитной карте, если выбран переключатель Кредитная карта. За подобные действия должна отвечать процедура, вызываемая событием Change (Изменить). Это событие генерируется всякий раз, когда изменяется значение свойства Value (Значение) какого-либо элемента управления. В данном случае, чтобы изменить свойства связанных элементов, надо сначала изменить значение свойства Value на

20