|
|
| (не показаны 9 промежуточных версий 1 участника) |
| Строка 1: |
Строка 1: |
| − | Наверное нет языка программирования проще, чем VBScript – Visual Basic Scripting Edition. Даже начинающий программист способен освоить его за два-три дня, а человек знакомый с Visual Basic или Visual Basic for Applications (VBA) практически сразу может приступать к работе. Ниже приведены основные сведения по синтаксису языка, дано описание операторов и встроенных функций. К сожалению, обработка ошибок в VBScript реализована на очень примитивном уровне. Разработчики не предусмотрели конструкций для обработки исключительных ситуаций, таких как try-except и try-finally в Delphi. В разделах "!!!" и "!!!" мы рассмотрим способы преодоления этих ограничений. | + | Наверное нет языка программирования проще, чем VBScript – Visual Basic Scripting Edition. Даже начинающий программист способен освоить его за два-три дня, а человек знакомый с Visual_Basic Visual Basic или Visual_Basic_for_Applications Visual Basic for Applications (VBA) практически сразу может приступать к работе. Ниже приведены основные сведения по синтаксису языка, дано описание операторов и встроенных функций. К сожалению, обработка ошибок в VBScript реализована на очень примитивном уровне. Разработчики не предусмотрели конструкций для обработки исключительных ситуаций, таких как try-except и try-finally в Delphi. В разделах [[VBScript. Обработка ошибок|Обработка ошибок]] и [[VBScript. Использование TCreator|Использование TCreator]] мы рассмотрим способы преодоления этих ограничений. |
| | | | |
| − | VBScript является интерпретируемым языком. За выполнение программы отвечает Windows Script Host, который поставляется в составе операционной системы начиная с версии Windows 98. На момент написания данной книги, последняя версия VBScript имела номер 5.7 и поставлялась в составе Windows Vista. Обновления для предыдущих версий операционной системы можно скачать с сайта компании Microsoft. | + | VBScript является интерпретируемым языком. За выполнение программы отвечает Windows Script Host, который поставляется в составе операционной системы начиная с версии Windows 98. На момент написания данной книги, последняя версия VBScript имела номер 5.8 и поставлялась в составе Windows 7. Обновления для предыдущих версий операционной системы можно скачать с сайта компании [http://msdn.microsoft.com/en-us/library/t0aew7h6%28VS.85%29.aspx Microsoft]. |
| | | | |
| − | === Подготовительные мероприятия === | + | == Содержание == |
| | | | |
| − | Учебные примеры мы будем выполнять в Гедымине, для чего создадим глобальный макрос согласно приведенным ниже инструкциям:
| + | * [[VBScript. Подготовительные мероприятия|Подготовительные мероприятия]] |
| | + | * [[VBScript. Основы VBScript|Основы VBScript]] |
| | + | * [[VBScript. Встроенные функции|Встроенные функции]] |
| | + | * [[VBScript. Обработка ошибок|Обработка ошибок]] |
| | + | * [[VBScript. Использование TCreator|Использование TCreator]] |
| | | | |
| − | # Запустим Гедымин;
| + | === См. также === |
| − | # Подключимся к демонстрационной базе данных под учетной записью Administrator;
| + | |
| − | # Откроем окно Редактора скрипт-объектов;
| + | |
| − | # Создадим новый глобальный макрос под названием "Test VBScript";
| + | |
| − | # В поле Наименование функции введем TestVBScript.
| + | |
| | | | |
| − | http://gsbelarus.com/gs/images/gs/2009/book/VBScript1.png | + | * [http://ru.wikipedia.org/wiki/Visual_Basic_Script Visual Basic Scripting Edition] |
| − | | + | * [http://ru.wikipedia.org/wiki/Visual_Basic Visual Basic] |
| − | == Основы VBScript ==
| + | * [http://ru.wikipedia.org/wiki/Visual_Basic_for_Applications Visual Basic for Applications (VBA)] |
| − | | + | |
| − | === Типы данных ===
| + | |
| − | | + | |
| − | В языке VBScript используется единственный тип данных – Variant (Вариант), который позволяет хранить в переменной число, строку, дату, булевское значение, ссылку на объект и другую информацию. Определить тип содержимого переменной можно с помощью набора функций: [[VBScript. Функция VarType|VarType]], TypeName, IsArray, IsDate, IsEmpty, IsNull, IsNumeric, IsObject, которые будут рассмотрены ниже. Тип содержащейся информации еще называется подтипом варианта. Полный список подтипов приведен в следующей таблице:
| + | |
| − | | + | |
| − | {| class="wikitable" border="1"
| + | |
| − | ! Подтип !! Описание
| + | |
| − | |-
| + | |
| − | | Empty || Переменной не присвоено значение. При использовании неинициализированной переменной в числовых выражениях, будет подставляться 0, а в строковых – пустая строка.
| + | |
| − | |-
| + | |
| − | | Null || Переменная не содержит данных.
| + | |
| − | |-
| + | |
| − | | Boolean || Булевская переменная может принимать значения True, или False.
| + | |
| − | |-
| + | |
| − | | Byte || Целое число в диапазоне от 0 до 255.
| + | |
| − | |-
| + | |
| − | | Integer || Целое число в диапазоне от -32 768 до 32 767.
| + | |
| − | |-
| + | |
| − | | Currency || Число с фиксированной точкой в диапазоне от -922 337 203 685 477.5808 до 922 337 203 685 477.5807.
| + | |
| − | |-
| + | |
| − | | Long || Целое число в диапазоне от -2 147 483 648 до 2 147 483 647.
| + | |
| − | |-
| + | |
| − | | Single || Число с плавающей точкой одинарной точности. Для отрицательных значений допустимый диапазон
| + | |
| − | от -3.402823E38 до -1.401298E-45. Для положительных – от 1.401298E-45 до 3.402823E38.
| + | |
| − | |-
| + | |
| − | | Double || Число с плавающей точкой двойной точности. Для отрицательных значений допустимый диапазон от
| + | |
| − | -79769313486232E308 до -4.94065645841247E-324. Для положительных -- от 4.94065645841247E-324 до 1.79769313486232E308.
| + | |
| − | |-
| + | |
| − | | Date (Time) || Содержит число, представляющее дату в диапазоне от 1-го января 100 года, до 31 декабря 9999 года.
| + | |
| − | |-
| + | |
| − | | String || Последовательность символов. Максимальная длина в районе 2-х миллиардов знаков.
| + | |
| − | |-
| + | |
| − | | Object || Объект.
| + | |
| − | |-
| + | |
| − | | Error || Номер ошибки.
| + | |
| − | |}
| + | |
| − | | + | |
| − | В зависимости от выражения, в котором участвует переменная, ее содержимое будет автоматически приведено к нужному типу. Рассмотрим такой пример:
| + | |
| − | | + | |
| − | Option Explicit
| + | |
| − | Sub TestVBScript
| + | |
| − |
| + | |
| − | Dim A, B
| + | |
| − | A = 5
| + | |
| − | B = "12"
| + | |
| − | Application.MessageBox A + B, "", vbOkOnly
| + | |
| − |
| + | |
| − | End Sub
| + | |
| − | | + | |
| − | Так как в выражении участвует числовая переменная '''A''', интерпретатор преобразует значение переменной '''B''' из строки '''"12"''' в число и просуммирует их:
| + | |
| − | | + | |
| − | http://gsbelarus.com/gs/images/gs/2009/book/VBScript.DataTypes.1.png | + | |
| − | | + | |
| − | Изменим макрос так, чтобы переменная '''А''' тоже содержала строку:
| + | |
| − | | + | |
| − | Option Explicit
| + | |
| − | Sub TestVBScript
| + | |
| − |
| + | |
| − | Dim A, B
| + | |
| − | A = "5"
| + | |
| − | B = "12"
| + | |
| − | Application.MessageBox A + B, "", vbOkOnly
| + | |
| − |
| + | |
| − | End Sub
| + | |
| − | | + | |
| − | Запустим его на выполнение. Теперь на экране появится результат слияния (конкатенции) двух строк, а не сумма их числовых представлений:
| + | |
| − | | + | |
| − | http://gsbelarus.com/gs/images/gs/2009/book/VBScript.DataTypes.2.png
| + | |
| − | | + | |
| − | Во избежании путаницы с автоматическим приведением типов, рекомендуется использовать функции конверсии: CBool, CByte, CCur, CDate, CDbl, CInt, CLng, CSng, CStr.
| + | |
| − |
| + | |
| − | Если результатом выражения должно быть именно слияние строк, а не сумма их числовых представлений, то следует использовать оператор & вместо +.
| + | |
| − | | + | |
| − | === Переменные ===
| + | |
| − | | + | |
| − | Переменная – это удобное символьное обозначение области памяти, где приложение хранит некоторые данные. В процессе выполнения приложения значение переменной может изменяться. Перед использованием переменную следует объявить с помощью оператора Dim.
| + | |
| − | | + | |
| − | Dim A
| + | |
| − | | + | |
| − | С помощью одного оператора можно объявить сразу несколько переменных, если перечислить их имена через запятую:
| + | |
| − | | + | |
| − | Dim Left, Right, Top, Bottom
| + | |
| − | | + | |
| − | При объявлении нет необходимости в указании типа данных, так как все переменные имеют тип Variant.
| + | |
| − | | + | |
| − | ''Если в первой строке текста скрипта не указано Option Explicit, то использовать переменные можно без объявления. Но, такой путь может привести к трудно выявимым ошибкам. Достаточно один раз ошибиться в написании имени переменной в тексте программы, чтобы получить непредсказуемый результат. Мы рекомендуем всегда указывать Option Explicit и объявлять переменные.''
| + | |
| − | | + | |
| − | Имя переменной должно соответствовать следующим требованиям:
| + | |
| − | | + | |
| − | # Начинаться с символа латинского алфавита;
| + | |
| − | # Состоять только из символов латинского алфавита или из символов латинского алфавита и цифр;
| + | |
| − | # Не превышать 255 символов в длину;
| + | |
| − | # Быть уникальным в пределах своей области видимости.
| + | |
| − | | + | |
| − | === Область видимости и время жизни ===
| + | |
| − | | + | |
| − | Область видимости переменной определяется тем, где она была объявлена. Если внутри тела процедуры<ref>Очевидно, что сказанное в раной мере применимо и к функциям.</ref>, то такая переменная называется локальной и доступна только в пределах этой процедуры. Если переменная объявлена в тексте скрипта, то она будет видима для всех процедур или функций определенных в этом скрипте. Локальные переменные могут иметь одинакове имена, если объявлены в разных процедурах.
| + | |
| − | | + | |
| − | ''В дереве Проводника окна Редактора скрипт-объектов присутствует специальный раздел – Константы и переменные – для объявления глобальных переменных, видимых для всех скрипт-функций проекта.''
| + | |
| − | | + | |
| − | Интерпретатор выделяет память для локальных переменных в момент их объявления и высвобождает по выходу из процедуры. Глобальные переменные существуют с момента их объявления и пока скрипт не закончит свое выполнение. Применительно к Гедымину это означает, что глобальные переменные существуют на протяжении всего времени выполнения программы.
| + | |
| − | | + | |
| − | === Присваивание значения переменной ===
| + | |
| − | | + | |
| − | Значение объявленной переменной присваивается с помощью оператора =. Имя переменной указывается слева от оператора, новое значение – справа. Например:
| + | |
| − | | + | |
| − | A = 200
| + | |
| − | B = "Наименование"
| + | |
| − | | + | |
| − | === Скалярные переменные и массивы ===
| + | |
| − | | + | |
| − | Переменная содержащая единственное значение называется скалярной. Иногда, возникает необходимость хранить несколько значений в одной переменной. В этом случае следует объявить массив. Синтаксис объявления идентичен объявлению скалярной переменной за тем исключением, что после имени в круглых скобках мы задаем размерность массива. Следующее объявление создаст массив из 12 элементов:
| + | |
| − | | + | |
| − | Dim Monthes(11)
| + | |
| − | | + | |
| − | В языке VBScript левая граница индекса массива всегда 0. Таким образом размер массива вычисляется, как число указанное в скобках плюс один. При присваивании значения элементу массива следует указать его индекс в круглых скобках:
| + | |
| − | | + | |
| − | Monthes(0) = "Январь"
| + | |
| − | Monthes(1) = "Февраль"
| + | |
| − | Monthes(2) = "Март"
| + | |
| − | ...
| + | |
| − | Monthes(10) = "Ноябрь"
| + | |
| − | Monthes(11) = "Декабрь"
| + | |
| − | | + | |
| − | Аналогично, при обращении к значению элемента мы используем его индекс:
| + | |
| − | | + | |
| − | MonthName = Monthes(5)
| + | |
| − | | + | |
| − | Массив не обязательно должен быть одномерным. VBScript позволяет нам задать до 60 размерностей при объявлении массива. Например, следующий оператор создаст двумерный массив из 12 строк и двух колонок <ref>При объявлении двумерного массива первое число всегда задает количество строк, а второе – колонок.</ref>:
| + | |
| − | | + | |
| − | Dim MonthDays(11, 1)
| + | |
| − | | + | |
| − | При обращении к элементам многомерного массива следует указывать все индексы:
| + | |
| − | | + | |
| − | MonthDays(0, 0) = "Январь"
| + | |
| − | MonthDays(0, 1) = 31
| + | |
| − | MonthDays(1, 0) = "Февраль"
| + | |
| − | MonthDays(1, 1) = 28
| + | |
| − | ...
| + | |
| − | | + | |
| − | Выше мы объявляли массивы, размер которых не меняется в процессе работы программы. Если заранее не известно сколько элементов понадобится, то можно объявить динамический массив:
| + | |
| − | | + | |
| − | Dim A()
| + | |
| − | | + | |
| − | Перед использованием следует установить размер динамического массива с помощью оператора ReDim:
| + | |
| − | | + | |
| − | ReDim A(25)
| + | |
| − | | + | |
| − | В процессе выполнения можно вызывать оператор ReDim многократно, каждый раз изменяя размер массива. Опция Preserve сохраняет значения элементов массива при изменении размера. Например, следующий код увеличит объявленный выше массив на пять элементов, оставив существующие нетронутыми:
| + | |
| − | | + | |
| − | ReDim Preserve A(30)
| + | |
| − | | + | |
| − | Помните, что при уменьшении размера массива, значения удаленных элементов будут безвозвратно утеряны.
| + | |
| − | С помощью оператора Erase можно очистить элементы фиксированного массива или освободить память, занимаемую динамическим массивом.
| + | |
| − | | + | |
| − | Dim A
| + | |
| − | ReDim A(25)
| + | |
| − | ...
| + | |
| − | Erase A
| + | |
| − | | + | |
| − | === Константы ===
| + | |
| − | | + | |
| − | Правилом хорошего тона является объявление констант для многократно используемых в тексте программы значений. Грамотно присвоенное имя константы улучшает читабельность, а само использование -- упрощает процесс внесения изменений в код. В отличие от переменных, значение константы нельзя изменить в процессе выполнения программы. Создание константы происходит с помощью оператора Const:
| + | |
| − | | + | |
| − | Const CountryName = "Belarus"
| + | |
| − | Const CountryCode = 375
| + | |
| − | | + | |
| − | Несколько констант могут быть объявлены в рамках одного оператора, через запятую. Как и переменная, константа обладает своей областью видимости в зависимости от того, где (в процедуре или за ее пределами) и как (Public или Private) она была объявлена. Константы, созданные оператором Const без указания Public или Private являются общедоступными по-умолчанию.
| + | |
| − | | + | |
| − | ''В дереве Проводника окна Редактора скрипт-объектов присутствует специальный раздел – Константы и переменные – для объявления глобальных констант, видимых для всех скрипт-функций проекта.''
| + | |
| − | | + | |
| − | Значения строковых констант заключаются в двойные кавычки.
| + | |
| − | | + | |
| − | Значения типа Дата следует обрамлять символами решетки (#) и использовать американский формат: месяц/день/год. Например:
| + | |
| − | | + | |
| − | Const Public IndependenceDay = #03/25/1918#
| + | |
| − | | + | |
| − | Во избежание путаницы между константами и переменными рекомендуется использовать единый префикс для всех констант, например "con", или набирать имя константы в верхнем регистре.
| + | |
| − | | + | |
| − | Для облегчения труда программиста VBScript содержит набор [[VBScript. Предопределенные константы|предопределенных констант]].
| + | |
| − | | + | |
| − | === Операторы ===
| + | |
| − | | + | |
| − | Операторы VBScript подразделяются на пять категорий: арифметические, сравнения, слияния, логические и присваивания.
| + | |
| − | | + | |
| − | ==== Арифметические операторы ====
| + | |
| − | | + | |
| − | {| class="wikitable" border="1"
| + | |
| − | ! Оператор !! Пример использования !! Описание
| + | |
| − | |-
| + | |
| − | | ^ || number ^ exponent || Возводит number в степень exponent. Number может быть меньше нуля только в случае целочисленной степени. Если один из операндов Null, все выражение принимает значение Null. Если несколько возведений в степень выполняются подряд, результат вычисляется слева направо.
| + | |
| − | |-
| + | |
| − | | * || number1 * number2 || Произведение двух чисел. Если операнд имеет значение Empty, то он принимается равным нулю. Если хотя бы один из операндов Null, все выражение принимает значение Null.
| + | |
| − | |-
| + | |
| − | | / || number1 / number2 || Вещественное деление двух чисел. Для операндов действуют правила аналогично оператору умножения.
| + | |
| − | |-
| + | |
| − | | \ || number1 \ number2 || Целочисленное деление. Перед вычислением оба операнда приводятся к типу Byte, Integer или Long. В остальном действуют правила как для оператора деления.
| + | |
| − | |-
| + | |
| − | | Mod || number1 Mod number2 || Остаток от целочисленного деления. Приведение операндов к целому, а также правила обращения с Empty и Null, как у целочисленного деления.
| + | |
| − | |-
| + | |
| − | | + || expression1 + expression2 || Если оба операнда числа, результатом является их арифметическая сумма. Если оба операнда строки – слияние (конкатенция) двух строк. Если один операнд число, а другой строка, то строковый операнд будет преобразован в число и прибавлен к числовому. Если хотя бы один из операндов Null, все выражение принимает значение Null. Если оба операнда Empty, результат имеет целочисленное значение 0. Если только один оператор Empty, в качестве результата возвращается значение второго операнда.
| + | |
| − | |-
| + | |
| − | | - || number1 – number2 или - number || В первом случае возвращает разность двух чисел. Во втором – инвертирует знак числа. Правила для операндов со значениями Null и Empty, как для оператора умножения.
| + | |
| − | |}
| + | |
| − | | + | |
| − | ==== Операторы сравнения ====
| + | |
| − | Формат использования операторов сравнения:
| + | |
| − | | + | |
| − | result = expression1 comparisonoperator expression2
| + | |
| − | | + | |
| − | где используются следующие операторы сравнения: < (меньше), <= (меньше или равно), > (больше), >= (больше или равно), = (равно), <> (не равно).
| + | |
| − | | + | |
| − | В зависимости от типов и значений операндов, сравнение осуществляется следующим образом:
| + | |
| − | | + | |
| − | {| class="wikitable" border="1"
| + | |
| − | ! Если !! То
| + | |
| − | |-
| + | |
| − | | Оба операнда числа. || Выполняется сравнение двух чисел.
| + | |
| − | |-
| + | |
| − | | Оба операнда строки. || Выполняется сравнение двух строк.
| + | |
| − | |-
| + | |
| − | | Один из операндов число, а второй строка. || Строковый операнд приводится к числу и выполняется сравнение двух чисел.
| + | |
| − | |-
| + | |
| − | | Один из операндов Empty, а второй число. || Операнд со значением Empty принимается равным 0.
| + | |
| − | |-
| + | |
| − | | Один из операндов Empty, а второй строка. || Операнд со значением Empty принимается равным пустой строке "". Осуществляется сравнение двух строк.
| + | |
| − | |-
| + | |
| − | | Оба операнда Empty. || Операнды считаются равными.
| + | |
| − | |-
| + | |
| − | | Хотя бы один из операндов Null. || Результат принимает значение Null.
| + | |
| − | |}
| + | |
| − | | + | |
| − | Специальный оператор Is применяется для сравнения двух объектных переменных и возвращает Истину, если обе переменных ссылаются на один и тотже экземпляр объекта.
| + | |
| − | | + | |
| − | ==== Операторы конкатенции ====
| + | |
| − | | + | |
| − | В данной категории находятся два оператора: + и &. Первый подробно описан в разделе "Арифметические операторы" выше. Рассмотрим использование оператора &.
| + | |
| − | | + | |
| − | result = expression1 & expression2
| + | |
| − | | + | |
| − | Если операнд не является строкой, он приводится к строковому типу. Если оба операнда Null, то результат также принимает значение Null, однако, в отличие от остальных операторов, если только один операнд Null, то он принимается равным пустой строке. Операнд, имеющий значение Empty, также воспринимается как пустая строка "".
| + | |
| − | | + | |
| − | ==== Логические операторы ====
| + | |
| − | | + | |
| − | VBScript предоставляет нам следующие логические операторы:
| + | |
| − | | + | |
| − | # Логическое отрицание, инверсия (Not);
| + | |
| − | # Логическое умножение, коньюнкция (And);
| + | |
| − | # Логическое сложение, дизьюнкция (Or);
| + | |
| − | # Логическое исключение (Xor);
| + | |
| − | # Логический эквивалент (Eqv);
| + | |
| − | # Логическая импликация (Imp).
| + | |
| − | | + | |
| − | В качестве операндов логических операторов могут выступать булевские выражения или числовые значения. В первом случае результатом будет булевская константа, во втором – число. В зависимости от оператора подача на вход одного или двух значений Null может приводить к Null результату. Оператор Not является унарным и возвращает логическое отрицание выражения. Над числовым операндом оператор Not производит побитовую инверсию. Остальные логические операторы являются бинарными. В таблице ниже приведены результаты выполнения каждого из операторов в зависимости от значения операндов Exp1 и Exp2:
| + | |
| − | | + | |
| − | {| class="wikitable" border="1"
| + | |
| − | !Exp1 !! Exp2 !! And !! Or !! Xor !! Eqv !! Imp
| + | |
| − | |-
| + | |
| − | | True || True || True || True || False || True || True
| + | |
| − | |-
| + | |
| − | |True || False || False || True || True || False || False
| + | |
| − | |-
| + | |
| − | |False || True || False || True || True || False || True
| + | |
| − | |-
| + | |
| − | |False || False || False || False || False || True || True
| + | |
| − | |-
| + | |
| − | |True || Null || Null || True || Null || Null || Null
| + | |
| − | |-
| + | |
| − | |False || Null || False || Null || Null || Null || True
| + | |
| − | |-
| + | |
| − | |Null || True || Null || True || Null || Null || True
| + | |
| − | |-
| + | |
| − | |Null || False || False || Null || Null || Null || Null
| + | |
| − | |-
| + | |
| − | |Null || Null || Null || Null || Null || Null || Null
| + | |
| − | |}
| + | |
| − | | + | |
| − | В жизни чаще всего используются операторы And и Or и гораздо реже – Xor. Нам не приходилось сталкиваться с использованием на практике операторов Eqv и Imp. Если вам тяжело разбираться с приведенной выше таблицей резюмируем действие данных операторов:
| + | |
| − | | + | |
| − | * And принимает значение Истина только если оба операнда Истина. В любом другом случае – это либо Ложь, либо Null.
| + | |
| − | * Or принимает значение Истина, если хотябы один из операндов Истина.
| + | |
| − | * Xor принимает значение Истина, если значения операндов различаются и Ложь, если они одинаковы.
| + | |
| − | | + | |
| − | При побитовом выполнении над числовыми операндами результат логического оператора определяется по следующей таблице:
| + | |
| − | | + | |
| − | {| class="wikitable" border="1"
| + | |
| − | !Exp1 !! Exp2 !! And !! Or !! Xor !! Eqv !! Imp
| + | |
| − | |-
| + | |
| − | | 0 || 0 || 0 || 0 || 0 || 1 || 1
| + | |
| − | |-
| + | |
| − | | 0 || 1 || 0 || 1 || 1 || 0 || 1
| + | |
| − | |-
| + | |
| − | | 1 || 0 || 0 || 1 || 1 || 0 || 0
| + | |
| − | |-
| + | |
| − | | 1 || 1 || 1 || 1 || 0 || 1 || 1
| + | |
| − | |}
| + | |
| − | | + | |
| − | ==== Оператор присваивания ====
| + | |
| − | | + | |
| − | Оператор присваивания (=) подробно описан в разделе "Переменные".
| + | |
| − | | + | |
| − | ==== Очередность применения операторов ====
| + | |
| − | | + | |
| − | Если выражение содержит несколько операторов, то они применяются в соответствии с установленным порядком, который называется приоритетом операторов. Изменить порядок по-умолчанию можно с помощью круглых скобок. Выражение внутри скобок всегда вычисляется в первую очередь.
| + | |
| − | | + | |
| − | В выражении, содержащем операторы разных категорий, арифметические действия выполняются в первую очередь, затем выполняются операторы сравнения и, в последнюю очередь, -- логические операторы. Все операторы сравнения имеют одинаковый приоритет и вычисляются слева-направо. Арифметические и логические операторы вычисляются в следующем порядке:
| + | |
| − | | + | |
| − | # Возведение в степень (^);
| + | |
| − | # Смена знака числа, унарный минус (-);
| + | |
| − | # Умножение (*) и деление (/);
| + | |
| − | # Целочисленное деление (\);
| + | |
| − | # Остаток от целочисленного деления (Mod);
| + | |
| − | # Сложение (+) и вычитание (-);
| + | |
| − | # Слияние строк (&).
| + | |
| − | | + | |
| − | Если умножение и деление встречаются в одном выражении, то операции выполняются в порядке следования слева-направо. Аналогичное правило действует в случае одновременного присутствия операторов сложения и вычитания.
| + | |
| − | | + | |
| − | Оператор слияния строк (&) не является арифметическим и по приоритету располагается между арифметическими операторами и операторами сравнения.
| + | |
| − | | + | |
| − | Очередность для логических операторов установлена следующая:
| + | |
| − | | + | |
| − | # Логическое отрицание, инверсия (Not);
| + | |
| − | # Логическое умножение, коньюнкция (And);
| + | |
| − | # Логическое сложение, дизьюнкция (Or);
| + | |
| − | # Логическое исключение (Xor);
| + | |
| − | # Логический эквивалент (Eqv);
| + | |
| − | # Логическая импликация (Imp).
| + | |
| − | | + | |
| − | === Условные выражения ===
| + | |
| − | | + | |
| − | Условные выражения применяются для управления порядком выполнения команд программы и позволяют организовать переходы (ветвления) и повторения команд. Как правило, операторы сравнения используются вместе с условными выражениями.
| + | |
| − | | + | |
| − | ==== Выражение If..Then..Else ====
| + | |
| − | | + | |
| − | Выражение условного перехода If позволяет выполнить ту или иную группу команд в зависимости от результата логического выражения или значения булевской переменной.
| + | |
| − | | + | |
| − | Для выполнения единственной команды при выполнении заданного условия используется однострочный синтаксис выражения:
| + | |
| − | | + | |
| − | Dim S
| + | |
| − | If DatePart("w", Now) = vbMonday Then S = "Понедельник"
| + | |
| − | Application.MessageBox S, "", vbOkOnly
| + | |
| − | | + | |
| − | Обратите внимание, что секция Else в этом случае опущена. Для выполнения группы операторов следует заключить их между ключевыми словами Then и End If.
| + | |
| − | | + | |
| − | Dim S
| + | |
| − | If DatePart("w", Now) = vbMonday Then
| + | |
| − | S = "Сегодня понедельник"
| + | |
| − | Application.MessageBox S, "", vbOkOnly
| + | |
| − | End If
| + | |
| − | | + | |
| − | Если при выполнении условия требуется выполнить один код, а при невыполнении – другой, то используется синтаксис выражения с секцией Else:
| + | |
| − | | + | |
| − | Dim S
| + | |
| − | If DatePart("w", Now) = vbMonday Then
| + | |
| − | S = "Сегодня понедельник"
| + | |
| − | Else
| + | |
| − | S = "Сегодня не понедельник"
| + | |
| − | End If
| + | |
| − | Application.MessageBox S, "", vbOkOnly
| + | |
| − | | + | |
| − | При необходимости выбора из нескольких альтернатив подойдет синтаксис с конструкцией ElseIf:
| + | |
| − | | + | |
| − | Dim S, D
| + | |
| − | D = DatePart("w", Now)
| + | |
| − | If D = vbMonday Then
| + | |
| − | S = "Понедельник"
| + | |
| − | ElseIf D = vbTuesday Then
| + | |
| − | S = "Вторник"
| + | |
| − | ElseIf D = vbWednesday Then
| + | |
| − | S = "Среда"
| + | |
| − | ...
| + | |
| − | End If
| + | |
| − | Application.MessageBox S, "", vbOkOnly
| + | |
| − | | + | |
| − | Выражения If могут быть вложенными:
| + | |
| − | | + | |
| − | Dim S, D
| + | |
| − | D = DatePart("w", Now)
| + | |
| − | If D = vbMonday Then
| + | |
| − | S = "Понедельник"
| + | |
| − | Else
| + | |
| − | If D = vbTuesday Then
| + | |
| − | S = "Вторник"
| + | |
| − | Else
| + | |
| − | If D = vbWednesday Then
| + | |
| − | S = "Среда"
| + | |
| − | Else
| + | |
| − | ...
| + | |
| − | End If
| + | |
| − | End If
| + | |
| − | End If
| + | |
| − | | + | |
| − | Хотя количество секций ElseIf в условном выражении не ограничено, интенсивное их использование может привести к запутанному, неудобочитаемому коду. В случае выбора одной альтернативы из множества возможных в зависимости от значения некоторого селектора рекомендуется использовать выражение Select Case.
| + | |
| − | | + | |
| − | ==== Выражение Select..Case ====
| + | |
| − | | + | |
| − | Перепишем пример с днями недели с использованием выражения выбора:
| + | |
| − | | + | |
| − | Dim S
| + | |
| − | Select Case DatePart("w", Now)
| + | |
| − | Case vbMonday
| + | |
| − | S = "Понедельник"
| + | |
| − | Case vbTuesday
| + | |
| − | S = "Вторник"
| + | |
| − | Case vbWednesday
| + | |
| − | S = "Среда"
| + | |
| − | ...
| + | |
| − | Case Else
| + | |
| − | Err.Raise 32000, "", "Неизвестный день недели"
| + | |
| − | End Select
| + | |
| − | | + | |
| − | Так как выражение селектора вычисляется только один раз, использование Select..Case приводит к более эффективному коду.
| + | |
| − | Рекомендуется всегда использовать секцию Case Else для отлавливания некорректных или необработанных значений селектора.
| + | |
| − | | + | |
| − | === Операторы цикла ===
| + | |
| − | | + | |
| − | Довольно часто возникает ситуация, когда код требуется запустить повторно. Для этого следует написать оператор цикла, который повторяет определенные команды снова и снова. Операторы цикла используются во многих ситуациях: при вычислении итоговой суммы по списку чисел, перемещении по записям набора данных или для запуска блока кода для нескольких объектов. Существует несколько циклов, описанных в следующих разделах. Некоторые из них выполняются, пока условие имеет значение Истина, некоторые – пока Ложь. И, наконец, есть такие, которые выполняются заданное число раз.
| + | |
| − | | + | |
| − | ==== Оператор Do..Loop ====
| + | |
| − | | + | |
| − | Данный оператор предназначен для выполнения группы команд пока заданное условие Истинно или до тех пор, когда оно не станет Истинным. Проверка условия может осуществляться как в начале цикла:
| + | |
| − | | + | |
| − | Do [{While | Until} condition]
| + | |
| − | [statements]
| + | |
| − | [Exit Do]
| + | |
| − | [statements]
| + | |
| − | Loop
| + | |
| − | | + | |
| − | так и в конце:
| + | |
| − | | + | |
| − | Do
| + | |
| − | [statements]
| + | |
| − | [Exit Do]
| + | |
| − | [statements]
| + | |
| − | Loop [{While | Until} condition]
| + | |
| − | | + | |
| − | Команда Exit Do может встречаться неограниченное число раз в теле цикла. Обычно она используется вместе с условным выражением If..Then и позволяет передать управление на оператор, следующий непосредственно за циклом. При использовании Exit Do внутри вложенного цикла, управление перейдет во внешний цикл.
| + | |
| − | | + | |
| − | Следующий код позволяет заменить игральный кубик:
| + | |
| − | | + | |
| − | Dim Resp, Num
| + | |
| − | Loop
| + | |
| − | Num = Int(6 * Rnd + 1)
| + | |
| − | Resp = Application.MessageBox Num & " Еще число?", "",_
| + | |
| − | vbYesNo or vbQuestion
| + | |
| − | Do Until Resp = vbNo
| + | |
| − | | + | |
| − | ==== While..Wend ====
| + | |
| − | | + | |
| − | Представляет собой усеченную версию оператора Do..Loop и позволяет выполнять группу команд пока условие Истинно. Синтаксис оператора:
| + | |
| − | | + | |
| − | While condition
| + | |
| − | [statements]
| + | |
| − | Wend
| + | |
| − | | + | |
| − | Обратите внимание, что Exit Do не действует внутри данного цикла. Циклы While..Wend могут быть вложенными.
| + | |
| − | | + | |
| − | ==== For..Next ====
| + | |
| − | | + | |
| − | Данный цикл повторяет заданный набор команд указанное число раз. Синтаксис оператора имеет вид:
| + | |
| − | | + | |
| − | For counter = start To end [Step step]
| + | |
| − | [statements]
| + | |
| − | [Exit For]
| + | |
| − | [statements]
| + | |
| − | Next
| + | |
| − | | + | |
| − | Перед стартом цикла переменной counter присваивается значение start. Далее проверяется выполнение условия counter <= end, при step >= 0, или counter >= end, при отрицательном шаге. После выполнение блока команд переменная counter увеличивается на значение step и все повторяется сначала.
| + | |
| − | | + | |
| − | Изменение счетчика в теле цикла не запрещено, но настоятельно не рекомендуется, так как затрудняет понимание логики программы и ее отладку.
| + | |
| − | | + | |
| − | Exit For может встречаться в теле цикла произвольное число раз. Циклы могут быть вложенными. Например, такой цикл инициализирует трехмерный массив:
| + | |
| − | | + | |
| − | Dim A(9, 9, 9)
| + | |
| − | Dim I, J, K
| + | |
| − | For I = 0 To 9
| + | |
| − | For J = 0 To 9
| + | |
| − | For K = 0 To 9
| + | |
| − | A(I, J, K) = 1
| + | |
| − | Next
| + | |
| − | Next
| + | |
| − | Next
| + | |
| − | | + | |
| − | ==== For Each..Next ====
| + | |
| − | | + | |
| − | Оператор цикла For Each..Next повторяет заданный набор команд для каждого элемента массива или коллекции и имеет следующий синтаксис:
| + | |
| − | | + | |
| − | For Each element In group
| + | |
| − | [statements]
| + | |
| − | [Exit For]
| + | |
| − | [statements]
| + | |
| − | Next
| + | |
| − | | + | |
| − | Цикл выполняется, если в массиве или коллекции присутствует хотябы один элемент. Exit For может встречаться в теле цикла произвольное количество раз.
| + | |
| − | | + | |
| − | Проиллюстрируем использование For Each..Next на примере следующего кода, который выводит на экран список файлов из корневого каталога диска с:\
| + | |
| − | | + | |
| − | Dim fso, f, f1, fc, s
| + | |
| − | Set fso = CreateObject("Scripting.FileSystemObject")
| + | |
| − | Set f = fso.GetFolder("c:\")
| + | |
| − | Set fc = f.Files
| + | |
| − | For Each f1 in fc
| + | |
| − | s = s & f1.name & vbNewLine
| + | |
| − | Next
| + | |
| − | Application.MessageBox s, "Файлы на c:\", vbOkOnly
| + | |
| − | | + | |
| − | === Процедуры ===
| + | |
| − | | + | |
| − | Для экономии памяти и структурирования программы, фрагмент кода, вызываемый многократно в разных местах, может быть оформлен ввиде процедуры. В языке VBScript существуют два вида процедур: подпрограммы (Sub) и функции (Function). Подпрограмма – это последовательность операторов, обрамленная ключевыми словами Sub и End Sub. Подпрограмма может принимать на вход параметры, но не возвращает значения. Функция – последовательность операторов, заключенная между Function и End Function, -- возвращает результат и поэтому может быть использована в выражении. Каждая процедура должна иметь имя, уникальное в пределах модуля. Имена процедур, объявленных в глобальном модуле, должны быть уникальны в рамках всего проекта.
| + | |
| − | | + | |
| − | Определение подпрограммы и функции имеет следующий синтаксис:
| + | |
| − | | + | |
| − | [Public [Default] | Private] Sub name [(arglist)]
| + | |
| − | [statements]
| + | |
| − | [Exit Sub]
| + | |
| − | [statements]
| + | |
| − | End Sub
| + | |
| − | | + | |
| − | [Public [Default] | Private] Function name [(arglist)]
| + | |
| − | [statements]
| + | |
| − | [Exit Function]
| + | |
| − | [statements]
| + | |
| − | End Function
| + | |
| − | | + | |
| − | Public процедуры являются глобальными и доступны во всех скриптах программы. Private процедуры доступны только в том скрипте, где они были объявлены. Если не указано иное, объявленная процедура является общедоступной. Ключевое слово Default может быть использовано только в теле класса и служит для указания метода по-умолчанию этого класса.
| + | |
| − | | + | |
| − | Список параметров имеет следующий синтаксис:
| + | |
| − | | + | |
| − | [ByRef | ByVal] varname [, ...]
| + | |
| − | | + | |
| − | Параметры могут передаваться по значению (ByVal) или по ссылке (ByRef). По-умолчанию все параметры передаются по значению. Константы, результаты вычисления выражений могут быть переданы только по значению. Изменение параметра, переданного по ссылке, приведет к изменению значения наружной переменной. Поясним передачу параметров внутрь процедуры на следующем примере:
| + | |
| − | | + | |
| − | Sub DoCalculation(ByRef A, ByVal B, ByVal C)
| + | |
| − | A = C * 2
| + | |
| − | B = C / 2
| + | |
| − | End Sub
| + | |
| − |
| + | |
| − | Sub TestVar
| + | |
| − | Dim V1, V2
| + | |
| − | V1 = 1
| + | |
| − | V2 = 2
| + | |
| − | DoCalculation V1, V2, 10
| + | |
| − | ' После выполнения процедуры DoCalculation
| + | |
| − | ' V1 = 20
| + | |
| − | ' V2 = 2
| + | |
| − | End Sub
| + | |
| − | | + | |
| − | Переменные, объявленные внутри тела процедуры, являются локальными и уничтожаются по завершении ее выполнения. Значения локальных переменных не сохраняются.
| + | |
| − | | + | |
| − | Список параметров указывается в круглых скобках при вызове функции или при вызове подпрограммы с помощью оператора Call<ref>Здесь авторы VBScript отличились своей непоследовательностью. Допускается использование круглых скобок без оператора Call при вызове процедуры с единственным параметром.</ref>. Так, вызов процедуры DoCalculation в приведенном выше примере мы могли написать следующим образом:
| + | |
| − | | + | |
| − | Call DoCalculation(V1, V2, 10)
| + | |
| − | | + | |
| − | === Выражение Execute ===
| + | |
| − | | + | |
| − | === Классы VBScript ===
| + | |
| − | | + | |
| − | VBScript позволяет создавать новые классы, которые в дальнейшем мы будем называть VB классами. Вообще говоря, полноценными классами в понимании объектно-ориентированного программирования они не являются, поскольку не поддерживают наследование и, соответственно, полиморфизм. Так что из трех китов, на которых базируется объектно-ориентированная парадигма остается только инкапсуляция — возможность объединять в рамках одной сущности данные и методы.
| + | |
| − | | + | |
| − | Определение класса осуществляется с помощью следующей конструкции:
| + | |
| − | | + | |
| − | Class name
| + | |
| − | statements
| + | |
| − | End Class
| + | |
| − | | + | |
| − | где name — это имя класса, а statements — это одно или несколько определений переменных, свойств, процедур или функций, называемых так же членами класса. Обратите внимание, что в отличие от Delphi, где код определения класса содержит только объявления процедур и функций, в VB классе код членов прописывается прямо в тексте класса.
| + | |
| − | | + | |
| − | Члены класса могут быть объявлены как Private или Public. Первые видны только внутри кода данного класса, вторые же доступны как для внутреннего кода, так и снаружи. Если переменная или функция (процедура) не содержат явного определения Public или Private, то они считаются общедоступными. Процедуры или функции объявленные как Public внутри блока класса становятся методами данного класса.
| + | |
| − | | + | |
| − | Переменные, объявленные как общедоступные, становятся свойствами класса наравне со свойствами объявленными непосредственно с помощью конструкций Property Get, Property Let, Property Set.
| + | |
| − | | + | |
| − | ==== Определение свойств класса ====
| + | |
| − | | + | |
| − | Выше мы уже говорили о том, что поля класса явно или не явно объявленные как Public, становятся его свойствами. Кроме этого, создать свойство класса можно определив специальные функции для считывания значения свойства (Property Get), а также для его присвоения (Property Let или Property Set).
| + | |
| − | | + | |
| − | Синтаксис определения таких функций следующий:
| + | |
| − | | + | |
| − | [Public [Default] | Private] Property Get name [(arglist)]
| + | |
| − | [statements]
| + | |
| − | [[Set] name = expression]
| + | |
| − | [Exit Property]
| + | |
| − | [statements]
| + | |
| − | [[Set] name = expression]
| + | |
| − | End Property
| + | |
| − |
| + | |
| − | [Public | Private] Property Let name ([arglist,] value)
| + | |
| − | [statements]
| + | |
| − | [Exit Property]
| + | |
| − | [statements]
| + | |
| − | End Property
| + | |
| − |
| + | |
| − | [Public | Private] Property Set name([arglist,] reference)
| + | |
| − | [statements]
| + | |
| − | [Exit Property]
| + | |
| − | [statements]
| + | |
| − | End Property
| + | |
| − | | + | |
| − | Определив только одну функцию, считывания или присвоения, можно создать свойство, соответственно, только для чтения или записи. Процедура Property Let используется для присвоения простых типов данных, а Property Set для передачи ссылки на объект. Обратите внимание, что все три функции могут принимать на вход произвольный список параметров. Таким образом можно организовать, например, свойства-массивы, передавая в качестве аргумента индекс элемента.
| + | |
| − | | + | |
| − | ==== Создание и уничтожение экземпляра VB класса ====
| + | |
| − | | + | |
| − | Создание экземпляра VB класса осуществляется с помощью оператора New.
| + | |
| − | | + | |
| − | Dim X
| + | |
| − | Set X = New classname
| + | |
| − | | + | |
| − | Уничтожение ранее созданного экземпляра происходит автоматически по завершении блока кода, где была объявлена соответсвующая переменная и при условии, что на нее нет внешних ссылок. Если необходимо уничтожить экземпляр вручную, то необходимо присвоить значение Nothing переменной.
| + | |
| − | | + | |
| − | ‘ объявление переменной и создание экземпляра класса
| + | |
| − | Dim X
| + | |
| − | Set X = New classname
| + | |
| − |
| + | |
| − | ...
| + | |
| − | ‘ использование экземпляра класса
| + | |
| − | ...
| + | |
| − |
| + | |
| − | ‘ уничтожение экземпляра класса
| + | |
| − | Set X = Notning
| + | |
| − |
| + | |
| − | ...
| + | |
| − | | + | |
| − | ==== События Initialize и Terminate ====
| + | |
| − | | + | |
| − | Событие Initialize происходит при создании экземпляра класса, а Terminate — при его уничтожении. Разработчик может определить свои обработчики данных событий. Ниже приведен пример использования событий создания и удаления объекта:
| + | |
| − | | + | |
| − | Class TestClass
| + | |
| − |
| + | |
| − | ' Определение обработчика события Initialize.
| + | |
| − | Private Sub Class_Initialize
| + | |
| − | MsgBox("TestClass started")
| + | |
| − | End Sub
| + | |
| − |
| + | |
| − | ' Определение обработчика события Terminate.
| + | |
| − | Private Sub Class_Terminate
| + | |
| − | MsgBox("TestClass terminated")
| + | |
| − | End Sub
| + | |
| − |
| + | |
| − | End Class
| + | |
| − |
| + | |
| − | ' Создание экземпляра класса TestClass.
| + | |
| − | ' На экран будет выведено сообщение "TestClass started"
| + | |
| − | Set X = New TestClass
| + | |
| − |
| + | |
| − | ' Уничтожение экземпляра.
| + | |
| − | ' На экран будет выведено сообщение "TestClass terminated"
| + | |
| − | Set X = Nothing
| + | |
| − | | + | |
| − | == Встроенные функции ==
| + | |
| − | | + | |
| − | {| class="wikitable" border="1"
| + | |
| − | ! Имя !! Описание
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Abs|Abs]] || Абсолютное значение, модуль числа.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Array|Array]] || Возвращает Variant содержащий массив.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Asc|Asc]] || Возвращает ANSI код первого символа в строке.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Atn|Atn]] || Арктангенс числа.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция CBool|CBool]] || Конвертирует значение в вариант с подтипом Boolean.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция CByte|CByte]] || Конвертирует переданное значение в вариант с подтипом Byte.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция CCur|CCur]] || Конвертирует переданное значение в вариант с подтипом Currency.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция CDate|CDate]] || Конвертирует переданное значение в вариант с подтипом Date.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция CDbl|CDbl]] || Преобразует переданное значение в вариант с подтипом Double.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Chr|Chr]] || Возвращает символ соответствующий заданному ANSI коду.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция CInt|CInt]] || Преобразует переданное значение в варинт с подтипом Integer.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция CLng|CLng]] || Преобразует переданное значение в варинт с подтипом Long.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Cos|Cos]] || Функция вычисляет косинус угла.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция CreateObject|CreateObject]] || Создает объект автоматизации и возвращает ссылку на него.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция CSng|CSng]] || Преобразует переданное значение в вариант с подтипом Single.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция CStr|CStr]] || Преобразует переданное значение в вариант с подтипом String.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Date|Date]] || Функция возвращает текущую дату.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция DateAdd|DateAdd]] || Прибавляет к дате указанный интервал.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция DateDiff|DateDiff]] || Функция возвращает количество временных интервалов между указанными датами.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция DatePart|DatePart]] || Возвращает указанную часть даты.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция DateSerial|DateSerial]] || Возвращает вариант с подтипом Date для указанного года, месяца и дня.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция DateValue|DateValue]] || Конвертирует значение в вариант с подтипом Date.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Day|Day]] || Возвращает номер дня в месяце, целое число в диапазоне от 1 до 31.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Eval|Eval]] || Вычисляет выражение и возвращает результат.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Exp|Exp]] || Вычисляет указанную степень числа е.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Filter|Filter]] || Извлекает из массива строк элементы, удовлетворяющие указанному критерию и помещает их в результирующий массив.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция FormatCurrency|FormatCurrency]] || Форматирует значение как денежную строку.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция FormatDateTime|FormatDateTime]] || Форматирует выражение как дату или время.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция FormatNumber|FormatNumber]] || Форматирует число.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция FormatPercent|FormatPercent]] || Форматирует число как проценты, умножает на 100 и добавляет символ %.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция GetLocale|GetLocale]] || Возвращает идентификатор текущих региональных установок.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция GetObject|GetObject]] || Создает объект автоматизации из дискового файла.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция GetRef|GetRef]] || Возвращает ссылку на процедуру.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Hex|Hex]] ||Возвращает строку – представление числа в шестнадцатиричной системе счисления.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Hour|Hour]] || Извлекает номер часа из времени.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция InputBox|InputBox]] ||
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция InStr|InStr]] || Возвращает позицию искомой последовательности символов в заданной строке.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция InStrRev|InStrRev]] || Действие функции и параметры аналогичны InStr с тем исключением, что поиск начинается с конца строки.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Int|Int]] || Функция возвращает целую часть числа.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Fix|Fix]] || Функция возвращает целую часть числа.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция IsArray|IsArray]] || Возвращает True, если выражение является массивом.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция IsDate|IsDate]] || Возвращает True, если выражение является датой или может быть преобразовано в дату.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция IsEmpty|IsEmpty]] || Возвращает True, если переменная не была инициализирована.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция IsNull|IsNull]] || Возвращает True, если переменная не содержит данных.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция IsNumeric|IsNumeric]] || Возвращает True, если переданное значение является числом.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция IsObject|IsObject]] || Возвращает True, если на вход передан объект автоматизации.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Join|Join]] || Объединяет значения элементов массива в одну строку.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция LBound|LBound]] || Возвращает нижнюю границу индекса массива.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция LCase|LCase]] || Приводит символы строки к нижнему регистру.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Left|Left]] || Возвращает указанное количество первых символов строки.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Len|Len]] || Возвращает длину строки.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Log|Log]] || Натуральный логарифм числа.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция LTrim|LTrim]],[[VBScript. Функция RTrim|RTrim]],[[VBScript. Функция Trim|Trim]] || Возвращают копию строки без начальных (LTrim), концевых (RTrim) или и начальных и концевых (Trim) пробелов.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Mid|Mid]] || Извлекает подстроку заданной длины, начиная с указанной позиции из переданной строки.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Minute|Minute]] || Извлекает номер минуты из времени.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Month|Month]] || Извлекает номер месяца из даты.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция MonthName|MonthName]] || Возвращает наименование месяца.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция MsgBox|MsgBox]] || Выводит на экран диалоговое окно с сообщением.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Now|Now]] || Возвращает текущие дату и время.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Oct|Oct]] || Возвращает строку, представление числа в восьмеричной системе исчисления.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Replace|Replace]] || Заменяет в строке заданную подстроку новым значением.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция RGB|RGB]] || Возвращает целое число, представляющее цвет в системе координат RGB.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Right|Right]] || Возвращает указанное число последних символов строки.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Rnd|Rnd]] || Генерирует случайное число.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Round|Round]] ||Возвращает число, округленное до указанного количества знаков после запятой.
| + | |
| − | |-
| + | |
| − | | ScriptEngine, ScriptEngineBuildVersion, ScriptEngineMajorVersion, ScriptEngineMinorVersion || Функции возвращают информацию о наименовании и версии скриптового языка.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Second|Second]] || Извлекает секунды из времени.
| + | |
| − | |-
| + | |
| − | | SetLocale ||
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Sgn|Sgn]] || Знак числа.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Sin|Sin]] || Вычисляет синус аргумента.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Space|Space]] || Формирует строку из указанного количества пробелов.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Split|Split]] || Разбивает переданную строку на подстроки и заполняет ими возвращаемый массив.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Sqr|Sqr]] || Вычисляет квадратный корень из числа.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция StrComp|StrComp]] || Возвращает результат сравнения двух строк.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция String|String]] || Формирует строку указанной длины, заполненную указанным символом.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция StrReverse|StrReverse]] || Переставляет символы в переданной строке в обратном порядке.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Tan|Tan]] || Тангенс числа.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Time|Time]] || Возвращает текущее время.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Timer|Timer]] || Возвращает количество прошедших с полуночи секунд.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция TimeSerial|TimeSerial]] || Возвращает вариант с подтипом Date, содержащий указанное время.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция TimeValue|TimeValue]] || Возвращает вариант с подтипом Date, содержащий время.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция TypeName|TypeName]] || Возвращает строковое наименование подтипа варианта.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция UBound|UBound]] || Возвращает верхнюю границу массива.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция UCase|UCase]] || Преобразует символы строки к верхнему регистру.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция VarType|VarType]] || Возвращает подтип переменной.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Weekday|Weekday]] || Номер дня недели для указанной даты.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция WeekdayName|WeekdayName]] || Возвращает наименование дня недели.
| + | |
| − | |-
| + | |
| − | | [[VBScript. Функция Year|Year]] || Извлекает год из даты.
| + | |
| − | |}
| + | |
| − | | + | |
| − | == Обработка ошибок ==
| + | |
| − | | + | |
| − | VBScript имеет весьма скудные встроенные средства обработки ошибок времени выполнения, которые сводятся к двум операторам:
| + | |
| − | | + | |
| − | On Error GoTo 0
| + | |
| − | On Error Resume Next
| + | |
| − | | + | |
| − | Первый – отключает обработку ошибок (состояние по-умолчанию). Если ошибка случится, то на экран будет выдано сообщение и выполнение текущей процедуры или функции прекратится.
| + | |
| − | | + | |
| − | При включенном режиме On Error Resume Next, ошибка не приводит к прерыванию выполнения кода и программист имеет возможность самостоятельно разобраться с ней. Информация об ошибке содержится в глобальном встроенном объекте Err. Ниже приводится описание его свойств и методов:
| + | |
| − | | + | |
| − | ;Description : Текстовое описание ошибки.
| + | |
| − | ;HelpContext : Номер топика в файле справки, который будет открыт, если пользователь воспользуется клавишей F1 в окне сообщения об ошибке.
| + | |
| − | ;HelpFile : Имя файла справки.
| + | |
| − | ;Number : Целочисленный номер ошибки. 0 означает отсутствие ошибки.
| + | |
| − | ;Source : Наименование приложения, в котором произошла ошибка.
| + | |
| − | | + | |
| − | Методы:
| + | |
| − | ;Clear : Очищает все свойства объекта, сбрасывает информацию об ошибке. Обратите внимание, что объект Err автоматически очищается при выполнении следующих операторов: On Error Resume Next, Exit Sub, Exit Function.
| + | |
| − | ;Raise : Генерирует ошибку времени выполнения. Полный формат вызова: Err.Raise(number, source, description, helpfile, helpcontext).
| + | |
| − | | + | |
| − | Только первый параметр (номер ошибки) является обязательным. Если опущены, значения остальных параметров подставляются из соответствующих свойств объекта.
| + | |
| − | | + | |
| − | Обработку ошибок проиллюстрируем на примере кода, который в цикле запрашивает у пользователя строку и пытается преобразовать ее в дату. Если введенная строка не является датой, то на экран выводится сообщение. Цикл повторяется, пока пользователь не введет корректную дату.
| + | |
| − | | + | |
| − | Dim InputD, InputS
| + | |
| − | On Error Resume Next
| + | |
| − | Do
| + | |
| − | Err.Clear
| + | |
| − | InputS = InputBox("Введите дату")
| + | |
| − | If IsNumeric(InputS) Then
| + | |
| − | Err.Number = vbObjectError + 1
| + | |
| − | Else
| + | |
| − | InputD = CDate(InputS)
| + | |
| − | End If
| + | |
| − | If Err.Number <> 0 Then
| + | |
| − | Application.MessageBox _
| + | |
| − | "Неверный формат даты! Повторите ввод.", _
| + | |
| − | "Ошибка", vbOkOnly + vbExclamation + vbSystemModal
| + | |
| − | End If
| + | |
| − | Loop Until Err.Number = 0
| + | |
| − | On Error Goto 0
| + | |
| − | | + | |
| − | == Использование TCreator ==
| + | |
| − | | + | |
| − | Бережное отношение к ресурсам компьютера – неприменный атрибут качественной программы. Сегодня, когда 1 Гб оперативной памяти на рабочей станции обычное дело, а операционные системы не имеют таких жестких ограничений на количество внутренних объектов, которые присутствовали во времена Windows 9х, многие разработчики не уделяют должного внимания вопросам экономного создания и удаления объектов. Как результат, приложение, вроде бы неплохо работающее на настольном компьютере, не запускается на POS терминале, оснащенном 128 Мб ОЗУ. Едва заметные утечки памяти могут привести к фатальным последствиям, если пользователь не выключает компьютер на протяжении нескольких дней или использует приложение особенно интенсивно. Многочисленные одновременные подключения к базе данных из программ, небрежно обращающихся с такими объектами, как транзакция или запрос, способны поставить в затруднительное положение даже очень производительный сервер.
| + | |
| − | | + | |
| − | Следует создавать объекты по мере необходимости и уничтожать их незамедлительно, по окончании использования. Исключением является ситуация, когда многократное создание и удаление объекта влекут значительные временные затраты. В этом случае можно рекомендовать использование глобальной переменной или пула объектов.
| + | |
| − | | + | |
| − | Программируя на Гедымине мы имеем дело с объектами трех видов:
| + | |
| − | | + | |
| − | # Экземпляры VBScript классов, созданные оператором New.
| + | |
| − | # COM объекты автоматизации (ActiveX объекты), созданные функцией CreateObject.
| + | |
| − | # Объекты платформы Гедымин, созданные вызовом метода Designer.CreateObject.
| + | |
| − | | + | |
| − | Для первых двух в среде выполнения VBScript действует автоматическая сборка мусора. Как только исчезает необходимость в объекте – он уничтожается. Как правило, это происходит по выходу из процедуры или функции, в рамках которой был создан объект. Программист имеет возможность форсировать данный процесс, присвоив значение Nothing соответствующей локальной переменной. С последними -- дело обстоит сложнее. Поскольку создаются они внутри платформы и не являются COM объектами, VBScript не может ни контролировать их использование, ни самостоятельно их удалять. Такая обязанность всецело возлагается на программиста.
| + | |
| − | | + | |
| − | Казалось бы, чего проще: Designer.CreateObject-Designer.DestroyObject – и все дела (см. пример ниже).
| + | |
| − | | + | |
| − | Dim Obj
| + | |
| − | Set Obj = Designer.CreateObject(...)
| + | |
| − | ...
| + | |
| − | Designer.DestroyObject(Obj)
| + | |
| − | | + | |
| − | Однако, если мы не используем режим On Error Resume Next, то любая ошибка в процессе выполнения приведет к преждевременному выходу из тела процедуры. Строка кода Designer.DestroyObject выполнена не будет и объект останется в памяти до завершения выполнения программы. Ниже приведен пример такой, небезопасной функции. Ее задача – вернуть наименование контакта по заданному идентификатору. Если внутри функции произойдет ошибка (например, на вход будет передана строка буквенных символов вместо целочисленного идентификатора), то объект TIBSQL, сохраненный в переменной q, уничтожен не будет.
| + | |
| − | | + | |
| − | Function UnSafe_GetContactName(ID)
| + | |
| − | Dim q
| + | |
| − | Set q = Designer.CreateObject(nil, "TIBSQL", "")
| + | |
| − | q.Transaction = gdcBaseManager.ReadTransaction
| + | |
| − | q.SQL.Text = _
| + | |
| − | "SELECT name FROM gd_contact WHERE id=" & CLng(ID)
| + | |
| − | q.ExecQuery
| + | |
| − | UnSafe_GetContactName = q.Fields(0).AsString
| + | |
| − | Designer.DestroyObject(q)
| + | |
| − | End Function
| + | |
| − | | + | |
| − | К счастью, разработчики платформы нашли элегантное решение данной проблемы. Как отмечалось выше, локальные VBScript объекты автоматически уничтожаются при выходе из процедуры или функции. Был создан вспомогательный класс [[TCreator]], который хранит список созданных объектов и уничтожает их в деструкторе. Теперь мы можем сделать безопасной нашу функцию:
| + | |
| − | | + | |
| − | Function Safe_GetContactName(ID)
| + | |
| − | Dim Creator, q
| + | |
| − | Set Creator = New TCreator
| + | |
| − | Set q = Creator.GetObject(nil, "TIBSQL", "")
| + | |
| − | q.Transaction = gdcBaseManager.ReadTransaction
| + | |
| − | q.SQL.Text = _
| + | |
| − | "SELECT name FROM gd_contact WHERE id=" & CLng(ID)
| + | |
| − | q.ExecQuery
| + | |
| − | Safe_GetContactName = q.Fields(0).AsString
| + | |
| − | End Function
| + | |
| − | | + | |
| − | От своего небезопасного аналога данная функция отличается лишь тем, что мы добавили переменную Creator и создаём объект через метод Creator.GetObject вместо Designer.CreateObject. Обратите внимание, что мы не удаляем Creator непосредственно -- об этом позаботится VBScript.
| + | |
| − | | + | |
| − | Класс [[TCreator]] входит в пакет Общие данные.
| + | |
| − | | + | |
| − | == Примечания ==
| + | |
| − | <references/>
| + | |
| | | | |
| | [[Category:VBScript]] | | [[Category:VBScript]] |
| | [[Category:Книга]] | | [[Category:Книга]] |
Наверное нет языка программирования проще, чем VBScript – Visual Basic Scripting Edition. Даже начинающий программист способен освоить его за два-три дня, а человек знакомый с Visual_Basic Visual Basic или Visual_Basic_for_Applications Visual Basic for Applications (VBA) практически сразу может приступать к работе. Ниже приведены основные сведения по синтаксису языка, дано описание операторов и встроенных функций. К сожалению, обработка ошибок в VBScript реализована на очень примитивном уровне. Разработчики не предусмотрели конструкций для обработки исключительных ситуаций, таких как try-except и try-finally в Delphi. В разделах Обработка ошибок и Использование TCreator мы рассмотрим способы преодоления этих ограничений.
VBScript является интерпретируемым языком. За выполнение программы отвечает Windows Script Host, который поставляется в составе операционной системы начиная с версии Windows 98. На момент написания данной книги, последняя версия VBScript имела номер 5.8 и поставлялась в составе Windows 7. Обновления для предыдущих версий операционной системы можно скачать с сайта компании Microsoft.