Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Представление символов Для записи символа отводится ячейка памяти длиной в 1 байт

Работа добавлена на сайт samzan.net:


Представление информации

Представление информации будет рассматриваться применительно к языку программирования Visual Basic (далее будет применяться сокращение VB).

Представление символов

Для записи символа отводится ячейка памяти длиной в 1 байт. Каждому символу  в соответствии с  таблицей ASCII поставлен в соответствие код из диапазона от 0 до 255, например:

Символ

Десятичный код

Содержание ячейки памяти

A

97

01100001

B

98

01100010

C

99

01100011

D

100

01100100

.

.

.

.

.

.

.

.

.

0

80

01010000

1

81

01010001

2

82

01010010

3

83

01010011

.

.

.

.

.

.

.

.

.

Пробел

32

00100000

Представление целых чисел (способ с фиксированной точкой)

Ячейка памяти может быть длиной 1, 2 или 4 байта.

Целые типы в VB

Название типа

Длина ячейки памяти в байтах

Диапазон значений

Byte (байт)

1

От 0 до 255

Integer (целый)

2

От -32 768 до 32 767

Long (длинный целый)

4

От -2 147 483 648 до 2 147 483 647

Пример представления целого числа 3 типа Byte (снизу указаны веса разрядов):

0

0

0

0

0

0

1

1

Значения разрядов

27

26

.

.

.

22

21

20

Веса разрядов

Следует сразу обратить внимание на принципиальное отличие символа от числа (например, символа 3 и числа 3). Несмотря на внешнее совпадение их изображений, они рассматриваются как разные объекты, между которыми нет никакой связи. Двоичный код символа 3 (01010011) отличается от двоичного кода числа 3 (00000011).

На запись знака не отведено места. Поэтому числа типа Byte могут быть только положительными. Максимальное значение, которое может быть записано по типу Byte равно 28 – 1 = 255.

Рассмотрим пример представления целого числа 21 типа Integer:

0

0

0

0

0

0

0

0

0

0

0

1

0

1

0

1

Знак

214

213

.

.

.

22

21

20

Знаковый разряд имеет значение 0 для положительных чисел и значение 1 для отрицательных чисел. Отрицательные числа записываются в так называемом дополнительном коде, но это выходит за рамки нашего рассмотрения.

Итак, один разряд отведен под знак и оставшиеся 15 разрядов – под значение числа. Максимальное значение абсолютного значения числа легко вычислить, для неотрицательных чисел это 215 – 1 = 32767, для отрицательных чисел это 215 = 32768.

Обратите внимание, на дробную часть не отведены разряды. Это понятно, ведь целые типы предназначены для данных принципиально принимающих только целочисленные значения.

Представление чисел с дробной частью (способ с плавающей точкой)

Для представления данных, которые имеют или могут иметь дробную часть, применяется способ с плавающей точкой.

Поясним идею этого метода в привычной для нас десятичной системе счисления. Любое действительное число может быть записано в научном формате, например:

123456000000000 = 1,23456*1014 = 0,123456*1015   или

0,00000000123456 = 0,123456*10-8

Очевидно, что любое число z в десятичной системе счисления может быть записано в таком формате в виде:

z = + – 0,m* 10+ –p,

где:

m – дробная часть, называемая мантиссой;

p – целое число, называемое порядком.

Для мантиссы должно быть выполнено простое, но принципиально важное требование, заключающееся в том, что ее старший разряд не равен нулю.

Все это верно и для двоичной системы счисления:

z = + – 0,m* 2+ –p,

где z, m и p записаны в двоичной системе счисления.

Что нужно записать в ячейке памяти, чтобы было можно восстановить значение записанного числа? Очевидно, это четыре отдельных элемента: знак числа, мантисса, знак порядка и сам порядок.

Ячейка памяти для данных с дробной частью может быть длиной 4 или 8 байтов.

Типы для данных с дробной частью

Название типа

Длина ячейки памяти в байтах

Диапазон значений

Single

(с плавающей точкой обычной точности)

4

Абсолютное значение находится примерно в диапазоне от 1,4*10-45 до 3,4*1038. Значение 0 не может быть представлено точно.

Точность 6 – 7 десятичных разрядов

Double

(с плавающей точкой двойной точности)

8

Абсолютное значение находится примерно в диапазоне от 4,9*10-324 до 1,7*10308

Точность 14 – 15 десятичных разрядов

Посмотрим для примера, как могла бы быть использована для представления числа ячейка памяти длиной 4 байта.

0

0

0

0

0

1

0

1

0

1

0

1

0

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

Знак порядка

Порядок

Знак числа

Мантисса

Байт

Байт

Байт

Байт

Один байт отведен под знак порядка и порядок. Оставшиеся три байта отведены под знак числа и мантиссу.

В качестве примера, посмотрим, как будет записано знакомое нам по прошлой лекции число 21,75.

21,75(10) = 10101,11(2) = 0, 1010111*25

Мантисса равна 1010111, порядок равен 5.

5(10) = 101(2)

На расположенном выше рисунке показано, как это число будет записано в ячейке памяти.

Абсолютное значение числа, которое может быть записано по способу с плавающей точкой, ограничено сверху и снизу.

Ограничение сверху происходит из за фиксированного числа разрядов разрядной сетки. Ограничение снизу возникает потому, что старший разряд мантиссы не может быть равен нулю.

Некоторые важные итоги

Абсолютное значение результата арифметической операции может оказаться больше того, которое может быть записано в разрядной сетке. Этот случай называется переполнением разрядной сетки и приводит к прекращению выполнения программы (ошибка периода выполнения программы).

Если результат арифметической операции имеет тип с плавающей точкой, то он может оказаться меньше того, которое может быть записано в разрядной сетке. Этот случай называется исчезновением порядка и также приводит к ошибке периода выполнения программы.

Арифметические операции с операндами целого типа выполняются быстрее, чем с операндами типа с плавающей точкой.

Арифметические операции с операндами целых типов выполняются точно (кроме операции деления).

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

Программирование на языке Visual Basic

О Visual Basic (далее VB) в сравнении с другими языками.

VB - лидер в технологии программирования. Лидер ли? Давайте посмотрим на предмет трезвым взглядом. По быстродействию - слаб, по мощности используемых библиотек доступа к системным ресурсам - тоже не очень, по возможностям работы с графикой, совсем не весьма. Что же остается?

А остается то, что и сделало VB одной из платформ-лидеров :

Стандартный пользовательский интерфейс пишется на нем очень быстро и непринужденно. Полученный результат выходит стандартным в применении, и каким угодно "навороченным" во внешнем виде. Это раз. Без этого VB не стал бы популярен, но не это так продвинуло его вперед.

Доступ к базам данных. Удобный, быстрый, легко реализуемый.

Глубокая интеграция с Микрософт Офис. Вот те коньки, на которых VB едет вперед, и не думает уступать пальму первенства другим.

 Гигантский плюс - время разработки приложения минимально. И это ценится.

Там где требуются высокая скорость разработки приложения - для VB практически нет альтернативы.

Очень сильное преимущество VB в его, скажем так, распространенности или стандартизованности. VB внедрен в виде VBA во все офисные приложения, а также в некоторых других продуктах.

С выходом 5-й, 6-й и 7-й версий (VB.NET) даже самые стойкие скептики, озабоченные, однако, поиском профессионального инструмента разработки современных приложений, разобравшись во всех его обширных возможностях, скажут: "Да, это - то, что нам нужно".

Что такое Visual Basic сегодня?

Microsoft Visual Basic сегодня является чрезвычайно эффективным инструментом создания быстродействующих приложений, который удовлетворит любые потребности разработчика.

Шесть лет назад Microsoft Corporation инициировала революционные перемены в области создания приложений. С появлением системы программирования VB программисты получили возможность быстро разрабатывать приложения для Windows, что ранее было сопряжено со значительными трудностями. В результате, используя технологии VB, несколько миллионов разработчиков создают сегодня приложения с беспрецедентной производительностью и легкостью.

Более того, в последних версиях VB революция продолжается. Microsoft Corporation последовательно реализует в нем доктрину "каждый компьютер - часть Internet". VB позволяет программисту, создавая компоненты ActiveX, осваивать новые технологические области, такие как Internet и внутренние сети, не отказываясь от существующего наработанного кода и навыков проектирования. Разработчики Web-приложений и систем клиент/сервер более не ставятся перед необходимостью делать выбор между себестоимостью и производительностью, масштабируемостью и быстрой разработкой приложения, между моделями локальных вычислительных сетей и технологиями Internet. Запустив VB, они попадают в мир реальных прогрессивных технологии, требующих лишь своего изучения и эффективного применения.

Правила присвоения имен в языке VB

При назначении имен переменным, константам, процедурам и аргументам в VB используются следующие правила:

имя должно начинаться с буквы;

имя может включать только буквы, цифры, символ подчеркивания (_), который на клавиатуре находится над знаком минус (-);

имя не должно содержать более 255 символов.

