Работа с формами
Рис. 1. Панель инструментов с компонентами форм |
Формы — это окна интерфейса программы. С их помощью можно сообщать пользователю необходимую информацию или получать ее в ответ. Для создания форм используются средства Visual Basic for Applications (VBA).
Создав новую форму (в «Менеджере проектов» правой кнопки мыши выберите «Вставить?UserForm») или дважды щелкнув на имени уже существующей, можно попасть в окно «Дизайна форм». На «Панели элементов», появившейся в панели инструментов (ее можно вызвать, указав «Вид?Панель элементов»), представлены все возможные элементы формы (рис. 1).
- Поле отображения текста — отражает текстовую информацию (рис. 2).
- Поле ввода текста — позволяет пользователю ввести текстовую информацию (рис. 3).
- Несколько видов списков — средства выбора варианта наподобие ниспадающего перечня шрифтов в Word (рис. 4).
- Флажок — элемент, который может находиться в трех состояниях: включенном, выключенном (это устанавливается как пользователем, так и программистом) или неактивном (определяется программой) (рис. 5).
- Переключатель — элемент, который также может находиться во включенном, выключенном и неактивном состоянии. В отличие от флажка, переключатели должны быть объединены в группы с помощью элемента «рамка». Если же один из группы включен, то остальные уже не могут быть в таком состоянии (рис. 6).
В Microsoft Word есть диалоговые окна, которые содержат как флажки (принято называть «функции». — Прим. ред.), так и переключатели. Кстати, почти все закладки меню «Сервис?Параметры» состоят из флажков, а меню «Вставка? Сноска» — из переключателей. - Выключатель — кнопка, которая может находиться в нажатом или отжатом состоянии. Например, в Word кнопки предназначены для представления скрытых символов или создания списков (рис. 7).
- Рамка — отражает прямоугольник с заголовком, используется в основном для объединения групп переключателей.
- Командная кнопка — обычная, наподобие кнопки OK или «Отмена» в любом диалоговом окне (рис. 8).
- Набор вкладок и 10-й элемент — наборы страниц, которые представляют комплект страниц-вкладок, схожих с закладками «Общие», «Сохранение», «Печать» и другими в диалоговом окне Word «Сервис?Параметры». Отличие между этими двумя элементами (т. е. набором вкладок и 10-м элементом) состоит в том, что 9-й при переключении на другую страницу не затрагивает остальные элементы формы, даже когда они находятся на нем, а изменить состояние других элементов можно только программно. Десятый же элемент при своем переключении принудительно (т. е. вне зависимости от программы) скрывает элементы на одной своей странице и показывает на другой. Чтобы лучше понять разницу между этими двумя типами элементов, создайте форму с каждым из них и посмотрите, как они работают, — при переключении закладок в 9-м элементе на них самих ничего меняться не будет, а при использовании 10-го элемента на каждой новой закладке вы можете разместить свой, отдельный набор элементов.
Так, 9-й элемент может использоваться в какой-либо программе, в частности базе данных, отображая вкладки с именами сотрудников. На каждого из них в нескольких полях есть стандартная текстовая информация, и число этих полей для всех одинаково. В этом случае разумнее будет использовать именно 9-й элемент, соответственно изменяя содержимое полей с текстом при переключении вкладок, чем создавать с помощью 10-го элемента набор страниц с отдельными полями текста на каждой из них, что резко увеличивает объем программы и усложняет ее.
К сожалению, в настоящее время нет единой номенклатуры этих двух элементов форм VBA, поэтому в справочной системе и литературе можно встретить разные названия для каждого из них (рис. 9). - Полоса прокрутки — аналогична той, что есть в Word. Может передавать в программу число, равное расстоянию в пунктах от ее начала. Верхний предел расстояния неограничен (рис. 10).
- Счетчик — две кнопки со стрелками. Может передавать в программу свое значение от 1 до 100 (рис. 11).
- Рисунок — в этот элемент можно вставить из файла рисунок, который будет храниться в форме (и шаблоне с ней) (рис. 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
1-й вход | 2-й вход | Результат |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |