Работа с формами

Рис. 1. Панель инструментов с компонентами форм

Формы — это окна интерфейса программы. С их помощью можно сообщать пользователю необходимую информацию или получать ее в ответ. Для создания форм используются средства Visual Basic for Applications (VBA).

Создав новую форму (в «Менеджере проектов» правой кнопки мыши выберите «Вставить?UserForm») или дважды щелкнув на имени уже существующей, можно попасть в окно «Дизайна форм». На «Панели элементов», появившейся в панели инструментов (ее можно вызвать, указав «Вид?Панель элементов»), представлены все возможные элементы формы (рис. 1).

  1. Поле отображения текста — отражает текстовую информацию (рис. 2).
  2. Поле ввода текста — позволяет пользователю ввести текстовую информацию (рис. 3).
  3. Несколько видов списков — средства выбора варианта наподобие ниспадающего перечня шрифтов в Word (рис. 4).
  4. Флажок — элемент, который может находиться в трех состояниях: включенном, выключенном (это устанавливается как пользователем, так и программистом) или неактивном (определяется программой) (рис. 5).
  5. Переключатель — элемент, который также может находиться во включенном, выключенном и неактивном состоянии. В отличие от флажка, переключатели должны быть объединены в группы с помощью элемента «рамка». Если же один из группы включен, то остальные уже не могут быть в таком состоянии (рис. 6).

    В Microsoft Word есть диалоговые окна, которые содержат как флажки (принято называть «функции». — Прим. ред.), так и переключатели. Кстати, почти все закладки меню «Сервис?Параметры» состоят из флажков, а меню «Вставка? Сноска» — из переключателей.
  6. Выключатель — кнопка, которая может находиться в нажатом или отжатом состоянии. Например, в Word кнопки предназначены для представления скрытых символов или создания списков (рис. 7).
  7. Рамка — отражает прямоугольник с заголовком, используется в основном для объединения групп переключателей.
  8. Командная кнопка — обычная, наподобие кнопки OK или «Отмена» в любом диалоговом окне (рис. 8).
  9. Набор вкладок и 10-й элемент — наборы страниц, которые представляют комплект страниц-вкладок, схожих с закладками «Общие», «Сохранение», «Печать» и другими в диалоговом окне Word «Сервис?Параметры». Отличие между этими двумя элементами (т. е. набором вкладок и 10-м элементом) состоит в том, что 9-й при переключении на другую страницу не затрагивает остальные элементы формы, даже когда они находятся на нем, а изменить состояние других элементов можно только программно. Десятый же элемент при своем переключении принудительно (т. е. вне зависимости от программы) скрывает элементы на одной своей странице и показывает на другой. Чтобы лучше понять разницу между этими двумя типами элементов, создайте форму с каждым из них и посмотрите, как они работают, — при переключении закладок в 9-м элементе на них самих ничего меняться не будет, а при использовании 10-го элемента на каждой новой закладке вы можете разместить свой, отдельный набор элементов.

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

    К сожалению, в настоящее время нет единой номенклатуры этих двух элементов форм VBA, поэтому в справочной системе и литературе можно встретить разные названия для каждого из них (рис. 9).
  10. Полоса прокрутки — аналогична той, что есть в Word. Может передавать в программу число, равное расстоянию в пунктах от ее начала. Верхний предел расстояния неограничен (рис. 10).
  11. Счетчик — две кнопки со стрелками. Может передавать в программу свое значение от 1 до 100 (рис. 11).
  12. Рисунок — в этот элемент можно вставить из файла рисунок, который будет храниться в форме (и шаблоне с ней) (рис. 12, 13).
Рис. 2
Рис. 3
Рис. 4
Рис. 5
Рис. 6
Рис. 7
Рис. 8
Рис. 9
Рис. 10
Рис. 11
Рис. 12

У каждого элемента есть свое уникальное имя, а также набор свойств, которые необходимо внимательно изучить. Их можно посмотреть в «Окне свойств», выделив элемент, щелкнув на нем правой кнопкой мыши и отметив пункт «Свойства». Если необходимо, можно вызвать справку по каждому свойству, поставив на него курсор мыши и нажав клавишу . Большой набор свойств имеет также и сама форма. С помощью ниспадающего меню в «Окне свойств» можно быстро перейти к свойствам выбранного элемента (рис. 14).

