Условная инструкция Select Case по своим возможностям аналогична If…Then… Else, но, прежде всего, рассчитана на выбор одного варианта не из двух, а из нескольких возможных. Синтаксис инструкции Select Case следующий:
Select Case выражение
[Case список_значений_выражения-n
[инструкции-n]]…
[Case Else
[инструкции_else]]
End Select
Результат выражения, находящегося после ключевых слов Select Case, используется Visual Basic при выборе одного из блоков инструкций Case (Вариант). В начале каждого блока Case (Вариант) находится список допустимых значений. При совпадении одного из них с результатом выражения, выполняется именно этот блок Case (Вариант).
Данный список может содержать один или несколько элементов, разделенных запятыми, каждый из которых может быть:
• значением,
• выражением,
• диапазоном,
• оператором сравнения.
С непосредственными значениями и выражениями мы уже встречались. Диапазон использует ключевое слово To (До) и определяет множество допустимых значений, от минимального до максимального:
выражение_минимум To выражение_максимум
Примеры диапазонов:
1 To 5
varX To varX +20
Оператор сравнения обязательно содержит ключевое слово Is (Есть), которое олицетворяет текущий результат выражения:
Is оператор_сравнения выражение
Данный блок инструкций Case (Вариант) выполняется, если результатом оператора сравнения будет True (Истина). Примеры операторов сравнения:
Is <> 0
Is> varX
Блок инструкций Case Else (Другой вариант) выполняется, если Visual Basic не находит подходящего значения ни в одной из блоков Case (Вариант).
В следующем примере Select Case оценивает значение переменной Mark, которой до этого был присвоен номер школьной оценки в цифровом виде, и расшифровывает ее. Если значение переменной Mark отличается от допустимого (от одного до пяти), то выдается сообщение об этом.
Select Case Mark
Case 1
MsgBox «Единица»
Case 2
MsgBox «Двойка»
Case 3
MsgBox «Тройка»
Case 4
MsgBox «Четверка»
Case 5
MsgBox «Пятерка»
Case Else
MsgBox «Оценка введена неправильно!»
End Select
Инструкция GoTo выполняет безусловный переход к метке, расположенной в любой части текущей процедуры. Синтаксис безусловного перехода предельно прост:
GoTo метка
Метка является символьным идентификатором одного из операторов программы, используемым для передачи к нему управления. Она представляет собой комбинацию латинских букв и цифр, но должна состоять начинаться с буквы. В конце метки ставится символ двоеточия «:». Вот несколько образцов меток:
L2:
Good_Place:
ThisIsLabel800:
Несмотря на кажущуюся простоту, использование безусловных переходов крайне затрудняет понимание логики работы программы и увеличивает число ошибок. С другой стороны, алгоритмически доказано, что в любой программе можно обойтись без GoTo, применяя вместо этого инструкции If…Then… Else и Do… Loop.
Поэтому применение инструкции GoTo крайне не рекомендуется. Она поддерживается Visual Basic только для совместимости с предыдущими диалектами языка Basic.
Цикл For…Next повторяет группу операторов программы нужное количество раз. Синтаксис данного цикла следующий:
For счетчик = начало To конец [Step шаг]
[инструкции]
[Exit For]
[инструкции]
Next [счетчик]
В качестве счетчика используется переменная, значение которой увеличивается или уменьшается при каждом выполнении цикла, проходя значения от начала до конца диапазона с заданным шагом.
По умолчанию при каждой итерации цикла переменная счетчика увеличивается на единицу, но с помощью ключевого слова Step (Шаг) это можно изменить. Переход на новую итерацию цикла осуществляется с помощью инструкции Next.
Досрочное завершение цикла возможно с помощью инструкции Exit For, которая иногда бывает необходима, например, при возникновении ошибки.
В случае применения оператора Exit For будет продолжаться выполнение других операторов программы, расположенных после цикла.
Например, следующий цикл подает звуковой сигнал 5 раз:
For i = 1 To 5
Beep
Next i
Инструкция For определяет переменную i в качестве счетчика цикла, а также ее начальное и конечное значение. Next каждый раз увеличивает переменную i на единицу.
Кстати, указание имени счетчика после Next не обязательно и обычно используется для облегчения понимания кода программы. Инструкция Beep единственная в теле цикла. Она производит короткий гудок.
Циклы могут быть многократно вложенными. Приведем пример такого цикла, где внутри одного цикла с переменной i вложен другой цикл с переменной j:
For i = 100 To 0 Step -10
For j = 1 To 20
varY = varY * (i / j)
Next j
If i <20 Then Exit For
Next i
Немного похожий своим написанием на предыдущий, цикл For Each…Next повторяет набор операторов для каждого элемента массива или всех объектов одного семейства. Вот его синтаксис:
For Each элемент In группа
[инструкции]
[Exit For]
[инструкции]
Next [элемент]
Например, чтобы поочередно вывести на экран значения всех элементов массива MyArray, нужно написать следующий цикл:
For Each ArrItem In MyArray
Print ArrItem
Next
Do… Loop – цикл, который выполняется до тех пор, пока не будет выполнено некоторое условие, указанное вначале или в конце цикла.
Он имеет следующий синтаксис (вариант проверки условия в начале):
Do [{While | Until} условие]
[инструкции]
[Exit Do]
[инструкции]
Loop
Допустима также другая форма написания этого цикла (вариант проверки условия в конце) :
Do
[инструкции]
[Exit Do]
[инструкции]
Loop [{While | Until} условие]
Итерации цикла (выполнение этого участка кода программы) будут продолжаются снова и снова, до тех пор, пока не будет выполнено одно из двух условий:
• условие, записанное после ключевого слова While (Пока [истина]), принимает значение False (Ложь),
• условие, записанное после ключевого слова Until (Пока не [истина]), принимает значение True (Истина).
Проверку условий можно делать как в начале, перед выполнением цикла, так и в конце, когда цикл был пройден хотя бы один раз.
Без указания условий цикл Do… Loop будет работать бесконечно. Поэтому для досрочного выхода из цикла можно применять инструкцию Exit Do.
В следующем примере иллюстрируется необходимость проверки условия в начале цикла, чтобы не возникла ошибка деления на ноль:
intDig1 = 5
Do While intDig1> 0
print 100 / intDig1
intDig1 = intDig1 – 1
Loop
Инструкция With не является условием или циклом, а упрощает выполнение нескольких последовательных операций над одним объектом, помогая избежать повторного задания его имени.
В следующем примере форма Form1 позиционируется на экране и устанавливается ее размеры.
With Form1
.Left = 3500
.Top = 2500
.Width = 4000
.Height = 3000
End With
В этой главе вы научитесь:
• разбираться в разновидностях подпрограмм,
• создавать собственные подпрограммы,
• использовать встроенные процедуры и функции.
В предыдущей главе мы познакомились с возможностью изменения последовательности операторов программы с помощью условных инструкций и циклов. Сюда же можно отнести и инструкции вызова процедур.
Процедурой (Procedure) в языке Visual Basic называется именованная часть программы, которая вызывается, выполняет определенные действия и возвращает управление в строку, следующую за точку вызова.
Различают следующие основные разновидности процедур:
• обработки событий,
• общего назначения,
• встроенные.
Процедуры обработки событий (Event Procedures) вызываются самим Visual Basic, когда происходят определенные события, связанные с элементами управления. В главе 2 мы уже составляли текст таких процедур, занимающихся обработкой события Click (Щелчок) кнопок cmdHello и cmdExit.
Процедуры общего назначения (General Procedures) не привязаны ни к каким событиям или объектам. Необходимость в их написании возникает, когда в разных частях программы приходится использовать одну и ту же последовательность операторов. Тогда пишется одна процедура общего назначения, а в нужных точках программы вставляются инструкции вызова этой процедуры. Использование процедур общего назначения улучшает читаемость текста программы, а также уменьшает число ошибок.
Встроенные процедуры (Built-In Procedures) поставляются уже готовыми в комплекте Visual Basic. Они выполняют все наиболее часто требуемые операции, но их внутренняя структура скрыта от программиста. Встроенные процедуры вызываются из основной программы так же, как и процедуры общего назначения. Методы и свойства стандартных объектов, также являются встроенными процедурами, однако они могут использоваться только применительно к этим объектам.
Обобщенный синтаксис инструкции вызова процедуры (Procedure Call) выглядит следующим образом:
имя_процедуры [(список_аргументов)]
Аргументы (Arguments), иначе именуемые параметрами (Parameters), представляют собой выражения, значения которых используются в процедуре и влияют на результаты ее работы. Процедуры, не требующие входных параметров, вызываются без аргументов.
Особенности использования процедур в программе зависит еще и от того, возвращают ли они какие-нибудь значения или нет. По этому признаку все процедуры делятся на две разновидности:
• Sub (Подпрограмма) – не возвращающие значения,
• Function (Функция) – возвращающие значения.
Инструкции вызова процедур Sub (Подпрограмма) пишутся отдельной строкой. Вызов Function (Функция) обязательно должен находиться на месте одного из параметров оператора языка Visual Basic или аргумента другой процедуры, где обычно может располагаться выражение.
Основное различие в синтаксисе вызова процедур различных видов заключается в том, что перечень аргументов процедуры Sub (Подпрограмма) приводится без скобок, а у Function (Функция) – он заключен в круглые скобки.
Примеры вызовов процедур различного типа:
MySub 5, varX +3, varY / varX
Form1.Caption = Now ()
Первой строкой вызывается процедура общего назначения MySub, которой передается три параметра. Во второй строке полученное значение встроенной функции Now без параметров, возвращающей текущую системную дату и время, присваивается свойству Caption (Заголовок) формы Form1.
А теперь перейдем к более подробному рассмотрению процедур общего назначения, которым посвящена данная глава.
Процедура Sub (Подпрограмма) представляет собой последовательность операторов языка Visual Basic, выполняющая определенные действия, не возвращающая значений. Синтаксис объявления подпрограммы следующий:
[{Private|Public}] [Static] Sub имя ([список_аргументов])
[инструкции]
[Exit Sub]
[инструкции]
End Sub
Ключевое слово Private (Частная) указывает на то, что данная процедура видна только внутри текущего модуля, а Public (Общая) делает ее общедоступной.
Другое ключевое слово Static (Постоянный) информирует Visual Basic о необходимости сохранения значений внутренних переменных между вызовами процедуры, хотя от этого они и не становятся видимыми для других подпрограмм.
Процедура Sub (Подпрограмма) может получать входные данные – аргументы, которые перечисляются в круглых скобках. Если аргументы отсутствуют, круглые скобки должны оставаться пустыми.
Необязательная в использовании инструкция Exit Sub (Выход из подпрограммы) позволяет досрочно завершить работу процедуры в тех случаях, когда это вам бывает необходимо.
Пример определения общедоступной процедуры Sub (Подпрограмма) общего назначения, которая выдает нужное количество гудков:
Public Sub Trill (intCount As Integer) ‘ начало процедуры
If intCount <1 Then Exit Sub ‘ если intCount <1, то выходим
For i = 1 To intCount ‘ цикл For… Next от 1 до intCount
Beep ‘ подача звукового сигнала из динамика компьютера
Next ‘ переходим к следующей итерации цикла For… Next
End Sub
В данной процедуре, кроме обычных операторов и инструкций языка Visual Basic были использованы комментарии, представляющие собой текст, поясняющий код программы.
Чтобы Visual Basic не воспринимал комментарии в качестве неверного кода, перед ними ставится символ «‘» или инструкция Rem. Когда Visual Basic встречает признак комментария, он игнорирует остальные символы до конца текущей строки.
Теперь в коде любой другой процедуры данной формы можно осуществлять вызов процедуры Trill с аргументом – количеством гудков:
Trill 10
Чтобы процедуру можно было вызывать извне текущего программного модуля, при ее вызове требуется дополнительно указать имя формы или модуля, где она была определена. Например, если процедура Trill находится в форме Проба, то она вызывается аналогично методу данной формы:
Проба.Trill 10
Проиллюстрируем режим сохранения значения внутренних переменных между вызовами процедуры, благодаря использованию ключевого слова Static (Постоянный). Можно привести пример такой процедуры, которая выполняет какие-то действия только ограниченное число раз:
Public Static Sub Proc1 () ‘ процедура Proc1 без аргументов
Dim CallCount As Integer ‘ объявляем целую переменную
If CallCount> = 5 Then Exit Sub ‘ если CallCount> =5 – выход
CallCount = CallCount +1 ‘ увеличиваем переменную на 1
…далее выполняется что-то полезное…
End Sub ‘ завершение процедуры
Эта процедура подсчитывает количество своих вызовов, сохраняя его в переменной CallCount. Процедура Proc1 выполняет какие-то полезные действия только в течение первых 5-ти вызовов, а следующие работают «вхолостую».
Данный пример иллюстрирует тот факт, что значение переменной CallCount хранится в памяти компьютера между вызовами процедуры.
Объявление процедуры Function (Функция) по своему синтаксису подобно Sub (Подпрограмма). Отличия обусловлены тем, что функция возвращает значение:
[{Private|Public}] [Static] Function имя [(аргументы)] [As тип]
[инструкции]
имя = выражение
[Exit Function]
[инструкции]
End Function
После ключевого слова As (Как) может быть указан тип данных, возвращаемых функцией. Внутри тела процедуры Function (Функция) обязательно должен встретиться оператор, который присваивает значение имени функции, например:
Private Function GetValue ()
[инструкции]
GetValue = 3
[инструкции]
End Function
В языке Visual Basic определено большое количество встроенных функций, которые могут вызываться, но их внутреннее содержимое скрыто от программиста. Чтобы получить возвращаемое значение функции, указывают ее имя.
В данном примере производится преобразование числа в текстовую строку с помощью функции Str и запись ее в переменную strTemp:
Dim strTemp As String
strTemp = Str (-19.436)
Если возвращаемое значение не требуется, можно вызвать функцию так же, как и процедуру Sub. Следует опустить скобки и указать список аргументов. Например, следующая строка выводит сообщение с текущей датой и временем:
MsgBox Now ()
Здесь используются сразу две встроенные функции языка Visual Basic. MsgBox не возвращает никакого значения, а только выводит окно сообщения. Функция Now используется в качестве аргумента, возвращая дату и время.
При вызове процедур типа Sub (Подпрограмма) или Function (Функция) возможно использование двух способов передачи фактических значений аргументов:
• по ссылке (ByRef),
• по значению (ByVal).
По умолчанию параметры передаются в виде ссылок, что дает возможность процедурам изменять их значения. Если необходимо предотвратить возможные изменения аргументов процедуры, следует осуществлять их передачу по значению, для чего при объявлении процедуры перед аргументом использовать ключевое слово ByVal, например:
Sub Proc2 (ByVal Arg1)
End Sub
Кроме параметров, которые должны быть непременно указаны при вызове процедуры, встречаются и необязательные параметры. Для их обозначения при объявлении применяется ключевое слово Optional (Необязательный):
Sub Proc3 (Arg1, Optional Arg2)
End Sub
При вызове процедуры с аргументом Optional (Необязательный) можно как указывать, так и не указывать необязательный аргумент. Если аргумент не указан, то для него используется имеющееся значение по умолчанию. Если по умолчанию значение не присвоено, аргумент обрабатывается так же, как любая другая переменная соответствующего типа.
В данном случае, правильными будут оба варианта записи вызова этой процедуры:
Proc3 10, 15
Proc3 10
Обычный синтаксис вызова процедур предусматривает позиционную передачу аргументов, то есть в порядке их следования в описании процедуры. Также, возможен вызов процедур с именованными аргументами, которые могут передаваться в любом порядке.
Каждый именованный аргумент состоит из имени, за которым следует двоеточие со знаком равенства (:=) и значение аргумента.
Например, следующие три вызова процедуры Proc3 абсолютно равноценны между собой:
Proc3 10, 15
Proc3 Arg1:=10, Arg2:=15
Proc3 Arg2:=15, Arg1:=10
Первый вызов процедуры Proc3 осуществляется с применением обычных неименованных аргументов. Вторая и третья строка показывает пример использования именованных аргументов Arg1 и Arg2.
В этой главе вы научитесь:
• использовать константы, переменные и массивы,
• выбирать для них нужные типы данных,
• преобразовать один тип данных в другой.
Константы, переменные или свойства объектов в языке программирования Visual Basic, могут содержать информацию различного формата, например, число, текстовую строку и другие.
Тип данных (Data Type) определяет стандартный способ представления данных в памяти компьютера, включая их формат и количество ячеек памяти в байтах (Bytes), которые потребуются для хранения информации. Типы данных используются для объявления констант, переменных и массивов. Также, свойства объектов и значение любого выражения имеют какой-то определенный тип.
Простые типы данных, которые могут применяться в программах на языке Visual Basic без всякого дополнительного объявления, перечислены в таблице (Рис.7.1).
Рис.7.1. Простые типы данных Visual Basic
Boolean (Логический) является самым простым из вышеперечисленных типов данных. Он может иметь только одно из двух возможных значений:
• True (Истина) – любое число, кроме нуля,
• False (Ложь) – ноль.
Типы Byte (Байт), Integer (Целый) и Long (Длинный целый) может содержать любое целое число в допустимом диапазоне.
Для чисел с плавающей точкой используются типы Single (Одинарной точности), Double (Двойной точности), Currency (Денежный) и Decimal (Десятичный). Разделителем целой и дробной части всегда является точка, независимо от национальных настроек Windows. Тип данных Decimal (Десятичный) не используется отдельно, а только в составе типа Variant (Варьируемый).
Дата и время по отдельности или их комбинация может содержаться в типе данных Date (Дата).
Два типа String (Строковый), предназначены для строк символов переменной или фиксированной длины.
Тип данных Object (Объектный) содержит не сам объект, а лишь указатель на его местоположение в оперативной памяти компьютера.
Самым универсальным типом данных является Variant (Варьируемый), который может содержать значение любого из описанных ранее типов. Однако у него есть и свои недостатки: данные этого типа медленнее всего обрабатываются Visual Basic и возрастает вероятность неправильного использования типов данных в процессе работы приложения.
Важнейшими характеристиками числовых типов данных служат диапазон значений (Range) и точность (Precision). Диапазон значений определяет, сможет ли нужное число уместиться в пределах данного типа, может быть в округленном виде. Точность указывает, какое именно количество десятичных знаков числа будут сохранены без округления.
Например, для сохранения всех разрядов числа 123 456 789 лучше всего подойдут типы данных Long (Длинный целый) и Double (Двойной точности). Если же использовать тип Single (Одинарной точности), нижние 2 разряда числа будут округлены и в результате получится 1,234568E+08 или, другими словами, получится 123 456 800 вместо 123 456 789:
Dim Dig1 As Single ‘ объявляем переменную Dig1 типа Single
Dig1 = 123456789 ‘ записывает туда число 123 456 789
MsgBox Dig1 ‘ выводим значение переменной Dig1
В практике программирования нередко возникает необходимость использования другого типа данных, то есть в преобразовании типов.
Такое преобразование осуществляется с помощью встроенных функций языка Visual Basic. Допустимы только некоторые виды преобразований, которые перечислены в таблице (Рис.7.2).
Рис.7.2. Функции языка Visual Basic
для преобразования типов данных
Теперь проверим на практике возможности преобразования типов данных, создав полезную программу, состоящую из одной строки.
Откройте окно кода с процедурой обработки события cmdHello_Click двойным щелчком мыши на кнопке Приветствие.
Удалите тело процедуры, между Private Sub и End Sub, а вместо этого впишите туда строку:
MsgBox Asc (InputBox («Введите символ»))
Теперь процедура должна выглядеть следующим образом:
Private Sub cmdHello_Click ()
MsgBox Asc (InputBox («Введите символ»))
End Sub
Единственной строкой кода производятся следующие действия: встроенная функция InputBox запрашивает ввод символа с клавиатуры, затем этот символ передается на вход функции Asc, преобразующей символ в код ASCII – American Standard Code for Information Interchange (Американский стандартный код для информационного обмена), который выводится на экран с помощью встроенной процедуры MsgBox.
Запустите сделанную вами однострочную программу щелчком мыши на кнопке Start (Запуск) панели инструментов или нажмите клавишу [F5].
Нажмите на форме кнопку Приветствие. Появится диалог с запросом о вводе символа (Рис.7.3).
Рис.7.3. Диалог с запросом о вводе символа
Введите какую-нибудь букву, цифру или любой другой символ и щелкните мышью на кнопке OK, либо нажмите клавишу [Enter], чтобы подтвердить ввод и передать введённое значение программе.
Появится окно сообщения с числовым значением кода данного символа (Рис.7.4).
Рис.7.4. Окно сообщения
с числовым значением кода символа
Такая получилась простая и в то же время полезная программа! Поэкспериментируйте с ней, вводя различные символы с клавиатуры. Завершите программу, щелкнув на кнопке End (Закончить).
Аналогичным образом работают и другие функции преобразования типов данных. Подробнее о каждой из них можно узнать в справочной системе Visual Basic.
Бесплатный фрагмент закончился.