Visual Basic

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 20:18, 1 июня 2016.
Visual Basic
Visual Basic 6 splash screen logo.png
Парадигма Процедурный, Объектно-ориентированный, Компонентно-ориентированный, Событийно-ориентированный
Первый   появившийся 1991
Стабильная версия 6.0
Печать дисциплины Статическая типизация, Строгая типизация, Динамическая типизация
Расширение файла .bas, .cls, .frm, .vbp, .vbg
Портал: Visual Basic
Главная реализация
Microsoft Visual Studio
Под влиянием
QuickBasic, BASIC
Влияние
Visual Basic .NET, REALbasic, Gambas, Xojo, Basic4ppc

Microsoft Visual Basic — язык программирования и интегрированная среда разработки программного обеспечения. Разрабатывался компанией Microsoft. Visual Basic унаследовал стиль и отчасти синтаксис языка BASIC, имеющего немало диалектов. Visual Basic сочетает в себе процедуры и элементы объектно-ориентированных и компонентно-ориентированных языков программирования, а интегрированная среда разработки VB содержит в себе инструменты для визуального проектирования пользовательского интерфейса, редактор кода с возможностью IntelliSense и подсветкой синтаксиса и инструменты для отладки приложений.

Достоинства и недостатки

Достоинства

  • Высокая скорость создания приложений с графическим интерфейсом для Microsoft Windows.
  • Простой синтаксис языка обеспечивает низкий порог вхождения.
  • Возможность компиляции как в машинный код, так и в P-код (по выбору программиста).
  • Безопасность типов обеспечивает защита от ошибок, связанных с применением указателей и доступом к памяти. Этот аспект делает Visual Basic приложения более стабильными, но также является объектом критики.
  • Возможность использования большинства WinAPI функций для расширения функциональных возможностей приложения. Данный вопрос наиболее полно исследован Дэном Эпплманом, написавшим книгу «Visual Basic Programmer’s Guide to the Win32 API».

Недостатки

  • Поддержка операционных систем только семейства Windows и Mac OS X (Исключение — VB1 for).
  • Отсутствие полноценного механизма наследования реализации объектов. Существующее в языке наследование позволяет наследовать только интерфейсы, но не их реализацию.
  • Практически все встроенные функции языка реализованы через библиотеку времени исполнения, которая, в свою очередь, производит много «дополнительной» работы по проверке и/или преобразованию типов, что замедляет скорость работы приложений.

Язык сильно привязан к своей среде разработки и к операционной системе Microsoft Windows, являясь исключительно инструментом написания Windows-приложений. Привязка к среде заключается в том, что существует большое количество средств, предназначенных для помощи и удобства программирования: встроенный отладчик, просмотр переменных и структур данных на лету, окно отладки, всплывающие подсказки при наборе текста программы. Все эти преимущества делают бесполезным и даже невозможным использование Visual Basic вне среды разработки, например в обычном текстовом редакторе

Стоит отметить, что все недостатки языка вытекают из его основного достоинства — простоты разработки графического интерфейса. Поэтому многие программисты используют Visual Basic для разработки интерфейса пользователя, а функциональность программы реализуют в виде динамически подключаемых библиотек, написанных на других языках.

Элементы языка

Типы данных

Переменные объявляются следующим образом: Dim varName As typeName

Где varName - имя переменной, а typeName - ее тип. Тип переменной можно не указывать, тогда переменная объявляется как Variant.

Таблица основных типов