Рис. 13

Среди наиболее распространенных свойств, имеющихся почти у всех элементов, можно отметить следующие: Caption — надпись на поверхности или в заголовке, если он есть; Top и Left — координаты верхнего левого угла элемента; Height и Width — высота и ширина; Enabled — доступность для изменений пользователем; TabIndex — число, показывающее, когда можно изменить в данном элементе содержание или состояние при переходах между элементами с помощью клавиши табуляции (можно запретить переход на какой-либо элемент, указав его свойство TabStop как False). Следует обратить внимание и на свойства формы: Picture, PictureAlignment, PictureSizeMode, PictureTiling. С их помощью на поверхность формы можно поместить какой-нибудь фоновый рисунок.

Рис. 14

Следует помнить, что создание элемента — только начало работы над формой. Сам по себе элемент никаких действий не выполняет, кроме, конечно, тех, которые его определяют: кнопка активизируется от щелчка мыши или клавиши , в списке представляются значения и т. д. Чтобы элемент выполнял какое-нибудь действие, когда на него оказывается влияние, надо написать программу «реакции на события». С элементом может произойти множество событий: двойной щелчок мыши на нем, проводка курсора мыши, ввод текста в соответствующее поле и т. д. Итак, чтобы записать программу, необходимо два раза щелкнуть на элементе. Тогда откроется окно и появится «заготовка» следующего вида:

Private Sub CommandButton1_Click()
End Sub

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

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

Рис. 15

Некоторые события имеют параметры, которые передаются программе. Так, процедура обработки события KeyDown (т. е. нажатие какой-либо клавиши при активном элементе) имеет вид:

Private Sub CommandButton1_KeyDown(ByVal
KeyCode As MSForms.ReturnInteger, ByVal 
Shift As Integer)
End Sub

Переменная KeyCode после срабатывания данной процедуры будет иметь значение, равное коду нажатой клавиши, а переменная Shift будет составлять 1, если соответствующая клавиша была нажата, и 0, если не была. Эти переменные можно использовать в процедуре.

Все свойства, задаваемые в «Окне свойств», можно изменять и из программы. Например, команда TextBox1.Enabled=True позволяет пользователю ввести текст в поле ввода TextBox1, а команда CheckBox1.Value=False снимет флажок с именем CheckBox1. Такая возможность делает формы VBA динамическими, т. е. их содержимое может в ответ на действия пользователя изменяться немедленно, причем без выгрузки и повторной загрузки формы. Сама форма может работать как обычное диалоговое окно программы для Windows — например, выбор пользователем значения из списка позволяет каждый раз выводить в форму какой-либо текст, неодинаковый для разных значений. Наиболее часто динамические формы применяются для отключения элементов, которые не могут быть использованными при каких-либо условиях. Например, в форме, состоящей из поля ввода текста и кнопки, вызывающей процедуру вычисления квадратного корня, кнопка может становиться неактивной при написании в поле ввода отрицательного числа.

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

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

Программа реакции формы на события представляет собой полноценный модуль проекта, за исключением лишь того, что процедуры из него могут быть вызваны только в другой программе. Так как вызов формы на исполнение с помощью кнопки, строки меню или сочетания клавиш невозможен, то необходимо в основной программе указать команду «ИмяФормы.Show» и назначить ей кнопки и сочетания клавиш. Следует учесть, что если даже все требуемые функции реализованы в процедурах программы реакции формы на события, то все равно приходится создать основную программу, хотя бы только для вызова данной формы.

Так же как и модули, формы могут быть сохранены в отдельных файлах с помощью функции «Экспорт файла» (в «Менеджере проектов» нужно щелкнуть на ней правой кнопкой мыши), или методом перетаскивания ее названия из «Менеджера проектов» в Explorer. Однако в отличие от модулей, при сохранении форм получается два файла: один содержит текст программы реакции формы на события, другой — информацию о расположении элементов на форме, их свойствах, а также рисунки и фон формы. Поэтому при импортировании оба этих файла должны находиться в одной папке.

Операторы цикла и перехода