Обратите внимание, имя не может содержать пробел ( ), точку (.), запятую (,), восклицательный знак (!) или символы (@), (&), ($), (#). Очень распространенной ошибкой начинающих программистов является включение пробела в состав имени, например, имя Проект 1 является неправильным. Правильным будет имя Проект_1 или Проект1. Оба эти варианта отличаются от исходного неправильного варианта тем, что не содержат пробела.

Не следует использовать имена, совпадающие с зарезервированными словами языка.

В VB не различаются строчные и прописные буквы. Применение строчных или прописных букв влияет лишь на удобочитаемость программного кода человеком, но не оказывает никакого влияния на результат выполнения программы.

Следует придерживаться определенных правил написания программ. Каждая инструкция должна начинаться с новой строки.

Print "Привет мир"

a = 1

Начиная с версии VB 6.0 допускается в одной строке помещать несколько инструкций, если их разделять символом двоеточие (:). Однако, не следует часто пользоваться этой возможностью.

Пример:

Print "Привет мир": Print "Привет Олег"

Начиная с версии VB 4.0, появилась возможность длинную инструкцию размещать не в одной строке, а в нескольких. Разделителем строк служит пара символов: пробел и следующий за ним символ подчеркивания ( _). Это дает возможность размещать длинные, трудно обозримые строки программного кода так, чтобы они полностью помещались на странице экрана.

Строка программы в VB может содержать максимум 1023 символа и не более десяти разделителей – этого обычно достаточно.

B VB, как и в большинстве языков программирования, могут быть использованы комментарии. Комментарии предназначены для пояснения отдельных фрагментов программы и игнорируются VB при выполнении программы. Для выделения начала комментария можно использовать или верхнюю запятую ('), или инструкцию Rem – их действие одинаково. Rem представляет собой инструкцию и поэтому должна находиться в отдельной строке. Верхняя запятая может ставиться в любом месте строки, при этом текст комментария располагают справа:

Rem Это комментарий

Print "Привет мир" 'Это тоже комментарий

Число строк кода (формы, модуля и т.п.) ограничивается 65534. Это ограничение не существенно, поскольку число строк в большинстве программ меньше.

Переменные и константы

Иногда нам с Вами необходимо запомнить или записать кое - что на память. Мы для этого пользуемся, например, записной книжкой (простой или электронной) или записями на бумаге.

При выполнении вычислений или обработке информации тоже требуется иногда запоминать некоторые промежуточные результаты. Для каждого из этих результатов выделяется участок памяти компьютера состоящий из одного или нескольких байтов. Для того, чтобы эти участки памяти можно было различать, а также, иметь возможность сослаться на содержимое  некоторого конкретного участка памяти (ведь не укажешь же на него пальцем), ему сопоставляют имя. Вот эта пара включающая участок памяти и сопоставленное ему имя и есть переменная.

Итак, переменная – это в некотором смысле ячейка для хранения информации, например, значения числа, строки символов. При этом имеется возможность неоднократно считывать значение переменной, а также возможность записывать в эту ячейку другое значение.

Ячейка памяти под переменную отводится как результат  объявления переменной в программе. В программном коде мы оперируем именем переменной. Но соответствующие действия на самом деле выполняются над содержимым ячейки памяти, которая отведена для этой переменной.

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

К константам относится все то, что сказано выше о переменных. Константа, как и переменная, может иметь имя, для хранения ее значения отводится ячейка памяти. Но есть одно существенное отличие. Константа в отличие от переменной не может изменить значение при выполнении программы. Переменные и константы – это  данные.

Множество значений, которые может принимать данное, допустимые операции, которые с ним можно выполнять, количество отведенных для него байтов, определяется типом данного. В каждом языке программирования определена своя система типов данных.

Познакомимся с системой типов данных VB.

 Основные типы данных VB

Тип данных

Размер ячейки в байтах

Диапазон значений

Byte (байт)

1

От 0 до 255

Integer (целый)

2

От -32 768 до 32 767

Long (длинный целый)

4

От -2 147 483 648 до 2 147 483 647

Single

(с плавающей точкой обычной точности)

4

Абсолютное значение находится примерно в диапазоне от 1,4*10-45 до 3,4*1038

Точность 6 десятичных разрядов

Double

(с плавающей точкой двойной точности)

8

Абсолютное значение находится примерно в диапазоне от 4,9*10-324 до 1,8*10308

Точность 14 десятичных разрядов

Currency

(денежный)

8

От -922 337 203 685 477,5808 до

922 337 203 685 477,5807

String (строка переменной длины)

10 байт + длина строки

Длина строки от 0 до приблизительно 2 миллиардов символов

Date (дата/время)

8

От 1 января 100 г. до 31 декабря 9999 г.

Boolean (логический)

2

True или False

Variant

(универсальный тип)

16 байт+ длина строки

Дата/время; числовые значения с тем же диапазоном, что и для Double; строки с тем же диапазоном, что и для String

Type (опреде-ляемый поль-зователем

тип)

Опреде-ляется компо-нентами

Диапазон каждого элемента определяется его типом данных.

Object (объект)

4

Любой указатель объекта

Если, к примеру, в программе имеется переменная типа Integer с именем КоличествоСтудентов, то где-нибудь в программе можно записать:

КоличествоСтудентов = 1000

 

и для всех инструкций, которые появятся после этого, переменная КоличествоСтудентов будет всегда равна числу 1000 – пока, возможно, не появится инструкция

КоличествоСтудентов = 1050

КоличествоСтудентов в этой инструкции является именем переменной, а 1000 в этом примере - её значением.

Инструкцию КоличествоСтудентов = 1000 называют инструкцией присвоения: переменная КоличествоСтудентов получает значение, равное 1000.

Эту инструкцию нельзя понимать в том смысле, что левая часть равна правой части. Присвоение – это действие, заключающееся в том, что значение правой части записывается в ячейку памяти, отведенную для хранения значения переменной, находящейся слева от знака равенства в инструкции присвоения. Будет ошибкой записать эту инструкцию так:

1000 = КоличествоСтудентов

Слева от знака равенства должна находиться переменная. А справа от знака равенства должно находиться выражение (формула), вычисленное в соответствии с которым значение, становится значением указанной слева от знака равенства переменной.

Переменные типов Byte, Integer, Long, Single, Double, Currency принимают числовые значения.

Типы Byte/Integer/Long

Данные типа Byte, Integer, Long содержат лишь целые числовые значения из различных диапазонов. Если переменной такого типа присваивается 1.4, то возвращается 1, если 1.5 – возвращается 2:

Dim n As Integer

 n =1.7 'Результат: 2

Типы Single/Double/Currency

Данные типа Single и Double содержат числа с плавающей точкой из разных диапазонов значений. Single – с 6 верными десятичными разрядами после запятой, Double – с 14 верными десятичными разрядами после запятой. Данные типа Currency также служат для представления чисел с плавающей точкой, но число разрядов после запятой ограничено четырьмя. Этого достаточно при выполнении денежных расчетов:

Dim s As Single, a As Single

s =1.7 'Результат: 1.7

a = - 62.697

В VB в качестве разделителя целой и дробной частей используется точка.

В этих инструкциях присваивания справа от знака равенства находятся константы с дробной частью. Возможно применение другого способа записи таких констант. Этот способ состоит в записи константы с порядком.

Константы типа Single  с порядком выглядят так:

Так выглядит константа с порядком

А вот чему равно ее значение

1.5Е-8

1.5*10-8 или 0.000000015

1E-6

0.000001

1.256578E5

125657.8

При записи констант типа Double вместо буквы E применяется буква D, что сигнализирует VB, что константа имеет тип с плавающей точкой, но не обычной, а двойной точности.

Так выглядит константа с порядком

А вот чему равно ее значение

1.5D-8

1.5*10-8 или 0.000000015

1D-6

0.000001

1.256578E5

125657.8

К числовым переменным можно применять арифметические операции сложения (+), вычитания (-), умножения (*), деления (/), возведения в степень (^) и некоторые другие, с которыми мы ознакомимся позже.

Тип String

Значением переменной типа String может быть символ или строка символов.

Для того чтобы VB отличал константу типа строки символов от имени переменной, константа заключается в парные кавычки:

Dim Переменная As String

Переменная = "Привет Мир" 'Результат: Привет Мир

Строки можно объединять. В качестве оператора объединения строк в VB можно использовать как знак суммирования (+), так и знак "коммерческое и" (&). Однако для лучшей читаемости кода следует применять только &, так как знак плюса используется обычно при суммировании числовых значений.

Dim a As String, b As String, c As String

a = “Петр”

b = “великий”

c = a+b ‘Значение: Петр великий

c = a&b ‘Значение: Петр великий

Тип Date

Значением переменной типа Date может быть, дата, время или дата и время.

Данные типа Date специально предназначены для обработки информации о дате и времени. Чтобы для VB было понятно, что под указанным значением подразумевается дата и/или время, нужно поместить его между двумя знаками #. При вводе следует пользоваться американским форматом (мм/дд/гг). Если же при вводе данных этого типа использовать кавычки ("), что допустимо, то следует применять установленный в системе формат даты и времени ( как правило – дд/мм/гг):

Dim d As Date

d = #10/16/95#  'Результат: 16.10.95

d = #1:25:00 PM# 'Результат: 13:25:00

d = "6.10.95"     'Результат: 6.10.95

d = "13:25"       'Результат: 13:25:00

Тип Boolean

Переменная типа Boolean может принимать всего два значения. Такая переменная может иметь значение True (истина) или значение False (ложь).

В VB значению True соответствует 1, а False - 0. Если переменной этого типа присваивается значение 0, то переменная содержит False. Все другие значения подразумевают True:

Dim nVar As Boolean

 nVar = 5 'Результат: True

Тип Variant

Универсальный тип данных Variant — это хамелеон. Он устанавливает тип данных в зависимости от содержимого. Если в такой переменной содержится число, то переменная типа Variant принимает соответствующий тип данных.

Если ее содержимое — число 5, то она принимает тип Integer;

если 1.2— Double; если текст, то String. Переменная типа Variant изменяет свой тип во время выполнения программы. Вот простой пример:

Dim V As Variant

V = "25" 'V содержит "25" (String)

V = V +5 'V содержит 30 (Integer)

V = V & " штук" ‘V содержит "30 штук" (String)

Переменные типа Variant имеют большое практическое значение, однако, при их применении возникают проблемы. Во-первых, при чтении кода не видно, какой внутренний тип имеет переменная в данный момент. Это может крайне затруднить обнаружение логических ошибок программирования. Во-вторых, данные этого типа занимают больше памяти, чем аналогичные данные, объявленные с указанием явного типа.

Структура проекта

Проект обычно включает в свой состав один или несколько контейнеров (рис. 4.1).

Рис. 4.1. Структура проекта

Контейнером может быть форма или модуль.

Форма (см. рис. 4.2) может содержать объекты (надписи, кнопки и т.д.) и программный код. При выполнении приложения она отображается на экране монитора в виде окна. Модуль отличается от формы тем, что он может содержать программный код, но не может содержать объектов и никак не отображается при выполнении проекта.

Рис. 4.2. Структура формы

Рис. 4.3. Структура программного кода модуля

С контейнером обычно связан программный код (см. рис. 4.2 и 4.3). Начальная (верхняя) часть программного кода контейнера, расположенная до объявления первой процедуры или функции, называется  главной секцией (General). В главной секции могут быть только инструкции объявлений и не могут быть выполняемые инструкции (например, инструкции присвоения).

После главной секции может находиться программный код объявлений процедур и функций.

Объявления процедур и функций могут содержать как инструкции – объявления, так и выполняемые инструкции. Таким образом, весь выполняемый программный код в VB может быть только частью процедуры или частью функции.

Объявление процедуры состоит из заголовка, включающего зарезервированное слово Sub, тела и конечной строки End Sub:

Sub

   Инструкции (тело процедуры)

End Sub

Объявление функции состоит из заголовка, включающего зарезервированное слово Function, тела и конечной строки End Function:

Function

   Инструкции (тело функции)

End Function

Переменные

Переменные обладают типом. Тип переменной устанавливается либо в результате явного объявления, либо системой устанавливается тип Variant, когда тип явно не указан.

Синтаксис объявления переменной:

Static/Public/Private/Dim ИмяПеременной [As Тип]

В подобных определениях синтаксиса прямоугольные скобки […] означают, что конструкция, находящаяся внутри этих скобок, не обязательна. Символ (/) означает, что должно быть выбрано одно из слов, между которыми он поставлен. Сами же символы ([), (]), (/) в текст объявления не включаются.

Зарезервированное слово Dim (размерность) при объявлении переменных применяется чаще всего, например:

Dim b15 As Single, Количество As Integer

Dim S29 As String

Здесь явно объявлены три переменные: b15 типа Single, Количество типа Integer и S29 типа String.

Область видимости переменных

Весьма важной характеристикой переменных является область их определения. В VB есть три вида областей определения, характеризующих доступность переменной:

локальная: переменная доступна только внутри процедуры или функции, в которой она объявлена;

контейнера: переменная доступна только внутри той формы или того модуля, где она объявлена;

глобальная: переменная доступна во всем проекте.

Локальные переменные

Локальными являются переменные, объявленные внутри процедуры или функции. Они доступны только внутри этой процедуры или функции.

Переменные контейнера

Переменные контейнера определяются в главной секции (General) и доступны только внутри соответствующего контейнера, т.е. формы, или модуля.

Глобальные переменные

Глобальные переменные определяются в главной секции (General) модуля. При этом вместо оператора Dim используется зарезервированное слово Public. Глобальные переменные доступны во всех модулях и формах проекта.

Время жизни переменных

Инструкции тела процедуры или функции выполняются, когда происходит вызов соответственно процедуры или функции. Память для локальных переменных  отводится при выполнении вызова и освобождается после его завершения. Таким образом, локально объявленные переменные при выходе из процедуры удаляются из памяти, а при новом вызове процедуры инициализируются заново. Их содержимое при этом не сохраняется, что не всегда желательно.

Статические переменные

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

Для объявления переменной как статической нужно просто вместо зарезервированного слова Dim использовать слово Static:

Private Sub Commandl_Click()

   Static A As Integer

   Dim В As Integer

   A = A + 1

   В = В + 1

 .

 .

 .

End Sub

В одной строке можно объявить несколько переменных, но при этом следует для каждой указывать имя типа:

Dim a As Integer, b As Integer, c As Long

Dim e As Integer, f, g

В первой строке объявлены две переменные типа Integer и одна переменная типа Long. Во второй строке – одна переменная  типа Integer, а две другие - типа Variant по умолчанию.

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

При объявлении переменной типа Boolean она получает значение False.

При объявлении переменной типа String она получает значение пустой строки “”.

Можно вообще не объявлять переменные. Переменная может появиться в программе, хотя она не была объявлена. Такой случай называется объявлением по умолчанию. Она будет иметь тип Variant.

Однако такая практика является источником ошибок и ее следует избегать. Чтобы VB расценивал любую необъявленную явно переменную формы или модуля как ошибочную, в главной секции формы или модуля первой должна следовать инструкция Option Explicit. Эта инструкция налагает требование явного объявления всех переменных этой формы или модуля. Если модуль содержит инструкцию Option Explicit, при попытке использования неописанного или неверно введенного имени переменной возникает ошибка во время исполнения программы.

Можно так настроить среду VB, что инструкция Option Explicit будет автоматически помещаться системой VB в главной секции создаваемой формы или модуля. Для этого следует выполнить команды меню Tools (сервис), затем Options (свойства), затем на вкладке Editor (редактор) установить флажок в окошке Require Variable Declaration (требовать объявления переменных) и, наконец, щелкнуть на кнопке ОК. Но это следует сделать до создания формы или модуля.

Константы

Основное отличие констант от переменных состоит в том, что их значение нельзя изменять в процессе выполнения программы. Они всегда сохраняют значение, присвоенное при разработке. Области видимости для констант определяются так же, как и для переменных. Константы бывают локальные, контейнера и глобальные.

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

Синтаксис объявления константы:

[Public/Private] Const ИмяКонстанты [As Тип] = Значение

Приведенное определение синтаксиса означает, что объявление константы содержит обязательное слово Const (константа). Перед Const может стоять Private (локальная) или Public (общая), то есть одно из слов, задающих область действия константы. Затем должно следовать имя константы. После имени может стоять слово As и наименование типа. Затем должен следовать знак равенства и значение константы.

В определении подчеркнуто наименование той области действия, которая может быть задана по умолчанию.

В следующем примере описывается глобальная константа Age целого типа, и ей присваивается значение 54 (это объявление должно находиться в главной секции модуля).

Public Const Age As Integer = 54

Допускается также описание нескольких констант в одной строке. В этом случае, чтобы задать тип данных, надо указать название типа для каждой константы.

В следующем примере описываются локальные константы Pi и Wg как Single.

Const Pi As Single = 3.14159, Wg As Single = 2.78

Примеры демонстрируют преимущество использования констант: например, при вычислениях с числом π в программе не нужно каждый раз вводить длинное число, а только имя константы Pi:

vCircle = Pi * vRadius ^ 2

Еще одно преимущество констант заключается в том, что если константа используется в нескольких процедурах, то при изменении ее значения оно будет правильно воспринято всеми процедурами.

Преобразование и совместимость типов

В этом разделе речь будет идти о тех ситуациях, когда при выполнении операции или инструкции участвуют данные разных типов. Например, что произойдет, если переменной целого типа присваивается числовое значение типа Single?

В отношении типов VB проявляет максимально возможную терпимость. Когда это возможно, преобразование одного типа в другой будет выполнено автоматически и программисту нет нужды об этом заботиться. Следует при этом иметь в виду:

  •  При преобразовании числа с плавающей точкой в целое происходит округление до ближайшего целого.
  •  При преобразовании целого числа в число с плавающей точкой дробная часть принимается равной нулю.
  •  В случае преобразования целого типа в другой целый тип возможна ситуация, когда целый тип с большим диапазоном значений преобразуется в целый тип с меньшим диапазоном значений. Если значение, которое присваивается «короткому» типу, выйдет за пределы диапазона его допустимых значений, произойдет ошибка периода выполнения.
  •  Строковые и числовые типы совместимы. Можно присвоить числовое значение строковой переменной и наоборот. Однако строка символов должна быть такой, чтобы она могла трактоваться как число.

Например, не возникнет ошибки периода выполнения при присвоении свойству Caption некоторой надписи, которое имеет тип String, значения 125 переменной типа Integer. Произойдет преобразование целого числового значения 125 в строку символов “125”.

И наоборот. При присвоении переменной целого типа значения свойства Text некоторого текстового поля, которое имеет тип String (пусть, например, в этом текстовом поле набрано три символа 125) произойдет преобразование строки символов “125” в целое число и целочисленная переменная получит значение 125.

Sub A

1:    Dim i As Integer

2:    i = Label1.Caption

3:    Label1.Caption = 250

End Sub

В теле этой процедуры в строке 2 происходит преобразование значения свойства Caption из типа String к типу Integer. В строке 3 происходит преобразование значения целой константы 250 к типу String, который имеет свойство Caption.

Возможно также выполнение арифметической операции, например умножения (*), когда один или оба операнды являются строкой символов, но при условии, что их значения, можно интерпретировать как числа.

Sub B

   Dim i As Integer, str As String, _

   r As Integer

   i = 5

   str = “25”

r = i * str ‘Результат: 125. String -> Integer

End Sub

При этом особую осторожность следует соблюдать с операцией сложения (+), которая в зависимости от контекста может означать либо операцию сложения, либо операцию сцепления.

В операции операнд1 + операнд2 символ (+) VB будет воспринимать как:

операцию сложения, если оба операнда имеют кокой либо из числовых типов;

операцию сложения, если один операнд имеет числовой тип, а второй является строкой символов, значение которой может быть интерпретировано как число;

операцию сцепления, если один операнд имеет числовой тип, а второй является строкой символов, значение которой не может быть интерпретировано как число;

операцию сцепления, если оба операнда имеют строковый тип независимо от их значений.

Пример.

Dim i As Integer

Dim r As Single

Dim st1 As String, st2 As String

Private Sub Command1_Click ()

   i = 2

   r = -1.3

   st1 = r + i ‘Результат: “0.7”

‘Integer-> Single, Single -> String

End Sub

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

В инструкции St1 = r + i при выполнении арифметической операции сложения тип Integer операнда i преобразуется к типу Single операнда r, так как арифметическая операция может быть выполнена над однотипными операндами.

Наконец, результат сложения типа Single преобразуется к типу String переменной St1.

Пример. Рассмотрим продолжение программного кода предыдущего примера.

Private Sub Command2_Click()

   st1 = 25 ‘Результат: “25”

   st2 = 15 ‘Результат: “15”

   st2= st1 + st2 ‘Результат: “2515”

End Sub

 Произошло сцепление операндов. Это следовало ожидать, поскольку оба операнда имеют строковый тип. Посмотрим, что произойдет, если один операнд будет иметь строковый, а другой – числовой, например, целый тип.

Продолжим программный код, приведенный в двух предыдущих примерах. Введем следующий программный код:

Private Sub Command2_Click()

   st1 = 2

   st2 = 3

   st1 = 25 + st1 + st2 ‘Результат: “30”

‘String -> Integer, String -> Integer

‘Integer -> String

End Sub 

При выполнении вычисления значения выражения 25 + st1 + st2 первой выполняется операция 25 + st1. В этой операции  один операнд (константа 25) имеет числовой тип, а другой (строка st1) имеет значение, которое может быть интерпретировано как число. Поэтому здесь символ (+) воспринят как операция сложения. Результат операции сложения (27) тоже имеет числовой тип, поэтому символ (+) в следующей операции 27+3 также воспринят как операция сложения и, в конце концов, получен понятный результат 30.

Изменим порядок следования операндов в инструкции присвоения st1 = 25 + st1 + st2, применив вместо нее инструкцию st1 = st1 + st2 + 25.

Переменная st1 на первый взгляд получит неожиданный результат вычислений “48”. Изменение порядка слагаемых привело к изменению значения результатов вычислений! Почему? Дело в том, что первой теперь выполняется операция st1 + st2, в которой символ (+) воспринимается как операция сцепления, поскольку оба операнда имеют строковый тип.  Результат операции соответственно тоже имеет строковый тип и равен “23”. При выполнении следующей операции “23” + 25 символ (+) будет воспринят, как операция сложения, поскольку один операнд (константа 25) имеет числовой тип, а другой операнд (“23”) может быть интерпретирован как число.

Итак, в VB в отличие от математики сумма может зависеть от порядка слагаемых.

Ввод и вывод значений переменных

Ввод данных с помощью функции InputBox

Для ввода значения переменной можно воспользоваться функцией с именем InputBox. Она выводит на экран диалоговое окно, содержащее сообщение и поле ввода, возвращает значение типа String, содержащее текст, введенный в поле ввода.

Упрощенный синтаксис обращения к функции:

InputBox(Сообщение,[Заголовок])

У этой функции первый слева аргумент обязательный, а все остальные – необязательные. Назначение аргументов:

Сообщение – выражение типа String, отображаемое в диалоговом окне;

Заголовок – выражение типа String, отображаемое в строке заголовка диалогового окна.

Пример.

Private Sub Command1_Click()

    Label2.Caption = InputBox(

    ”Пожалуйста, введите Ваше имя”)

End Sub

В этой процедуре вызывается функция InputBox. При выполнении эта функция выводит диалоговое окно с запросом-подсказкой на ввод данных пользователем (рис. 5.4).

Значение аргумента функции InputBox  выведено в виде запроса-подсказки в окне функции InputBox. Значением функции InputBox будет строка символов, которую пользователь наберет в поле окна функции InputBox. Это возвращаемое значение функцией InputBox присваивается свойству Caption надписи Label2.

Еще один пример:

Private Sub Command1_Click()

 Dim Приглашение As String

 Dim ПолноеИмя As String

 Dim i As Integer, s As Single

 Приглашение = "Пожалуйста, введите Ваше имя!"

 ПолноеИмя = InputBox(Приглашение)

 Label2.Caption = ПолноеИмя

 i = InputBox("Задайте значение i")

 ‘String -> Integer

 Label3.Caption = "i=" & i ‘Integer -> String

 s = InputBox("Задайте значение s")

 ‘String ->Single

 Label4.Caption = "s=" & s ‘Single -> String

End Sub

В процедуре Command1_Click объявлены четыре переменных, в том числе переменная i целого типа и переменная s с плавающей точкой обычной точности. Этим переменным также задаются значения с помощью обращений к функции InputBox. Полученные переменными i и s значения затем отображаются в полях надписей Label3 и Label4 соответственно.

Вывод данных с помощью инструкции Print

При помощи инструкции Print можно печатать тексты на форме, а также на изображении. Текст должен при этом стоять в кавычках (").

Пример:

Print "Эй, студент! Привет!"

Пишет на форме:

Эй, студент! Привет!

В инструкции Print можно выполнять вычисления, например:

Print 2*3

выдаст на форме:

6

Всё, что стоит после слова Print в кавычках, при выполнении компьютером, будет символ за символом выведено на форме. А всё, что стоит справа от Print не в кавычках, будет вычислено компьютером и выведено на форме.

Так, к примеру, 2*3 для компьютера означает результат умножения 2 на 3.

Синтаксис инструкции Print:

[объект.] Print [СписокВывода]

Здесь объект – это имя формы, может быть опущено для текущей формы, СписокВывода – текст, который печатается на форме. Несколько элементов в списке вывода отделяются друг от друга точкой с запятой (;) или запятой (,). При использовании запятой между выводимыми элементами СпискаВывода будут сделаны интервалы. При использовании точки с запятой между выводимыми элементами СпискаВывода они будут напечатаны друг за другом без перерыва. Например, следующая команда напечатает сообщение в форме Form1:

 Form1.Print “Это форма Form1”

Если же форма Form1 является текущей, то имя объекта в команде может быть опущено и команда будет записана короче:

Print “Это форма Form1”

Если список вывода не заканчивается точкой с запятой (;) или запятой (,), то каждое обращение к инструкции Print начинает вывод в следующей строке. Если список вывода заканчивается точкой с запятой (;), то следующее обращение к инструкции Print приведет к продолжению печати в той же строке без перерыва. Если же список вывода заканчивается запятой (,), то следующее обращение к инструкции Print приведет к продолжению печати в той же строке с некоторым отступом.

Если нужно распечатать значения нескольких данных в одной строке, то все их нужно перечислить после команды Print в СпискеВывода, например, в результате выполнения пары инструкций:

Print "2*2 всё ещё равно "; 2*2;”,”

Print " а 59 умножить на ноль равно "; 59 * 0;”.”

получим:

2*2 всё ещё равно 4,

а 59 умножить на ноль равно 0.

Для очистки формы от результата вsполненной на ней ранее печати может быть применен метод Cls.

Например, следующая инструкция очистит форму Form1:

Form1.Cls

Если форма Form1 является текущей, то имя формы можно не указывать.

Форматирование вывода

Для форматирования чисел, дат и времени может быть применена функция Format. Эта функция преобразует число, дату или время в строку символов. Мы можем указать, сколько десятичных разрядов отведено на запись числа, нужны или нет лидирующие нули, замыкающие нули, обозначения валюты, разделители тысяч.

Вот упрощенный синтаксис функции Format: Format(Выражение, Формат). Параметр Выражение определяет значение, которое требуется преобразовать. Параметр Формат – это текстовая строка, сформированная из символов: (0) – в этой позиции должен быть напечатан замыкающий или лидирующий ноль; (#) – в этой позиции не следует печатать замыкающий или лидирующий ноль; (.), (,),
(-), (+), ($), ((), ()), (пробел) – эти символы печатаются в той позиции, где они указаны.

Ниже приводятся примеры преобразования чисел функцией Format:

Обращение к функции      Результат

Format (315.4,”00000.00”)      00315.40

Format (315.4,”#####.##”)      315.4

Format (6315.4,”##,##0.00”)     6,315.40

Format (315.4,”$##0.00”)      $315.40

Format (“09.10.2001”,”dd.mm.yy”)     09.10.01

Format (“09.10.2001”,”dddd, dd mmmm, yyyy года”)  вторник, 09 октября, 2001 года

Лекция 6

Вывод данных с помощью функции MsgBox

Для вывода значения некоторого выражения может быть применена функция MsgBox. Для этого следует обратиться к функции MsgBox, пользуясь, например, упрощенным синтаксисом:

MsgBox (Сообщение)[, , Заголовок]

Здесь Сообщение – это выражение, которое будет преобразовано в строку символов и выведено в окне MsgBox, а Заголовок – строка символов, отображаемая в заголовке этого окна.

Пример 1

i = 5

MsgBox ("i= " & i), ,  "Вывод переменной i"

Окно функции MsgBox будет выглядеть так, как показано на рис. 6.1.

Управление порядком выполнения инструкций

Инструкции управления порядком выполнения команд позволяют оценить реальную ситуацию и адекватно реагировать на нее, принимая решения о дальнейших действиях. VB предоставляет для этого ряд инструкций.

Условная инструкция If ... End If

Наиболее часто для программирования разветвлений используется инструкция If ... End If (блок-схема реализуемого алгоритма на рис. 6.2), которая может иметь простую однострочную или блочную структуру.

Однострочный синтаксис

If ЛВ Then Инструкция1 [Else Инструкция2]

Здесь If (если), Then (то) и Else (иначе) - зарезервированные слова, ЛВ – логическое выражение. Существенно, что здесь после слова Then, а также после слова Else может находиться только одна инструкция. Выполнение такой инструкции состоит в следующем. Если ЛВ, имеет значение True, выполняется Инструкция1, указанная за Then, а инструкция 2 не выполняется (пропускается). Если же значение ЛВ равно False, то выполняется Инструкция2, следующая за ключевым словом Else, если такая имеется, а Инструкция1 пропускается.

Пример 2

If A = 7 Then Beep

В этом примере выдается звуковой сигнал, если переменная А равна 7.

Пример 3

If X < 9 Then Print "False!" Else Print "True!"

В примере 3 выводится текст False!, если значение переменной X меньше 9. В противном случае выводится текст True!.


Блочный синтаксис

If ЛВ1 Then

   [Инструкции1]

[ElseIf ЛВi Then

   [Инструкцииi]]

[Else

   [Инструкции2]]

End If

Если в зависимости от условия необходимо выполнить не одну инструкцию, а несколько инструкций, следует использовать блочный синтаксис. Это относится и к ветви Else. Кроме того, блочная структура с ElseIf позволяет анализировать несколько условий. Здесь каждая из Инструкции1, Инструкции2 и ИнструкцииI – это одна или несколько инструкций.

Выполнение этой инструкции If состоит в следующем. Сначала проверяется значение ЛВ1. Если оно истинно, то выполняется группа  Инструкции1 и на этом выполнение инструкции If завершается. Если же значение ЛВ1 ложно, то проверяется значение следующего условия ЛВi. Если оно истинно, то выполняется группа ИнструкцииI и на этом выполнение инструкции If завершается. Если же значение ЛВi ложно, то проверяется следующее ЛВi. Если же все ЛВi оказываются ложными, то выполняется группа инструкций Инструкции2.

Пример 4

If A = 7 Then

  Beep

End If

В этом примере звуковой сигнал прозвучит только в том случае, если значение переменной А равно 7.

Пример 5

If Name = "Иванов" Then

   Print "Ваша карточка удерживается!"

Else

   Print "Получите деньги, пожалуйста!"

End If

В этом примере, если значение переменной Name равно “Иванов”, то будет выведено Ваша карточка удерживается!. При любом другом значении переменной Name будет выведено Получите деньги, пожалуйста!

Пример 6

If Обращение = 1 Then

Print "Здравствуйте, господин"

ElseIf Обращение = 2 Then

   Print " Здраствуйте, госпожа"

Elself Обращение = 3 Then

   Print " Здравствуйте, дамы и господа"

Else

   Print "Здравствуйте, люди"

End If

Для этого примера результат вывода показан в таблице:

Значение переменной Обращение

Результат вывода

1

Здравствуйте, господин

2

Здравствуйте, госпожа

3

Здравствуйте, дамы и господа

Любое другое, кроме 1, 2, 3

Здравствуйте, люди

Инструкция выбора Select Case (выбрать в случае)

Еще одной инструкцией VB, предназначенной для программирования разветвлений, является Select Case (инструкция выбора), которая позволяет выполнить одну из нескольких групп операторов в зависимости от значения некоторого выражения.

Инструкция Select Case имеет следующий синтаксис:

Select Case Проверочное_выражение

[Case Значение1

   [Инструкции1]]

[Case Значение2

   [Инструкции2]]

[Case Else

   [ИнструкцииЗ]]

End Select

Пример 7

   Select Case V

   Case 1

     Print "Равно 1"

Case 2, 3

      Print "Равно 2 или 3"

Case 4 То 6

      Print "Больше или равно 4 и меньше или равно 6"

Case Is >= 9

      Print "Больше или равно 9"

Case Else

      Print "Ни одно из предшествующих"

End Select

В качестве значения для блока Case можно указывать не только одно значение (1), но и несколько, разделенных запятой, (2, 3). Можно определять также области сравнения (4 То 6) или воспользоваться относительным сравнением (Is >= 9). Вместо непосредственного значения проверочного выражения можно использовать ключевое слово Is.

Блок Case Else выполняется, если ни одно из предыдущих условий не является истинным.

Если условию Select Case соответствует несколько блоков Case, то выполняется первый из них.

Инструкции цикла

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

1. Параметрический цикл For… Next

Этот цикл управляется параметром, который при повторении выполнения тела цикла изменяет с заданным шагом свое значение от заданного начального значения до заданного конечного значения. Такой цикл используют в случае, когда заранее известно, сколько необходимо совершить повторений выполнения тела.

Синтаксис инструкции цикла:

 For ИПЦ = НЗПЦ To КЗПЦ [Step ШИПЦ]
       Тело цикла (одна или несколько инструкций)
  
Next [ИПЦ]

Слова For (для), To (до), Step (шаг), Next (затем) являются зарезервированными.

Применены обозначения:

ИПЦ – имя параметра цикла (переменная любого числового  типа);

НЗПЦ – начальное значение параметра цикла (выражение любого числового типа), которое параметр цикла будет иметь при первом выполнении тела цикла;

КЗПЦ – конечное значение параметра цикла (выражение любого числового типа);

ШИПЦ – шаг изменения параметра цикла (выражение любого числового типа) – необязательная часть инструкции цикла.

Числовые значения НЗПЦ и КЗПЦ задают интервал, в котором будет изменяться параметр цикла. Необязательный параметр ШИПЦ задает шаг изменения параметра цикла на каждом проходе. По умолчанию, если он отсутствует, то принимается равным 1. Наконец, после инструкций, составляющих тело цикла, следует команда Next, обозначающая границу действия цикла. В случае вложенных циклов (в тело цикла входит инструкция цикла) можно указывать, к какому из них относится команда Next. Это достигается добавлением после слова Next имени параметра цикла.

Процесс выполнения инструкции For… Next для положительного шага иллюстрирует рисунок 6.3. Рассмотрим примеры.

Пример 8

Сумма=0

For i = 1 To 100 Step 2

   Сумма = Сумма +i

Next

В этом примере вычисляется сумма всех целых нечетных чисел от 1 до 100.

Пример 9

 

For n = 100 To 60 Step –10

   Print n 

Next n 

В примере 9 продемонстрированы две возможности: явно заданный шаг цикла и отсчет в обратном направлении. Последнее достигается заданием отрицательного шага и тем, что начальное значение параметра цикла больше, чем конечное.

Этот код выведет на текущей форме:

100

90

80

70

60

Пример 10

Dim x As Integer

For x = 1 To 50

    Beep

Next

Эта программа заставляет компьютер подавать звуковой сигнал 50 раз.

Инструкцию For...Next можно завершить досрочно с помощью инструкции Exit For. Выполнение этой инструкции приводит к досрочному завершению выполнения инструкций тела цикла и выходу из цикла.

For …

.

.

.

Exit For

 Лекция 7

2. Итерационный цикл Do While...Loop  или Do...Loop While

Здесь While (пока) и Loop (цикл) зарезервированные слова. Циклы типа While предназначены для ситуаций, когда количество повторений тела цикла (итераций) заранее неизвестно. Вот синтаксис двух разновидностей цикла While:

Первый вариант:

Do While УсловиеПовторения

Группа инструкций

Loop

Здесь УсловиеПовторения – это выражение логического типа (подробнее), которое принимает либо значение True, либо значение False. Выполнение этой инструкции происходит так. Сначала вычисляется значение логического выражения УсловиеПовторения. Если оно имеет значение True, то выполняются инструкции, помещенные между строками Do While и Loop. Затем все повторяется с начала. Если же логическое выражение имеет значение False, то происходит выход из цикла. Следующей будет выполнена инструкция, помещенная ниже строки Loop. Все это поясняет блок-схема на рис. 7.1.

Второй вариант:

Do

Группа инструкций

Loop While УсловиеПовторения

Блок-схема реализуемого алгоритма приведена на рис. 7.2. Различие между этими двумя вариантами заключается в том, что УсловиеПовторения (условие повторения выполнения тела цикла) проверяется в первом случае до выполнения тела цикла (цикл – пока), а во втором случае – после выполнения тела цикла (цикл - до).

Перейдем к примерам. Рассмотрим действие следующего участка программы.

Пример 1

Счетчик = 0

Номер = 20

Do While Номер > 10

Номер = Номер – 1

Счетчик = Счетчик + 1

Loop

MsgBox ("Выполнено " & Счетчик & " итераций цикла.")

При выполнении этого участка программы в окне функции MsgBox будет выведено:

Выполнено 10 итераций цикла.

В этой программе условие проверяется до входа в цикл. Если переменной Номер задать значение, равное 10 вместо 20, инструкции внутри цикла выполняться не будут.

Пример 2

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

Счетчик = 0

Номер = 9

Do

 Номер = Номер – 1

 Счетчик = Счетчик + 1

Loop While Номер > 10

MsgBox ("В цикле выполнено " & counter & " итераций.")

Инструкцию Do...Loop можно завершить досрочно с помощью инструкции Exit Do.

3. Итерационный цикл Do Until...Loop  или Do...Loop Until

Until (до) – зарезервированное слово. По своей логике цикл Until подобен циклу While с той лишь разницей, что выполнение условия означает необходимость выхода из цикла. Как и в случае цикла While, проверка условия выхода в цикле Until может осуществляться перед очередным проходом или после него. Вот синтаксис этих двух вариантов.

Первый вариант:

Do Until УсловиеВыхода

Группа инструкций

Loop

Блок-схема реализуемого алгоритма приведена на рис. 7.3.

Второй вариант:

Do

Группа инструкций

Loop Until УсловиеВыхода

Блок-схема реализуемого алгоритма приведена на рис. 7.4.

Перейдем к примерам.

Пример 3

Рассмотрим действие участка программы:

Счетчик = 0

Номер = 20

Do Until Номер = 10

Номер = Номер – 1

Счетчик = Счетчик + 1

Loop

Переменная Счетчик получит значение 10.

Пример 4

Счетчик = 0

Номер = 1

Do

   Номер = Номер + 1

   Счетчик = Счетчик + 1

Loop Until Номер = 10

Переменная Счетчик получит значение 9.

Инструкцию Do...Loop можно завершить досрочно с помощью инструкции Exit Do.

Пример 5

Задана строка символов. Получить новую строку символов, отличающуюся от исходной тем, что из нее удалены все пробелы.

Так, например, строки “Это тест” и “   Это    тест  ” должны считаются идентичными.

Применим некоторые стандартные функции VB, предусмотренные для обработки строк:

Len(Строка) – возвращает количество символов в аргументе Строка;

InStr([Начало], Строка1,Строка2) – возвращает номер позиции, начиная с которой Строка2 входит в Строку1 или 0, если Строка2 не входит в Строку1, аргумент Начало – номер позиции, с которой начинается поиск;

Left(Строка, КоличествоСимволов) – возвращает строку, включающую первые КоличествоСимволов аргумента Строка;

Right(Строка, КоличествоСимволов) – возвращает строку, включающую последние КоличествоСимволов аргумента Строка.

 

Function УдалениеПробелов(Строка As String) As String

   Dim Длина As Long, Позиция As Long, Старт As Long

   Старт = 1

   Do

       Длина = Len(Строка)

       Позиция = InStr(Старт, Строка, " ")

       If Позиция > 0 Then Строка = Left(Строка, Позиция – 1) _

       & Right(Строка, Длина – Позиция)

       Старт = Позиция

   Loop Until Позиция = 0

   УдалениеПробелов = Строка

End Function 

В этой функции в цикле определяется номер позиции от начала заданной строки, в которой стоит пробел. Затем из строки вырезается эта позиция с пробелом. Цикл прекращается, когда в строке не остается ни одного пробела (в этом случае функция InStr(Старт, Строка, " ") возвратит 0).

Операции и функции

В расположенной далее таблице дан полный перечень операций, которые могут быть применены к числовым данным.

Операция

Функция

Математические операции

[операнд1] + [операнд2]

Сложение

[операнд1] - [операнд2]

Вычитание

- операнд

Перемена знака

[операнд1] * [операнд2]

Умножение

[операнд1] / [операнд2]

Деление

[операнд1] \ [операнд2]

Целочисленное деление. Результат – целая часть отношения операндов

[операнд1] MOD [операнд2]

Деление по модулю. Операнды округляются до целого значения. Результат – остаток отношения операндов, например 5.4 MOD 2 = 1

[операнд1] ^ [операнд2]

Возведение в степень

Операции отношения

[операнд1] < [операнд2]

Меньше.

Результат True, если отношение выполняется, или False, если отношение не выполняется

[операнд1] > [операнд2]

Больше

[операнд1] <= [операнд2]

Меньше или равно

[операнд1] => [операнд2]

Больше или равно

[операнд1] = [операнд2]

Равно

[операнд1] <> [операнд2]

Не равно

Если в выражении использовано несколько операций, то в первую очередь выполняются операции, имеющие наивысший приоритет. Если приоритет операций одинаковый, то они выполняются слева направо.

Таблица приоритетов.

Приоритет

Операция

1

Вызов функции, скобки.

2

^

3

-

4

*, /

5

\

6

MOD

7

+, -

Математические функции (углы выражаются в радианах).

Обращение к функции

Возвращаемое значение

Abs(x)

Абсолютное значение х

Atn(x)

arctg x

Cos(x)

cos x

Exp(x)

ex

Int(x)

Целая часть

Fix(x)

Целая часть

Log(x)

ln x

Rnd

Случайное число

Sgn(x)

Знак числа

Sin(x)

sin x

Sqr(x)

Квадратный корень от х

Tan(x)

tg x

Функции Int и Fix возвращают значение типа, совпадающего с типом аргумента, которое содержит целую часть числа.

Синтаксис:

Int(число)

Fix(число)

Обязательный аргумент число – это любое допустимое числовое выражение. Различие между функциями Int и Fix состоит в том, что для отрицательного значения аргумента функция Int возвращает ближайшее отрицательное целое число, меньшее либо равное указанному, а Fix ближайшее отрицательное целое число, большее либо равное указанному. Например, функция Int преобразует -8.4 в -9, а функция Fix преобразует -8,4 в -8.

Функция Rnd возвращает значение типа Single, содержащее случайное число, меньшее 1 и большее или равное нулю.

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

 Лекция 8

Массив

Массив представляет собой совокупность однотипных элементов, для хранения значений которых отводится столько ячеек памяти, сколько их содержится в массиве. Каждая ячейка памяти отводится под отдельный элемент массива. Таким образом, массив является структурированной  переменной в отличие от скалярной простой переменной. Все элементы массива имеют один и тот же тип.

При необходимости выполнить некоторое действие над всеми элементами массива можно сослаться на массив как целое по его имени. Возможны также ссылки на его отдельные элементы. Каждый отдельный элемент массива определяется именем массива и значениями индексов. Например, ссылка a(7) означает, что а – это имя одномерного массива с одним индексом, элемент массива имеет значение индекса равное 7. Одномерный массив принято называть вектором. Например, ссылка a1(2, 9) означает, что а1- это имя двумерного массива Двумерные массивы принято называть матрицами. Можно по аналогии с матрицами считать, что элемент a1(2, 9) принадлежит 2 строке и 9 столбцу.

Как и простые переменные, массивы описываются с помощью инструкций Dim, Static, Private или Public. Разница в объявлении между скалярными переменными (т.е. не массивами) и массивами состоит в том, что для массива надо указывать его размер (количество ячеек, отводимых под массив). Массив с заданным размером называется фиксированным. Массив, объявление размера которого отложено, называется динамическим.

1. Описание массива фиксированного размера

При объявлении фиксированного массива, кроме его имени и типа элементов, необходимо для каждого индекса указать его верхнюю и нижнюю границы:

НижняяГраница To ВерхняяГраница

Например,  Dim x(1 To 10) As Single

При объявлении можно указать, только верхнюю границу, тогда по умолчанию нижняя граница равна 0. Нижняя граница по умолчанию будет установлена равной 1, если в главной секции имеется инструкция Option Base 1. Допустимым значением для Option Base являются только 0 и 1.

В следующей строке программы массив фиксированного размера описывается как массив типа Integer, имеющий 11 строк и 11 столбцов:

Dim a1(10, 10) As Integer

Первый аргумент внутри скобок представляет строки, а второй – столбцы.

Как и при описании скалярных переменных, если тип при описании массива не задается, подразумевается, что элементы массива имеют универсальный тип Variant.

Пример 1. Вычисление среднего арифметического.

Вычислить

, k <= 100.

1. Применяемые данные

Исходные данные:

k – переменная целого типа, число заданных величин;

a (100) – фиксированный массив с плавающей точкой обычной точности, значения заданных величин.

Результаты:

 s – переменная с плавающей точкой обычной точности, значение среднего арифметического;

Промежуточные:

Сумма – переменная с плавающей точкой обычной точности, значение суммы первых k элементов массива x;

i – переменная целого типа, значение индекса элемента массива x..

2. Построение блок-схемы алгоритма

Полная блок-схема алгоритма приведена на рис. 8.1 и 8.2.

Остановимся подробнее на блок-схеме, изображенной на рис. 8.1. Все входящие в нее блоки пронумерованы. Она содержит один укрупненный блок (№  2), который выполняет ввод массива (задает значения элементам массива). Это означает, что этот блок от точки входа до точка выхода имеет собственную блок-схему, которой мы займемся позже. А пока на этом блоке просто записано, что он делает.

Укрупненные блоки обычно изображаются в виде прямоугольника с двойными вертикальными сторонами.

Посмотрим на эту блок-схему с точки зрения базовых структур, которые в нее входят. Блоки 1 – 3 составляют последовательную структуру (следование), которую мы назовем Структура 1. Блоки 4 – 7 относятся к циклу. Эту структуру мы назовем, Структура 2. Блоки 8, 9 – это опять последовательная структура, которую мы назовем Структура 3. Структура 1, Структура 2 и Структура 3, рассматриваемые  в совокупности также являются структурой следования. В блок-схеме любого структурированного алгоритма всегда можно ясно увидеть базовые структуры, из которых строится алгоритм.

На рис. 8.2 приведена блок-схема алгоритма ввода массива. Дело в том, что в VB нет такой инструкции, которая бы одна обеспечивала ввод всего массива. Можно ввести значение лишь одного элемента массива. Поэтому для ввода массива приходится применять цикл.

3. Разработка интерфейса проекта

В этом проекте и во многих следующих примерах мы будем применять простейший интерфейс, когда на форме находится единственная кнопка Command1, щелчок на которой начинает выполнение кода проекта. Свойству Caption этой кнопки следует задать значение Вычислить. Свойству AutoRedraw формы следует задать значение True, чтобы после перекрытия окна формы другим окном или при свертывании формы и ее развертывании происходило перерисовывание выведенной на ней информации.

Рис. 8.3. Интерфейс проекта

4. Составление программы

Option Explicit

Option Base 1

Private Sub Command1_Click()

1:  Dim k As Integer

   Dim a(100) As Single

   Dim s As Single

   Dim i As Integer

5:  Dim Сумма As Single

   Cls

   k = InputBox("Введите k")

   Print "k = " & k

   ВводВектора a, k

10: Сумма = 0

   For i = 1 To k

       Сумма = Сумма + a(i)

   Next

   s = Сумма / k

15: Print "Среднее арифметическое равно " & s

End Sub

Private Sub ВводВектора(x() As Single, n As Integer)

   Dim i As Integer

   For i = 1 To n

     x(i) = InputBox("Элемент вектора (" & i & ")=?", "Ввод вектора")

     Print x(i),

   Next

   Print

End Sub

Инструкция Option Explicit в главной секции требует явного объявления переменных. Эта инструкция, если она есть, всегда должна быть первой в главной секции.

Инструкция Option Base 1 в главной секции устанавливает, что по умолчанию нажняя граница индекса массива равна не 0, а 1.

После запуска проекта на выполнение программный код начнет выполняться только после нажатия на кнопки Command1. В этом случае для кнопки Command1 происходит событие Click, что и приводит к выполнению событийной процедуры Command1_Click.

В строках 1 – 5 тела этой процедуры находятся инструкции объявлений данных. При этом под переменные и под массив отводится память. В строке 6 тела процедуры содержится обращение к методу Cls, который обеспечивает очистку формы от ранее выведенной на ней информации, что возможно, когда на кнопку Command1 Вы  нажимаете не первый раз. Инструкция присвоения в строке 7 задает значение переменной k (то значение, которое будет введено в окне функции InputBox). Следующая инструкция, находящаяся в строке 8 для контроля печатает на форме значение переменной k. В строке 9 содержится обращение к пользовательской процедуре ВводВектора. Выполнение этого обращения упрощенно можно понимать так, что выполняются все инструкции тела процедуры ВводВектора, в которых предварительно имя агумента x заменено на указанное в обращении значение аргумента a, и имя аргумента n заменено на k.

Строки 1 – 10 процедуры Command1_Click реализуют часть алгоритма блок-схемы, изображенной на рис. 8.1, которую мы выше назвали Структура 1. Вот так следующими сверху вниз инструкциями реализуется на VB базовая структура алгоритма, называемая следованием.

Строки 11 – 13 процедуры Command1_Click реализуют цикл. В данном случае это та часть алгоритма блок-схемы, изображенной на рис. 8.1, которую мы выше назвали Структура 2. Обратите внимание на то, что в программе нет инструкции i = 1, а также инструкции i = i + 1, несмотря на то, что эти инструкции есть в блок-схеме. Нет также проверки условия i <= k. В программе выполнение этих действий обеспечивает инструкция ForNext.

Строки 14 и 15 процедуры Command1_Click реализуют часть алгоритма блок-схемы, изображенной на рис. 8.1, которую мы выше назвали Структура 3.

Процедура Ввод_вектора выполняется при обращении к ней в процедуре Command1_Click. Обращение (это инструкция, включающая имя процедуры и значения аргументов) приводит к выполнению тела процедуры, в котором имена аргументов (примененные в объявлении процедуры) заменены именами значений аргументов (указанными в обращении к процедуре). Эта процедура обеспечивает ввод значений всех элементов одномерного массива, а также печать на форме для контроля всех введенных значений элементов массива.

Пример 2. Счастливые билеты

Трамвайный билет имеет шестиразрядный номер. Сколько всего таких билетов, у которых сумма первых трех цифр номера равна сумме последних трех цифр?

Option Explicit

Private Sub Command1_Click()

Dim i As Integer, j As Integer, k As Integer

Dim КСБ As Long

Dim s(27) As Integer

'    Сумма цифр трех правых разрядов (а также трех левых

'    разрядов) может принимать значения 0, 1, 2, … , 27.

   For i = 0 To 27

       s(i) = 0

   Next

'   Обнуление счетчика s( i ). Дальше в кратном цикле

'   вычисляются s( i ), равное числу выпадения суммы цифр трех

'   разрядов, равной i.

   For i = 0 To 9

   For j = 0 To 9

   For k = 0 To 9

       s(i + j + k) = s(i + j + k) + 1

   Next k, j, i

'   Находим Количество счастливых билетов (КСБ).

'   При этом учтем, что при каждом значении суммы трех левых

'   разрядов, равной i, эта же сумма в трех правых

'   разрядах выпадает s( i ) раз. Но и в трех левых разрядах она

'   появляется тоже s( i ) раз. Следовательно, всего случаи

'   равенства суммы трех левых и трех правых разрядов значению i

'   имеют место s( i )^2 раз.

КСБ = 0

   For i = 0 To 27

       КСБ = КСБ + s(i) ^ 2

   Next

   Print “Найдено “; КСБ – 1; “ счастливых билетов”

'   Вычли 1, так как номера 000000 нет. Нумерация начинается

'   с номера 000001.

End Sub

При выполнении программы на форме будет выведено:

Найдено 55251 счастливых билетов

2. Описание динамического массива

Если массив описан как динамический, можно изменять его размер во время работы программы. Для описания динамического массива  используются инструкции Static, Dim, Private или Public с пустыми скобками:

Dim a2 () As Single

При выполнении программы можно переобъявлять динамический массив с помощью инструкции ReDim.

Среди инструкций некоторой процедуры или функции можно записать:

ReDim a2 (5, 1 To 10)

Далее этот массив может быть переопределен:

ReDim a2 (15)

С помощью инструкции ReDim можно изменять размер массива (число элементов), верхние и нижние границы индексов, а также количество размерностей (индексов). Инструкцию ReDim можно применять для изменения динамического массива столько раз, сколько потребуется. Однако при каждом применении данные, содержащиеся в массиве, теряются.

Инструкция ReDim Preserve может увеличить размер массива, сохраняя при этом его содержимое. В следующем примере показывается, как можно увеличить размер массива a4 на 10 элементов без уничтожения текущих значений элементов массива. Пусть был объявлен динамический массив

Dim a4 () As Integer

Затем в программе установлен размер этого массива

 ReDim a4 (n)

Далее в программе может быть, например, записано

ReDim Preserve a4(n+10)

Использование зарезервированных слов ReDim Preserve вместе с динамическим массивом позволяет изменить только верхнюю границу и только последней размерности массива. Изменение числа размерностей невозможно.

3. Присвоение массивов

Начиная с VB 6.0, имеется возможность присвоить содержимое одного массива другому так же, как это делается для простых переменных. Но эти массивы должны иметь одинаковые значения размерностей и одинаковое количество элементов. Если же в левой части оператора присвоения стоит динамический массив, то совпадение размерностей и числа элементов не обязательно. Размерность и число элементов массива в левой части оператора присвоения при необходимости изменятся.

 Лекция 9

Пример. Найти значение наибольшего элемента одномерного массива.

1. Выбор данных.

Исходные данные:

k – Переменная целого типа, число заданных величин;

a ( ) – динамический массив с плавающей точкой обычной точности, значения заданных величин.

Результаты:

 НаибЭлем – переменная с плавающей точкой обычной точности, значение наибольшего среди рассмотренных элементов массива a;

Промежуточные:

i – переменная целого типа, значение индекса элемента массива x.

2. Построение блок-схемы алгоритма (см. рис. 9.1).

Ввод массива представлен укрупненным блоком (блок 2). Основой алгоритма является цикл (блоки 4 – 8). В этот цикл входит разветвление (блоки 6 и 7).

3. Разработка интерфейса проекта

Воспользуемся тем же интерфейсом проекта, который был применен для примера, рассмотренного в предыдущей лекции (подробнее).

4. Составление программы.

Option Explicit

Option Base 1

Private Sub Command1_Click()

1:   Dim i As Integer, k As Integer

    Dim a() As Single

    Dim НаибЭлем As Single

    Cls

5:   k = InputBox("Введите k")

    Print "k= " & k

    ReDim a(k)

    Print "Ввод вектора а"

    Ввод_вектора a

10:  НаибЭлем = a(1)

    For i = 2 To k

       If a(i) > НаибЭлем Then НаибЭлем = a(i)

    Next

Print "Наибольший элемент равен "; НаибЭлем

End Sub

Private Sub Ввод_вектора(x() As Single)

1:   Dim i As Integer

    Dim i_min As Integer

    Dim i_max As Integer

    i_min = LBound(x)

5:   i_max = UBound(x)

    For i = i_min To i_max

      x(i) = InputBox("Элемент вектора (" _

      & i & ")=?", "Ввод вектора")

      Print x(i),

    Next

    Print

End Sub

В этой программе применяется динамический массив a. В строке 9 тела процедуры Command1_Click происходит обращение к процедуре Ввод_вектора, которая обеспечивает ввод всех элементов массива a. Упрощенно можно действие этого обращения понимать так, как будто на месте строки 9 выполняется все тело процедуры Ввод_вектора, во всех инструкциях которого имя x заменено на имя a. Процедура Ввод_вектора обеспечивает не только ввод значений всех элементов массива, но печать на форме их значений для контроля правильности задания значений при вводе. В этой процедуре применяется обращение к функция LBound(x), которая возвращает наименьшее значение индекса массива, имя которого является аргуменом этой функции. В процедуре Ввод_вектора также применяется обращение к функция UBound(x), которая возвращает наибольшее значение индекса массива, имя которого является аргуменом этой функции.

Инструкция, находящаяся в стоке 8 процедуры Ввод_вектора, обеспечивает печать элемента массива. Следующий элемент массива будет выведен в той же самой строке (подробнее).

Инструкция, находящаяся в стоке 10 процедуры Ввод_вектора, нужна, чтобы следующая (если такая есть) инструкция Print после выхода из  процедуры Ввод_вектора выводила информацию на форме не в той же самой, а в следующей строке.

Логические операции

Эти операции могут применяться к данным и выражениям логического типа (Boolean).

В VB определены 6 логических операций: And (логическое «И»), Or (логическое «ИЛИ»), Not (логическое отрицание), Imp (логическая импликация), Xor (логическое исключительное «ИЛИ»), Equ (логическая эквивалентность). Рассмотрим первые три операции из этого списка. Операции Imp, Xor и Equ – реликты старых версий VB.

Операция Not имеет следующий синтаксис:

Not Операнд

Операнд, имеющий логический тип, – это отношение, переменная или функция логического типа или результат логической операции. Результат логического отрицания имеет значение противоположное значению ее операнда, что показывает приведенная ниже таблица:

Значение операнда

Значение операции Not Операнд

True

False

False

True

Операция And имеет два операнда:

Операнд 1 And Операнд 2

Результат операции логическое «И» определяет таблица:

Значение операнда 1

Значение операнда 2

Значение операции

Операнд 1 And Операнд 2

True

True

True

True

False

False

False

True

False

False

False

False

Операция And имеет значение True только тогда, когда оба операнда имеют значение True.

Пример. Неравенство axb следует записать a <= x And x <= b

Операция Or также имеет два операнда:

Операнд 1 Or Операнд 2

Результат операции логическое «ИЛИ» дан в таблице:

Значение операнда 1

Значение операнда 2

Значение операции

Операнд 1 OR Операнд 2

True

True

True

True

False

True

False

True

False

False

False

False

Операция Or имеет значение True, если хотя бы один операнд имеет значение True.

Пример. Условие значение х не принадлежит отрезку [a, b] следует записать:

x < a Or x > b  или  Not (x >= a And x <= b).

Логические операции имеют более низкий приоритет, чем арифметические операции.

Таблица приоритетов.

Приоритет

Операция

1  7

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

8

<, >, <=, >=, =, <>

9

Not

10

And

11

Or

Лекция 10

ПРОЦЕДУРЫ И ФУНКЦИИ

За исключением объявления переменных, типов и т.п. в контейнере весь код программы VB состоит из процедур и функций.

Виды процедур и функций

В программе на языке VB можно использовать несколько видов процедур и функций. Вот некоторые из них:

Событийная процедура – обработчик события. Код этой процедуры выполняется автоматически, если с объектом происходит событие, с которым эта процедура связана.

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

Функция во всем подобна пользовательской процедуре, а главное ее отличие от процедуры состоит в том, что функция возвращает значение в ту точку, откуда она была вызвана.

В предыдущих лекциях в примерах рассматривались процедуры обработки событий, которые в процессе выполнения программы инициировались (запускались) в результате свершения некоторого определенного события (щелчок мыши, нажатие кнопки и т.п.). В VB имеется возможность выделить неоднократно повторяющиеся фрагменты программы в определенным образом организованные функциональные блоки инструкций, которые можно использовать без их повторного написания и отладки. При этом сложные программы получаются более компактными, а функциональные блоки при их правильной организации могут использоваться в других программных разработках. Организовать функциональные блоки в VB можно в виде процедур (Sub) и функции (Function).

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

Рис. 10.1. Иллюстрация порядка выполнения процедур и функций

Выполнение программы может начаться только с событийной процедуры. В этой процедуре могут вызываться другие процедуры (процедура А) или функции. После вызова процедуры (функции) выполняются инструкции тела этой процедуры (функции). В свою очередь в вызванной процедуре могут быть обращения к другим процедурам или функциям (функция Б) и т.д.

Прекращение выполнения вызванной процедуры или функции (возврат) означает возвращение в вызывающую процедуру или функцию, выполнение которой продолжается с инструкции, следующей за инструкцией, в которой произошел вызов.

Вызов процедур и функций

Чтобы код функции или процедуры общего назначения был исполнен, она должна быть вызвана.

Вызов процедуры осуществляется вставкой в программу строки, которая начинается с ее имени. Сразу после имени должны следовать разделенные запятой аргументы процедуры, если таковые предусмотрены.

ИмяПроцедуры [Список значений аргументов]

Другой способ вызова процедуры (оставлен для совместимости со старыми версиями VB) заключается в использовании ключевого слова Call, при этом за ним должно следовать имя процедуры и заключенный в скобки список аргументов.

Call ИмяПроцедуры [(Список значений аргументов)]

Функция возвращает значение, в остальном же ее вызов подобен вызову процедуры.

X = A + ИмяФункции ([Список значений аргументов])

Чтобы функция могла вернуть значение, ее вызов должен фигурировать в какой-нибудь конструкции, использующей возвращаемое функцией значение (например, в качестве присваиваемой величины в операции присваивания, в качестве условия в конструкции  If и т. п.).

Объявление процедур и функций

Процедура (функция) не может быть определена внутри какой-либо процедуры или функции.

Для объявления процедуры используют следующий синтаксис:

[Private/Public][Static] Sub ИмяПроцедуры _

[(Список аргументов)]

[Инструкции]

[Exit Sub]

[Инструкции]

End Sub

Синтаксис объявления функции выглядит несколько иначе:

[Private/Public][Static] Function ИмяФункции _

[(Список аргументов)] [As Тип]

[Инструкции]

[ИмяФункции = Выражение]

[Exit Function]

[Инструкции]

[ИмяФункции = Выражение]

End Function

Пояснения синтаксиса:

Public. Этим словом объявляют в стандартном модуле процедуру или функцию, которая должна быть доступна всем процедурам и функциям всех контейнеров проекта. В форме это слово применять нельзя.

Private. В этом случае процедура или функция доступна только в пределах того контейнера, где она объявлена. Действует по умолчанию.

Static. Все переменные, объявленные в  в процедуре или функции станут статическими, то есть сохранят значения после завершения ее работы и выхода из нее.

Exit Sub или Exit Function. Эти инструкции осуществляют досрочный выход из процедуры или соответственно функции.

Синтаксис аргументов сам по себе является достаточно развитым:

[Optional] [ByVal / ByRef] [ParamArray] _ ИмяАргумента [()] [As Тип][= ЗначениеПоУмолчанию]

ИмяАргумента  это имя переменной, массива, элемента управления или формы (в последних двух случаях тип принимает значения Control или Form). В случае массива после имени массива ставится пара скобок ( ), внутри которых не указываются границы значений индексов, что позволяет использовать одну процедуру (функцию) для разного числа элементов массива в каждом конкретном случае.

Тип может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (только переменной длины), Variant, пользовательский тип или Control и Form.

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

Пример объявления процедуры вычисления площади прямоугольника по заданным значениям сторон:

Sub D (Длина As Single, Высота As Single, _

Площадь As Single)  

   Площадь = Длина * Ширина 

End Sub

Пример обращения к процедуре:

D w1, h1, s1

D w2, h2, s2

s = s1 + s2

Пример объявления функции вычисления площади прямоугольника по заданным значениям сторон:

Function Df (Длина As Single, _

Высота As Single) As Single

   Df = Длина * Ширина  

End Function 

Пример обращения к функции:

s = Df(w1, h1) + Df(w2, h2)

Пример процедуры формирования вектора из сумм элементов столбцов матрицы:

Sub MatrVektor (A() As Single, B() As Single, _

MaxI As Integer, MaxJ As Integer)

  Dim J As Integer, I As Integer

For J = 1 To MaxJ

A(J) = 0

For I = 1 То MaxI

А(J) = А(J) + B(I,J)

Next

Next

End Sub

Изменяя значения аргументов данную процедуру можно использовать для работы с матрицами произвольного размера.

А вот пример функции для вычисления среднего значения элементов одномерного массива:

Function FunSumVector (A( ) As Single, _

MaxI As Integer) As Single

   Dim Sum As Single, I As Integer

   Sum = 0

   For i=1 To MaxI

       Sum = Sum + A(I)

   Next

   FunSumVector = Sum/MaxI

End Function

В следующем примере функция Celsius пересчитывает градусы Фаренгейта в градусы Цельсия. Когда функция вызывается процедурой Command1_Ckick, переменная, содержащая значение аргумента, передается функции. Результат вычислений возвращается вызывающей процедуре и выводится в окно сообщения.

Sub Command1_Ckick()

  Dim t As Single

   t = InputBox( _

"Введите температуру в градусах Фаренгейта“)

   MsgBox "Температура равна " & _

Celsius(t) & " градусов Цельсия"

End Sub

Function Celsius(ГрадФар As Single) As Single

   Celsius = (ГрадФар - 32) * 5 / 9

End Function

Поясним назначение зарезервированных слов, применяемых при определении аргументов:

Optional. Это слово должно предшествовать имени того аргумента, который является необязательным. После необязательного аргумента могут следовать только необязательные же аргументы. Нельзя использовать необязательные аргументы совместно с массивом аргументов (ParamArray).

ByVal. Значение аргумента, которому предшествует это слово, будет передаваться в процедуру или функцию по значению (передается его копия). Если аргументом окажется внешняя относительно процедуры переменная, то никакие манипуляции с этим аргументом в теле процедуры или функции не изменят значения этой внешней переменной. Такой способ применяется для входных данных. При обращении к процедуре или функции соответствующий аргумент может быть выражением.

ByRef. Передача значения аргумента будет производиться по ссылке (передается физический адрес аргумента). Значение внешней переменной, переданной процедуре в качестве этого аргумента, может быть изменено операторами процедуры. Этот режим передачи аргументов по ссылке принят по умолчанию и используется для выходных параметров. При обращении к процедуре или функции соответствующий аргумент может быть только переменной.

ParamArray. Массив аргументов. Таковым может быть объявлен только последний аргумент в списке, при этом он будет представлять собой переменную типа Variant, содержащую в себе массив. Этим способом можно передавать в процедуру или функцию значительные объемы данных. При использовании массива аргументов нельзя применять свойства Optional, ByVal и ByRef.

ЗначениеПоУмолчанию. Допустимо только для необязательного аргумента. Задает значение, которое будет автоматически присвоено аргументу в случае его отсутствия.

Именованные аргументы

При вызове процедур Sub или Function возможна позиционная передача аргументов, т.е. в порядке следования в описании процедуры. Кроме того, аргументы могут передаваться по именам, вне зависимости от позиции в списке аргументов.

ИмяАргумента:= ЗначениеАргумента

Именованный аргумент состоит из имени аргумента, за которым следует двоеточие со знаком равенства (:=) и значение аргумента.

Именованные аргументы особенно полезны при вызове процедуры с необязательными аргументами (Optional).

Если используются именованные аргументы, то запятые для обозначения отсутствующих позиционных аргументов не нужны. С помощью именованных аргументов проще проследить, какие аргументы переданы, а какие опущены.

При вызове процедуры с аргументом Optional можно как указывать, так и не указывать необязательный аргумент. Если аргумент не указан, то для него используется имеющееся значение по умолчанию. Если по умолчанию значение не присвоено, аргумент обрабатывается так же, как любая другая переменная указанного типа.

Область действия имен процедур и функций

Для того чтобы процедура или функция была доступна во всех модулях и формах проекта, она должна быть объявлена в модуле с ключевым словом Public. Процедура или функция, объявленная в форме, доступна процедурам и функциям только этой формы (независимо от примененного ключевого слова Private или Public).

В список аргументов процедуры рекомендуется включать все входные и все выходные для этой процедуры данные.

В список аргументов функции рекомендуется включать все входные для этой функции данные. Ее единственный (как правило) результат возвращается в вызывающую программу через имя функции.

Должно выполняться следующее соответствие между списками аргументов при объявлении и при обращении:

Аргумент                    Аргумент при обращении

при объявлении

Переменная Константа, переменная, элемент массива, выражение.

Массив                    Массив

Форма                   Форма

Элемент управления   Элемент управления

Пример 1.

Sub Sum (A As Integer, B As Integer, С As Integer)

   С = А + В

End Sub

Sub Form_Click ()

   Dim X(1 To 3) As Integer

   X(1) = 1

   X(2) = 2

   Sum X(1), X(1) + X(2), X(3)

   Print Х(1), Х(2), Х(3)

End Sub

Sub Command1_Click ()

   Dim X As Integer, Z As Integer

   X = 5

 Sum X, 4, Z

   Print X, Z

End Sub

Результат при щелчке на форме: 1 2 4

Результат при щелчке на кнопке: 5 9

Пример 2.

Sub Sum (A ( ) As Integer)

A(3) = A(1) + A(2)

End Sub

Sub Form_Click ()

   Dim X(3) As Integer

   X(1) = 1

   X(2) = 2

   Sum X

   Print X(1), X(2), X(3)

End Sub

Результат:  1 2 3

Если никакое значение не присвоено имени функции, то имя функции принимает значение по умолчанию: числовая функция принимает значение 0, функция, объявленная как String, принимает значение пустой строки нулевой длины (“”), функция, объявленная как Variant принимает значение Empty (значение, которое принимает имя функции, называют возвращаемым значением функции).

Лекция 11

Пример 1

Заданы два одномерных массива a(1), a(2), … , a(k) и b(1), b(2), … , b(l). Центрировать и вывести массив а, если среднее значение его элементов меньше среднего значения элементов массива b. В противном случае центрировать и вывести массив b. Каждый элемент центрированного массива получается как разность значения соответствующего элемента исходного массива и среднего значения его элементов.

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

Перечень подзадач.

Ввод одномерного массива x. Применим уже знакомую нам процедуру: Ввод_вектора (x() As Single).

Вычисление для одномерного массива x, имеющего imax элементов, среднего значения его элементов. Применим функцию:

Среднее(x() As Single, imax As Integer) As _ Single.

Центрирование одномерного массива x, имеющего imax элементов. Применим процедуру:

ЦенирированиеВектора (x() As Single, imax As _ Integer, Вычитаемое As Single).

Вывод одномерного массива x. Применим процедуру: Вывод_вектора (x() As Single).

Рис. 11.1. Укрупненная блок-схема основного алгоритма

Укрупненная блок-схема основного алгоритма

Укрупненная блок-схема основного алгоритма приведена на рис. 11.1. Алгоритмы подзадач 2, 3 и 4 характеризуются простотой, что позволяет обойтись без составления их блок-схем. Основой всех этих трех алгоритмов является простой цикл.

Интерфейс проекта

Воспользуемся тем же интерфейсом проекта, который был применен для примеров, рассмотренных в предыдущих лекциях (подробнее).

Исходный текст программы

Option Explicit

Option Base 1

Private Sub Command1_Click()

Dim k As Integer, l As Integer

   Dim a() As Single, b() As Single

   Cls

   k = InputBox("k=?")

   l = InputBox("l=?")

   Print "k= "; k; " l= "; l

   ReDim a(k), b(l)

   Print "Ввод вектора а"

   Ввод_вектора a

   Ввод_вектора b

   Dim СреднееА As Single, СреднееВ As Single

   СреднееА = Среднее(a, k)

   СреднееВ = Среднее(b, l)

   If СреднееА < СреднееВ Then

       ЦентрированиеВектора a, k, СреднееА

       Print "Центрированный вектор а"

       Вывод_вектора a

   Else

       ЦентрированиеВектора b, l, СреднееВ

       Print "Центрированный вектор b"

       Вывод_вектора b

   End If

End Sub

Private Sub Ввод_вектора(x() As Single)

1:   Dim i As Integer

    Dim i_min As Integer

    Dim i_max As Integer

    i_min = LBound(x)

5:   i_max = UBound(x)

    For i = i_min To i_max

      x(i) = InputBox("Элемент вектора (" _

      & i & ")=?",”Ввод вектора”)

      Print x(i),

    Next

    Print

End Sub

Private Function Среднее(x() As Single, _

imax As Integer) As Single

   Dim sum As Single, i As Integer

   sum = 0

   For i = 1 To imax

       sum = sum + x(i)

   Next

   Среднее = sum / imax

End Function

Private Sub ЦентрированиеВектора(x() As Single, _

imax As Integer, Вычитаемое As Single)

   Dim i As Integer

   For i = 1 To imax

       x(i) = x(i) - Вычитаемое

   Next

End Sub

Private Sub Вывод_вектора(x() As Single)

1:   Dim i As Integer

    Dim i_min As Integer

    Dim i_max As Integer

    i_min = LBound(x, 1)

5:   i_max = UBound(x, 1)

    For i = i_min To i_max

      Print x(i),

    Next

    Print

End Sub

Лекция 12

Пример 2

Усложним условие примера, рассмотренного на предыдущей лекции. Заданы те же два одномерных массива. Требуется центрировать и вывести массив, у которого меньше среднее значение элементов, величина которых больше h. Новое условие полностью выглядит так:

Заданы два одномерных массива a(1), a(2), … , a(k) и b(1), b(2), … , b(l). Центрировать и вывести массив а, если среднее значение его элементов, имеющих значение больше h, меньше среднего значения элементов массива b, имеющих значение больше h. В противном случае центрировать и вывести массив b. Каждый элемент центрированного массива получается как разность значения соответствующего элемента исходного массива и среднего значения его элементов, имеющих значение больше h.

Изменения в перечне подзадач.

Изменения коснуться только подзадачи вычисления для одномерного массива x, имеющего imax элементов, среднего значения тех его элементов, значение которых больше h. Применим функцию: Function Среднее (x() As Single, imax As Integer, _ h As Single, Сигнал As Boolean) As Single

Новшество состоит в том, что если не окажется ни одного элемента массива x, значение которого больше h, то среднего вообще не существует. Обращение к функции Среднее может привести к двум ситуациям:

а) среднее значение существует (при этом аргумент Сигнал должен получить значение True.

б) среднее значение не существует (при этом аргумент Сигнал должен получить значение False).

Изменению подлежат только текст процедуры Command1_Click и функции Среднее.

Блок-схема алгоритма функции Среднее

Рис. 12.1. Блок-схема алгоритма вычисления среднего значения вектора


Изменения в основном алгоритме

Рис. 12.2. Блок-схема измененного участка основного алгоритма

Здесь sa и sb – переменные типа Boolean вычисляются при обращениях к функции Среднее для вектора a и b соответственно. Их значение говорит о том, существует или не существует среднее значение для соответствующего вектора.


Исходный
 текст программы

Option Explicit

Option Base 1

Private Sub Command1_Click()

   Dim k As Integer, l As Integer, h As Single

   Dim a() As Single, b() As Single

   Cls

   k = InputBox("k=?")

   l = InputBox("l=?")

   h = InputBox("h=?")

   Print "k= "; k; " l= "; l; " h= "; h

   ReDim a(k), b(l)

   Print "Ввод вектора а"

   Ввод_вектора a

   Print "Ввод вектора b"

   Ввод_вектора b

   Dim СреднееА As Single, СреднееВ As Single

   Dim sa As Boolean, sb As Boolean

   СреднееА = Среднее(a, k, h, sa)

   СреднееВ = Среднее(b, l, h, sb)

   If sa And sb Then

       If СреднееА < СреднееВ Then

           ЦентрированиеВектора a, k, СреднееА

           Print "Центрированный вектор а"

           Вывод_вектора a

       Else

           ЦентрированиеВектора b, l, СреднееВ

           Print "Центрированный вектор b"

           Вывод_вектора b

        End If

    Else

        Print "Решения нет "

    End If

End Sub

Private Sub Ввод_вектора(x() As Single)

1:   Dim i As Integer

    Dim i_min As Integer

    Dim i_max As Integer

    i_min = LBound(x)

5:   i_max = UBound(x)

    For i = i_min To i_max

      x(i) = InputBox("Элемент вектора (" _

      & i & ")=?",”Ввод вектора”)

      Print x(i),

    Next

    Print

End Sub

Private Function Среднее(x() As Single, imax As _

Integer, h As Single, Сигнал As Boolean) As Single

   Dim sum As Single, kol As Integer, i As Integer

   sum = 0

   kol = 0

   For i = 1 To imax

       If x(i) > h Then

           sum = sum + x(i)

           kol = kol + 1

       End If

   Next

       If kol <> 0 Then

           Среднее = sum / kol

           Сигнал = True

       Else

           Сигнал = False

       End If

End Function

Private Sub ЦентрированиеВектора(x() As Single, _

imax As Integer, Вычитаемое As Single)

   Dim i As Integer

   For i = 1 To imax

       x(i) = x(i) - Вычитаемое

   Next

End Sub

Private Sub Вывод_вектора(x() As Single)

1:   Dim i As Integer

    Dim i_min As Integer

    Dim i_max As Integer

    i_min = LBound(x, 1)

5:   i_max = UBound(x, 1)

    For i = i_min To i_max

      Print x(i),

    Next

    Print

End Sub

Пример 3

Заданы три одномерных массива a(1), a(2), … , a(k), b(1), b(2), … , b(l) и c(1), c(2), … , c(m). Найти у скольких из этих массивов значения всех элементов больше заданной величины h.

Перечень подзадач

Ввод одномерного массива x. Применим известную по предыдущим примерам процедуру.

Проверка для одномерного массива x, имеющего imax элементов, что значение всех его элементов больше заданной величины h. Применим функцию:

Проверка(x() As Single, imax As Integer, h As Single) As Boolean

Блок-схема алгоритма функции Проверка

Рис. 12.3. Блок-схема алгоритма функции Проверка

Здесь r – это локальная переменная типа Boolean.

Интерфейс проекта

Воспользуемся тем же интерфейсом проекта, который был применен для примеров, рассмотренных в предыдущих лекциях (подробнее).

Разработка программы

Option Explicit

Option Base 1

Private Sub Command1_Click()

   Dim k As Integer, l As Integer, m As Integer

   Dim a() As Single, b() As Single, c() As Single

   Dim h As Single

   Cls

   k = InputBox("k=?")

   l = InputBox("l=?")

   m = InputBox("m=?")

   h = InputBox("h=?")

   Print "k= "; k; " l= "; l; " m= "; m; " h= "; h

   ReDim a(k), b(l), c(m)

   Print "Ввод вектора а"

   Ввод_вектора a

   Print "Ввод вектора b"

   Ввод_вектора b

   Print "Ввод вектора c"

   Ввод_вектора c

   Dim Количество As Integer

   Количество = 0

   If Проверка(a, k, h) Then Количество = _ Количество + 1

   If Проверка(b, l, h) Then Количество = _ Количество + 1

   If Проверка(c, m, h) Then Количество = _ Количество + 1

   Select Case Количество

       Case 0

           Print "Не удовлетворяет ни один массив"

       Case 1

           Print "Удовлетворяет один массив"

       Case 2

           Print "Уудовлетворяют два массива"

       Case 3

           Print "Удовлетворяют три массива"

   End Select

End Sub

Private Sub Ввод_вектора(x() As Single)

1:   Dim i As Integer

    Dim i_min As Integer

    Dim i_max As Integer

    i_min = LBound(x)

5:   i_max = UBound(x)

    For i = i_min To i_max

      x(i) = InputBox("Элемент вектора (" _

      & i & ")=?",”Ввод вектора”)

      Print x(i),

    Next

    Print

End Sub

Private Function Проверка(x() As Single, imax As Integer, _

   h As Single) As Boolean

   Dim i As Integer

   Dim r As Boolean

   r = True

   i = 1

   Do While  (i <= imax) And r

       If x(i) > h Then

           Else

               r = False

       End If

       i = i + 1

   Loop

   Проверка = r

End Function

В функции Проверка вместо инструкции цикла Do While могла бы быть применена инструкция цикла For  вместе с инструкцией Exit For:

Private Function Проверка(x() As Single, imax As _ Integer, h As Single) As Boolean

   Dim i As Integer

   Проверка = True

   For i = 1 To imax

       If x(i) <= h Then

               Проверка = False

               Exit For

       End If

   Next

End Function

Лекция 13

Пример 4

Задана матрица а, имеющая кa строк и la столбцов, а также матрица b, имеющая кb строк и lb столбцов и матрица с, имеющая кc строк и lc столбцов.

Найти значение наибольшего из максимальных элементов этих матриц. Вывести матрицу, максимальный элемент которой оказался наибольшим.

Перечень подзадач

Ввод матрицы x, имеющей imax строк и jmax столбцов.

Применим процедуру Ввод_матрицы (x() As Single).

Определение максимального элемента матрицы x, имеющей imax строк и jmax столбцов.

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

МаксМатр(x() As Single, imax As Integer, jmax As Integer) As Single

Вывод матрицы x, имеющей imax строк и jmax столбцов.

Применим процедуру:

Вывод_матрицы (x() As Single).


Блок-схема алгоритма функции МаксМатр

Рис. 13.1. Блок-схема алгоритма определения значения максимального элемента матрицы

Интерфейс проекта

Воспользуемся тем же интерфейсом проекта, который был применен для примеров, рассмотренных в предыдущих лекциях (подробнее).

Разработка программы

Option Explicit

Option Base 1

Private Sub Command1_Click()

   Dim ka As Integer, la As Integer

   Dim kb As Integer, lb As Integer

   Dim kc As Integer, lc As Integer

   Dim a() As Single, b() As Single, c() As Single

   Cls

   ka = InputBox("ka=?")

   la = InputBox("la=?")

   kb = InputBox("kb=?")

   lb = InputBox("lb=?")

   kc = InputBox("kc=?")

   lc = InputBox("lc=?")

   Print "ka= "; ka; " la= "; la

   Print "kb= "; kb; " lb= "; lb

   Print "kc= "; kc; " lc= "; lc

   ReDim a(ka, la), b(kb, lb), c(kc, lc)

   Print "Задайте значения элементов матрицы a"

   Ввод_матрицы a

   Print "Задайте значения элементов матрицы b"

   Ввод_матрицы b

   Print "Задайте значения элементов матрицы c"

   Ввод_матрицы c

   Dim МаксА As Single, МаксВ As Single, МаксС As Single

   МаксА = МаксМатр(a, ka, la)

   МаксВ = МаксМатр(b, kb, lb)

   МаксС = МаксМатр(c, kc, lc)

   Dim МаксАВС As Single

   МаксАВС = МаксА

   If МаксВ > МаксАВС Then МаксАВС = МаксВ

   If МаксС > МаксАВС Then МаксАВС = МаксС

   Print "Наибольший элемент равен "; МаксАВС

   If МаксАВС = МаксА Then

       Print "Наибольший элемент содержит матрица a"

       Вывод_матрицы a

   End If

   If МаксАВС = МаксВ Then

       Print "Наибольший элемент содержит матрица b"

       Вывод_матрицы b

   End If

   If МаксАВС = МаксС Then

       Print "Наибольший элемент содержит матрица c"

       Вывод_матрицы c

   End If

End Sub

Private Sub Ввод_матрицы(x() As Single)

1:   Dim i As Integer

    Dim i_min As Integer

    Dim i_max As Integer

    i_min = LBound(x)

5:   i_max = UBound(x)

    Dim j As Integer

    Dim j_min As Integer

    Dim j_max As Integer

    j_min = LBound(x, 2)

10:  j_max = UBound(x, 2)

    For i = i_min To i_max

      For j = j_min To j_max

        x(i, j) = InputBox("Элемент матрицы ("  _

        & i & ", " & j & ") = ?",  _

        "Ввод матрицы")

        Print x(i, j),

15:    Next

      Print

    Next

End Sub

Private Function МаксМатр(x() As Single, imax As Integer, _

   jmax As Integer) As Single

   Dim i As Integer, j As Integer, МаксХ As Single

   МаксХ = x(1, 1)

   For i = 1 To imax

       For j = 1 To jmax

           If x(i, j) > МаксХ Then МаксХ = x(i, j)

   Next j, i

   МаксМатр = МаксХ

End Function

Private Sub Вывод_матрицы(x() As Single)

1:   Dim i As Integer

    Dim i_min As Integer

    Dim i_max As Integer

    i_min = LBound(x)

5:   i_max = UBound(x)

    Dim j As Integer

    Dim j_min As Integer

    Dim j_max As Integer

    j_min = LBound(x, 2)

10:  j_max = UBound(x, 2)

    For i = i_min To i_max

      For j = j_min To j_max

        Print x(i, j),

      Next

15:    Print

    Next

End Sub

В процедурах Ввод_матрицы и Вывод_матрицы применены функции Ubound и Lbound.

Не обязательно передавать в процедуры и функции значения верхних и нижних границ размерностей массива. Их можно вычислять. Для этого можно применить функции Ubound и Lbound соответственно.

Синтаксис обращения к этим функциям:

UBound(ИмяМассива [,Номер измерения])

LBound(ИмяМассива [,Номер измерения])

Параметр НомерИзмерения используют в случае многомерного массива, например:

Dim x() As Single

.

.

.

НаибольшийНомерСтроки = Ubound (x, 1)

НаименьшийНомерСтолбца = Lbound (x, 2)

Если номер измерения опущен, то он подразумевается равным 1.

Передача аргументов по ссылке и по значению

Передача значений аргументов при вызове процедуры или функции по ссылке (в списке аргументов для передаваемого таким образом аргумента используется ключевое слово ByRef) означает, что вызываемой процедуре или функции передается адрес ячейки памяти, по которому хранится значение аргумента (т.е. вызываемая процедура или функция для работы с переданным по ссылке аргументом использует ту же ячейку или область памяти, что и вызывающая процедура пли функция). При этом не выделяется дополнительная память для работы с переданным аргументом в вызываемой программе. Изменение значения аргумента в вызываемой процедуре или в функции означает изменение значения и в вызывающей процедуре или в функции (используется одна и та же ячейка или область памяти).

Передача по ссылке (ее поясняет рис 13.2) определена по умолчанию.

Рис. 13.2. Пояснение связи по ссылке

Передача значений аргументов при вызове процедуры или функции по значению (в списке аргументов используется ключевое слово ByVal) означает, что для аргумента выделяется дополнительная ячейка или область памяти, в которую записывается значение передаваемого аргумента. Изменения значения аргумента в вызываемой процедуре или в функции не ведут к изменению аргумента в вызывающей процедуре или в функции, так как вызываемая процедура или функция использует для аргумента другую ячейку или область памяти аналогично локальным данным (см. рис. 13.3). Это удобно, если модификация данных необходима только внутри вызываемой процедуры или функции и нет необходимости передавать измененные данные обратно в вызывающую процедуру или функцию.

Вместе с тем передача по значению (выделение дополнительной памяти) приводит к неэффективному использованию памяти. В связи с этим, для строк символов и массивов нецелесообразно использовать передачу по значению.

Рис. 13.3. Пояснение связи по значению

Лекция 14

Отладка

Различают ошибки программы:

Синтаксические ошибки (состоят в нарушении правил синтаксиса инструкций).

Ошибки периода выполнения программы.

Логические ошибки.

О синтаксических ошибках и ошибках периода выполнения среда сообщает на этапе ввода программного кода или его выполнения соответственно. Это упрощает обнаружение и исправление ошибок. Самым "крепким орешком" среди всех возможных являются логические ошибки. При их появлении код выполняется корректно, но желаемый результат не достигается.

Для выявления причин логической ошибки и ее устранения требуется обширное тестирование. VB предлагает некоторые эффективные инструменты для поиска источников ошибок.

Среда VB может находиться в трех режимах:

- разработка – design;

- выполнение – run;

- отладка – break.

1. Режим отладки

Набор команд меню Run и назначение многих кнопок панели инструментов зависит от состояния среды разработки. В режиме проектирования приложение можно только запустить, все же остальные возможности недоступны. При запуске можно выбрать один из двух вариантов: без полной компиляции или полную компиляцию всех процедур. Приложение запускается нажатием клавиши F5 или кнопки Start в среде разработки VB.

Переход в режим отладки выполняется нажатием клавиш Ctrl+Break или щелчком на кнопке Break панели инструментов. В режиме отладки можно выбирать один из вариантов: продолжать программу или перейти в режим разработки.

В режим выполнения можно перейти, нажав повторно клавишу F5 или щелкнув на кнопке Continue. Обратите внимание, что в режиме отладки кнопка Start носит название Continue.

Название текущего режима отображается в квадратных скобках в строке заголовка VB.

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

Большое преимущество режима отладки заключается в том, что выполнение программы приостанавливается в месте возникновения ошибки. Другим важным моментом является то, что при этом сохраняются значения всех текущих переменных и их можно увидеть. Для этого достаточно навести указатель мыши на имя соответствующей переменной.

В среде разработки VB инструменты поиска ошибок объединены в меню Debug. Воспользовавшись командой Toolbars меню View, можно отобразить панель инструментов Debug для доступа к основным средствам отладки.

2. Точка останова

Есть еще одна возможность переключения приложения в режим отладки. Это возможно благодаря точке останова (Breakpoint). Точка останова – это выделенная строка программы, на которой автоматически останавливается выполнение программы. По достижении этой строки программы Visual Basic также переходит в режим отладки.

Если щелкнуть левой кнопкой мыши на полосе индикатора (серая вертикальная полоса слева от программного кода), то в этом месте появится красная точка и находящаяся рядом строка закрашивается красным цветом. Установить и удалить точки останова можно также с помощью контекстного меню или кнопки Toggle Breakpoint панели инструментов.

Точки останова можно поместить в любой строке кода, кроме строк комментариев или пустых строк.

Среда разработки предоставляет еще ряд других возможностей установки и удаления точек останова. При этом текстовый курсор всегда должен находиться в соответствующей строке кода.

На панели инструментов Debug находится кнопка Toggle Breakpoint, позволяющая установить или удалить точку останова на текущей строке. Это можно сделать также нажатием клавиши F9. В меню Debug есть команда Set Next Statement. После  ее выполнения строка кода, в которой находится курсор, становится следующей выполняемой строкой. Для вызова этой команды используется также комбинация клавиш Ctrl+F9.

Установку или удаление точки останова для текущей строки можно выполнить и с помощью команды Toggle Breakpoint меню Debug. Удалить все точки останова во всем проекте можно с помощью команды Clear All Breakpoints меню Debug. 

Точки останова предназначены для принудительной остановки программы в нужном месте и перехода в режим отладки. В результате становятся доступными все средства отладки.

В режиме отладки VB особым образом выделяет строку, которая должна выполняться следующей. Сама строка выделяется желтым цветом, а на полосе индикатора рядом с ней появляется желтая стрелка.

Если выполнение программы прерывается в точке останова, то оба выделения комбинируются.

Чтобы продолжить выполнение программы с любой другой строки, необходимо желтую стрелку полосы индикатора просто перетащить мышью на нужную строку.

Если попытаться установить желтую стрелку на строку, которая не может быть выполнена, курсор мыши примет вид, указывающий на невозможность переноса. После отпускания кнопки мыши данная строка не выделяется.

Если при просмотре программы вы потеряли из виду текущую строку выполнения, то с помощью команды меню Debug, Show Next Statement можно вернуть ее в поле зрения в окне кода.

3. Пошаговое выполнение программы

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

Команды пошагового выполнения можно вызвать из меню Debug либо из панели инструментов Debug.

3.1. Шаг с заходом (Step into)

Для выполнения следует нажать кнопку Step into  на панели инструментов Debug или клавишу F8. При пошаговом выполнении строки кода выполняются одна за другой. После выполнения одной строки кода маркер следующей строки перемещается на одну строку.

Логическая последовательность строк программы сохраняется. Благодаря этому можно отслеживать последовательность выполнения строк при вызове процедуры, например, в операторах ветвления.

3.2. Шаг с обходом (Step Over)

Шаг с обходом подобен шагу с заходом. Различие проявляется только при вызове текущей процедурой других процедур. Если при шаге с заходом осуществляется переход в вызываемую процедуру, то шаг с обходом выполняет вызов процедуры как единичный оператор.

Шаг с обходом выполняется нажатием кнопки Step Over  на панели инструментов Debug или комбинации клавиш Shift+F8. Этот вид пошагового выполнения представляет интерес при поиске ошибки в процедурах, содержащих вызовы других процедур. Сначала можно протестировать текущую процедуру без захода в вызываемые процедуры. Если же выяснится, что ошибка возникает в вызываемой процедуре, то при следующем проходе следует войти в эту процедуру.

3.3. Шаг с выходом (Step Out)

Команда Step Out меню Debug позволяет выполнить оставшуюся часть текущей процедуры и возвратиться в точку вызова.

Для вызова команды Step Out можно воспользоваться также кнопкой панели инструментов Debug либо комбинацией клавиш Ctrl+Shift+F8. Эта команда доступна только в режиме отладки. Если текущая строка находится в вызванной процедуре, то с помощью команды Step Out остальная часть процедуры не выполняется по шагам. Отличие команды Step Out от команды Continue состоит в том, что после выхода из процедуры переключение в режим выполнения не происходит, если эта процедура была вызвана другой. Если же текущая процедура не была вызвана другой процедурой, то происходит переход в режим выполнения и VB ожидает возникновения события, выполнение процедуры обработки которого начнется в режиме отладки.

3.4. Выполнить до текущей позиции (Run To Cursor)

Команда Run To Cursor меню Debug позволяет выполнить программу от текущей выполняемой строки до строки с установленным в ней текстовым курсором. Для вызова команды Run To Cursor используется также комбинация клавиш Ctrl+F8.

Команда Run To Cursor может помочь, если проверяемая процедура содержит циклы. В этом случае их просмотр командой Step Into может занять слишком много времени, что особенно неприятно, если большая часть цикла выполняется корректно. Эта команда используется всегда, когда нужно пропустить пошаговое выполнение некоторых частей кода.

3.5. Список вызовов

При поиске ошибок часто нужно знать последовательность вызова процедур. В окне Call Stack отображается список имен всех выполняемых в данный момент процедур. Первым отображается имя текущей процедуры. За ним следует список процедур в той последовательности, в которой они были вызваны. Имя процедуры обработки события указывается в конце списка. Таким образом, образуется список всех вызванных процедур или функций. После завершения процедура удаляется из списка.

Окно Call Stack позволяет отобразить команда Call Stack... меню View, которая доступна только в режиме отладки. Для открытия окна можно воспользоваться также комбинацией клавиш Ctrl+L или соответствующей кнопкой на панели Debug.

С помощью кнопки Show этого окна осуществляется переход в окно кода к выбранной в списке процедуре.

Кроме этого, на полосе индикатора зеленым треугольником отмечается строка, содержащая вызов процедуры.

4. Окна режима отладки

Кроме контроля хода выполнения программы важной задачей инструментов отладки VB является проверка значений выражений. Для реализации механизма просмотра (watch) VB предлагает несколько способов. Контроль значений возможен только в режиме отладки. Более того, контролируемое выражение доступно только в определенных местах; например, значение локальной переменной можно проверить только в процедуре, в которой она объявлена. При попытке проверить значение выражения за пределами области определения появляется сообщение "Out of context" ("Вне контекста").

4.1. Окно подсказки Data Tips

Самый простой вариант просмотра значения переменной или выражения – использование окна Data Tips. Для открытия этого окна достаточно в режиме отладки установить курсор мыши на соответствующем выражении в окне кода.

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

4.2. Окно контрольного значения (Watch Window)

Это окно открывается с помощью команды меню View, Watch Window. Окно контрольного значения позволяет прослеживать изменение контролируемых значений, которыми могут быть значения переменных, выражений, а также свойств объектов. Контролируемые значения сначала следует добавить в окно контролируемо значения.

Проще всего для добавления контролируемых значений в окно воспользоваться методом Drag & Drop (перетащить и бросить). Для этого в окне кода следует выделить контролируемое значений,  затем навести на него указатель мыши, нажать левую кнопку мыши и, удерживая ее нажатой, перетащить контролируемое значение в окно контролируемого значения, после чего отпустить левую кнопку мыши (бросить).

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

Рис. 14.1. Окно контрольного значения

Пиктограмма, изображающая очки (тип просмотра Watch Expression), показывает, что будет отображаться только текущее значение выражения, которое будет автоматически обновляться при переходе в режим отладки. Пиктограмма руки со знаком равенства (тип просмотра Break When Value Is True) показывает, что если значение контролируемого выражения становится равным True или ненулевым, то осуществляется автоматический переход в режим отладки. Пиктограмма руки с треугольником (знак Δ (дельта), или символ приращения) обозначает, что выполнение программы прерывается при изменении значения выражения. Для изменения способа просмотра контролируемого выражения следует щелчком правой кнопки на окне контрольного значения раскрыть контекстное меню и выполнить команду Edit Watch.

Выражение, отображаемое в первом столбце окна контрольного значения, можно не только просматривать, но и редактировать.

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

Третий столбец отображает тип соответствующего выражения.

В последнем столбце указывается объект, которому принадлежит выражение или переменная. Это значит, что значение отображается, если при просмотре область действия указанного объекта больше или равна текущей области действия.

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

4.3. Окно локальных переменных (Local Window)

Окно локальных переменных функционирует аналогично окну контрольного значения. Однако если в окно контрольного значения необходимо явно добавлять выражения, то в окне локальных переменных все локальные переменные отображаются автоматически.

Для открытия этого окна следует вызвать команду Locals Window меню View или щелкнуть на соответствующей кнопке панели инструментов Debug.

Рис. 14.2. Окно локальных переменных

В первом столбце (см. рис. 14.2) отображаются имена локальных объектов и переменных. В первой строке приводится главный объект (форма, модуль или модуль класса), т.е. объект, которому принадлежит выполняемая процедура или функция.

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

4.4. Окно отладки (Immediate Window)

В режиме отладки в это окно можно вводить и выполнять код VB. Однако многострочные конструкции, например For. . .Next, использовать нельзя.

Для открытия окна отладки следует вызвать команду Immediate Window меню View или воспользоваться комбинацией клавиш Ctrl+G.

В этом окне (см. рис. 14.3) можно не только изменять содержимое переменных или свойств, но и применять методы объектов, что позволяет, например, имитировать логическую ошибку или вызывать процедуру. Для выполнения инструкции нужно поставить в ней курсор и нажать на клавишу Enter. Текстовый курсор при этом может не находиться в конце строки.

Рис. 14.3. Окно отладки

После выполнения строка из окна не удаляется, поэтому ее можно выполнять несколько раз с измененными, при необходимости, значениями. В окне отладки можно осуществлять не только ввод, но и вывод, воспользовавшись инструкцией Print. Для этого инструкции Print передается требуемое выражение, и после нажатия клавиши Enter результат отобразится в следующей строке.

С помощью перетаскивания можно перемещать выражения из окна кода в окно отладки и наоборот.

4.5. Инструкция Print

Вместо инструкции Print в окне отладки можно использовать вопросительный знак (?), как это было в старых версиях Basic (см. рис. 14.3). В окне отладки сохраняются последние 200 строк, которые можно редактировать или выполнять повторно.

Окно отладки можно использовать и по-другому. В этом случае, используя объект Debug и его метод Print, сообщения окну посылают из программного кода. Например, на рис. 14.3 можно увидеть результат работы находящейся в программном коде инструкции

Debug.Print "Число 2 = "; lblЧисло2.Caption

 Возможность такого вывода в окно отладки имеет несколько преимуществ. Во-первых, таким образом выводить контрольные значения можно не только в режиме отладки, но и в режиме выполнения, что позволяет выводить выражения, не останавливая выполнение программы. Во-вторых, выведенные значения, отображаемые в окне отладки, можно просмотреть даже после остановки программы. Это важно в случаях, когда поведение программы при пошаговом выполнении отличается от поведения при нормальном выполнении, например при приеме данных в режиме реального времени.

5. Обработка ошибок времени выполнения

В идеальном случае программа не должна бороться с ошибками в период выполнения. Однако разработчик должен предусмотреть вероятность появления сбойных файлов, переполнения памяти или ввода пользователем некорректных данных. Все это может послужить причиной возникновения ошибок при выполнении программы.

При обнаружении такой ошибки VB выводит соответствующее сообщение и приостанавливает выполнение программы.

Если приложение было запущено из среды разработки, то существует возможность переключиться в режим отладки с помощью кнопки Debug либо в режим проектирования с помощью кнопки End. Среда разработки относительно "мягко" реагирует на ошибки периода выполнения.

Если же такая ошибка возникает после запуска выполняемого ЕХЕ-файла, то приложение немедленно закрывается. Хотя сообщение об ошибке и появляется, если не предусмотреть перехват ошибок, то перейти в режим отладки невозможно. Это драматическая реакция, возможно, на совершенно безобидную ошибку.

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

Обработка ожидаемых ошибок времени выполнения производится в три этапа:

• перехват ошибки;

• проверка и устранение ошибки;

• продолжение выполнения программы.

5.1. Перехват ошибки

В VB для этого предназначена инструкция On Error, которая обычно помещается в начале процедуры или функции.

On Error GoTo Метка

On Error Resume Next

On Error GoTo 0

Выполнение инструкции On Error активизирует режим обработки ошибок. Это означает, что при возникновении ошибки периода выполнения после ввода в программу этой строки выполняются предусмотренные в программе инструкции обработки ошибки. Выполнение программы не прерывается и стандартное сообщение об ошибке не выводится.

Метка, указанная в инструкции GoTo, должна находиться в той же процедуре, что и инструкция On Error. Она указывается в отдельной строке и представляет собой имя, после которого ставится двоеточие. При возникновении ошибки управление будет передано на инструкцию, стоящую ниже метки.

Инструкцию Resume Next можно использовать вместе с инструкцией On Error, и тогда каждая строка, вызвавшая ошибку, игнорируется, так как управление передается на следующую инструкцию.

Если в качестве метки указан ноль (0), то предусмотренная разработчиком обработка ошибок отключается и включается стандартный механизм обработки ошибок.

5.2 Проверка и устранение ошибки

Инструкция On Error не выполняет непосредственно никакой обработки ошибок, а лишь передает управление ответственному за обработку ошибок фрагменту программы. Обычно метка находится в конце процедуры и перед ней помещается инструкция Exit Sub или Exit Function. Благодаря этой инструкции, при безошибочном выполнении процедура в этом месте завершает свою работу, и фрагмент процедуры после метки выполняется только после возникновения ошибки.

Обработка ошибки должна выполняться сразу после ее обнаружения. Сначала следует установить тип ошибки. Для этого в Visual Basic существует объект Err, свойство которого Number содержит код последней возникшей ошибки. Свойство Description этого окна содержит текстовое сообщение о последней ошибке.

Пример.

Dim ErrNum1 As Integer

ErrNum1 = Err.Number

Список кодов ошибок, которые можно перехватывать и обрабатывать, вы найдете в системе справок VB. После определения типа ошибки по ее коду (свойство Number объекта Err) следует попытаться устранить ошибку или обработать ее так, чтобы она не мешала выполнению программы. Например, при делении на нуль это может быть прекращение текущих вычислений. При ошибках обращения к диску может отображаться диалоговое окно для принятия пользователем решения о прекращении операции или повторном выполнении.

5.3 Продолжение выполнения программы

Завершив обработку ошибки, следует продолжить нормальное выполнение программы. Инструкция Resume позволяет вернуться в строку, вызвавшую ошибку, для ее повторного выполнения, а оператор Resume Next возвращает в следующую строку за строкой с ошибкой.

Процедура с обработчиком ошибок может выглядеть следующим образом:

Sub Error_Test()

Dim E As Single

On Error GoTo ErrLabel

'Включает обработку ошибок

For i = 4 То 0 Step -1

Е = 2 / I

'Вызывает деление на нуль

Next

Exit Sub

ErrLabel:                   'Метка

Select Case Err.Number      'Проверка ошибки

   Case 11                 'Деление на нуль

i = -1

Err.Clear

Resume              'Возврат

Case Else

MsgBox (Err.Description)

Stop

End Select

End Sub

Свойство Description объекта Err возвращает текст системного описания ошибки. Это можно использовать для вывода текста сообщения об ошибке в обработчике ошибок, поскольку системный вывод сообщения об ошибке при использовании обработчика ошибок не производится.

Лекция 15

Пользовательский тип данных

Кроме встроенных типов данных, таких как Integer, Long и т.п., VB поддерживает также типы данных, определяемые пользователем. Они могут быть созданы как на основе стандартных типов данных, так и на основе ранее определенных пользователем типов данных.

Для определения пользовательского типа данных используется ключевое слово Type:

[Private / Public] Type Имя_типа

   ИмяЭлемента1 [([Размерность])] As Тип

   [ИмяЭлемента2 [([Размерность])] As Тип]

End Type

Определив собственный тип данных, вы можете использовать его для объявления переменных этого типа. Эти переменные могут быть локальными, глобальными или переменными контейнера (подробнее):

Пример

Type Товар

   Название As String

   Цена As Currency

   Код As String

End Type

Dim Инструмент As Товар

.

.

.

   Инструмент.Название = "Отвертка"

   Инструмент.Цена =120

.

.

.

В этом примере определяется тип данных Товар. Затем объявляется переменная Инструмент типа Товар, и устанавливаются конкретные значения составляющих этой переменной.

Доступ к элементам переменной пользовательского типа осуществляется, по аналогии с доступом к свойствам, путем указания точки после имени переменной. При этом переменные одинакового типа можно присваивать не поэлементно, а напрямую:

Type Субъект

   Фамилия As String

   ТабельныйНомер As Integer

End Type

   Читатель As Субъект, Пользователь As Субъект

Private Sub Commandl_Click()

   Пользователь.Фамилия = "Иванов И.И."

   Пользователь.ТабельныйНомер = 218739

   Читатель = Пользователь

End Sub

Переменные Читатель и Пользователь относятся к одному типу Субъект. Поэтому они присваиваться напрямую, а не поэлементно.

Пользовательские типы данных могут быть составными. В этом случае важна последовательность определения типов. Сначала нужно определить базисный тип, который будет использоваться далее в составных типах. Если не соблюдать это правило, то после запуска программы появится сообщение об ошибке. Ниже приводится пример использования составных пользовательских типов данных:

Type Персона

   Имя As String

   Фамилия As String

End Type

Type Клиент

Идентификатор As Персона

   ДеньРождения As Date

End Type

Dim Покупатель As Клиент

Private Sub Command1_Click()

   Покупатель.Идентификатор.Имя = "Иван"

   Покупатель.Идентификатор.Фамилия = "Петров"

End Sub

Данные пользовательского типа рекомендуется использовать при обработке данных неизменной структуры.

Инструкция With

Инструкция With позволяет указывать объект только один раз для последовательности инструкций. Инструкция With ускоряет выполнение процедур и помогает избежать повторного задания имени объекта.

 Command1.Caption = “Вычислить

Command1.Font.Bold = True

Command1.Visible = False

С применением инструкции With этот программный код следовало бы записать так:

 With Command1

 .Caption = “Вычислить”

 .Font.Bold = True

 .Visible = False

End With

Для увеличения эффективности программы возможно создание вложенных инструкций With. Это показывает следующий пример.

Command1.Caption = “Вычислить”

Command1.Font.Name = "Arial"

Command1.Font.Bold = True

Command1.Font.Size = 15

Command1.Visible = False

 

Эквивалентный по результату действия программный код:

 With Command1

 .Caption = “Вычислить

 With .Font

  .Name = "Arial"

  .Bold = True

  .Size = 15

 End With

 .Visible = False

End With

Использование в качестве аргументов процедур и функции имен форм и элементов управления

Список аргументов процедур и функций может включать имена форм и элементов управления (в качестве описателей типа для них применяются соответственно Form и Control). Это позволяет создавать универсальные алгоритмы для работы с формами и управляющими элементами. Например, для привлечения внимания пользователя к одной из надписей формы можно создать одну универсальную процедуру, изменяющую  шрифт и его цвет:

Sub Внимание (lbl As Control)

   lbl.FontItalic =  True

   lbl.ForeColor = vbRed

End Sub

Аргументом процедуры является имя надписи. Обращение к данной процедуре с указанием в качестве значения имени какой-либо конкретной надписи приведет к изменению ее шрифта и цвета.

Знаки типов

Указывать название типа данных при объявлении не обязательно. Тип данных при объявлении может устанавливаться просто добавлением знака типа в конце имени переменной.

Знаки типов переменных:

Тип переменной

Знак типа

Пример

Integer

%

a%

Long

&

sum&

Single

!

sigma!

Double

#

b#

Currency

@

betta@

String

$

x$

Примеры объявлений переменных со знаками типов:

Dim Отчество$

Dim Процент@

Dim Счетчик%

Не все типы данных имеют собственные знаки. Применение знаков для объявления типов – устаревшая традиция, применение которой не рекомендуется.

В отличие от других языков программирования VB не требует явного объявления типа переменной. Если переменная появляется в инструкции в программном коде впервые, то тип будет объявлен автоматически. Это так называемое неявное объявление типа переменной.

Исходя из этого, следующие инструкции эквивалентны:

Dim a As Currency

a = 276

или

a@ = 276


Графика

В VB есть три графических объекта, которые позволяют работать с графикой, это:

форма (Form);

управляющий элемент графическое поле (PictureBox);

рисунок (Image).

Форма и графическое поле – это два объекта-контейнера, которые:

способны содержать в себе точечный рисунок из графического файла;

обладают графическими методами и позволяют с помощью графических методов рисовать на своей поверхности;

способные содержать в себе другие управляющие элементы.

Объект Image (рисунок) может только содержать в себе точечный рисунок, не обладает графическими методами и не не может включать управляющих элементов, т.е. не является контейнером.

1. Система координат

Как форма, так и графическое поле обладают системой координат (см. рис.15.1), которая применяется при любом выводе на поверхности формы или графического поля текста, графики и рисунков.

Рис. 15.1. Система координат

По умолчанию начало отсчета находится в левом верхнем углу объекта. Ось Х направлена вправо, ось Y – вниз.

Системой координат можно управлять как на этапе разработки так и при выполнении программы.

1.1 Свойство ScaleMode

Единицу измерения координат можно выбрать на этапе проектирования. За это отвечает свойство ScaleMode. По умолчанию в качестве единицы измерения выбран твип. Эта единица соответствует 1/1440 дюйма или 0,0176 миллиметра. В одном сантиметре примерно 567 твипов. Можно также выбрать в качестве единицы измерения пиксели (размер точки на рисунке), пункты или символы (применяется для текста), дюймы, сантиметры или миллиметры.

1.2. Свойства ScaleLeft и ScaleTop

Значения этих свойств определяют числовые значения координат левого верхнего угла объекта. Значения этих свойств не влияют на положение контейнера.

Рис. 15.2. Установка значения координат левого верхнего угла

Если в программном коде задать, например, инструкции ScaleLeft = 50 и ScaleTop = 100, то значения координат верхнего левого угла контейнера будут соответствовать рисунку, который расположен на рис. 15.2.

Если для контейнера (формы или поля рисунка) задать значение свойства ScaleTop = 100, то помещенный в этом контейнере объект управления, значение свойства  Top (значение координаты Y объекта) которого равно 100 будет помещен под верхнюю кромку контейнера.

Лекция 16

1.3. Свойства ScaleWidth и ScaleHeigt

Эти свойства задают масштаб при существующей высоте и ширине объекта имеются в виду внутренние размеры. Например:

ScaleWidth = 1000

ScaleHeigt = 100

Эти инструкции определяют единицу горизонтальной оси как 1/1000 внутренней ширины объекта, и единицу вертикальной оси как 1/100 текущей внутренней высоты объекта. Если размеры формы при выполнении программы изменяются, единицы остаются теми же.

1.4. Метод Scale

Позволяет определить систему координат и единицу измерения на форме, графическом поле и объекте Printer. Он задает координаты начала и конца отсчета по вертикали и горизонтали. Эту систему координат можно будет использовать, если свойство ScaleMode имеет значение 0.

Синтаксис метода:

[объект].Scale [(x1, y1) – (x2, y2)]

x1, y1 – координаты левого верхнего угла определяемой системы координат объекта;

x2, y2 – координаты правого нижнего угла определяемой системы координат объекта.

Если координаты опущены, то на рабочей поверхности объекта будет принята система координат по умолчанию (с единицей измерения – твип).

Метод Scale не изменяет размеры объекта, а задает значения координат его левого верхнего и нижнего правого углов.

2. Графические изображения

Изображение складывается из множества отдельных точек, которые называются пикселями. Изображение на экране является образом видеопамяти (специальный блок памяти, с которым работает видеоконтроллер). Количество точек на экране и информация по каждой из точек определяют режим работы дисплея и требуемый объем видеопамяти. В монохромных дисплеях один пиксель требует один бит видеопамяти (бит содержит 1 – соответствующая ему точка экрана светится, бит содержит 0 – не светится). В цветных дисплеях любой цвет создается смешением красного, зеленого и синего цветов различной интенсивности. На один пиксель отводится до 4 байта. В трех первых байтах кодируется интенсивность (от 0 до 255) соответственно красного, зеленого и синего цветов. Четвертый байт не используется.

R

G

B

Не используется

Цветовые возможности конкретного компьютера зависят от видеоадаптера и от выбранного в Windows видеорежима. Возможны видеорежимы 16-, 32-, 64-, 256-, 65536-цветные и с 16,7 миллионами цветов.

Для задания цвета графических объектов в VB используется специальная функция RGB, название которой образовано по первым буквам английских слов Red (красный), Green (зеленый) и Blue (синий). Функция использует три целочисленных аргумента RGB(R, G, B), которые могут принимать значения от 0 до 255. Первый параметр определяет интенсивность красного цвета, второй –  интенсивность зеленого, третий – интенсивность синего. При значении параметра 0 –  соответствующий цвет полностью отсутствует, 255 – максимальная интенсивность.

Ниже в таблице приводятся значения параметров RGB-функции для наиболее распространенных цветов.

Цвет

Красный компонент

Зеленый компонент

Синий компонент

Черный

0

0

0

Синий

0

0

255

Зеленый

0

255

0

Циан

0

255

255

Красный

255

0

0

Мажента

255

0

255

Желтый

255

255

0

Белый

255

255

255

3. Графические управляющие элементы

Это два элемента управления: Line (линия) и Shape (фигура). Элемент Shape за счет выбора соответствующих значений его свойства Shape способен превращаться в одну из шести геометрических фигур (окружность, овал, прямоугольник, квадрат, а также прямоугольник и квадрат со скругленными углами). С применением этих трех элементов управления можно создавать графику проще, чем посредством графических методов.

4. Работа с рисунками

Рисунки могут быть помещены в форме, в элементе управления графическое поле (PictureBox) и в элементе управления рисунок (Image). VB позволяет загружать в приложение файлы .jpg и .gif, а также .bmp, .dib, .ico, .cur, .wmf и .emf.

Во время разработки точечный рисунок может быть добавлен в форму или элемент управления двумя способами:

из  графического файла с помощью свойства Picture;

через буфер обмена.

В последнем случае следует скопировать рисунок из другого приложения в буфер обмена, вернуться в VB, выбрать форму, рисунок или графическое поле и в меню Edit (правка) выбрать Paste (вставить).

Для удаления рисунка из объекта следует выделить этот объект, затем в окне свойств выбрать свойство Picture, двойным щелчком на значении этого свойства выделить его и, наконец, нажать клавишу Delete.

В период выполнения можно выполнить загрузку изображения тоже несколькими способами.

Например, можно использовать функцию LoadPicture для присвоения полного имени файла свойству Picture. Следующий оператор загружает файл bmp1.bmp в элемент управления pic1:

pic1.Picture = LoadPicture(“c:\Pict\bmp1.bmp”)

Можно также скопировать изображение из одного объекта в другой. Следующий оператор копирует графику из элемента управления – рисунок img1 в элемент управления – графическое поле pic1:

pic1.Picture = img1.Picture

Для удаления изображения в период выполнения без замены его другим изображением можно воспользоваться функцией LoadPicture.

Следующий оператор удаляет изображение из графического поля img1:

img1.Picture = LoadPicture(“”)

5. Графические методы

Для создания графики VB, в дополнение к графическим элементам управления, имеет несколько графических методов для применения в форме и графическом поле (PictureBox), приведенных далее в таблице:

Имя метода

Назначение метода

Line

Рисует линию, прямоугольник или заполненное окно

Circle

Рисует круг, эллипс или дугу

Cls

Очищает всю графику и вывод метода Print.

PaintPicture

Закрашивает графику в произвольно выбранных местах

Point

Возвращает значение цвета выбранной точки

PSet

Устанавливает цвет отдельной точки

Очистка области рисования выполняется применением метода Cls:

[Объект.] Cls

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

Для нанесения точки применяется метод PSet

:

[Объект.]PSet(x,y)[,Цвет]

где х и y – координаты точки.

Например, нанесет точку синего цвета инструкция:

PSet(300,400), RGB(0,0,255)

Здесь и в следующих определениях аргумент Цвет можно задавать функцией RGB(R, G, B). Эта функция определяет цвет как смесь трех цветов: красного (R), зеленого (G) и синего (B), интенсивность каждого из которых задается числом из диапазона от 0 до 255.

Стереть точку можно инструкцией, которая задает для нее цвет фона:

PSet(300,400), BackColor

Для рисования линии, соединяющей точку (x1, y1) с точкой (x2, y2), следует применить метод Line:

[Объект.]Line [(x1, y1)] – [Step](x2, y2)[, Цвет]

Линия включает первую точку, но не включает вторую, конечную точку. Это полезно при рисовании замкнутого контура. Последнюю точку линии можно обозначить инструкцией

PSet Step (0, 0)[, Цвет]

Слово Step перед координатами означает, что они отсчитываются относительно последней точки рисования.

Например, инструкция Line (100, 200)–(150, 250) эквивалентна инструкции Line (100, 200)–Step(50, 50).

Если первая пара координат опущена, то линия будет нарисована от позиции текущей точки, которой является последняя точка рисования, до точки с координатами (x2, y2). Текущая точка может быть также задана с помощью ее координат CurrentX и CurrentY.

Например, следующие инструкции нарисуют треугольник:

CurrentX = 500

CurrentY = 1500

Line –(2000, 3000)

Line –(1000, 3000)

Line –(500, 1500)

Если аргумент Цвет опущен, то цвет линии определяется значением свойства ForeColor объекта.

Для рисования прямоугольников вместе с методом Line используется аргумент B, например инструкция

Line (200, 200)–Step(1000, 1000), , B

нарисует квадрат со стороной 1000 твипов. Две запятые перед аргументом B указывают, что аргумент Цвет опущен.

 Для рисования окружностей, эллипсов, дуг и секторов может быть применен метод Circle. Ниже показан синтаксис этого метода:

[Объект.]Circle [Step](x, y), Радиус[, [Цвет][, [Нач], [Кон][, Вид]]]

Здесь приняты некоторые новые обозначения:

x, y – координаты центра;

Радиус – радиус окружности, для эллипса – размер более длинной полуоси;

Нач и Кон – выраженный в радианах угол начала и угол конца дуги, которые присутствуют или отсутствуют в обращении к методу только вместе;

Вид – отношение вертикальной полуоси эллипса к горизонтальной полуоси (по умолчанию равен 1).

Например, процедура Form_Click в режиме выполнения после щелчка на форме нарисует на форме дугу окружности с центром в точке с координатами 2000, 1500, радиуса 1000 твипов, от начальной точки, расположенной под углом pi / 2, против часовой стрелки, до конечной точки, находящейся под углом pi / 3:

Private Sub Form_Click()

   Const pi = 3.14159265

   Circle (2000, 1500), 1000, , pi / 2, pi / 3

End Sub

Если перед началом или перед концом дуги поставить знак минус, то при рисовании дуги эта точка дуги будет соединена прямой с центром окружности.

Обращение Circle (600, 1000), 800, , , , 2 нарисует эллипс, вертикальная ось которого равна 1600, а горизонтальная ось равна 800.

При рисовании прямоугольника, круга или эллипса эти фигуры могут быть заполнены сплошным цветом или цветными линиями.

Свойство FillStyle отвечает за вид заполнения рисуемой фигуры, предлагая на выбор один из восьми видов заполнения. По умолчанию имеет значение 1 – Transparent (прозрачное, фигура выглядит незаполненной). Значение этого свойства 0 – Solid обеспечивает заполнение фигуры сплошным цветом, установленным свойством FillColor. Остальные значения 2 – 7 предлагают заполнение вертикальными, горизонтальными, наклонными линиями или в клетку.

Толщина линии при выводе задается значением свойства DrawWidth объекта.

Будет линия сплошной или различного вида прерывистой – определяет значение свойства DrawStyle объекта.

Свойство AutoRedraw формы или графического поля разрешает (при его значении, равном True) или запрещает (при его значении, равном False) перерисовывание результатов работы графических методов, например при изменении размеров окна.

Методы, осуществляющие вывод информации на форму, позволяют направлять ее непосредственно на принтер. Принтер (объект Printer) рассматривается как особая форма, размер которой совпадает с размером печатаемой страницы. Метод Scale применим для объекта Printer и позволяет установить нужную систему координат.

6. Построение графиков функций

Построим график функции у = -0.25х3 + 0.14х2 + 0.25 х – 25 на отрезке значений аргумента
[-10,+10]. Анализ показывает, что область значений функции на этом отрезке: -270 <
у < +270.

Option Explicit

Function Primer(x As Single) As Single

   Primer = -0.25 * x ^ 3 + 0.14 * x ^ 2 + _

   0.25 * x - 25

End Function

Private Sub Form_Click()

   Dim x As Single

   Scale (-10, -270)-(10, 270) 'установка масштаба

   Cls 'очистка экрана

   DrawWidth = 1 'установка толщины линии

   Line (-10, 0)-(10, 0)   'рисование оси Х

   Line (0, -270)-(0, 270) 'рисование оси Y

   CurrentX = -10 'текущее значение Х

   CurrentY = Primer(-10) 'текущее значение Y

   For x = -10 To 10 Step 0.5

       Line -(x, Primer(x)) 'построение графика

   Next

End Sub

Построенный график показан на рис. 16.1.

Рис. 16.1. Результат работы программы

Лекция 17

Файлы

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

Хранение больших объемов информации на внешних носителях с учетом того, что время доступа к данным на внешних носителях на один, два порядка ниже времени доступа к данным в оперативной памяти, требует их хорошо продуманной организации. Данные на внешних носителях информации хранятся в виде файлов.

Под файлом понимается именованная часть внешней памяти, предназначенная для хранения совокупность данных. Файл состоит из записей. Запись характеризуется длиной, выраженной в байтах.

Запись состоит из данных, которые передаются между оперативной и внешней памятью за одну операцию чтения или записи данных.

Чтение данных – это передача данных из внешней памяти в оперативную память, запись данных – это передача данных из оперативной памяти во внешнюю память.

Работа с файлами включает этапы:

получение номера свободного канала ввода-вывода, с которым будет связан файл;

открытие файла;

чтение или запись данных;

закрытие файла;

удаление файла.

Номер файла

Каждому открытому файлу система VB ставит в соответствие канал ввода-вывода с определенным номером. При выполнении операции ввода и вывода имеет значение не имя файла, а номер связанного с ним канала.

Номер свободного канала, который можно использовать для работы с файлом может быть получен с помощью функции FreeFile:

FreeFile [(RangeNumber)]

Необязательный параметр RangeNumber может принимать значение 0 (по умолчанию) и 1. Если его значение равно 0, то возвращается номер канала из диапазона 1– 255, если 1, то из диапазона
256 – 511.

Пример

n = FreeFile

Типы доступа к файлам

В VB предусмотрены три типа доступа к файлам:

последовательный доступ (Sequential) – для чтения и записи текстовых файлов, которых могут состоять из записей переменной длины;

произвольный доступ (Random) – для чтения и записи файлов с записями, которые могут быть только одинаковой длины;

двоичный доступ (Binary) – для чтения и записи отдельных байтов файла.

При последовательном доступе для доступа к какой-либо записи должны быть пройдены все предыдущие записи. При произвольном доступе можно сразу перейти к нужной записи. Все внешние устройства позволяют использовать последовательный доступ к записям файла. Произвольный доступ позволяют использовать только магнитные и оптические диски.

Последовательный доступ

Последовательный доступ используется главным образом при работе с текстовыми файлами. Текстовый файл может содержать коды символов, признак перевода строки ( vbCrLf или Chr(13) & Chr(10)),  признак табуляции (vbTab или Chr(10)) и признак конца файла. Здесь записи – это строки переменной длины, отделенные друг от друга символом перевода строки.

Файл последовательного доступа должен быть открыт инструкцией Open:

Open ИмяФайла For [Input / Output / Append] As НомерФайла

Ключевое слово

Описание

Input

Открытие только для чтения из файла

Output

Открытие для записи в файл

Append

Открытие для добавления к файлу

Если файл не существует и открывается для чтения (Input), то VB выдает сообщение об ошибке, а если для записи или добавления (Output или Append), то создается новый файл. Если файл с указанным именем существует, то в режиме Output его содержимое удаляется, а в режиме Append файл открывается для добавления:

В конце строки указывается номер файла НомерФайла.

Пример.

Open "С:\Readme.txt" For Append As fh1

Инструкция Close #НомерФайла предназначена для закрытия открытого файла. Если номер файла указан, то закрывается соответствующий файл, если нет, то закрываются все открытые файлы. Примеры:

Close #fh 'закрывает файл, описываемый номером fh;

Close fh 'использование # необязательно;

Close 'Закрывает все файлы, открытые приложением

Чтение из файла последовательного доступа

Для считывания данных из файла, открытого для последовательного доступа, существует несколько возможностей. В общем случае это осуществляется с помощью инструкции Input, имеющей несколько разновидностей:

Инструкция Line Input # считывает одну запись.

Line Input #НомерФайла, ИмяПеременной

 где Line Input – ключевое слово;

НомерФайла – это номер файла;

ИмяПеременной  имя переменной типа String или Variant, которая принимает значение записи файла.

При выполнении инструкции считывается одна запись файла и помещается в ячейку оперативной памяти, адрес которой соответствует имени переменной в инструкции ввода (переменная получает значение, совпадающее с введенной записью файла). Последовательное выполнение инструкций ввода обеспечивает последовательное считывание записей файла.

Инструкция Input$ - считывает заданное количество символов (байтов).

Может применяться как инструкция и как функция, например:

Строка = Input$  (КоличествоБайтов, НомерФайла)

Прочитать всю информацию из файла можно несколькими способами:

Private Sub Form_Click()

   Dim S As String, T As String

   Dim fh As Integer

   fh = FreeFile

   Open “c:\ReadMe.txt” For Input As fh

‘    1-ый вариант

   Do Until EOF(fh)

       Line Input #fh, S

       T = T & S & vbLf

   Loop

‘    2-ой вариант

‘    T = Input$(LOF(fh),fh)

   Close #fh

   Print T

End Sub

Оба варианта приводят к одинаковому результату. В первом варианте инструкция Input: выполняется в цикле, пока не будет достигнут конец файла. Функция EOF (сокращение End Of File) возвращает значение True при достижении конца файла. При этом на каждом шаге цикла считывается отдельная строка и к ней добавляется символ конца строки, который отбрасывается инструкцией Line Input.

Во втором варианте весь файл считывается функцией Input$. Функция LOF (сокращение Length Of File) позволяет определить длину файла в байтах.

3. Инструкция Input # - применяется для чтения файлов, записанных инструкцией Write #.

Запись в файл последовательного доступа

В VB для записи информации в файл используются инструкции Print # и Write #.

Инструкция Print # функционирует почти так же, как ее "коллега" для экрана, с той лишь разницей, что данные не выводятся на экран, а сохраняются в файле, открытом для записи или добавления. Для вывода информации в последовательный файл используется инструкция:

Print #НомерФайла, [ (Spc(n) / Tab[(n)])] [ Выражение] [ , или ;]

Print # - обеспечивает вывод в последовательный файл в формате дисплея (т.е. аналогично выводу на печать, например, на форме).

Выражение - выражение, значение которого записывается в файл.

Если выражения разделяются «;», то в файл они записываются без пробелов слитно.

Если выражения разделяются «,», то в файл они записываются в фиксированные зоны длиной 14 символов (зонный формат).

Если в конце выражения не стоит «;» или «,», то выведенная в файл строка дополняется символами <CR>, обозначающими переход к началу строки (ASCII-код равен 13), и <LF>, обозначающими переход на другую строку (ASCII-код равен 10). Таким образом, каждому значению соответствует одна запись или одна строка при выводе в формате дисплея.

Spc(n) и Таb(n) определяют соответственно вставку n пробелов между выводимыми выражениями и табуляцию на n колонок перед списком выражений.

Примеры

Print #fh, Text1.Text

Print #fh, "Фрагмент 1", " Фрагмент 2"

Print #fh, "Это составляет "; "единое целое"

Инструкция Write # имеет такой же синтаксис, что и Print #. Отличие состоит только в форматировании вывода. Если Print # сохраняет данные в виде обычного текста, то Write # заключает текстовые строки в кавычки, а цифры выводятся без кавычек:

Print #fh,”Москва”, ”Киев”, 85

‘ в файле будет: Москва Киев  85

Write #fh, “Москва”,”Киев”, 85

‘ в файле будет: “Москва”, “Киев”, 85

Данные, сохраненные с помощью инструкции Write #, можно считать инструкцией Print #.

Для удаления с дискового пространства неиспользуемого файла используется инструкция

Kill ИмяФайла

 где Kill – зарезервированное слово.

Произвольный доступ

В отличие от последовательного доступа, при котором записи  не структурированы, произвольный доступ предполагает, что  записи имеют постоянную структуру, а следовательно и одинаковую длину. Это позволяет считывать данные в произвольном порядке. Обычно эти данные имеют пользовательский тип.

Открытие файла

Файл произвольного доступа должен быть открыт инструкцией Open.

Open ИмяФайла For Random [Access Доступ] [Блокировка] As [#] НомерФайла [Len = ДлинаЗаписи]

Параметр Len определяет длину записи. Если это значение меньше, чем реальная длина записи, то возникает ошибка, если больше - то при записи файла используется больше дискового пространства, чем необходимо.

Параметр Access позволяет задать права доступа к открываемому файлу:

Доступ

Пример

Без указания

Ореn “Date.dat” For Random As НомерФайла

Чтение (Read)

Ореn “Date.dat” For Random Access Read As НомерФайла

Запись (Write)

Ореn “Date.dat” For Random Access Write As НомерФайла

Чтение и запись

(Read Write)

Ореn “Date.dat” For Random Access Read  Write As НомерФайла

Если права доступа не указаны, то по умолчанию используется Read Write.

Обычно с файлами с произвольным доступом пользуются многие приложения и многие пользователи при работе в сети. Для обеспечения целостности данных при коллективном использовании файла следует установить значение параметра блокировки, определяющего права доступа к открытому файлу. Этот параметр может принимать значения:

Shared
Файл может использоваться всеми процессами для считывания и записи.

Lock Read
Никакой другой процесс не может считывать данные из файла.

Lock Write
Никакой другой процесс не может записывать данные в файл.

Lock Read Write
Никакой другой процесс не может считывать или записывать данные.

Пример

Open "c:\ADDRESS.DАТ" For Random Access Write As 1 Len = 27

Ввод и вывод (Get - чтение, Put - запись)

Для чтения и записи данных используются соответственно инструкции Get и Put.

Get #НомерФайла, НомерЗаписи, Переменная

Put #НомерФайла, НомерЗаписи, Переменная

В примере в файл записываются данные из переменной Address, причем номер записи равен 7, а затем в переменную Address считывается вторая запись файла.

Put #fh, 7, Address 'сохраняет 7-ую запись

Get #fh, 2, Address 'считывает 2-ую запись

Для того чтобы в одной записи сохранить несколько значений различных типов, следует использовать пользовательские типы данных:

Type Person

FirstName As String * 20

Name As String * 20

CustomerN As Integer

End Type

Dim Customer As Person

Private Sub Command1_Click()

Dim fh As Integer

fh = FreeFile

Open "C:\LORE.DAT" For Random As fh Len = Len(Customer)

Get #fh, 2, Customer

Close #fh

End Sub

Двоичный доступ

Двоичный доступ незначительно отличается от произвольного доступа. Разница состоит только в том, что двоичный доступ возможен не к определенному набору данных, а к отдельному байту внутри любого файла.

Открытие файла для двоичного доступа

Для открытия двоичного файла также используется инструкция Open:

Open ИмяФайла Fоr Binary [Access Доступ] [Блокировка]  As [#] НомерФайла

Формат инструкции Open при двоичном доступе похож на формат этой инструкции при произвольном доступе. Главное отличие состоит в том, что вместо ключевого слова Random указывается Binary, а параметр Len отсутствует, так как записи имеют фиксированную длину – 1 байт.

Пример

Open “SPOCK.VUL” For Binary As fh

Ввод и вывод

Для считывания и записи в файл используются также инструкции Get и Put. Синтаксис их такой же, как при произвольном доступе, только вместо номера записи указывается номер байта:

Get #fh, 12, Var   'считывает 12-й байт

Put #fh, 4, Var 'записывает 4-й байт

Если данные считываются в строку, то будет считано такое количество байтов, равное длине строки:

Dim strOutput As String

str0utput = String(24, " ")’Создана строка длиной 24 байта

Get #fh, 26, str0utput

В данном примере в строку считывается 24 байта, начиная с 26-го байта файла

Лекция 18

События

Система Windows генерирует события (сообщения для приложения), которые предназначены для управления работой приложения. Приложение может реагировать или не реагировать на событие. Для того чтобы приложение реагировало на событие, программист должен поместить программный код в заготовке соответствующей событийной процедуры.

Некоторые события поддерживают почти все управляющие элементы. Такими событиями, например, являются:

GotFocus (Получил фокус) – генерируется в момент получения объектом фокуса клавиатуры. Пока объект  обладает фокусом, все события клавиатуры происходят для него.

LostFocus (Потерял фокус) – генерируется, когда фокус перемещается на другой объект.

Форма поддерживает события, некоторые из которых используются особенно часто.

Наиболее часто применяемые события формы

Имя события

Когда происходит

Load

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

Paint

При перерисовывании формой своего содержимого

QueryUnlload

Перед выгрузкой формы. Используется для отмены выгрузки формы

Resize

При любом изменении размеров формы, при первом ее появлении на экране, свертывании и восстановлении

Terminate

При прекращении существования формы. Из памяти удаляются все ссылки на форму, она больше не может быть загружена

Unload

При выгрузке формы из памяти. Ссылки на форму сохраняются, она может быть загружена заново

Источником некоторых событий может быть мышь.

События мыши

Имя события

Когда происходит

Click

При нажатии и отпускании кнопки мыши (щелчок)

DragDrop

При окончании перетаскивания объекта

DragOver

При перетаскивании объекта

MouseDown

При нажатии кнопки мыши. Аргументы событийной процедуры позволяют определить, какая из кнопок мыши была нажата и не происходит ли это при нажатой клавише Shift или Ctrl или Alt

MouseMove

При перемещении мыши

MouseUp

При отпускании ранее нажатой кнопки мыши

Клавиатура также является источником событий. События клавиатуры происходят для того управляющего элемента, который в данный момент обладает фокусом клавиатуры. В случае, если ни один управляющий элемент не обладает фокусом, это событие получит форма.  Но если свойству KeyPreview формы присвоить значение True (по умолчанию оно имеет значение False), то каждое событие клавиатуры будет происходить  сначала для формы, затем для управляющего элемента, обладающего фокусом клавиатуры.

События клавиатуры

Имя события

Когда происходит

KeyDown

При нажатии клавиши. Применяется для отслеживания нажатия функциональных клавиш, клавиш навигации и других, используемых для управления программой

KeyPress

При нажатии и затем отпускании одной из символьных клавиш. При нажатии не символьных клавиш событие не происходит

KeyUp

При отпускании ранее нажатой клавиши. Применяется для отслеживания нажатия функциональных клавиш, клавиш навигации и других, используемых для управления программой

Объекты, классы, коллекции

Объектами являются форма и управляющие элементы, помещенные на форму. Есть глобальные объекты VB.

Глобальные объекты VB

Объект

Описание

App

Приложение, содержит сведения об исполняющейся программе

Clipboard

Обеспечивает доступ к буферу обмена Windows и позволяет программе обмениваться данными с другими приложениями.

Debug

Отладка. Предназначен для облегчения поиска ошибок

Err

Содержит информацию об ошибках периода выполнения.

Error

Служит для отладки приложений, работающих с базами данных

Printer

Позволяет обращаться к принтеру, как к объекту

Screen

Позволяет обращаться к экрану, как к объекту

Объекты обладают свойствами. Значения свойств могут быть заданы на этапе визуального программирования, а также могут быть изменены кодом при выполнении приложения.

Большинство объектов кроме свойств также располагают методами. Метод позволяет выполнить определенное действие с объектом.


Вот некоторые примеры методов:

Имя метода

Назначение

Circle

Позволяет нарисовать на поверхности формы или управляющего

элемента PictureBox окружность, эллипс и сектор

Cls

Удаляет с поверхности формы или объекта  PictureBox

результаты графического и текстового вывода

Hide

Удаляет форму с экрана без выгрузки ее из памяти

Line

Рисует линии и прямоугольники на рабочей поверхности

формы или управляющего элемента PictureBox

Move

Перемещает объект в точку с заданными координатами

PSet

Рисует точку заданного цвета с заданными координатами на

поверхности формы или управляющего элемента PictureBox

SetFocus

Перемещает фокус клавиатуры на данный объект

Show

Отображает форму на экране

Size

Изменяет размеры объекта

К свойствам и методам объекта можно обратиться следующим образом:

ИмяОбъекта. Имя Свойства

ИмяОбъекта. Имя Метода

Например, выполнение приведенной ниже инструкции приведет к удалению окна формы с экрана:

Form1.Hide

Основная идея объекта состоит в том, что некоторые данные и код, предназначенный для работы с этими данными, объединяются в единое целое. Это объединение называется инкапсуляцией. Внешний код может взаимодействовать с  объектом через его свойства, методы и события.

Класс представляет собой шаблон объекта. А объект в этой связи – это одна из копий, созданных по заданному классом шаблону. По аналогии с переменными класс можно рассматривать как тип, а объект, как переменную этого типа.

Объектно-ориентированные языки (С++) поддерживают инкапсуляцию, полиморфизм и наследование.

Под полиморфизмом подразумевается, что в разных классах существуют методы с одинаковыми именами и решающие при этом одинаковые задачи.

В объектно-ориентированных языках, поддерживающих наследование возможно создание новых классов на основе уже существующих. При этом вновь созданный класс обладает всеми функциональными возможностями класса-родителя. Этот механизм называют наследованием.

VB поддерживает инкапсуляцию, отчасти поддерживает полиморфизм, но не поддерживает наследование.

Возможно объявление переменной объектного типа, значением которой является объект. Синтаксис объявления такой переменной:

Public/Private/Dim ИмяПеременной As [New] ИмяОбъектногоТипа

В качестве объектного типа рекомендуется вместо общих типов Object и Control применять  по возможности конкретные классы (такие как, например, Label или TextBox). В этом случае приложение будет работать быстрее. Список конкретных классов можно увидеть в окне Object Browser, которое можно открыть, щелкнув на кнопке на панели инструментов.

Примеры объявления переменных объектного типа:

Dim a As Object

Dim b As Control

Dim c As Label

Применение необязательного зарезервированного слова  New означает необходимость создания нового управляющего элемента указанного типа.

Чтобы переменная объектного типа содержала ссылку на объект, следует воспользоваться инструкцией, имеющей синтаксис:

Set ИмяПеременной = [New] Ссылка

Если ссылка указывает на несуществующий объект, то применение необязательного зарезервированного слова  New приведет к созданию нового объекта.

Коллекции

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

Так свойство Count содержит число объектов коллекции.

Некоторые методы коллекций

Имя метода

Назначение

Item

Позволяет выбрать объект в коллекции

Add

Включает объект в состав коллекции

Remove

Исключает объект из состава коллекции

Коллекция должна быть объявлена программистом с применением синтаксиса:

Public/Private/Dim ИмяКоллекции As New Collection

Для работы с элементами коллекции в VB предусмотрена инструкция цикла For Each … In … Next (для каждого … в …).

Синтаксис:

For Each Экземпляр In Коллекция

[Инструкции]

[Exit For]

[Инструкции]

Next

Эта инструкция повторяет выполнение группы инструкций для каждого экземпляра коллекции.

Пример.

Объявлены коллекция и три переменные, которые включены в коллекцию. Затем все содержимое коллекции распечатано (см. рис. 18.1).

Private Sub Form_Click()

Dim List As New Collection

Dim i As Integer

Dim s As Single

Dim st As String

Dim v As Variant   

i = 3

s = 1.5

st = "Test"

List.Add st

List.Add s

List.Add i

For Each v In List

     Print v,

Next

End Sub

Рис. 18.1. Результат работы программы

В VB определены две встроенные коллекции объектов, к которым можно обращаться без их объявления:

Forms. В эту коллекцию включены все загруженные формы проекта.

Controls. Коллекция включает все управляющие элементы всех форм.

В качестве примера рассмотрим процедуру, которая текст на всех надписях делает красного цвета.

Private Sub Command1_Click()

   Dim КоллекцияНадписей As New Collection

   Dim x As Control

   For Each x In Controls

       If TypeOf x Is Label Then

           КоллекцияНадписей.Add x

       End If

   Next

   For Each x In КоллекцияНадписей

       x.ForeColor = RGB(255, 0, 0)

   Next

End Sub

Первый цикл в этой программе просматривает все управляющие элементы проекта. Если управляющий элемент – надпись, то он включается в коллекцию КоллекцияНадписей.

Второй цикл просматривает все элементы коллекции КоллекцияНадписей и устанавливает красный цвет текста на каждом элементе этой коллекции.

В VB предусмотрена возможность определения новых классов. Однако эту важную тему мы вынуждены оставить за рамками нашего внимания.


Экзаменационные вопросы

Способы представления символов и чисел.

Основные типы данных VB.

Объявление констант и переменных.

Структура проекта.

Область действия и время жизни переменных.

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

Отношения, логический тип данных, логические операции.

Стандартные математические функции VB.

Приоритет операций, установленный в VB.

Инструкция присвоения, функция InputBox.

Метод Print, функция MsgBox.

Инструкция If.

Инструкция Select Case.

Инструкция For  … Next.

Инструкции Do While … Loop и Do … Loop While.

Инструкции Do Until … Loop и Do … Loop Until.

Статические и динамические массивы. Объявление массивов.

Объявление процедур и обращение к ним.

Объявление функций и обращение к ним.

Виды процедур VB. Область действия имен процедур и функций.

Синтаксис аргументов процедур и функций.

Передача аргументов по ссылке и по значению.

Необязательные аргументы, массив аргументов, именованные аргументы.

Пользовательский тип данных.

Система координат. Свойство ScaleMode. Метод Scale.

Графические управляющие элементы.

Графические методы.

Средства отладки VB.

Файлы с последовательным доступом, объявление, запись, чтение.

Файлы с произвольным доступом, объявление, запись, чтение.


Проект

Контейнер 1

Контейнер 2

Контейнер n

Форма

General

Процедура 1

Процедура n

Объекты

Модуль

General

Процедура 1

Процедура n

Рис. 5.4 Окно функции InputBox

Инструкция

Условие?

Да

Нет

Рис. 7.1. Цикл Do While … Loop

Инструкция

Условие?

Да

Нет

Рис. 7.2. Цикл Do … Loop While

Инструкция

Условие?

Нет

Да

Рис. 7.3. Цикл Do Until … Loop

Инструкция

Условие?

Нет

Да

Рис. 7.4. Цикл Do … Loop Until

Ввод k

Сумма = 0

i = 1

i <= k

Да

Нет

Сумма = Сумма + a ( i )

     s = Сумма/k

   Вывод s

Конец

i = i + 1

Ввод a

Рис. 8.1. Блок-схема процедуры Command1_Click

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

(9)

i = 1

Вход

i <= n

Ввод хi

i = i+1

Выход

Нет

Да

Рис. 8.2. Блок-схема алгоритма ввода значений всех элементов вектора

Рис. 9.1. Блок-схема алгоритма

Ввод k

НаибЭлем = a( i )

Вывод НаибЭлем

Конец

НаибЭлем = a(1)

i = 2

i <= k

Да

Нет

a( i )>НаибЭлем

Да

Нет

i = i + 1

Ввод a

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

(9)

Событийная процедура

Вызов процедуры А

Процедура А

Вызов функции Б

Возврат

Функция Б

Возврат

Главная секция (General)

(1)

(5)

(2)

(4)

(3)

Конец

Ввод  k, l

Ввод массива a

Ввод массива b

Вычисление CреднееА

Вычисление CреднееВ

CреднееА  <  CреднееВ

Центрирование массива b

Центрирование массива a

Вывод массива b

Вывод массива a

Да

Нет

Вход

sum = 0

kol = 0

i = 1

i<=n

sum = sum + x(i)

kol = kol + 1

x(i)>h

Да

Нет

Да

Нет

i =  i +1

kol>0

Среднее = sum/kol

Сигнал = True

Сигнал = False

Выход

Да

Нет

Конец

CреднееА  <  CреднееВ

Центрирование массива b

Центрирование массива a

Вывод массива b

Вывод массива a

sa And sb

Вывод “Решения нет”

Да

Нет

Да

Нет

Да

Вход

r = True

i = 1

(i <= n) And r

    x(i) > h

r = False

i = i +1

Проверка = r

Выход

Нет

Нет

Да

Да

Вход

МаксX = x(1,1)

i = 1

i <= imax

j <= jmax

МаксX = x(i,j)

x(i,j) => МаксX

j = j + 1

j = 1

i = i + 1

МаксМатр = МаксX

Выход

Нет

Да

Да

Нет

Нет

Значение аргумента в обращении к процедуре (функции)

Физическая ячейка памяти

Аргумент в объявлении процедуры (функции)

Значение аргумента в обращении к процедуре (функции)

Дополнительная физическая ячейка памяти

(копия значения аргумента)

Аргумент в объявлении процедуры (функции)

X

Y

X=0

Y=0

Форма или управляющий элемент

X

Y

X=50

Y=100




1. Minded bigoted openminded vegn leftwing rightwing socilist roylist buddhist conservtive liberl communist vegetrin dogmtic morl fscist
2. тематической познавательной деятельности направленной на исследование социальных объектов отношений и пр
3. статьям калькуляции их состав и экономическая значимость
4.  Представьте- людный декабрьский вечер не совсем вечер конечно но уже стемнело
5. Население как фактор размещения производства
6. Основные этапы эволюции растительного мираВ протерозойскую эру около 1 млрд лет назад ствол древнейших эук
7. Конструирование из бумаги с детьми 5-7 лет
8. на тему Основы работы в Microsoft Excel 2013 Программный продукт Excel разработанный фирмой Microsoft является популяр
9. tmi~, t~s tt~st~~n
10. І. викладач .
11.  Антисептика понятие виды современная антисептика
12. виробництвоприрода а тому ми повинні дуже уважно розглянути проаналізувати деякі принципи механізми чин
13. Очистка промышленных сточных вод
14. КОНТРОЛЬНАЯ РАБОТА ’1 Выполнила студентка 3 курса 831 группы Факультета МВСО заочн
15. ЭКОНОМИЧЕСКИЙ ИНСТИТУТ Кафедра естествознания Санитарногигиеническая карта услови
16. Осн источником дохв большинства граждан явл зар плата хотя ее удельный вес в общ совокупности дохв снизилс
17. ~ это ВПРМ непрерывноциклического действия Производительность машины Пм 24003000 шп-ч Сателлит машины П
18. 1939 австрийский невропатолог психиатр психолог
19. независимость право самостоятельного управления какойлибо частью государства закрепленное в общегосуд
20. представительной монархии.html