Наименование Размер типа Описание типа данных
Byte 1 байт Байт. Предназначен для хранения целых чисел от 0 до 255. Если переменной такого типа присвоить значение, выходящее за эти пределы, то Visual Basic сгенерирует ошибку времени выполнения.
Integer 2 байта Целое. Предназначен для хранения целых чисел в диапазоне −32768 до 32767. Суффикс для обозначения типа «%».
Long 4 байта Длинное целое. Предназначен для хранения целых чисел в диапазоне −2 147 483 648 до 2 147 483 647. Суффикс для обозначения типа «&».
Single 4 байта С плавающей точкой одинарной точности. Диапазон от -3,402823E38 до -1,401298E-45 для отрицательных значений; от 1,401298E-45 до 3,402823E38 для положительных значений. Суффикс для обозначения типа «!».
Double 8 байт С плавающей точкой двойной точности. Переменные этого типа позволяют хранить числа с точностью до 16 цифр и длиной до 300 символов. Диапазон значений варьируется от −1.80E+308 до 1.80E+308. Суффиксом является «#». Вычисления с ним являются приблизительными, так как используется бинарное представление числа согласно стандарта IEEE 754.
Decimal 16 байт Масштабируемое целое. Этот тип использует десятичное представление чисел. Вычисления с ним, также как с типом Currency являются точными. Диапазон значений от −7.92E+28 до 7.92E+28. Нельзя напрямую объявить переменную с типом Decimal. Он может использоваться только как подтип для Variant и переменную можно привести к данному типу с помощью функции кастования CDec.
Boolean 2 байта Булев тип данных может хранить только два значения: True либо False, истина или ложь. Истинное значение в VB соответствует целочисленной −1, а ложь равна 0, а при неявном приведении типа, любое численное значение отличное от нуля рассматривается как истина. Такое поведение позволяет использовать логические операторы AND, OR, NOT, XOR не только для булевой алгебры, но также и для битовых операций.
String 10 + 2*N байт Строка переменной длины. Предназначен для хранения строковой (символьной) информации. Сама строка хранится в кодировке Unicode, поэтому каждый символ кодируется 2-мя байтами. Если посмотреть тип изнутри, то используется дополнительно 4 байта для хранения указателя на строку, 4 байта для размера строки, а сама строка завершается нуль-символами (ещё 2 байта). Таким образом максимальный размер строки может достигать до 2 Гбайт. Суффикс типа «$».
String*N 2*N байт Строка постоянной длины. Также как и тип String хранит символьные данные, за исключением того, что размер данных фиксированный и указывается при объявлении переменной. Если значение строки слишком большое, то она усекается до необходимого размера. Если строка меньше чем требуется, то происходит выравнивание размера добавлением символа "пробела". Следует заметить, что фиксированные строки и массивы, а также структуры не могут быть больше 64 кб.
Date 8 байт Тип данных позволяет хранить значения времени и даты в промежутке от полуночи 1 января 100 года до полуночи 31 декабря 9999 года. Если переменной присвается только значение даты, то время равняется 00:00. Целочисленная единица представляет собой одни сутки. Это позволяет добавлять и вычитать даты используя только математические операторы, но для выполнения этих целей VB предоставляет специализированные функции работы с датами.
Object 4 байта Используется для хранения ссылки на объект. Присваивание переменной для этого типа происходит с помощью оператора Set. Сам тип является аналогом IDispatch, в нем хранится ссылка на интерфейс IDispatch. Для любого объекта нужно использовать IUnknown.
Currency 8 байт Денежный. Данный тип может иметь до 4 цифр после запятой, и до 14 — перед ней. Значение представляют собой числа в десятичной системе счисления, а не в двоичной, как это происходит для типов с плавающей запятой одинарной и двойной точности. Таким образом вычисления будут произведены точно. Диапазон значений от −922 337 203 685 477,5808 до 922 337 203 685 477,5807. Данный тип является предпочтительным для проведения финансовых расчетов. Суффикс «@».
Variant 16 байт / 22 байта+N байт / N-байт Переменная типа Variant может содержать данные любого типа, включая ссылки на объекты, пользовательские типы и массивы. Visual Basic автоматически производит необходимые преобразования данных. Подтип содержащий число требует 16 байт памяти, а для хранения строковых данных 22 байта + длина самой строки. Диапазон значений равен диапазону значений подтипа. Данный тип самый медленный по скорости выполнения, так как требуется время на распаковку и упаковку значений.

Массивы

Переменная массива объявляется постановкой круглых скобок после имени переменной. Если известно количество хранимых значений, то можно также указать размер массива в описании.

Dim var1() As type1
Dim var2() As type2

Присвоение значений элементам массива:

Dim var1(4) As String
var1(0) = "green"
var1(3) = "purple"

Также можно присвоить значения элементам массива в строке объявления переменной:

Dim var() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9}

Извлечение элементов из массива

Dim var1 As Integer
var1 = var(1)

Приведенный выше код извлекает второй элемент массива var и присваивает его значение переменной var1.

Операторы

Оператор присвоения

Знак равенства (=) используется для присвоения значения переменной. Также возможно использование ключевого слова Let перед именем переменной(для совместимости с ранними версиями). Для присвоения переменной объектного типа, необходимо наличие ключевого слова Set. Примеры: nVar = 10, Let iCount = 20, Set refDouble = objClass. Многократное присваивание (A = B = C) невозможно. VB оценит выражение B = C и в переменную A присвоит результат True или False, 0 или -1, в зависимости от типа.

Арифметические операторы

  • сложение (+), вычитание (-), умножение (*), деление (/)
  • возведение в степень (^). Пример: 2 ^ 3 = 8
  • целочисленное деление (\). Делит первое число на второе, отбрасывая (не округляя) дробную часть. Пример: 5 \ 2 = 2
  • деление по модулю (Mod). Делит первое число на второе, возвращая только остаток от деления. Пример: 5 Mod 2 = 1

Операторы сравнения

  • равенство (=). Пример: If nVar = 10 Then
  • больше, чем и меньше, чем (> и <). Пример: If nVar > 10 Then
  • больше или равно и меньше или равно (>= и <=). Пример: If nVar >= 10 Then
  • не равно (<>). Пример: If nVar <> 10 Then
  • сравнение объектов (Is). Определяет, ссылаются объектные переменные на тот же объект или на разные. Пример: If obj1 Is obj2 Then
  • оператор подобия (Like). Сравнивает строковый объект с шаблоном и определяет, подходит ли шаблон. Пример: If strEmail Like "*@*.*" Then

Логические операторы

  • логическое И (And) — Обе части выражения должны быть истинными, чтобы всё выражение стало истинным. Пример: If (2 * 2 = 4) And (2 * 3 = 6) Then
  • логическое ИЛИ (Or) — должно быть истинным хотя бы одно из выражений. Пример: If (2 * 2 = 5) Or (2 * 2 = 4) Then
  • логическое отрицание (Not) — возвращает True, если условие ложно и наоборот. Пример: If Not(2 * 2 = 5) Then
  • логическое исключение (Xor) — в выражении E1 Xor E2 возвращает True, если только E1 = True или только E2 = True, иначе — False.
  • эквивалентность (Eqv) — оценивает эквивалентность двух выражений, возвращает True, если они имеют одинаковое значение.
  • импликация (Imp) — возвращает False, если E1 = True и E2 = False, иначе — True.

Операторы конкатенации

  • Оператор (+) используется для конкатенации строк. Если обе части выражения имеют символьный тип, то операция склеивания строк будет успешной. Если одна из частей выражения, имеет числовой тип, но другая часть не может быть корректно преобразована к числу, то возникает ошибка приведения типов. Чтобы не допустить таких ситуаций, рекомендуется использовать соответствующие операторы для конвертации типов или применять оператор (&) для соединения строк.
  • Оператор (&) производит автоматическое преобразование выражений и значений в строковой тип. Например, выражение str = "10" & 20 даёт результат "1020", а не "30". Если бы использовали оператор (+) в данном выражении, то VB привел бы выражение "10" к числовому типу 10, и в случае успеха, произвёл бы арифметическое сложение.

Управляющие кострукции

Оператор ветвления

Синтаксис:

If <условие> Then [действие_когда_условие_истинно]

If <условие> Then [действие_когда_условие_истинно] Else [действие_когда_условие_ложно]

If <условие> Then
    [действие_когда_условие_истинно]
ElseIf <условие2> Then
    [действие_когда_условие2_истинно]
ElseIf <условиеN> Then
    [действие_когда_условиеN_истинно]
Else
    [действие_когда_условие_ложно]
End If

Оператор выбора

Синтаксис:

Select Case <проверяемое_значение> 'Переменная или выражение, которое требуется проверить по одному или нескольким условиям
    Case <значение_1>              'Выполняется действие, если проверяемое значение будет соответствовать значению 1
        [действие_1]
    Case <значение_2>, <значение_3>, <значение_4> 'Проверяет список значений. Если найдено соответствие, то выполняется действие
        [действие_2]
    Case <значение_5> To <значение_6>       'Проверяет диапазон значений
        [действие_3]
    Case Is >= <значение_7>                 'Проверяет значение на истинность с условием
        [действие_4]
    Case Else                               'Выполняется действие, если ни одно из условий не выполнится
        [действие_5]
End Select

Цикл со счётчиком

Синтаксис:

For <переменная> = <значение> To <конечное_значение> [Step <шаговое_значение>]
    [блок_операторов]
    [Exit For] 'Выход из цикла
Next [переменная]

Совместный цикл

Синтаксис:

For Each <переменная> In <коллекция>
    [блок_операторов]
    [Exit For] 'Принудительный выход из цикла
