Как сделать окно в vbs

Добавил пользователь Владимир З.
Обновлено: 18.09.2024

Впервые поддержка приложений HTML Applications (HTA) появилась в Internet Explorer (IE) 5.0, то есть уже достаточно давно. Но лично я долгое время не использовал HTA, пока наконец я не решил разобраться, каким же образом сделана замечательная программа Scriptomatic 2.0.

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

Использование HTA для ввода пользователем данных

Изображенная на рисунке 1 страница ввода данных VBScripting Using an HTA User Interface содержит следующие элементы:

  • Текстовое поле ввода
  • Поле ввода пароля
  • Список с возможностью выбора одного элемента
  • Список с возможностью выбора нескольких элементов
  • Трех позиционный переключатель
  • Раскрывающийся список выбора с действием On Change
  • Три поля для флажка
  • Кнопки запуска исполнения процедур VBScript для всех перечисленных элементов управления, кроме раскрывающегося списка с действием On Change.
  • Кнопка Exit

Рисунок 1. Диалоговое окно ввода VBScripting Using an HTA User Interface

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

Кнопка Exit. Кнопка Exit закрывает приложение и окно приложения простым вызовом self.close. При использовании этого метода необходимо соблюдать в процедурах соответствующие заверщающие действия, например очиску переменных путем присвоения им предопределенного значения Nothing. С другой стороны, эти завершающие действия можно собрать в процедуре, вызываемой при нажатии Exit, а не сразу закрывать приложение.

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

Блок заголовка Head

Полный код сценария VBScripting Using an HTA User Interface слишком велик для представления в рамках журнальной статьи, поэтому подробно будут рассмотрены только основные элементы. В листинге 1 представлены элементы заголовка и стиля сценария VBScriptUI.hta, которые определяют внешний вид окна ввода. Внутри блока находятся элементы залоговка title и приложения HTA:APPLICATION. Элемент title определяет заголовок окна HTA. Семь строк кода в разделе HTA:APPLICATION задают стиль отображения окна - без полос прокрутки, только единственный экземпляр, раскрывание на весь экран при запуске. Список атрибутов, их возможных значений и значения по умолчанию, используемых HTA:APPLICATION, был приведен в предыдущей статье.

Блок кода сценария Script

Элемент Script сценария VBScriptUI.hta определяет, что в качестве языка сценариев страницы является VBScript. В нем же определяются семь процедур, которые, собственно, и выполняют все действия, выполняемые приложением. Поле ввода HTA является основным средством ввода информации от пользователя, а пользователь может управлять работой приложения, выбирая те или иные элементы интерфейса. Как правило, для каждой кнопки создается собственная процедура-обработчик. Я не стану описывать все процедуры, но некоторые все же заслуживат отдельного упоминания.

Процедура Window_Onload, представленная в листинге 2, выполняется при запуске файла HTA. В этой процедуре выполняются действия по инициализации, которые не требуют пользовательского вмешательства.

Процедура RadioButtons (листинг 3) вычисляет, какое из положений переключателя было выбрано. Для этого используется свойство Checked объекта.

Как видно из названия, позиции переключателя организованы в виде массива, первый элемент которого имеет индекс 0.

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

Процедура SelectMulti (см. листинг 5) использует свойство Selected для вычисления отмеченных элементов массива. Для списка элементов используется конструкция For . . . Next следующего вида.

Тело сценария - HTA Body

Весь пользовательский интерфейс - кнопки, поля и раскрывающиеся списки определяются в том же файле HTA. При этом внимание следует обратить на следующие атрибуты HTML.

В данном приложении атрибут input type может принимать значения button, text, radio, checkbox и password. Для группирования позиций переключателя (input type="radio") им присваивается одинаковое имя - атрибут name. В группе позиций в каждый момент времени может быть выбрана только одна. Для группирования полей с флажком (input type="checkbox") используется атрибут value.

Для очистки пароля и замены его пустой строкой используется строка сценария:

Атрибут value объекта Textbox используется для задания, изменения и вывода на экран значения объекта. Например, в первом текстовом поле, которое изначально содержит значение rgb(192,0,0). Значением атрибута value объекта кнопка является надпись на кнопке.

Атрибут onclick (его можно рассматривать как метод объекта), активно используемый в данном демонстрационном примере, определяет действие, выполняемое при щелчке мышью на объекте. За исключением кнопки Exit, со всеми остальными кнопками связаны соответствующие процедуры. Чтобы связать процедуру с атрибутом onclick надо указать для атрибута имя, совпадающее с именем процедуры. Так, для кнопки ChangeColor используется конструкция onclick="changecolor", вызывающая процедуру изменения цвета фона для первого текстового поля.

Раскрывающиеся списки и списки выбора начинаются с атрибута select size. Select указывает, что данный объект можно выбрать, size определяет, сколько элементов будут выведены на экран. Например, select size="3" означает, что при выборе поля с раскрывающимся списком и будет отображать три элемента. Для создания списка с множественным выбором следует включить атрибут multiple. Затем следует создать каждый элемент списка с помощью предложения option. Ели элемент должен быть выделен сразу при запуске приложения, требуется указать атрибут selected как в следующем примере .

