Шрифт:
Интервал:
Закладка:
PROGRESSBAR В ВАШИХ ПРОГРАММАХ
Во многих программах для Windows используется такой элемент, как ProgressBar — индикатор, показывающий, на сколько продвинулся тот или иной процесс. В частности, он есть практически во всех программах-инсталляторах. К сожалению, в VBA этот элемент отсутствует, но его можно сделать самостоятельно!
Выглядеть он будет, например, так, как на рис. 8.6.
Рис. 8.6. ProgressBar в программе на VBA
А делается он следующим образом (предполагается, что у нас есть часть программы, в которой выполняется длинный и долгий цикл: то есть известное нам количество множество однотипных операций, и которую надо снабдить ProgressBar'ом):
1. Создаем небольшую форму и помещаем на нее: надпись с пояснительным текстом (например, "Label1") и две другие надписи, (скажем, "Label2" и "Label3"), низкие и широкие, которые расположим одну над другой (рис. 8.7).
Рис. 8.7. А вот как он сделан
К примеру, их координаты и размеры:
Label2: Тор — 45, Left — 15, Height — 15, Width — 250
Labe13: Top — 45, Left — 15, Height — 15, Width — 0
Зададим в качестве фонового цвета для "Label2" — серый, а для "Label3" — зеленый (свойство "BackColor", вкладка "Палитра" — рис. 8.8).
Рис. 8.8. Выбор фонового цвета для ProgressBar'а — здесь.
2. Для того, чтобы форма появилась на экране, но могла быть модифицируема программно все время своего отображения, в ее код нужно поместить следующий текст:
Private Sub UserForm_Activate()
— остальной текст программы, которая должна выполняться во время отображения ProgressBar ' а…
Unload Me
End Sub
Все, что находится в теле этого обработчика, будет выполняться, в то время как форма будет находиться на экране. По окончании выполнения программы форма будет выгружена (хотя выгружать ее не обязательно, если после окончания программы в обработчике предполагается продолжение работы с формой). Однако никакие другие события формой обрабатываться в это время не будут.
3. Идея такова. Ширину третьей надписи "Label3" можно изменять программно. Поэтому для отображения ProgressBar'а надо вставить в код строки, изменяющие ширину этой надписи. К примеру, цикл в программе выполняется п раз. Тогда ширина надписи "Label3" будет определяться командой в теле цикла по формуле "Label3.Width = (scet / п) * 250", где "scet" — это счетчик цикла, а 250 — ширина надписи Label2.
После каждой такой команды надо вставлять инструкцию "Me.Repaint", чтобы перерисовать форму с учетом новых параметров третьей надписи, автоматической перерисовки до полного отображения формы (которое произойдет, когда кончится обработка события "UserForm_Activate()" и форма не будет выгружена) не происходит. Если форма с ProgressBar'ом должна долго находится на экране без изменений, то рекомендуется почаще использовать команду "Me.Repaint", так как без перерисовки внешний вид формы может быть легко испорчен окнами других приложений, когда пользователь решит воспользоваться ими во время работы макроса.
Итак, код для формы с ProgressBar' ом должен иметь такой вид ("п" количество необходимых выполнений цикла):
Private Sub UserForm_Activate()
Me.Repaint For t=1 to n
…. необходимые команды программы в цикле….
Label3.Width = ((t / n) * 250)
Me.Repaint Next t
Unload Me
End Sub
Разумеется, в нем возможны изменения и улучшения. Можно несколько раз использовать ProgressBar в одной форме, каждый раз обнуляя ширину третьей надписи. Можно поместить на одну форму несколько ProgressBar'ов, где один, например, показывает выполнение всего задания, а другой — его текущей части.
ХРАНЕНИЕ СКРЫТОЙ ИНФОРМАЦИИ В ДОКУМЕНТЕ
Иногда автору программы необходимо записать в документ информацию "для внутреннего пользования": например, чтобы при следующей обработке документа программой использовать определенные предыдущие данные.
Можно, конечно, использовать Свойства документа (объект
"Dialogs (wdDialogFileSurnmarylnfo).Comments"), но лучше сделать такую запись с помощью добавления специальной переменной прямо в документ Word:
ActiveDocument.Variables.Add Name:="xl", Value:="Текст"
ActiveDocument.Variables.Add Name:="x2", Value:=12
Прочитать эти переменные можно будет с помощью похожей функции:
y1 = ActiveDocument.Variables("x1").Value
y2 = ActiveDocument.Variables("x2").Value
Кроме как с помощью этой функции, значения заданных в документе переменных узнать нельзя никак! Таким способом можно помещать в документ служебную информацию для макросов: сохраненные параметры, скрытые комментарии и и.д. Но не думайте, что для надежного сокрытия секретной информации достаточно поместить ее в переменные документа — с помощью функции
For Each per In ActiveDocument.Variables
Debug.Print per.Name + " " + per.Value
Next per
абсолютно все переменные будут благополучно помещены в окно отладки, где их легко и просто можно просмотреть.
ЧТО ТАКОЕ API?
Для того, чтобы облегчить труд своих коллег и обеспечить всем программам для Windows универсальный интерфейс, программисты Microsoft создали такую вещь, как API — "Application Programming Interface".
Это — набор функций и процедур, которые могут наиболее часто использоваться программами: отображение дерева каталогов, поиск файлов, отображение стандартного окна с кнопками закрытия, минимизации и развертывания на весь экран и многих других. В итоге разработчик, создающий программу для Windows, не должен продумывать и разрабатывать специальные подпрограммы для отображения окна программы, окна для выбора папки и остальных подобных элементарных операций, — ему достаточно просто вызвать из библиотек kernel32.dll или user32.dll, содержащих функции и процедуры API, нужную ему функцию, а она уже все сделает за него сама. Таких функций и процедур много — порядка 600.
В операционной системе MS-DOS такого понятия, как API, не было, — тот, кто брался писать программу для этой операционной системы, обязан был сам, от начала до конца, продумать и реализовать способы выдачи на экран изображения, получения данных от пользователя, путешествия по файловой системе, рисования графики, если таковая возможность была необходимой[239]. Это делало процесс разработки программ с удобным для пользователя интерфейсом весьма трудоемким процессом, зачастую затраты времени и сил на создание приемлемого графического интерфейса программы превосходили затраты на реализацию собственного алгоритма программы, ради которого она и создавалась. Недаром были очень распространены так называемые "консольные" приложения, то есть программы, работающие только из командной строки, без интерфейса, — ввод данных происходил в той же командной строке или производился из указанного в ней файла, а вывод результатов шел в простом текстовом режиме.
С появлением операционной системы Windows каторжный труд программистов по разработке внешнего вида программы и удобных способов ввода и вывода информации резко облегчился, — уже в Windows 3.0 использовались функции API. Теперь программист, если он, например, желал