Next [переменная]

Цикл с условием

Синтаксис:

Цикл выполняется, когда условие истинно:

Do While <условие> 
    [блок_операторов]
    [Exit Do] 'Принудительный выход из цикла
Loop

Цикл выполняется, когда условие ложно:

Do Until <условие> 
    [блок_операторов]
    [Exit Do]
Loop

Цикл выполняется, когда условие истинно:

While <условие> 
    [блок_операторов]
Wend

Цикл с постусловием

Синтаксис:

Do
    [блок_операторов]
    [Exit Do]
Loop While <условие>

Do
    [блок операторов]
    [Exit Do]
Loop Until <условие>

Процедуры и функции

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

  • Процедура начинается с оператора Sub и заканчивается End Sub, между которыми и помещается код. Процедуры могут вызываться или самим Visual Basic, например, реализованные в виде обработчиков событий, или другими процедурами и функциями. Имя процедуры обработки события состоит из имени объекта, знака подчёркивания и имени события:
Private Sub Command1_Click() 'Событие будет вызвано при нажатии на элемент управления "Кнопка"
    ...
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 'Вызывается при перемещении указателя мыши в окне формы
    ...
End Sub

На самом деле Visual Basic реализует цикл обработки оконных сообщений Windows. В примере с формой, цикл отфильтрует сообщение WM_MOUSEMOVE и автоматически вызовет процедуру Form_MouseMove с параметрами: какие кнопки мыши были нажаты, координаты указателя. Данный механизм скрывает от разработчика некоторые аспекты программирования в среде Windows, позволяя ему сразу приступить к написанию пользовательского кода. В большинстве случаев, класс решаемых задач не потребует от программиста знаний о сообщениях и оконных функциях. Но Visual Basic не ограничивает программиста самому реализовать обработку оконных сообщений. Это позволяет очень гибко подходить к построению приложений, но и потребует достаточного опыта для написания подобного кода, который может вызвать нестабильную работу программы вплоть до аварийного завершения.

  • Функции в VB начинаются с ключевого слова Function и заканчиваются End Function. Возвращаемое значение функции присваивается переменной, совпадающее с названием функции. Для того, чтобы досрочно прервать выполнение процедуры или функции, существуют специальные операторы Exit Sub и Exit Function. Visual Basic 6.0 содержит встроенные функции для работы с файловой системой, датой и временем, математические функции, функции взаимодействия с системой, функции для работы со строками, функции приведения типов и функции осуществляющие финансовые расчёты. Также существуют недокументированные функции, которые позволяют работать, например, с указателями.

Пример функции:

Public Function FunctionExample(ByVal A As Double, ByRef A As Double) As Double
        FunctionExample = 8
End Function

В этом примере можно заметить модификатор ByVal перед аргументом A. Это способствует тому, что параметры в функцию будут переданы по значению. Модификатор ByRef, напротив, передаёт значение по ссылке. Для такого типа модификатора, функция может модифицировать значения переменных, переданных в качестве параметров. Visual Basic по-умолчанию всегда передаёт значения по ссылке, если ни один из модификаторов не был указан.

Модули и классы

Программный код в Visual Basic храниться в модулях. Существуют три вида модулей:

  • Модуль формы (расширение файла *.frm) является основой большинства приложений Visual Basic. Модуль формы содержит процедуры обработки события, общие процедуры и объявленные на уровне формы: переменные, константы, типы и внешние процедуры. Если открыть модуль формы в текстовом редакторе, можно увидеть описания формы и её элементов управления, включая их свойства. Код, размещённый в модуле формы, может ссылаться на другие формы или объекты приложения.
  • Стандартный модуль (расширение файла *.bas) является контейнером для процедур, функций и объявлений, к которым обычно получают доступ другие модули приложения. Они могут содержать глобальную переменную (доступную всему приложению) или описанные на уровне модуля: переменные, константы, типы, внешние и глобальные процедуры. Код, размещённый в стандартном модуле, может быть не связан с определенным приложением; если не использовать ссылки на модуль формы или имена элементов управления, стандартный модуль может быть использован в других приложениях.
  • Модуль класса (расширение файла *.cls) является основой объектно-ориентированного программирования в Visual Basic. Модуль класса используется для создания новых объектов. Эти объекты могут иметь собственные свойства, методы и события. Фактически, форма – просто модуль класса, который может содержать элементы управления, помещенные в него, и выводить их на экран. Классы могут содержать специальные процедуры Class_Initialize и Class_Terminate, которые фактически являются конструктором и деструктором.