Атрибут onchange (его можно рассматривать как событие в языках программирования), который был использован для обработки события в поле с раскрывающимся списком On Change, действует точно также, как и атрибут onclick для выполнения действия. Отличие заключается только в том, что действие выполняется сразу при изменении значения в поле. При изменении значения объекта происходит выполнение связанной процедуры - в данном случае это процедура OnChangeEx.

Последний важный элемент - кнопка Exit. В этом демонстрационном примере для выполнения связанного с кнопкой действия используется артибут onclick, но вместо вызова процедуры VBScript происходит просто обращение к встроенному методу self.close.

Знания - в жизнь

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

Синтаксис функции MsgBox

Функция MsgBox имеет следующий синтаксис:

Диалоговое окно вида:




Ниже приведен полный список констант и эквивалентных им цифровых значений:

Константа

Значение

Описание

vbOKOnly

vbOKCancel

vbAbortRetryIgnore

vbYesNoCancel

vbYesNo

vbRetryCancel


Ниже таблица со списком констант иконок и констант, устанавливающих фокус на кнопках:

Константа

Значение

Описание

vbCritical

vbQuestion

Выводит иконку с вопросительным знаком

vbExclamation

Выводит иконку с восклицательным знаком (в желтом треугольнике)

vbInformation

vbDefaultButton1

Устанавливает фокус по умолчанию на первой кнопке

vbDefaultButton2

Устанавливает фокус по умолчанию на второй кнопке

vbDefaultButton3

Устанавливает фокус по умолчанию на третьей кнопке

vbDefaultButton4

Устанавливает фокус по умолчанию на четвертой кнопке

vbMsgBoxHelpButton

Добавляет кнопку Справка

vbMsgBoxRight

vbMsgBoxRtlReading


Определяться выбор пользователя будет с помощью условия IF. В некоторых ситуациях можно использовать Select Case.


В открывшемся окне редактора кода вводим следующую процедуру:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

End Sub

Второй вариант вызова диалога с помощью Select Case.

Создадим вторую процедуру на Листе 2. Код процедуры следующий:

Select Case mes
Case vbYes: Selection = "Нажата ДА"
Case vbNo: Selection = "Нажата НЕТ"
Case vbCancel: Selection = "Нажата Отмена"
End Select

End Sub

В этом случае результат вызова MsgBox присваивается переменной mes и далее в Select Case ищется совпадение и согласно совпадения, выполняются действия.

Вот и все. Ниже прикреплен готовый пример, рассмотренный в этой статье.

Перечень констант и значений, возвращаемых функцией MsgBox:

Как мне это сделать?

3 ответа

Вы найдете ссылки для этого в Интернете.

Вам нужна кнопка с несколькими кнопками MsgBox , установите ее как значение, а затем: если нажать CANCEL , процесс остановится.

ВНИМАНИЕ: вы, вероятно, столкнетесь с серьезной задержкой или сбоем. Я не несу ответственности за какой-либо ущерб, если вы решите продолжить.

Вы можете создать командный файл, который открывает один и тот же сценарий VBS много раз. Сделайте блокнот с:

Или, если вы хотите его зациклить:

Замените YourTextHere на все, что хотите.

Затем сохраните его как .vbs

Затем сделайте еще один блокнот:

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

Затем сохраните его как .bat

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

Замените "BatchFile" на имя созданного вами пакетного файла.

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

Напишем наш первый файл сценария - Hello.vbs , который будет выводить надпись : “Hello World!”.

Он будет состоять из одной строки:

MsgBox “Hello World!”

Запустим его и получим:

Visual Basic Script , как и другие языки программирования использует переменные.

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

Добавим в наш сценарий переменные:

‘объявляем переменную Message

Message = “Hello World!”

‘присваиваем ей значение “Hello World!”

При запуске сценария результат будет тот же.

Следует помнить при объявлении и использовании переменных и прочих зарезервированных слов, что для VBS регистр вводимых букв (в отличии от JScript) не имеет значения. Поэтому для VBS переменная Message и message будут одной и той же переменной. Если где-то в тексте сценария вы вызовете переменную Message как message – ошибки не будет.

В данном примере для пояснения действий, использовались комментарии, которые отделяются знаком апострофа ( ‘) . Все, что будет в сценарии идти за знаком апострофа, интерпретатор языка VBScript , будет считать комментарием.

VBS поддерживает также константы – данные, которые в противоположность переменным не могут изменять свое значение в течении сценария. Константы объявляются в начале сценария зарезервированным словом Сonst .

Используем в сценарии Hello.vbs константу вместо переменной:

Const Message = “Hello World!”
‘объявляем константу Message

Урок 2. Операторы языка

При действиях с числами VBS позволяет использовать обычные математические операторы:

Оператор Описание
+ Сложение
- Вычитание
* Умножение
/ Деление
\ Деление нацело
При действиях же со стоками символов, допускается их объединение при помощи операторов + и &.

“Visual “ + “Basic “ & “Script” = “Visual Basic Script”

Давайте составим сценарий, который будет выводить приветствие в зависимости от имени пользователя.