Если нужно повторить ту или иную группу операций несколько раз, то используются такие операторы цикла, как Do...Loop, For...Next и For Each...Next. А если требуется совершить какие-либо действия в зависимости от наличия определенных условий, а также от значения той или иной переменной, то применяются операторы условия: If...Then...Else и Select Case.

Переход к другой части той же программы выполняется с помощью оператора GoTo «имя метки». В то место, куда нужно совершить переход, на отдельной строке следует проставить метку с соответствующим именем и за ней двоеточие.

Более подробное описание функций, особенностей и синтаксиса всех операторов можно получить в справочной системе Visual Basic for Applications.

Это пригодится

  • Чтобы ускорить выполнение работающей с текстом программы, рекомендуется почаще использовать команду ActiveDocument. UndoClear, которая позволяет очистить список выполненных команд (однако делает невозможной отмену последних изменений).
  • Чтобы система не тратила время и ресурсы на постоянное обновление экрана и отображение изменений и чтобы выполнять визуальный контроль происходящих изменений, поставьте в начало программы команду Application. Screen Updating = False, а в конец — команду Application.ScreenUpdating = True.
  • Если возникает нестандартная ошибка, то с помощью команды On Error goto «имя метки» можно заставить программу переходить к указанной метке, а поставив перед каким-либо фрагментом программы команду On Error Resume Next, можно приказать ей (при возникновении ошибки) начать выполнение следующей команды.
  • Чтобы пользователь мог вносить в программу определенные данные (кроме создания форм), можно применить встроенные диалоги Visual Basic — диалоговое окно «Открытие файла», «Свойства документа» и др. Они вызываются следующими командами: Dialogs(«Название диалога»).Show — показывает диалог и выполняет соответствующие ему действия; Dialogs(«Название диалога»).Display — только демонстрирует диалог и позволяет записать в переменные введенные изменения, однако никаких действий не выполняет и ничего не изменяет; Dialogs(«Название диалога»).Execute — ничего не отображает на экране, но применяет все изменения, сделанные ранее по команде With Dialogs(«Название диалога»)... End With). Чтобы получить список возможных диалогов, наберите Dialogs(. К сожалению, в справочной системе нет описания конкретных диалогов, поэтому придется отображать каждый.
  • Можно в любой момент прервать работу макрокоманды, нажав клавиши и .

О шифровании и паролях

Защита доступа к информации с помощью пароля — самый распространенный способ хранения секретов на ПК. Она используется практически везде — начиная с задания пароля на вход в Internet и заканчивая установкой пароля на проекты VBA. Однако о принципах такой защиты большинству пользователей известно довольно мало. Вот некоторые сведения.

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

Таким образом, XOR — это та же функция ИЛИ (если хотя бы на один из входов было подано значение 1, то и результат получается равным 1), однако она при подаче на вход сразу двух единиц выдает 0. Обратите внимание на одно интересное свойство функции: если на ее вход подать значение первого входа и получившийся после этого результат, то выйдет значение второго входа. То же самое происходит и со значением второго входа и с полученным результатом: в результате образуется значение первого входа. Следовательно, зная итоговую величину функции XOR и данные на любом из входов, можно получить значение на другом входе — т. е. функция XOR обратима.

Отсюда и вытекает принцип шифрования паролем. Берем некий текст, который должен быть зашифрован, и определенное слово, выбранное в качестве пароля. Текст — это последовательность букв-байтов. Поскольку байт равен восьми битам, это позволяет представить текст как последовательность битов — нулей и единиц: 11010101010110101001101010111110 1010101111101010100011101010... Запишем в такой же форме пароль: 10010101010011. Затем сопоставим последовательности битов данного текста и пароля, повторив пароль несколько раз так, чтобы у каждого бита данного текста был соответствующий ему бит пароля: 110101010101101010011010101111101 010101111101010100011101010...

1001010101001110010101010011 10010101010011100101010100111001...

Далее шифруем, применяя к этим двум последовательностям функцию XOR: 01000000000101001 10011111000011111111111 00001111110111010011...

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

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

Успехов вам в программировании!

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


Функция XOR
1-й вход2-й входРезультат
000
101
011
110