Объектно-ориентированное программирование

Простое взаимодействие между объектами является одним из базовых составляющих парадигмы Visual Basic. Сам объект называется экземпляром класса. Объектная модель VB предоставляет различные классы для работы с формами, элементами управления, буфером обмена, коллекциями, экраном и т.д. Для взаимодействия с другими объектами, класс предоставлянт разработчику интерфейс, состоящий из свойств, методов и событий.

Создание нового объекта из класса возможно ранним или поздним связыванием. Для раннего связывания используется ключевое слово New перед именем класса. Для позднего связывания используется функция CreateObject возвращающая ссылку на созданный объект. Присваивание ссылок осуществляется в переменные с типом Object, используя оператор Set. Доступ к методам и свойствам класса происходит через оператор - точку ., который ставится сразу после имени переменной объектного типа. Если класс содержит события, то переменные объявляются с ключевым словом WithEvents, тем самым будут доступны процедуры обработки событий.

Visual Basic позволяет разработчику самому создавать новые классы. В отличии от других языков программирования, таких как Java и C++, Visual Basic имеет неполную поддержку ООП.

Как известно, абстрактный класс необходим, чтобы предоставить шаблон для интерфейса другим классам. В Visual Basic классы имеющие члены класса, но не содержащие реализацию, можно использовать в качестве абстрактных классов, но фактически они ими не являются. Из классов Visual Basic всегда можно создать объекты, даже если они не содержат кода.

Принцип инкапсуляции действует в Visual Basic. Чтобы разграничить доступ к членам класса, служат модификаторы Public, Private и Friend, используемые при описании процедур, функций, констант, переменных и пользовательских типов.

Наследование реализации не поддерживается. Visual Basic обеспечивает только поддержку наследования интерфейса через оператор Implements. При наследовании интерфейса любой класс может действовать как базовый класс интерфейса. Вообще любой класс, может выступать как базовый класс интерфейса.

Полиморфизм обеспечивается только через интерфейсы, т.к. наследование VB не поддерживает. Реализация полиморфизма показана на примере классов Автомобиль и Самолёт реализующие интерфейс класса Транспорт.

'Класс ITransport.cls
Public Function GetMaxSpeed() As Long
End Function
'Класс CAuto.cls
Implements ITransport 'Наследуем интерфейс

Private Function ITransport_GetMaxSpeed() As Long 'Реализация метода
    ITransport_GetMaxSpeed = 240
End Function
'Класс CFly.cls
Implements ITransport

Private Function ITransport_GetMaxSpeed() As Long
    ITransport_GetMaxSpeed = 700
End Function
    Dim T As ITransport 'Объявляем переменную с типом ITransport    Set T = New cAuto
    WhatTransportSpeed T 'Передаем ссылку в процедуру, которая вызовет нужный метод класса, в зависимости от реализации    Set T = New cFly
    WhatTransportSpeed T

Простейшая программа на VB

Следующая консольная программа выводит на экран строку "Hello, World!".

Module Hello
  Sub Main()
      MsgBox("Hello, World!")  'выводит сообщение "Hello, World!"
  End Sub
End Module

Важными составляющими программы являются комментарии, процедура Main, ввод и вывод.

Комментарии

Одиночная кавычка (') в начале строки означает, что в ней содержится комментарий и компилятору следует ее игнорировать. Можно сделать комментарием всю строку или поместить комментарий в конце другого оператора.

'комментарий
MsgBox("Hello, World!") 'выводит сообщение "Hello, World!"

Процедура Main

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

Существуют четыре вида процедуры Main:

  • Sub Main()
  • Sub Main(ByVal cmdArgs() As String)
  • Function Main() As Integer
  • Function Main(ByVal cmdArgs() As String) As Integer

Наиболее распространенный вид — Sub Main(). При создании приложения Windows Forms для приложений, которые выполняются самостоятельно, необходимо написать процедуру Main.

Ввод и вывод

Процедура Main вызывает функцию MsgBox для отображения окна сообщения, содержащего строку "Hello, World!":

MsgBox("Hello, World!")

Ссылки

  1. Visual Basic 6.0 Resource Center
  2. Secure your Visual Basic 6.0 investment with Microsoft .NET
  3. Visual Basic 6 Renewed to Run on Windows 8