Назовем его Hello_Name.vbs:

Dim Name
‘ объявляем переменную Name

Name = InputBox(“Введите свое имя:”, “”)
‘присваиваем Name имя введенное пользоваетелем

MsgBox “Привет “ & Name + “ !”
‘выводим приветствие

Сценарий очень прост. Вначале появляется диалоговое окно ввода

InputBox , в которое пользователь вводит свое имя:

После ввода имени, данные в окне MsgBox будут выведены на экран.

Урок 3. Условный оператор

Поэкспериментировав со сценарием Hello_Name.vbs вы заметите, что у него имеется один недостаток, если пользователь нажмет кнопку OK , не введя имени он выдаст “ пустое ” приветствие. Без имени.

Для контроля возвращаемых сценарием данных существует условный оператор If…Then…Else

Усложним наш сценарий с его помощью:

Dim Name
'объявляем переменную Name

Name = InputBox("Введите свое имя:", "")
'присваиваем Name имя введенное пользоваетелем

If Name = "" Then
'Если ничего не введено

Else
'если пользователь что-то ввел

MsgBox "Привет " & Name + " !"
'выводим приветствие

Предыдущий пример имел один недостаток - он выполнялся один раз. Если не вводилось имя мы получали только уведомление об этом, чтобы снова ввести имя приходится снова запускать сценарий.

Для многократного повторения одного и того же кода существуют циклы (см. справочник).

Добавим в наш сценарий цикл While. Wend: Dim Name
' объявляем переменную Name

While Name = ""
'задаем условие цикла: до тех пор пока Name не
'принимет какое-либо значение цикл будет повторяться

Name = InputBox("Введите свое имя")

MsgBox("Вы не ввели своего имени" & Chr(10) & "Попытайтесь еще раз")

'снова запускаем цикл:
Wend

'если Name было присвоено значение выходим из цикла:
MsgBox "Привет " + Name

Урок 5. Подпрограммы и функции

VBS позволяет использовать подпрограммы и функции.

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

Функция отличается от подпрограммы, что ее можно вставлять в выражения (например математические).

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

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

Sub Имя_подпрограммы ( парамеры )
.
Код подпрограммы
.
End Sub

Функция имеет аналогичную структуру:

Function Имя_функции ( параметры )
.
Код функции
.
End Function

Подпрограммы и функции располагаются обычно в начале сценария.

Используем подпрограмму в сценарии Hello.vbs , назовем новый сценарий Hello_Sub.vbs.

Заключим оператор MsgBox в подпрограмму Messeger:

MsgBox “Hello World!”

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

Для этого добавим диалоговое окно выбора.

Окончательный сценарий Hello_Sub.vbs будет следующим:

‘ Создаем подпрограмму Messeger c параметром text Sub Messager(text)
MsgBox text
End Sub ‘ Конец подпрограммы

‘объявляем переменную result, в которую будет помещен результат
‘работы диалогового окна

‘Выводим окно выбора:
result = MsgBox(“Хотите увидеть приветствие?”, vbYesNo _ + vbQuestion, “Ваш выбор”) If result = vbYes Then

‘выбрана кнопка “Да”

Call Messager(“Hello World!”)

‘вызываем подпрограмму с параметром “Hello World”

MsgBox “Не хотите – не надо!”

Чтобы проиллюстрировать использование функции, мы не будем создавать свою функцию, а воспользуемся встроенной функцией VBS – Ucase , которая переводит строчные буквы в прописные.

Создадим сценарий UCase_Function.vbs: Dim Text, UText
'объявляем переменные для хранения исходного
'и преобразованного текста

Text = InputBox("Введите какой-либо текст:", "")
'помещаем введенные данные в Text

UText = UCase(Text)
'преобразуем с помощью функции UCase
'строчные буквы в прописные, вызываем ее с параметром Text

MsgBox UText
'выводим результат


Урок 6. Массивы в VBScript

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

Но в больших сценариях (состоящих из сотен строк) существует потребность в десятках и более переменных, что не так удобно в работе.

Допустим мы имеем переменную result в которую будет помещен результат какого-либо вычисления. Если переменная у нас одна, то и использование ее не составит труда. Но если у нас, допустим, десять переменных, в которые будут помещаться результаты многих вычислений ( Dim result1, result2, result3,…), то работать при этом с данными переменными будет не так удобно.

Решением этой проблемы будет использование массива, который объединяет в себе множество однотипных элементов (цифр, символов, строк и т.д.).

Вместо десяти переменных мы можем создать массив result , который будет состоять из десяти элементов, куда можно будет помещать результаты вычислений.

Массив, как и переменные объявляется словом Dim :

Dim result(9)
‘создаем массив из десяти элементов

Каждый элемент массива имеет свой порядковый номер – индекс. Нумерация индексов начинается с 0.

Т.о. если мы десять переменных result переведем в массив, то для вызова значения, которому раньше соответствовала переменная result1 , нужно обратится к первому элементу массива с индексом 0 :

После объявления массива можно его заполнять значениями:

Dim MyArray (2)
MyArray(0) = "Один"
MyArray(1) = "Два"
MyArray(2) = "Три"

Читайте также: