Visual Basic.txt 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. #Visual Basic
  2. Бондаренко Виталий группа 47
  3. Microsoft Visual Basic — язык программирования, а также интегрированная среда разработки программного обеспечения, разрабатываемые корпорацией Microsoft. Язык Visual Basic унаследовал дух, стиль и отчасти синтаксис своего предка — языка BASIC, у которого есть немало диалектов. В то же время Visual Basic сочетает в себе процедуры и элементы объектно-ориентированных и компонентно-ориентированных языков программирования. Интегрированная среда разработки VB включает инструменты для визуального проектирования пользовательского интерфейса, редактор кода с возможностью IntelliSense и подсветкой синтаксиса, а также инструменты для отладки приложений.
  4. Visual Basic также является хорошим средством быстрой разработки (RAD) приложений баз данных для операционных систем семейства Microsoft Windows. Множество готовых компонентов, поставляемых вместе со средой, призвано помочь программисту сразу же начать разрабатывать бизнес-логику бизнес-приложения, не отвлекая его внимание на написание кода запуска программы, подписки на события и другие механизмы, которые VB реализует автоматически.
  5. Первое признание серьёзными разработчиками Visual Basic получил после выхода версии 3. Окончательное признание как полноценного средства программирования для Windows — при выходе версии 5. Версия VB6, входящая в состав Microsoft Visual Studio 6.0, стала по-настоящему зрелым и функционально богатым продуктом.
  6. Элементы языка
  7. Типы данных
  8. Переменные в Visual Basic объявляются оператором Dim, после которого указывается имя, затем - ключевое слово As и тип переменной. Если тип опущен, то ключевое слово As не указывается и переменная объявляется как Variant. Если не указать конструкцию Option Explicit в разделе деклараций, то явного объявления переменных не требуется и они автоматически будут созданы при первом использовании. Данное поведение может привести к снижению скорости выполнения программы, так как необъявленные переменные будут иметь тип Variant, а также возможны логические ошибки, связанные с неверным вводом имени имеющейся переменной или риска конфликтов в приложении, когда область определения переменной не совсем ясна.
  9. Dim strMessage As String 'объявление переменной символьного типа
  10. Dim iProductCount As Integer 'объявление переменной целочисленного типа
  11. Dim dt70YearsOfVictory As Date 'объявление переменной для хранения даты и времени
  12. Dim otherValue ' тип не указан, переменная типа Variant
  13. Public Sub Main()
  14. strMessage = "Привет, Мир!"
  15. iProductCount = 125
  16. dt70YearsOfVictory = #5/9/2015 2:00:00 PM# ' дата 9 мая 2015 14:00:00
  17. otherValue = 12.5 ' тип переменной Variant, подтип Double.
  18. otherValue = "Википедия" ' тип переменной Variant, подтип String.
  19. End Sub
  20. Операторы
  21. Язык Visual Basic содержит множество операторов, которые отвечают за арифметические операции, операции сравнения и присвоения, а также конкатенации.
  22. Оператор присвоения
  23. Знак равенства (=) используется для присвоения значения переменной. Также возможно использование ключевого слова Let перед именем переменной. В ранних версиях языка BASIC его наличие было обязательным, но в Visual Basic он оставлен для совместимости. Для присвоения переменной объектного типа, необходимо наличие ключевого слова Set. Примеры: nVar = 10, Let iCount = 20, Set refDouble = objClass.
  24. Многократное присваивание, так как это реализовано в языке C, невозможно. A = B = C не означает, что A, B и C будут иметь равные значения. VB оценит выражение B = C и в переменную A присвоит результат True или False, 0 или ?1, в зависимости от типа.
  25. Арифметические операторы
  26. сложение (+), вычитание (-), умножение (*), деление (/)
  27. возведение в степень (^). Пример: 2 ^ 3 = 8
  28. целочисленное деление (\). Делит первое число на второе, отбрасывая (не округляя) дробную часть. Пример: 5 \ 2 = 2
  29. деление по модулю (Mod). Делит первое число на второе, возвращая только остаток от деления. Пример: 5 Mod 2 = 1
  30. Операторы сравнения
  31. равенство (=). Пример: If nVar = 10 Then
  32. больше, чем и меньше, чем (> и <). Пример: If nVar > 10 Then
  33. больше или равно и меньше или равно (>= и <=). Пример: If nVar >= 10 Then
  34. не равно (<>). Пример: If nVar <> 10 Then
  35. сравнение объектов (Is). Определяет, ссылаются объектные переменные на тот же объект или на разные. Пример: If obj1 Is obj2 Then
  36. оператор подобия (Like). Сравнивает строковый объект с шаблоном и определяет, подходит ли шаблон. Пример: If strEmail Like "*@*.*" Then
  37. Логические операторы
  38. логическое И (And) — Обе части выражения должны быть истинными, чтобы всё выражение стало истинным. Пример: If (2 * 2 = 4) And (2 * 3 = 6) Then
  39. логическое ИЛИ (Or) — должно быть истинным хотя бы одно из выражений. Пример: If (2 * 2 = 5) Or (2 * 2 = 4) Then
  40. логическое отрицание (Not) — возвращает True, если условие ложно и наоборот. Пример: If Not(2 * 2 = 5) Then
  41. логическое исключение (Xor) — в выражении E1 Xor E2 возвращает True, если только E1 = True или только E2 = True, иначе — False.
  42. эквивалентность (Eqv) — оценивает эквивалентность двух выражений, возвращает True, если они имеют одинаковое значение.
  43. импликация (Imp) — возвращает False, если E1 = True и E2 = False, иначе — True.
  44. Операторы конкатенации
  45. Оператор (+) используется для конкатенации строк. Если обе части выражения имеют символьный тип, то операция склеивания строк будет успешной. Если одна из частей выражения, имеет числовой тип, но другая часть не может быть корректно преобразована к числу, то возникает ошибка приведения типов. Чтобы не допустить таких ситуаций, рекомендуется использовать соответствующие операторы для конвертации типов или применять оператор (&) для соединения строк.
  46. Оператор (&) производит автоматическое преобразование выражений и значений в строковой тип. Например, выражение str = "10" & 20 даёт результат «1020», а не «30». Если бы использовали оператор (+) в данном выражении, то VB привел бы выражение «10» к числовому типу 10, и в случае успеха, произвёл бы арифметическое сложение.
  47. Управляющие конструкции
  48. В Visual Basic, как и во многих языках программирования, существуют конструкции, предназначенные для управления порядком выполнения действий. Некоторые из конструкций, такие как GoSub и Return, оставлены для совместимости с ранними версиями языка BASIC, но реализация в виде отдельных процедур может обеспечить более структурированный код.
  49. Оператор ветвления
  50. Общий синтаксис:
  51. 'Запись оператора ветвления в одну строку
  52. If <условие> Then [действие_когда_условие_истинно]
  53. 'Такая запись позволит выполнить действия в зависимости от истинности условия
  54. If <условие> Then [действие_когда_условие_истинно] Else [действие_когда_условие_ложно]
  55. 'Запись оператора ветвления в несколько строк
  56. If <условие> Then
  57. [действие_когда_условие_истинно]
  58. ElseIf <условие2> Then
  59. [действие_когда_условие2_истинно]
  60. ElseIf <условиеN> Then
  61. [действие_когда_условиеN_истинно]
  62. Else
  63. [действие_когда_условие_ложно]
  64. End If
  65. Оператор выбора
  66. Общий синтаксис:
  67. Select Case <проверяемое_значение> 'Переменная или выражение, которое требуется проверить по одному или нескольким условиям
  68. Case <значение_1> 'Выполняется действие, если проверяемое значение будет соответствовать значению 1
  69. [действие_1]
  70. Case <значение_2>, <значение_3>, <значение_3> 'Проверяет список значений. Если найдено соответствие, то выполняется действие
  71. [действие_2]
  72. Case <значение_5> To <значение_6> 'Проверяет диапазон значений
  73. [действие_3]
  74. Case Is >= <значение_7> 'Проверяет значение на истинность с условием
  75. [действие_4]
  76. Case Else 'Выполняется действие, если ни одно из условий не выполнится
  77. [действие_5]
  78. End Select
  79. Пример: вывод различных сообщений в зависимости от значения переменной
  80. 'Введём переменную и дадим ей значение вручную
  81. Dim X As Double
  82. X = InputBox("Введите числовое значение переменной Х")
  83. Select Case X 'Проверим, подходит ли некоторой воображаемой функции наше значение
  84. Case Is < 5, Is >= 20, 12 To 15 'Диапазон подходящих значений
  85. MsgBox "Действительное значение для некоторой функции"
  86. Case Else 'Не подходящие значения
  87. MsgBox "Значение не может быть использовано в некоторой функции"
  88. End Select
  89. Цикл со счётчиком
  90. Общий синтаксис:
  91. For <переменная> = <значение> To <конечное_значение> [Step <шаговое_значение>]
  92. [блок_операторов]
  93. [Exit For] 'Выход из цикла
  94. Next [переменная]
  95. Пример: подсчёт суммы чётных чисел от 1 до 100
  96. For I = 0 To 100 Step 2
  97. Sum = Sum + I
  98. Next
  99. Совместный цикл
  100. Общий синтаксис:
  101. For Each <переменная> In <коллекция>
  102. [блок_операторов]
  103. [Exit For] 'Принудительный выход из цикла
  104. Next [переменная]
  105. Пример: выводит на экран каждый элемент из массива
  106. Dim strItem As Variant
  107. For Each strItem In Array("Яблоко", "Груша", "Слива")
  108. Print strItem
  109. Next
  110. Цикл с условием
  111. Общий синтаксис:
  112. Do While <условие> 'Цикл выполняется, когда условие истинно
  113. [блок_операторов]
  114. [Exit Do] 'Принудительный выход из цикла
  115. Loop
  116. Do Until <условие> 'Цикл выполняется, когда условие ложно
  117. [блок_операторов]
  118. [Exit Do]
  119. Loop
  120. While <условие> 'Цикл выполняется, когда условие истинно
  121. [блок_операторов]
  122. Wend
  123. Пример: Построчное чтение текстового файла
  124. Open "file.txt" For Input As #1
  125. Do While Not EOF(1) 'Возвратит True, если ожидается конец файла
  126. Line Input #1, strBuffer 'Чтение строки в переменную
  127. Debug.Print strBuffer 'Вывод в окно отладки
  128. Loop
  129. Close #1
  130. Цикл с постусловием
  131. Общий синтаксис:
  132. Do
  133. [блок_операторов]
  134. [Exit Do]
  135. Loop While <условие>
  136. Do
  137. [блок операторов]
  138. [Exit Do]
  139. Loop Until <условие>
  140. Процедуры и функции
  141. Подпрограммы являются одними из основных элементов языка. Они представляют собой процедуры и функции.
  142. Процедура начинается с оператора Sub и заканчивается End Sub, между которыми и помещается код. Процедуры могут вызываться или самим Visual Basic, например, реализованные в виде обработчиков событий, или другими процедурами и функциями. Имя процедуры обработки события состоит из имени объекта, знака подчёркивания и имени события:
  143. Private Sub Command1_Click() 'Событие будет вызвано при нажатии на элемент управления "Кнопка"
  144. ...
  145. End Sub
  146. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 'Вызывается при перемещении указателя мыши в окне формы
  147. ...
  148. End Sub
  149. На самом деле Visual Basic реализует цикл обработки оконных сообщений Windows. В примере с формой, цикл отфильтрует сообщение WM_MOUSEMOVE и автоматически вызовет процедуру Form_MouseMove с параметрами: какие кнопки мыши были нажаты, координаты указателя. Данный механизм скрывает от разработчика некоторые аспекты программирования в среде Windows, позволяя ему сразу приступить к написанию коммерческого кода. В большинстве случаев, класс решаемых задач не потребует от программиста знаний о сообщениях и оконных функциях. Но Visual Basic не ограничивает программиста самому реализовать обработку оконных сообщений. Это позволяет очень гибко подходить к построению приложений, но и потребует достаточного опыта для написания подобного кода, который может вызвать нестабильную работу программы вплоть до аварийного завершения.
  150. Функции в VB начинаются с ключевого слова Function и заканчиваются End Function. Возвращаемое значение функции присваивается переменной, совпадающее с названием функции. Для того, чтобы досрочно прервать выполнение процедуры или функции, существуют специальные операторы Exit Sub и Exit Function. Visual Basic 6.0 содержит встроенные функции для работы с файловой системой, датой и временем, математические функции, функции взаимодействия с системой, функции для работы со строками, функции приведения типов и функции осуществляющие финансовые расчёты. Также существуют недокументированные функции, которые позволяют работать, например, с указателями.
  151. Пример функции для решения квадратного уравнения:
  152. Private Sub Main()
  153. Dim RetX1 As Double, RetX2 As Double
  154. Dim strStatus As String
  155. strStatus = SolveQuadraticEquation(4, 6, 2, RetX1, RetX2) 'Решение уравнения 4*X^2 + 6*X - 2 = 0
  156. 'Выводим ответ
  157. MsgBox "Решение: " & strStatus & vbCrLf & _
  158. "X1 = " & RetX1 & vbCrLf & _
  159. "X2 = " & RetX2, vbInformation
  160. End Sub
  161. 'Функция решения квадратного уравнения
  162. Public Function SolveQuadraticEquation(ByVal A As Double, _
  163. ByVal B As Double, _
  164. ByVal C As Double, _
  165. ByRef X1 As Double, _
  166. ByRef X2 As Double) As String
  167. Dim D As Double
  168. D = (B * B) - (4 * A * C) 'Получаем значение дискриминанта
  169. If D >= 0 Then
  170. X1 = (-B - Sqr(D)) / (2 * A) 'Вычисляем корни уравнения
  171. X2 = (-B + Sqr(D)) / (2 * A)
  172. SolveQuadraticEquation = "Решение получено" 'Функция возвращает сообщение о решении
  173. Else
  174. SolveQuadraticEquation = "Дискриминант < 0. Корней нет"
  175. End If
  176. End Function
  177. В этом примере можно заметить модификатор ByVal перед аргументами A, B и C. Это способствует тому, что параметры в функцию будут переданы по значению. Модификатор ByRef, напротив, передаёт значение по ссылке. Для такого типа модификатора, функция может модифицировать значения переменных, переданных в качестве параметров. Visual Basic по-умолчанию всегда передаёт значения по ссылке, если ни один из модификаторов не был указан.
  178. Модули и классы
  179. Программный код в Visual Basic хранится в модулях. Существуют всего три вида модулей: модуль формы (Form), стандартный модуль (Module) и модуль класса (Class Module).
  180. Модуль формы (расширение файла *.frm) является основой большинства приложений Visual Basic. Модуль формы содержит процедуры обработки события, общие процедуры и объявленные на уровне формы: переменные, константы, типы и внешние процедуры. Если открыть модуль формы в текстовом редакторе, можно увидеть описания формы и её элементов управления, включая их свойства. Код, размещённый в модуле формы, может ссылаться на другие формы или объекты приложения.
  181. Стандартный модуль (расширение файла *.bas) является контейнером для процедур, функций и объявлений, к которым обычно получают доступ другие модули приложения. Они могут содержать глобальную переменную (доступную всему приложению) или описанные на уровне модуля: переменные, константы, типы, внешние и глобальные процедуры. Код, размещённый в стандартном модуле, может быть не связан с определенным приложением; если не использовать ссылки на модуль формы или имена элементов управления, стандартный модуль может быть использован в других приложениях.
  182. Модуль класса (расширение файла *.cls) является основой объектно-ориентированного программирования в Visual Basic. Модуль класса используется для создания новых объектов. Эти объекты могут иметь собственные свойства, методы и события. Фактически, форма — просто модуль класса, который может содержать элементы управления, помещенные в него, и выводить их на экран. Классы могут содержать специальные процедуры Class_Initialize и Class_Terminate, которые фактически являются конструктором и деструктором.
  183. Объектно-ориентированное программирование
  184. Простое взаимодействие между объектами является одним из базовых составляющих парадигмы Visual Basic. Сам объект называют экземпляром класса. Объектная модель VB предоставляет различные классы для работы с формами, элементами управления, буфером обмена, коллекциями, экраном и т. д. Для взаимодействия с другими объектами класс предоставляет разработчику интерфейс, состоящий из свойств, методов и событий.
  185. Создание нового объекта из класса возможно ранним или поздним связыванием. Для раннего связывания используется ключевое слово New перед именем класса. Для позднего связывания используется функция CreateObject, возвращающая ссылку на созданный объект. Присваивание ссылок осуществляется в переменные с типом Object, используя оператор Set. Доступ к методам и свойствам класса происходит через оператор точку ., который ставится сразу после имени переменной объектного типа. Если класс содержит события, то переменные объявляются с ключевым словом WithEvents, тем самым будут доступны процедуры обработки событий.
  186. Пример показывает взаимодействие программы с библиотекой Microsoft Scripting Runtime, предоставляющей объекты для работы с файловой системой:
  187. Public Sub Main()
  188. Dim objFSO As New FileSystemObject 'Создаём экземпляр класса, используя оператор New
  189. Dim objWindows As Folder
  190. Set objWindows = objFSO.GetFolder(Environ("SYSTEMROOT")) 'Вызываем метод класса GetFolder и присваиваем ссылку на полученный объект
  191. MsgBox "Папка Windows: " & objWindows.Path 'Читаем свойства класса
  192. MsgBox "Дата создания: " & Format(objWindows.DateCreated, "YYYY-MM-DD H:mm:ss")
  193. Dim sTextFilePath As String
  194. Dim objTS As TextStream
  195. sTextFilePath = objFSO.BuildPath(Environ("TEMP"), "Тестовый файл.txt") 'Метод с двумя параметрам возвращает значение типа String
  196. Set objTS = objFSO.CreateTextFile(sTextFilePath, True)
  197. objTS.Write "Привет, Википедия!"
  198. objTS.Close
  199. objFSO.DeleteFile sTextFilePath, True
  200. Set objFSO = Nothing 'Присваивая Nothing, происходит освобождение ссылки, и объект может вызвать процедуру деструктора
  201. Set objWindows = Nothing 'VB автоматически вызывает деструктор, если на объект больше не ссылаются
  202. Set objTS = Nothing
  203. End Sub
  204. Visual Basic позволяет разработчику самому создавать новые классы. В отличие от других языков программирования, таких как Java и C++, Visual Basic имеет неполную поддержку ООП.
  205. Как известно, абстрактный класс необходим, чтобы предоставить шаблон для интерфейса другим классам. В Visual Basic классы имеющие члены класса, но не содержащие реализацию, можно использовать в качестве абстрактных классов, но фактически они ими не являются. Из классов Visual Basic всегда можно создать объекты, даже если они не содержат кода[4]
  206. Принцип инкапсуляции действует в Visual Basic. Чтобы разграничить доступ к членам класса, служат модификаторы Public, Private и Friend, используемые при описании процедур, функций, констант, переменных и пользовательских типов.
  207. Наследование реализации не поддерживается. Visual Basic обеспечивает только поддержку наследования интерфейса через оператор Implements. При наследовании интерфейса любой класс может действовать как базовый класс интерфейса. Вообще любой класс, может выступать как базовый класс интерфейса.
  208. Полиморфизм обеспечивается только через интерфейсы, так как наследование VB не поддерживает. Реализация полиморфизма показана на примере классов Автомобиль и Самолёт реализующие интерфейс класса Транспорт.
  209. 'Класс ITransport.cls
  210. Public Function GetMaxSpeed() As Long
  211. End Function
  212. 'Класс CAuto.cls
  213. Implements ITransport 'Наследуем интерфейс
  214. Private Function ITransport_GetMaxSpeed() As Long 'Реализация метода
  215. ITransport_GetMaxSpeed = 240
  216. End Function
  217. 'Класс CFly.cls
  218. Implements ITransport
  219. Private Function ITransport_GetMaxSpeed() As Long
  220. ITransport_GetMaxSpeed = 700
  221. End Function
  222. 'Стандартный модуль Program.bas
  223. Option Explicit
  224. Public Sub Main()
  225. Dim T As ITransport 'Объявляем переменную с типом ITransport
  226. Set T = New cAuto
  227. WhatTransportSpeed T 'Передаем ссылку в процедуру, которая вызовет нужный метод класса, в зависимости от реализации
  228. Set T = New cFly
  229. WhatTransportSpeed T
  230. End Sub
  231. 'Функция имеет аргумент, который принимает ссылку на объект, реализующий интерфейс ITransport
  232. Public Sub WhatTransportSpeed(Transport As ITransport)
  233. MsgBox "Максимальная скорость: " & Transport.GetMaxSpeed()
  234. End Sub