
СТРУКТУРНЫЕ ОСОБЕННОСТИ ПРИЛОЖЕНИЙ VB
Если проект сравнительно прост, то его программный код можно полностью поместить в модуле формы. Но при увеличении сложности проекта код удобнее составлять не одним большим куском, а частями. Эти части называются модулями. Каждый модуль будет может храниться в отдельном файле, его можно добавлять в проект, редактировать. Приложение VB (проект) – это совокупность модулей экранных форм, исходных (отдельных) модулей, модулей классов и других элементов, с помощью которых решается некоторая задача.
Количество программного кода, которое может содержаться в каждом модуле ограничено 65534 строками, при этом одна строка кода не может превышать 1024 байт.
Исходный модуль добавляется в проект командой Project\Add Module. Все описания в исходном модуле должны быть с видимостью Public (то есть глобальными).
Модуль формы добавляется в проект командой Project\Add Form, а модуль класса – командой
Project\Add Class Module.
Есть ограничения и для проектов. Один проект может содержать до 32000 любых идентификаторов (имен форм, модулей, классов, переменных, констант, процедур, функций, объектов и пр.). Длина идентификаторов не может превышать 40 символов.
Подпрограммы
Представление программного кода приложения в виде отдельных компактных модулей – это одно из проявлений модульного принципа программирования (МПП). Другим проявлением МПП является разбиение программного кода уже внутри модуля на отдельные части – подпрограммы: процедуры-события и подпрограммы общего назначения (ПОН) – общие процедуры и функции, не связанные с конкретными событиями объектов и которые разработчик создает по своему усмотрению.
На рисунке ниже представлена общая схема программной структуры модуля. Так, один модуль формы может содержать несколько процедур-событий и подпрограмм общего назначения. ПОН могут размещаться в любых модулях, при этом они выполняют самостоятельные действия и предназначены для многократного использования.

Общая структура программного кода модуля формы VB
может быть представлена следующей схемой. [<Раздел контейнерных (уровня модуля) описаний>] [<Начало n-й процедуры-события >
<Раздел локальных описаний> <Раздел операторов>
<Конец n-й процедуры-события >] [<Начало k-й ПОН >
<Раздел локальных описаний>
<Раздел операторов>
<Конец k-й ПОН>],
Вмодуле формы общих процедур и функций может и не быть, а в исходном модуле, наоборот, процедур-событий не должно быть. Приведенная структура не является строго обязательной. Так, разделы описаний могут вообще отсутствовать или располагаться внутри блоков операторов, а процедуры-события и ПОН могут размещаться в программном коде в любом порядке.
Процедура-событие вызывается в ответ на какое-то событие объекта (щелчок мыши по кнопке или изменение значения поля, перемещение мыши, нажатие символа на клавиатуре). Она после запуска программы (загрузки формы) постоянно находится в состоянии ожидания события. На рис.81 показана схема последовательной смены событий при работе с формой. При этом каждое событие формы может иметь свой программный код.

Общими процедуры и функции называются потому, что могут быть вызваны явно из любой подпрограммы другого контейнера, если только они не были объявлены как Private. После выполнения такой подпрограммы происходит автоматический возврат в то место программы, откуда подпрограмма была вызвана.
Процедура и функция имеет имя и возможный список формальных параметров (СФормП).
Синтаксис описания процедур и функций следующий
[Private|Public][Static] Sub <имя процедуры> [(<СФормП>)] <Раздел локальных описаний> <Раздел операторов>
End Sub
[Private|Public][Static] Function <имя функции> [(<СФормП>)] [As <Тип>]
<Раздел локальных описаний> <Раздел операторов>
End Function
Private или Public – это области видимости. Если область
явно не указана, то по умолчанию подпрограмма будет
отнесена к классу Public. (Напомню, что Private
определяет локальную подпрограмму, которая будет видна
только внутри данного модуля, Public – глобальная подпрограмма, которая будет видна из других модулей).
Наличие в заголовке описания подпрограммы слова Static
позволит сохранить значения всех локальных переменных
между последовательными вызовами этой подпрограммы. При отсутствии этого слова все значения локальных
переменных обнуляются перед обращением к подпрограмме.
Процедуры и функции могут иметь формальные параметры, которые могут быть входными и выходными.
Входной параметр – это переменная, значение которой должно быть установлено до начала работы подпрограммы
и которая участвует в работе подпрограммы.
Выходной параметр – это переменная, которая получает свое значение в результате работы подпрограммы.
Входные и выходные параметры в списке формальных
параметров записываются через запятую с обязательным
указанием типа параметра. Разделение на входные и
выходные формальные параметры происходит в заголовке
подпрограмм с помощью ключевых слов byVal и byRef (по умолчанию). В списке формальных параметров можно
определить необязательный параметр, если сопроводить
его ключевым словом Optional.
Общая процедура вызывается как отдельный оператор со
списком фактических параметров СФактП, а функция
может вызываться либо из выражения (при этом она возвращает результат работы в имени функции), либо как
отдельный оператор, то есть как общая процедура, тогда результат возвращается через выходные параметры. Список фактических параметров – это входные параметры для подпрограммы, которые могут быть переменными, константами, динамическими массивами и выражениями. В списке фактических параметров для необязательного параметра может отсутствовать значение.
Синтаксис оператора вызова подпрограммы:
Call Имя_подпрограммы [(<СФактП>)]
или бесскобочная форма записи оператора вызова подпрограммы: Имя_подпрограммы [<СФактП >]
По умолчанию формальные параметры в подпрограмме
являются одновременно входными и выходными, если не использовать перед ними ключевого слова byVal. Тогда
процесс передачи фактических параметров на место формальных параметров при вызове подпрограммы будет выполняться по ссылке (т.е. будет передаваться адрес
фактической переменной). Это значит, что подпрограмма получает доступ к области памяти, где хранится
оригинальное значение переменной, и может его изменить
в подпрограмме. Такой формальный параметр часто называется параметром-переменной.
Возможна передача фактических параметров по значению. В этом случае переменная копируется, и подпрограмма получает только копию от значения переменной, а не адрес. Но тогда перед такими формальными параметрами
в заголовке подпрограммы следует указать ключевое слова byVal. Это защитит передаваемую переменную (фактический параметр) от изменения. Такой формальный параметр часто называется параметром-значением.

Рис.82. Схема вызова общих процедур и функций
Пример. Описать процедуру определения стороны ромба по известному углу и радиусу вписанной окружности и две функции, вычисляющие площадь треугольника и площадь параллелограмма.
Dim A As Double, B As Double, C As Double, _
Z As Double
Private Sub Ромб(ByVal R As Double, ByVal A As Double, Z As Double)
IF sin(A) <=0 Then
MsgBox “Задайте другой угол”
Else
Z = 2*R/sin(A) End If
End Sub
Private Function Parall(ByVal A As Double, ByVal B As Double, ByVal Angle As Double, Z As Double)
IF sin(Angle) <=0 Then
MsgBox “Задайте другой угол”, vbCritical,”Ошибка”
Else
Z = A*B*sin(Angle) End If
End Function
Private Function Triangle(ByVal A As Double, ByVal B As Double, ByVal C As Double) As Double
P# = (A + B + C) / 2
P = P * (P - A) * (P - B) * (P - C) IF P<0 Then
MsgBox “Неверно заданы параметры”, _ vbCritical,”Ошибка”
Else
Triangle = Sqr(P) End If
End Function
Private Sub Form_Load()
A=10 : B=3.1415926/4 : C=7 Call Ромб(A, B, Romb#)
MsgBox “Сторона ромба = “ & Romb , , _ "Подпрограммы"
Z = Triangle(A, Round(B*10), C)
MsgBox “ПлощадьТреугольника = “ & Z , , _ "Подпрограммы"
Parall A, C, B, Z
MsgBox “ПлощадьПарал-ма = “ & Z , , _ "Подпрограммы"
End Sub


Существуют три способа описания переменных.
1. С помощью оператора объявления переменной.
При этом каждая переменная должна быть описана либо отдельной строкой, либо через запятую, согласно следующему синтаксису:
Public | Private | Dim | Static <Имя переменной>
[As [New] <Тип>].
В квадратные скобки заключена необязательная часть оператора, в угловых скобках – правильный идентификатор, вертикальная черта
– означает выбор одного из слов. Первое ключевое слово определяет область видимости переменной. Public-глобальная (открытая) пере-менная, доступная всему приложению. Она одинаково определена и имеет одно и то же значение во всех модулях и подпрограммах (процедурах и функциях) проекта. Dim – контейнерная переменная, доступная для всех подпрограмм соответствующего контейнера: модуля, формы, класса.
Private – локальная переменная, доступная лишь на
уровне подпрограммы, где была объявлена. При выходе из подпрограммы локально объявленные переменные уничтожаются. При следующем вызове подпрограммы все локальные переменные инициализируются заново (обнуляются). Особенности подпрограмм будут рассмотрены позже.
Например, запись нескольких переменных в одной строке может выглядеть так:
Dim i As Integer, j As Integer, s As String, bbb _
As Boolean,
а при объявлении переменных в виде
Dim i, j, k As Integer лишь переменная k будет
иметь тип Integer, а остальные переменные (i, j) будут иметь тип Variant.
Private Sub Command1_Click()
Static C As Integer C = C +1
Text1 = C 'По умолчанию используется свойство Text
End Sub
2. Тип переменных можно задать в коде при определении их значения с помощью специальных префиксов: % – для Integer, & – для
Long, ! – для Single, # – для Double, @ – для Currency, $ – для String. Например,
a%=5 : x%=11 : Sum = Sum# + sin(a*x)/a.
3. Тип переменной можно задать с помощью
оператора объявления типа Def… (DefByte,
DefInt, DefLng, DefSng, DefDbl и т. д.), но обязательно в области GD. Например,
DefDate D 'Тип Date для всех переменных, 'начинающихся на букву D
DefInt V-Y 'Переменные от V до Y имеют тип Integer
Private Sub Command1_Click()
Print "Сегодня", "Я родился", "Я прожил (дней)"
D1=Date |
|
'Получение текущей даты |
||||
|
|
'(например, 21/09/2007) |
||||
D2 = "25/12/1980" |
'Дата рождения |
|
||||
N = D1 - D2 |
|
'Количество прожитых дней |
||||
Print D1, D2, N |
|
|
|
|
|
|
X=5/2 |
: |
Y=10/3 |
: |
Z=X/Y |
||
Print X, Y, Z |
'Вывод: |
2 |
3 |
0.666 |
||
End Sub |
|
|
|
|
|
|
Объявлять тип переменной вовсе необязательно. В этом случае тип будет объявлен самой средой VB по умолчанию как тип Variant, а после присвоения такой переменной значения определенного типа произойдет автоматическое изменение и типа переменной.
Переменные типа Byte, Integer, Long не могут иметь дробных значений, а переменные типа Byte – отрицательных значений. Попытка присвоить переменной значение, которое не входит в диапазон допустимых значений заданного для нее типа, вызовет при выполнении программы ошибку. Например,
Dim x As Byte, y As Byte
X= 5-7 'X типа Byte не может быть отрицательной Y= 100*3 'Y превышает максимально допустимое.