КулЛиб - Классная библиотека! Скачать книги бесплатно
Всего книг - 712808 томов
Объем библиотеки - 1401 Гб.
Всего авторов - 274559
Пользователей - 125076

Новое на форуме

Новое в блогах

Впечатления

Влад и мир про Шенгальц: Черные ножи (Альтернативная история)

Читать не интересно. Стиль написания - тягомотина и небывальщина. Как вы представляете 16 летнего пацана за 180, худого, болезненного, с больным сердцем, недоедающего, работающего по 12 часов в цеху по сборке танков, при этом имеющий силы вставать пораньше и заниматься спортом и тренировкой. Тут и здоровый человек сдохнет. Как всегда автор пишет о чём не имеет представление. Я лично общался с рабочим на заводе Свердлова, производившего

  подробнее ...

Рейтинг: 0 ( 0 за, 0 против).
Влад и мир про Владимиров: Ирландец 2 (Альтернативная история)

Написано хорошо. Но сама тема не моя. Становление мафиози! Не люблю ворьё. Вор на воре сидит и вором погоняет и о ворах книжки сочиняет! Любой вор всегда себя считает жертвой обстоятельств, мол не сам, а жизнь такая! А жизнь кругом такая, потому, что сам ты такой! С арифметикой у автора тоже всё печально, как и у ГГ. Простая задачка. Есть игроки, сдающие определённую сумму для участия в игре и получающие определённое количество фишек. Если в

  подробнее ...

Рейтинг: 0 ( 0 за, 0 против).
DXBCKT про Дамиров: Курсант: Назад в СССР (Детективная фантастика)

Месяца 3-4 назад прочел (а вернее прослушал в аудиоверсии) данную книгу - а руки (прокомментировать ее) все никак не доходили)) Ну а вот на выходных, появилось время - за сим, я наконец-таки сподобился это сделать))

С одной стороны - казалось бы вполне «знакомая и местами изьезженная» тема (чуть не сказал - пластинка)) С другой же, именно нюансы порой позволяют отличить очередной «шаблон», от действительно интересной вещи...

В начале

  подробнее ...

Рейтинг: +1 ( 1 за, 0 против).
DXBCKT про Стариков: Геополитика: Как это делается (Политика и дипломатия)

Вообще-то если честно, то я даже не собирался брать эту книгу... Однако - отсутствие иного выбора и низкая цена (после 3 или 4-го захода в книжный) все таки "сделали свое черное дело" и книга была куплена))

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

  подробнее ...

Рейтинг: +1 ( 1 за, 0 против).
DXBCKT про Москаленко: Малой. Книга 3 (Боевая фантастика)

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

В общем герою (лишь формально вникающему в разные железки и нейросети)

  подробнее ...

Рейтинг: +1 ( 1 за, 0 против).

Visual Basic .NET для "чайников". [Уоллес Вонг] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

byWaa
lceWang

Hungry Minds™

HUNGRYMINDS,INC.
Bes-S
' enilgBooks•Dg
ita
i lDownolads•eS
-ooks•AnswerNew
i orks•e-Newsele
trs•Ba
rndedWebSe
tis•e-Learnnig
NewYork,NY•Ce
l vea
l nd,OH•Indianapolis,IN

Уоллес Вонг

ДИАЛЕКТИКА
Москва • Санкт-Петербург • Киев
2002

ББК 32.973.26-018.2.75
В73
УДК 681.3.07

Компьютерное издательство "Диалектика"
Зав. редакцией В. В. Александров
Перевод с английского и редакция П.Л. Минько

По общим вопросам обращайтесь в издательство "Диалектика'
по адресу: info@dialektika.com, http://www.dialektika.com

Вонг, Уоллес.
В73 Visual Basic .NET для "чайников". : Пер. с англ. — М. : Издательский дом
"Вильяме", 2002. — 336 с. : ил. — Парал. тит. англ.
ISBN 5-8459-0288-6 (рус.)
Добро пожаловать в мир компьютерного программирования с использованием Visual Basic. NET — разработанного компанией Microsoft языка программирования, который поможет
вам легко и быстро писать собственные программы. Если вас давно волнует идея создания
своих программ, но в то же время вы опасаетесь, что вам это не по зубам, откиньте сомнения
прочь. Если вы в состоянии написать краткую пошаговую инструкцию о том, как пройти к
вашему дому, значит, сможете освоить и процесс написания программ на языке Visual Basic.
NET. Чтобы помочь вам в постижении азов программирования на Visual Basic. NET.
материал этой книги изложен простым, доступным языком, а основной акцент сделан па тех
функциональных возможностях, которые наверняка пригодятся вам при написании
собственных программных продуктов.
Книга предназначена для начинающих пользователей.
ББК 32.973.26-018.2.75
Вес названия программных продуктов являются зарегистрированными торговыми марками соответствующих фирм.
Никакая часть настоящею падания ни в каких целях не может быть воспроизведена в какой бы то ни было
форме и какими бы то ми было средствами, будь то электронные или механические, включая
фотокопирование и запись на магнитный носитель, если на это нее письменного разрешения издательства
Hungry Minds.
Copyright © 2002 by Dialektika Computer Publishing.
Original English language edition copyright © 2001 by Hungry Minds, Inc.
All rights reserved including the right of reproduction in whole or in part in any form.
This edition published by arrangement with the original publisher. Hungry Minds, Inc.
For [Dummies and Dummies Man are trademarks under exclusive license to Hungry Minds, inc. Used by permission.
ISBN 5-8459-0288-6 (рус.)
ISBN 0-7645-0867-9 (англ.)

© Компьютерное изд-во "Диалектика". 2002
© Hungry Minds, Inc., 2002

Оглавление
Введение
Глава 1. Как работает Visual Basic .NET
Глава 2. Пользовательский интерфейс приложения Visual Basic .NET
Глава 3. Создаем пользовательский интерфейс
Глава 4. Приступаем к написанию кодов BASIC
Глава 5. Создание пользовательского интерфейса: разберемся в деталях
Глава 6. Разработка форм
Глава 7. Элементы как средство предоставления пользователю
возможности выбора
Глава 8. Использование текстовых полей и надписей
Глава 9. Использование списков и полей со списком
Глава 10. Настройка отображения пользовательского интерфейса
Глава 11. Разработка раскрывающихся меню
Глава 12. Подменю, расширяемые меню и выпадающие меню
Глава 13. Диалоговые окна
Глава 14. Написание процедур обработки событий
Глава 15. Использование переменных
Глава 16. Получение данных от пользователя
Глава 17. Займемся математикой
Глава 18. Обработка текстовой информации
Глава 19. Определение констант и использование комментариев
Глава 20. Создание структур данных
Глава 21. Борьба с ошибками
Глава 22. Условные операторы If-Then
Глава 23. Оператор выбора Select Case
Глава 24. Создание циклов
Глава 25. Циклы, которые умеют считать
Глава 26. Вложенные циклы
Глава 27. Общие процедуры
Глава 28. Использование аргументов
Глава 29. Создание функций
Глава 30. Так что же это такое — объектно-ориентированное
программирование?
Глава 31. Объектно-ориентированное программирование на практике
Глава 32. Наследование и перегрузка
Глава 33. Десятка полезнейших советов, которые вы вряд ли найдете
в каком-нибудь другом месте
Глава 34. Советы по использованию интерфейса Visual Basic .NET
Предметный указатель

19
25
31
39
47
61
79
91
97
105
113
121
131
139
155
167
177
183
195
205
213
223
235
243
249
255
261
267
275
281
291
297
305
315
321
325

Содержание
Введение

19

Часть I. Создание программ на Visual Basic .NET
Глава 1. Как работает Visual Basic .NET
Написание программ на Visual Basic .NET

23
25
25

Создание пользовательского интерфейса
Определение свойств элементов интерфейса
Написание команд на языке BASIC

26
27
27

Что означает приставка .NET

28

Недостатки концепции .NET

29

Глава 2. Пользовательский интерфейс приложения Visual Basic .NET

31

Запуск Visual Basic .NET
Приступаем к созданию нового проекта
Открытие существующих проектов
Добро пожаловать в пользовательский интерфейс Visual Basic .NET
Манипулирование окнами
Как сделать окно плавающим
Как сделать окно закрепленным
Скрытие окон
Закрытие окна

31
32
34
34
36
37
37
38
38

Выход из Visual Basic .NET

38

Глава 3. Создаем пользовательский интерфейс
Основные компоненты пользовательского интерфейса
Использование панели Toolbox для рисования объектов
Создание вашего первого пользовательского интерфейса
Определение свойств элементов интерфейса
Зачем нужны свойства
Внесение изменений в свойства объектов
Изменение свойств объектов на стадии разработки интерфейса
Определение свойств для интерфейса вашей первой программы
Глава 4. Приступаем к написанию кодов BASIC

39
39
39
40
42
43
43
44
45
47

Что представляют собой коды BASIC

47

Написание процедур обработки событий
Быстрый способ создания процедуры обработки событий
Обычный способ создания процедуры обработки событий
Что могут делать коды BASIC
Как работают процедуры обработки событий
Написание кодов BASIC для своей первой программы

49
49
50
51
52
53

Часть II. Создание пользовательского интерфейса

59

6

Содержание

Глава 5. Создание пользовательского интерфейса: разберемся в деталях 61
До того как приступить к созданию интерфейса
Вспомните, для кого создается программа
Не дайте пользователю заблудиться
Сделайте навигацию очевидной
Будьте снисходительны
Не забывайте о простоте и удобстве
Приступаем к созданию интерфейса
Создание форм
Рисование объектов в окне формы
Изменение свойств объектов
Переименование объектов
Отображение текста на объекте
Настройка размеров объектов
Перемещение объектов на экране
Прикрепление объектов к сторонам формы
Закрепление объектов
Копирование созданного объекта
Удаление объектов
Выделение сразу нескольких объектов для перемещения, копирования или удаления
Определение для объектов свойства Tablndex
Выделение объектов серым цветом
Как сделать объект невидимым
Изменение текста, отображаемого на объекте
Глава 6. Разработка форм
Создание форм
Переименование форм
Отображение нескольких форм
Изменение внешнего вида форм
Итак, раскрасим вашу форму
Создание фоновых рисунков
Виды границ
Сворачивание и разворачивание окна формы
Размещение формы на экране
Удаление и добавление форм
Выбор формы, которая будет отображаться первой
Открытие, скрытие и закрытие форм
Открытие форм
Скрытие (и восстановление) форм
Закрытие форм
Глава 7. Элементы как средство предоставления пользователю
возможности выбора

61
61
62
62
62
63
63
64
64
66
67
68
70
70
71
72
73
73
74
74
76
77
77
79
79
79
80
81
81
82
82
84
86
87
88
88
89
89
90
91

Нажми на кнопку - получишь результат...

91

Создание флажков и переключателей

92

Содержание

7

Выравнивание флажков и переключателей
Группировка флажков и переключателей
Отображение текста на кнопках, флажках, переключателях и рамках групп

Глава 8. Использование текстовых полей и надписей
Создание надписей и текстовых полей
Изменение внешнего вида отображаемого текста
Раскрашивание текста надписей и текстовых полей
Настройка отображения границ
Выравнивание текста относительно границ объекта
Настройка текстовых полей
Прокрутка текста
Создание полей для ввода паролей
Ограничение длины текста

Глава 9. Использование списков и полей со списком
Создание списков и полей со списком
Как нарисовать объекты в окне формы
Настройка параметров поля со списком
Наполнение списка и поля со списком элементами для выбора
Сортировка элементов списков и полей со списком
Удаление элементов из списка
Сделайте список удобным

Глава 10. Настройка отображения пользовательского интерфейса
Установка одинаковых размеров для нескольких объектов

96

97
97
98
99
99
100
101
101
102
103

105
105
106
106
108
110
110
111

113
113

Выравнивание объектов

114

Определение расстояния между объектами

115

Выравнивание по центру

116

Фиксация положения объектов
Фиксирование положения всех объектов в окне формы

116
117

Фиксирование положения отдельных объектов

Часть III. Создание меню
Глава 11. Разработка раскрывающихся меню

8

93
94

117

119
121

Основные компоненты строки меню

121

Создание меню для интерфейса вашей программы
Добавление и удаление заголовков меню и команд меню
Перемещение заголовков и команд меню
Присвоение меню имен

122
123
124
124

Настройка меню
Добавление в меню разделительных линий
Назначение комбинаций клавиш
Отображение флажков рядом с командами меню
Выделение серым команд меню
Скрытие команд меню

125
125
126
128
129
130
Содержание

Глава 12. Подменю, расширяемые меню и выпадающие меню
Создание подменю

131
131

Изменение команд меню в процессе выполнения программы

132

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

133
133
134
136
136
137
138

Глава 13. Диалоговые окна
Создание простых диалоговых окон
Добавление пиктограмм
Добавление командных кнопок
Как определить, на какой кнопке щелкнул пользователь
Использование стандартных диалоговых окон
Создание окна OpenRle
Как определить, какой файл выбран пользователем в диалоговом окне OpenRle
Создание окна Save File
Как определить, какой файл выбран пользователем в окне SaveFile
Создание окна Color
Как определить, какой цвет был выбран пользователем
Создание окна Font
Как определить, какие опции были выбраны пользователем в окне Font
Создание окна Print
Создание окна PageSetup

Часть IV. Основы создания кодов
Глава 14. Написание процедур обработки событий

139
139
140
141
142
143
144
146
147
147
147
148
148
149
150
151

153
155

Работа с редактором кодов
Разворачивание и сворачивание кодов BASIC

155
156

Виды событий
Создание процедур обработки событий
Из каких частей состоит процедура обработки событий
Разделение окна редактора кодов на две части

157
157
158
159

Использование редактора кодов

160

Просмотр процедур обработки событий

162

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

164
164
164
164
164

Глава 15. Использование переменных
Чтение данных
Содержание

167
167
9

Переменные и их значения
Использование переменных
Объявление переменных
Присвоение имен переменным
Присвоение переменным числовых значений
Присвоение переменным текстовых значений
Присвоение переменным значений других переменных
Присвоение переменным значений свойств объектов
Область видимости переменных
Переменные, видимые в пределах блока
Переменные, доступные в пределах процедуры
Переменные, доступные в пределах модуля
Глобальные переменные
Использование переменных для представления объектов
Глава 16. Получение данных от пользователя
Использование свойства Text для получения текстовой информации

176
177
177

Получение логической информации

178

Получение числовых данных

179

Выбор из списка сразу нескольких элементов
Сколько элементов выбрал пользователь?
Определение выбранных пользователем элементов

180
180
180

Глава 17. Займемся математикой

183

Арифметические операторы
Сложение двух чисел
Вычитание чисел
Получение отрицательных чисел
Умножение чисел
Операция деления
Применение оператора Mod
Возведение в степень
Конкатенация двух строк
Изменение типов переменных

183
184
184
184
184
185
186
186
187
187

Логические операторы
Применение оператора Not
Применение оператора And
Применение оператора Or
Применение оператора Хог
Операторы сравнения
Сравнение числовых и текстовых значений
Использование для сравнения строк операторов = и
Использование для сравнения строк операторов >, >=, < и

Обзор основных компонентов пользовательского интерфейса

У

Как нарисовать интерфейс

>

Изменение свойств созданных элементов

мм ользовательский интерфейс предназначен для отображения информации на экране и
* ^ •* для получения данных от пользователя. Если вы создадите простой и понятный интерфейс, написанная вами программа также будет казаться доступной и удобной. Сделайте
интерфейс сложным и запутанным, и тогда можно будет продать кому-нибудь эту
"серьезн)ю" программу и написать книгу на 500 страниц с объяснением того, как "проста"
эта программа в использовании.
Чтобы дать вам общее представление о возможностях Visual Basic .NET, в этой главе (а
также в главе 5) мы рассмотрим основные этапы создания пользовательского интерфейса:
I S этап рисования интерфейса;
I V определение свойств элементов интерфейса;
I J написание кодов BASIC (этот этап описан в главе 4)

Основныекомпонентыпользовсипельасого
иярне[гфейса
Стандартный пользовательский интерфейс состоит из окон, в которых отображаются различные элементы, в первую очередь текст и картинки. Окна могут заполнять собою весь экран или только его часть. Одновременно могут быть открыты несколько окон. Они могут как
карты накрывать друг друга, а могут быть просто расположены рядом. На языке Visual Basic
.NET окна называются формами.
Если вы создаете новую форму, то вначале она будет пустой. Чтобы сделать ее чем-то полезной, нужно нарисовать на ней объекты. Объектом может служить кнопка, текстовое поле,
картинка, переключатель и т.д. В дальнейшем пользователи смогут общаться с вашей программой посредством щелканья на кнопках, ввода текста или манипулирования с объектами,
содержащимися в форме.

ИспользованиепанелиToolboxдлярисованияобъектов
Чтобы нарисовать объект, нужно воспользоваться панелью элементов Toolbox, которая
обычно находится в левой части экрана (если вы ее еще не переместили в какое-нибудь другое
место). На панели расположены значки и перечислены соответствующие им имена, представляющие различные типы объектов, которые вы можете нарисовать в окне формы (рис. 3.1).

Глава 3. Создаем пользовательский интерфейс

39

Toob
l ox

_„._._
, ..*"!

tt Panto
AM
A U*UM
.«] Buton
RbiTextBat
P Oe
ickBox
(^ RaSoButcn
^| pk*4*SProject

Visual Basic .NET отобразит диалоговое окно New Project (Создать проект), в котором вы сможете выбрать тип создаваемой программы.
2. Щелкните на значке Windows Application (Приложение Windows).
3. Щелкните в строке Name (Название), наберите слово H e l l o , а затем щелкните на кнопке ОК.
Visual Basic .NET отобразит пустую форму, именуемую F o r m l .
4. Поместите курсор мыши над правым нижним углом формы (прямо над маленьким квадратиком, называемым маркером, который будет отображен

40

Часть I. Создание программ на Visual Basic .NET

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

5. Выберите команду View ^ Tool box, чтобы на своем обычном месте в левой
части экрана отобразилась панель Toolbox.
(Пропустите этот шаг если панель Toolbox уже отображена.)
6. В панели Toolbox щелкните на значке Button (Кнопка).
7. Поместите курсор в окно формы, а затем переташите его, чтобы нарисовать
кнопку (рис. 3.2).
Не стоит особо беспокоиться по поводу точного размещения объекта в окне формы. Попытайтесь лишь придать ему вид, подобный тому, который вы видите на
рис. 3.2.
8. В панели Toolbox щелкните на кнопке PictureBox (Рисунок) и нарисуйте
объект в окне формы.
Повторите этот процесс еще два раза, чтобы выделить места для трех рисунков.
На рис. 3.3 показано, как эти места могут быть распределены. (Обратите внимание: на рисунке все три объекта выделены, благодаря чему вы их видите.)
'.К; WindawsAnulicationJ - Microsoft Visual Basic.NET Idesitin] - f-orm1.vl> Uesninl

£ile

£dlt

yiew

£rojeet fiulld gebug

Data

Fflfmat loots Hfindow

r"1 ?>•
I t x I [Properties _

X0

3ullon1 Syse
tm Wnidows For
BactCoo
li
• Conrlol
Backgroundn
la
i g«[J3l ("ore]
Cursor
Detauf
щ Fon(
Image
IrragtAlign

RigHToLeft
Тек!

MicioioilSan
I

I (топе)
MiddleC enter
О
(none
(none)
No
Bulloni

Allow Drop
ConlextMenu
Enabled
Tablndey
TahSlop
Visible
S C'.infiijylAl*
J4 IflunainirPini
1
f«Htt

Nor»
True
0
Ttue
True

Ready

Рис. З.2. Создание кнопки в окне формы
ч. Щелкните на значке объекта Label (Надпись) и нарисуйте его в окне формы
(рис. 3.4).
I О. Выберите команду File^Save All (Файл^Сохранить все).

Глава 3. Создаем пользовательский интерфейс

41

Рис. 3.3. Выделение места для трех рисунков

Рис. 3.4. Создание надписи в окне формы
11. Нажмите клавишу (или выберите команду DebugOStart).
Visual Basic .NET запустит вашу программу, и вы сможете увидеть созданный интерфейс. Поскольку вы пока еще не изменили установленные по умолчанию свойства объекта, ваш пользовательский интерфейс будет выглядеть пустым и обезличенным. Как сделать его более презентабельным, вы узнаете в следующем разделе.
12. Щелкните на кнопке закрытия в правом верхнем углу формы.
Visual Basic .NET остановит выполнение программы, и вы сможете продолжить
процесс ее создания.

OnfteqeAettue
uHineficfieuca
Прорисовка пользовательского интерфейса —- это только первый шаг на пути к разработке программы Visual Basic .NET. Теперь нужно определить свойства каждого созданного
объекта интерфейса.
"°—*'

42

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

Часть I. Создание программ на Visual Basic .NET

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

Lab ell Syse
tm Wndows Fom
i s Label*]
В Behavi»
AllowDrop
AutoSize
ContentMenu
Enabled
Tablnde*
Visible

False
False
(none)
True
2
7fue

В (DynamicP'opeitie
(Advanced)

В Dare
Ш (DataBindings)
Tag
В De?iqn

ШШ1ВН
' Locked
Modfiers
В Focus

'||
Labeli
FaJse
Atiembly

CausesVakdation True
В Lavout
Anchor
T O D , Lelt
Dock
None
Ш Location
Б4. 128
Ш Sue
184.48

%
^
Щ
%
§|
К

-.

Рис. З.5. В окне Properties все свойства организованы по категориям
Каждый объект может иметь свойства сразу нескольких категорий. Чаще всего вы можете
встретить следующие из них:
ii J Appearance (Отображение). Свойства этой категории определяют цвета, выравниI
вание, текстовые надписи, которые будут отображаться на объекте.
| S Behavior (Поведение). Определяют, как объект будет себя вести, когда пользоваI
тель щелкнет кнопкой мыши или нажмет клавишу.
S Data (Данные). Связывают объект с информацией, сохраненной в базе данных.
S Design (Проект). Определяют имя объекта, может ли он перемещаться и будет ли
отображаться для других частей программы.
S Focus (Фокус). Определяют действия объекта в момент выбора его пользователем.
•f Layout (Размещение). Определяют размер объекта и размещение его на экране.
Свойство Name, относящееся к категории Design,— это то свойство, которое
почти всегда изменяется. Visual Basic .NET автоматически присваивает объектам
стандартные имена, такие как T e x t l и B u t t o n 3 . Однако если вам нужно в тексте
программы указать определенный объект, намного легче это сделать, если присвоить ему легко запоминающееся имя.

Внесение изменений в свойства объектов
Свойства объектов могут изменяться на двух этапах:
| S на стадии разработки интерфейса;
Е ^ во время выполнения программы.

Глава 3. Создаем пользовательский интерфейс

43

На стадии разработки интерфейса в основном определяются размер, цвет и местоположение объекта.
В большинстве случаев свойства объектов устанавливаются именно на данном этапе.
Наиболее важное свойство, которое обычно изменяется, — это имя объекта.
Чтобы свойства объектов можно было изменять в процессе выполнения программы, нужно написать соответствующие коды BASIC. Таким образом поддерживается диалог с пользователем. Например, изменяя свойства объектов, можно отобразить на "экране какое-нибудь
сообщение или переместить объект в другое место.

Изменение свойств объектов на стадии разработки интерфейса
Изменить свойства объектов в процессе создания интерфейса очень просто. Делается это
следующим образом.
1. Щелкните на объекте, свойства которого необходимо изменить.
2. Откройте окно Properties (Свойства) и щелкните на названии нужного свойства.
Чтобы открыть окно Properties, нажмите клавишу .
3. Наберите или выберите HI списка новое значение этого свойства.
Ничего сложного, не так ли? Если вы будете следовать нашим советам и повторять на
компьютере все приведенные в этой книге примеры, вам довольно часто придется изменять
свойства объектов. Поэтому, когда нужно будет изменить набор свойств для одного или нескольких объектов, в книге будет просто приведена таблица, подобная представленной ниже.
Объект

Свойство

Значение

Form

Text

Hello, world!

Это значит, что вам нужно будет выполнить следующие действия.
1. Щелкнуть на объекте Form (Форма).
2. В окне Properties (Свойства) щелкнуть на свойстве Text (Текст).
3. В поле свойства Text набрать Не] ] о, w o r l d ! (Здравствуй, мир!).

Тест на проверку полученных вами знаний
. И з каких двух основных частей состоит
пользовательский интерфейс?
а. Из простого в использовании интерфейса и трех томов руководства по использованию этого интерфейса.
б. Из огромного сложного меню и большой
кнопки "Выход из программы".
в. Из монитора и клавиатуры.
г. Из форм и объектов.

44

2. Как можно изменить свойства объектов?
а
Н и к а к О н и с а м и и н о г д а меняЮтся.
б. Послать объекту сообщение с просьбой измениться.
в

Воспользоваться окном Properties во врем я создания интерфейса либо написать коды
BASIC для изменения свойств объектов в
процессе выполнения программы.

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

Часть I. Создание программ на Visual Basic МВТ

Определение свойств для интерфейса
вашей первой программы
Вот как можно определить свойства формы, которую вы начали создавать в этой главе.
1. Запустите приложение Visual Basic .NET. (Если оно уже работает, пропустите
этот шаг.)
2. Выберите команду FileORecent Projects^Hello.sIn (Файл^Последние проВыполняя действия, описанные в разделе "Создание вашего первого пользовательского интерфейса", на шаге 3 вы должны были дать своему проекту название H e l l o . Если же вы указали какое-нибудь другое имя, то сейчас выберите именно его.
3. Щелкните на рисунке, который расположен крайним слева.
4. Нажмите клавишу , чтобы открыть окно Properties.
5. Дважды щелкните на свойстве Name (оно относится к категории Design) и
наберите p i c S m i l e .
6. Щелкните на свойстве Image (Изображение), которое относится к категории
Appearance (Отображение).
Появится кнопка с тремя точками (...).
7.

Щелкните на кнопке с тремя точками (...).
Откроется диалоговое окно Open.

8. Откройте папку с пиктограммами. (Обычно найти ее можно с помощью команды Programs^Microsoft Visual Studio.NET^>Common7^Graphics^lcons).
9. Внутри папки Icons найдите папку MiSC и откройте ее.
Visual Basic .NET отобразит список пиктограмм, сохраненных в папке Misc.
10. Выберите пиктограмму FACE02 и щелкните на кнопке Open.
Visual Basic .NET отобразит в области объекта p i c S m i l e маленькое улыбающееся ЛИЦО.
11. Щелкните на свойстве SizeMode (Размер, категория Behavior), затем— на
кнопке со стрелкой и
в открывшемся списке выберите пункт
Stretchlitiage.
Visual Basic .NET увеличит вставленный рисунок до размеров выделенной для него области.
12. Щелкните на надписи L a b e l l .
13. Щелкните на свойстве BorderStyle (Тип границ, категория Арраегапсе), потом — на кнопке со стрелкой и выберите пункт FixecBD.
Visual Basic .NET придаст объекту L a b e l l объемный вид.
14. Дважды щелкните на свойстве Name (категория Design) и наберите
lblMessage.
15. Дважды щелкните на свойстве Text (категория Appearance) и удалите установленное по умолчанию значение.
16. В соответствии с табл. 3.1 измените указанные свойства для остальных объектов.
17. Выберите команду
.

FileOSave

All

или

нажмите

Глава 3. Создаем пользовательский интерфейс

комбинацию

клавиш

45

Поздравляем! Вы только что определили все необходимые свойства для своего первого
пользовательского интерфейса. Если вы все сделали правильно, ваша форма должна выглядеть так, как показано на рис. 3.6.

"к. WinriowsA|)|>licatioi3 - Microsoft Visual Basic.NE I |desi()ii| • Fornti.vb {Design!
£lla £dtt View £raject guild Oabug 0д1а Farma» loot» Bflndow
11

F .,= Fowtl

_ъ __ '
1

X
jFormi

г я Hello, World! Program

S 'tern Window FoimsF firm

Ы ? 1 LSi *
l ur-or
В Fonl
I
FcieColof
FrffnBorderSrylt
t
RigNToLe)t
Tent
В p 1 ,y..
AlluwJrsp
C]nt-?tMenu
Enabled
,
im^Mode
|В1ш,ГИшИ™
j ill I Dynamic Piopf r'l"
В |.,,
j Ш [Daiabindirg.J
,
Tag
В f>f ГПП
INsmai
DiawGrd
Ш CiiidSiie
Locked
SnspToGtid
В i nrut

EH»

'

3

. ,i

Default
_*J и
Mi ro'oftSisnsSfit
L_
• ContrrlTe«t
Sijatle
N3
Hello Wotldl Pi
Falie
[nnnH
True
NoCcrlrol

For ml
True
8, В
Fal^e
True
,

-

^

Рис. З.6. Так должен выглядеть пользовательский интерфейс после определения всех
необходимых свойств
Таблица 3.1. Свойства, которые нужно изменить для завершения разработки своего
пользовательского интерфейса
Объект

Свойство

Значение

Form

Text

Hello, World! Program

PictureBox2

Name

picFrown

Image

FACE04

SizeMode

Stretchlmage

Name

picHappy

Image

FACE03

SizeMode

Stretchlmage

Name

btnExit

Text

Exit

PictureBox3

Button 1

46

Часть I. Создание программ на Visual Basic .NET

Глава 4

Приступаем к написанию кодов BASIC
главе...
> Что могут делать коды BASIC
> Создание работающих процедур
> Написание кодов BASIC для вашей программы
компьютер начнет что-нибудь делать лишь при условии, что ему будут даны пошаговые инструкции. Если вы пропустите какой-то шаг или дадите неточные указания, компьютер не будет знать, что ему делать дальше. (Вообще-то компьютер знает, что ему
делать, просто он не сможет понять, что вы от него хотите.)
Программисты называют отдельную инструкцию командой. Обычная команда BASIC выглядит примерно так:
Taxes = Income * F l a t T a x R a t e
Набор команд программисты называют кодом. Если вы хотите найти обший язык с программистами (а они не разговаривают ни о чем, кроме как о программах), вам нужно изучить
их сленг и этикет.
Итак, никогда не говорите программисту: "Покажи мне свой набор команд". Он вас скорее всего не поймет, а если и поймет, то сделает вид, что не понял. Вместо этого скажите:
"Покажи мне свои коды".
Обычно код выглядит приблизительно следующим образом:
Income = 90000
F l a t T a x R a t e = .95
Taxes - Income * F l a t T a x R a t e
Совокупность кодов, которая заставляет компьютер делать что-нибудь полезное
(например, играть с вами в игру, считать что-либо или изображать на экране летающий гамбургер), называется программой.

4,fno nfieqanagusiHjtH собой tcoqu
Чтобы заставить компьютер что-то сделать, нужно дать инструкции, которые он сможет
понять. При использовании Visual Basic .NET все команды, которые даются компьютеру,
должны быть написаны на языке BASIC.
Как и все другие языки, BASIC оперирует собственным набором команд, каждой из которых соответствует свое ключевое слово. Некоторые из ключевых слов перечисленных ниже.
Loop
Function
Sub
End
Do
Integer
Case
If
Else
Select
Then
For
Коды BASIC сплошь состоят из ключевых слов, соответствующих командам языка
BASIC. Всякий раз, когда компьютер видит ключевое слово, он сразу же думает: "О, это специальная инструкция для меня, теперь я знаю, что делать!"

Глава 4. Приступаем к написанию кодов BASIC

47

Программа может состоять лишь из одной команды, а может вмещать в себя миллионы
команд. Короткие программы чаше всего выполняют что-нибудь не очень значительное, например отображают на экране надписи наподобие "Привет, Хозяин!" Большие программы,
как правило, способны на нечто более интересное, но с ними обычно и проблем побольше.
Теоретически, вы можете написать программу, содержащую миллион или более команд.
Однако те программисты, которые пытались это сделать, рисковали попасть к психиатру задолго до завершения своей работы.
Чтобы превратить процесс программирования в максимально приятное занятие, принято
большие программы разбивать на несколько маленьких, которые, к счастью, потом могут работать вместе. Программы, написанные на Visual Basic .NET, обычно состоят из трех частей
(рис. 4.1). Вот описание каждой такой части.
S Пользовательский интерфене. Информация о нем будет сохранена в файле с
расширением . VB. (Для его создания коды BASIC вам писать не придется.)
f S Процедуры управления событиями. Они сохраняются в том же файле, что и пользовательский интерфейс. (Эти процедуры создаются с использованием кодов BASIC
для отображения информации на экране и получения данных от пользователей.)
S Файлы модулей и классов. Состоят из кодов BASIC и предназначаются для проведения вычислений и манипулирования данными, полученными от пользователей.
Visual Basic .NET сохраняет модули и классы в файлах с расширением . VB.
Файл формы
Пользовательский
интерфейс
Процедуры
обработки
событий

Коды BASIC

Коды BASIC

Файл модуля

Файл класса

Рис. 4.1. Части, из которых обычно состоит программа
Visual Basic .NET
Файлы модулей содержат коды BASIC, называемые основными процедурами (они
будут рассмотрены в четвертой части книги). В Visual Basic .NET нет жесткого
предписания использовать эти файлы для сохранения части программы, однако их
применение помогает правильно организовать структуру программы и сделать се
удобной для модификации.
Поскольку файлы модулей и классов не обязательны, вы можете сохранить всю
программу (коды для управления данными и колы пользовательскою интерфейса)
в одном файле. Однако если вы так сделаете, то ваша программа станет трудной
для чтения и малопонятной (имеются в виду коды программы).

48

Часть I. Создание программ на Visual Basic .NET

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

Написание nftoqeqiffi o
Прежде чем приступать к написанию процедуры обработки событий для объекта формы,
этот объект нужно создать (точнее, нарисовать в окне формы).
Затем нужно настроить свойства созданных объектов и дать всем им имена, которые нетрудно бу.чет вспомнить. Если вы этого не сделаете, то вам придется столкнуться с именами
объектов, устанавливаемыми Visual Basic .NET по умолчанию (такими, как R a d i o B u t t o n l
или T e x t

Быстрый способ создания процедуры обработки событий
Многие объекты, к числу которых относятся те же кнопки и переключатели, должны как-то
реагировать на различные события, скажем на пользовательское щелканье мышкой. Чтобы сделать их способными на ответные действия, нужно написать код BASIC. Как вы уже могли догадаться, одним из самых распространенных событий является событие, носящее название Click
(Щелчок) и обозначающее, что пользователь навел курсор на объект и щелкнул кнопкой мыши.
Итак, 1тобы создать процедуру обработки событий для какого-то определенного объекта
формы, вы должны выполнить следующие действия.
1. Откройте форму, содержащую объект, для которого нужно написать процедуру обработки событий.
Для того чтобы сделать это, можно выполнить команду ViewoDesigner (Вид^
Конструктор), нажать комбинацию клавиш или щелкнуть на вкладке
Design. Если форма не появится на экране, выберите команду View^Solution
Explorer (Вид=> Разработчик задач) и дважды щелкните на названии нужной формы. Visual Basic .NET отобразит ее на экране.
Режим, при котором на экране отображается форма, называется режимом конструктора.
2. Дважды щелкните на объекте, для которого хотите написать процедуру обработки событий.
Если этим объектом будет кнопка, произведите на ней двойной щелчок. Visual
Basic .NET отобразит пустой код (его выполнение не влечет за собой никаких
действий) процедуры обработки событий, имеющий приблизительно такой вид:
P r o t e c t e d Sub B u t t o n l _ C ] : ck (ByVal s e n d e r As Object,,
EyVal e As

System.EventArgs)

End Sub

Глава 4. Приступаем к написанию кодов BASIC

49

Режим, при котором отображается окно с кодами BASIC, называется режимом
кодов. Можете пока не обращать внимания на всякий "мусор", который заключен
в круглые скобки.
3. Между первой и последней строкой напишите код BASIC, который должен выполняться после наступления события. Это может выглядеть примерно так:

Protected Sub Buttonl_Click(ByVal sender As Object,_
ByVal e As System.EventArgs)
Me.Close ()
End Sub

Обычный способ создания процедуры обработки событий
Каждый раз, когда вы рисуете новый объект, Visual Basic .NET сохраняет его имя в списке
объектов, который называется C l a s s Name (Имена классов). Этот список показан на рис. 4.2.
Список Class Name
Вкладка
Design

Вкладка
Code

Список Method Name

Jflew

£11.

Debug

*.-.'
(WndomApplicationS)
J

•vl

*

*

-

-d*!

* • *

a

« ЫпЕм* Cbck

[ O v e r r i d e ^
( B a t e

D a s s

E v e r t s ]

s e n d e r ?.з S y s t e m . C t o j e c t ,
- , »

p i ^ S r m l e

Rmdjf*

ColV

O«1

Рис. 4.2. Открыв список Class Name в окне кодов, выберите нужный объект
Для создания процедуры обработки событий вы должны сообщить Visual Basic:
I S имя нужного объекта;
I S событие, на которое этот объект должен отреагировать.
Делается это следующим образом.

50

Часть I. Создание программ на Visual Basic .NET

1. Переключитесь в режим кодов.
Чтобы переключиться в режим кодов, выберите команду View^Code (Вид^Коды),
нажмите клавишу или щелкните на вкладке Code. Visual Basic .NET отобразит
коды BASIC, отвечающие за работу вашего пользовательского интерфейса.
2. Щелкните на списке C l a s s Name и выберите объект, для которого хотите
написать процедуру обработки событий.
Например, если вы хотите написать процедуру обработки событий для определенной кнопки, найдите в списке C l a s s Name ее имя и щелкните на нем.
Если вы напишете процедуру обработки событий для объекта, а потом измените
его имя, Visual Basic .NET не сможет правильно на это отреагировать, так как будет думать, что вы просто создали новый объект, в точности похожий на старый.
Это означает, что переименованному объекту не будут соответствовать никакие
процедуры обработки событий. Поэтому переименуйте все объекты до того, как
начнете писать для них процедуры обработки событий.
3. Щелкните на списке M e t h o d Name (Имя метода) и выберите в нем событие,
на которое должен отреагировать объект.
Visual Basic .NET создаст пустую процедуру обработки событий.
4. В новой процедуре обработки событий напишите код BASIC, который будет
выполнен в случае наступления указанного события.

Тест на проверку полученных вами знаний
'Properties
Window, в окне Solution Explorer щелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. В категории Layout щелкните на свойстве Dock (Прикрепить).
Рядом появится кнопка со стрелкой.
4. Щелкните на кнопке со стрелкой, направленной вниз.
Откроется графическое меню, в котором будут отображаться серые прямоугольники, характеризующие способы прикрепления объекта к стороне формы (рис. 5.4).

Глава 5. Создание пользовательского интерфейса: разберемся в деталях 71

Рис. 5.4. Меню прикрепления, где можно
выбрать сторону, к которой будет прикреплен данный обьект
5. Щелкните на той серой кнопке, которая отвечает нужному расположению
объекта.
Visual Basic .NET сразу же растянет объект и прикрепит его к указанной вами
стороне.
Если объект ранее уже был прикреплен к какой-либо стороне, щелкните на кнопке
None, и данная опция будет снята.

Закрепление объектов
Когда вы прикрепляете объект, он автоматически изменяет свои размеры и становится
растянутым вдоль всей формы. Если вы не хотите, чтобы объект менял свою форму, можно
просто закрепить его положение относительно одной или нескольких сторон.
Закрепление объекта относительно какой-то стороны означает, что как бы пользователь
не изменял размеры окна формы, расстояние между объектом и указанной стороной будет
оставаться неизменным. Чтобы закрепить объект, сделайте следующее.
1. Щелкните на объекте, который вы хотите закрепить.
Вокруг границ этого объекта отобразятся маркеры.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду Viewc:>Properties
Window, в окне Solution Explorer щелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. В категории Layout щелкните на свойстве Anchor (Закрепить).
Появится кнопка с направленной вниз стрелкой.
4. Щелкните на кнопке со стрелкой.
Появится графическое меню, схематически отображающее объект и направленные к четырем сторонам прямоугольники, символизирующие способы закрепления (рис. 5.5).

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

72

Часть II. Создание пользовательского интерфей

5. Щелкните на одном или нескольких четырехугольниках, направленных к
нужным сторонам.
Теперь каждый раз, когда будет открываться форма, расстояние между объектом
и стороной, относительно которой он закреплен, будет оставаться неизменным.
Таким образом, если, скажем, объект закреплен относительно верхней и левой
сторон, то как бы пользователь не изменял размеры окна, расстояние между объектом и этими сторонами будет оставаться прежним.

Копирование созданного объекта
После того как объект будет создан и свойства его будут настроены нужным образом, вам
наверняка захочется просто скопировать его, чтобы создать еще один или несколько таких же
объектов. Это избавит вас от необходимости снова и снова проходить через все этапы построения объектов.
Чтобы скопировать объект, сделайте следующее.
1. Щелкните на объекте, который нужно скопировать.
Вокруг его границ отобразятся маркеры.
2. Нажмите комбинацию клавиш Tab Order.
Visual Basic .NET скроет значения свойства Tablndex для всех объектов.
Если по какой-то причине вы не хотите, чтобы пользователи могли выделять объект с помощью клавиши , присвойте свойству TabStop (категория Behavior)
значение F a l s e (Ложь). Это свойство доступно лишь тогда, когда снято отображение в окне формы значений свойства Tablndex.

Выделение объектов серым цветом
Если вы не хотите, чтобы пользователь щелкал на каком-то объекте (например, на кнопке
или флажке), можно выделить его серым цветом, как показано на рис. 5.7. Такой объект как
бы говорит пользователю: "Придет время, когда на мне можно будет щелкать, но сейчас этого делать не надо".
||И Dimmed and 11 nil inline ft objects

HLilDj

Гт: dimmed'

I'm not
dimmed!

Рис. 5.7. Обычный объект и объект,
который выделен серым
Чтобы выделить объект серым цветом, сделайте следующее.
1. Щелкните на объекте, который вы хотите выделить серым.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View!=> Properties
Window, в окне Solution Explorer щелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Щелкните на свойстве Enabled (Разрешенный), которое расположено под
категорией Behavior, и присвойте ему значение F a l s e .
Выделенный серым объект не способен ни на какие действия. Если же вы хотите, чтобы
он был недоступным не все время, а только иногда, напишите для него соответствующие коды BASIC.
Чтобы вы получили представление о беспрецедентной простоте кодов BASIC, ниже приведен код, который снимает выделение серым с кнопки (имя которой, скажем, b t n E x i t ) . Для этого нужно присвоить свойству кнопки Enabled значение
True (Истина). Вот как это делается:
B t n E x i t . E n a b l e d = True

76

Часть II. Создание пользовательского интерфей

Если вы хотите с помощью кода BASIC сделать кнопку недоступной, присвойте свойству
Enabled значение F a l s e . В случае кнопки b t n E x i t это будет выглядеть так;
BtnExit.Enabled = False
Итак, с помощью кодов BASIC можно выделять кнопку серым или снимать с нее выделение в процессе выполнения программы. Это может быть ответом на какие-либо действия,
производимые пользователем (например, на ввод текста, перемещение курсора, беспомощное
щелканье мышью и т.п.).

Как сделать объект невидимым
Помимо выделения недоступного объекта серым (что может смущать пользователей, поскольку объект все равно остается перед глазами и на нем хочется щелкнуть), таковой можно
вовсе убрать с экрана.
Чтобы отменить отображение объекта на экране, вы должны выполнить такие действия.
1. Щелкните на объекте, который отображать на экране не нужно.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View^Properties
Window, в окне Solution Explorer щелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Находясь в категории Behavior, щелкните на свойстве Visible (Видимый) и
присвойте ему значение F a l s e.
Убрать объект с экрана можно также с помощью кодов BASIC. Вот пример кода, который
убирает с экрана кнопку btr.New:
BtnNew.Visible = False
Как и выделенные серым, скрытые на экране объекты становятся недоступными пользователю. с тобы сделать объект доступным, нужно его снова отобразить на экране, присвоив
свойству Visible значение True. Вот пример кода, который позволит снова отобразить на экране кногку btnNew:
B t n N e w . V i s i b l e = True

Кзменекие liieicctna,
на oSbetane
Приведенный ниже пример демонстрирует, насколько легко и быстро можно создать код
BASIC, изменяющий текст, который отображается на кнопке. Вначале в окне формы нарисуйте кнопку и измените ее свойства, как показано в табл. 5.3.
Таблица 5 .3. Новые значения для свойств кнопки
Объект

Свойство

Значение

Button 1

Name

btnChangeMe

Text

Change Text

Глава 5. Создание пользовательского интерфейса: разберемся в деталях 77

Дважды щелкните на кнопке bLnChangeMe и наберите код для создания процедуры
управлениями событиями:
P r o t e c t e d Sub btnChar.geMe_Click (3yVal
System.Object,

s e n d e r As_

ByVal e As System.EventArgs)

btnChangeMe.Text = " I t w o r k s ! "
End Sub
Запустив программу, щелкните па кнопке, где написано Change T e x t . Visual Basic .NET
самым волшебным образом заменит текст на кнопке надписью It w o r k s ! Чтобы остановить
выполнение этой доброй и наивной программы, щелкните на кнопке закрытия окна формы.

78

Часть II. Создание пользовательского интерфейса

Глава 6

Разработка форм
главе...
У Создание форм и определение способа их отображения
> Изменение внешнего вида формы
> Открытие и закрытие формы
ж
амым главным элементом пользовательского интерфейса является окно, которое в
^•"' Visual Basic .NET называется формой. Большинство программ, написанных на языке
Visual Basic .NET, используют для своей работы не менее одной формы, а более сложные
программы применяют по две, три и более форм.
Программа может использовать одну форму, в частности, для отображения набора кнопок. Если пользователь щелкает на определенной кнопке, открывается вторая форма, содержащая, скажем, имена, адреса и телефоны сотрудников, у которых он одолжил деньги до зарплаты, но пока еще ничего им не вернул.

Создание фо[гм
Когда вы приступите к разработке проекта Windows Applications, Visual Basic .NET автоматически создаст одну пустую форму, чтобы вы могли сразу начать создавать свой пользовательский интерфейс. Но если ваша программа не будет отличаться особым аскетизмом и
простотой, вам наверняка понадобится еще парочка форм.
Вот каким образом можно создать новую форму.
1. Выберите команду Project^>Add Windows Form (Проект^Добавить форму)
или щелкните на панели инструментов на кнопке со стрелкой, расположенной справа от значка Add New Item, и выберите пункт Add Windows Form.
Откроется диалоговое окно Add New Item (Добавить новый элемент).
2. Укажите имя новой формы в текстовом поле Name.
Когда вы вводите имя формы, не нужно указывать расширение файла . VB; оно
будет добавлено к имени файла автоматически.
3. Щелкните на кнопке Open.
Visual Basic .NET отобразит новую форму, готовую к применению.
Возьмите за привычку периодически сохранять результаты проделанной вами работу,
тем более что для этого нужно всего лишь нажать комбинацию клавиш
или выбрать команду F i l e ^ S a v e All (Файл О Сохранить все). Если
ваш компьютер зависнет или если вдруг пропадет напряжение в сети, вы потеряете
только ту часть работы, которая была выполнена уже после последнего сохранения.

Переименование форм
При создании формы Visual Basic .NET автоматически присваивает ей стандартное имя,
наподобие Form3 . vb. Но вы можете дать форме более подходящее имя.

Глава 6. Разработка форм

79

1. Откройте окно Solution Explorer.
Чтобы сделать это, нажмите комбинацию клавиш , выберите команду View^Solution Explorer или щелкните на панели инструментов на значке
Solution Explorer.
2. Щелкните на форме, которой вы хотите присвоить новое имя.
Можно также щелкнуть правой кнопкой мыши в окне формы, выбрать в открывшемся списке команду Rename (Переименовать) и указать новое имя. Если вы
поступите именно так, то можете не выполнять шаги 3 и 4, указанные ниже.
3. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду ViewProperties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
4. Дважды щелкните на свойстве Name (Имя), относящемся к категории DeSign, и наберите новое имя.
Visual Basic .NET всегда добавляет к имени формы расширение . VB, например:
f rmMain. vb.

Отображение нескольких форм
Поскольку программы обычно состоят из двух и более форм, иногда возникает необходимость отобразить на экране сразу несколько форм. Вот как это делается.
1. Откройте окно Solution Explorer.
Чтобы открыть данное окно, нажмите комбинацию клавиш , выберите команду View^>Solution Explorer или щелкните на панели инструментов на
значке Solution Explorer.
2. Дважды щелкните на форме, которую хотите открыть.
Visual Basic .NET отобразит выбраню вами форму.
Visual Basic .NET может в каждый отдельный момент времени отображать на экране только одну форму. Однако если вы выбрали для просмотра несколько форм,
Visuai Basic .NET поместит каждую из них на отдельной вкладке. Имя формы и
слово Design будут отображаться на корешке соответствующей вкладки, и все
корешки будут постоянно видны на экране. Для того чтобы отобразить какую-то
форму, достаточно щелкнуть на ее корешке. А чтобы просмотреть коды BASIC,
относящиеся к форме, нужно щелкнуть на вкладе кодов.
-» Ballot • Microsoft Visual 6asic.NET [design I • Stuff.uh [Design I
£lle Edit Jtfew £roject guild Qehug Data Formal laob Himtew Help
Stuff yb ГОвиопГ

Вкладки Design

'

-

Вкладка Code

Рис. 6.1. Вы можете быстро перейти к нужной форме, щелкнув на вкладке с ее именем

80

Часть //. Создание пользовательского интерфей

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

Итак, раскрасим вашу форму
По умолчанию все создаваемые Visual Basic .NET формы имеют серую фоновую заливку.
В этом нет ничего страшного, но иногда все же хочется добавить хоть какой-то цвет, чтобы
окно формы не выглядело как фрагмент бортовой части линкора или эсминца.
Изменить цвет фона в окне формы можно следующим образом.
1. Откройте окно Solution Explorer.
Чтобы сделать это, нажмите комбинацию клавиш , выберите команду Viewt> Solution Explorer или щелкните на панели инструментов на значке
Solution Explorer.
2. Дважды щелкните на форме, вил которой хотите изменить.
Вокруг выбранной вами формы появятся маркеры.
3. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View^Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
4. Щелкните на свойстве BackColor (Цвет фона), относится к категории Appearance.
Рядом появится кнопка со стрелкой.
5. Щелкните на кнопке со стрелкой.
Cbstan Web | System |

CZ
Da
Slam
l on
C
33
JC
okra
1
tH
..B
• "iSeibji
t Sam
l on
(ШШ
ZZS
lLhocolale
ean
Snhael
I SaddleBrown
ПП Sandi-B'wn

PeachPuli
EmPttu
С П Liren
СИ Bisque

Рис. 6.2. Выберите в этом окне
цвет фона для своей формы

Откроется диалоговое окно (рис. 6.2), в котором вам на выбор будут представлены три типа фоновых цветов:
• Custom — обычный набор цветов и их оттенков;

Глава 6. Разработка форм

81

• Web — цвета, разработанные для создания Web-страниц (что не мешает вам
использовать их при создании собственной программы);
• System — цвета, используемые в среде Windows (например, цвета кнопок на
панелях инструментов).
6. Щелкните на одной из вкладок и выберите понравившийся цвет.
Visual Basic .NET заполнит форму указанными цветом.

Создание фоновых рисунков
Вы можете не только заполнить окно формы каким-нибудь цветом, но и применить в качестве фонового рисунка какое-либо изображение, например, логотип компании, горный пейзаж или портрет вашего босса.
Чтобы сделать некий рисунок фоновым, необходимо выполнить следующие действия.
1. Откройте окно Solution Explorer.
Чтобы сделать это, нажмите комбинацию клавиш , выберите команду View^Solution Explorer или щелкните на панели инструментов на значке
Solution Explorer.
2. Дважды щелкните на форме, вид которой хотите изменить.
Вокруг выбранной вами формы появятся маркеры.
3. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View^ Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
4. Щелкните на свойстве Backgroundlmage (Фоновый рисунок), относящемся
к категории Appearance.
Рядом с ним появится кнопка с тремя точками.
5. Щелкните на кнопке с тремя точками.
На экране появится диалоговое окно Open.
6. Выберите изображение, которое вы хотите использовать в качестве фонового рисунка, и щелкните на кнопке Open.
Возможно, вам придется открыть несколько папок, чтобы добраться до файла, в котором сохранен нужный рисунок. Если окно формы больше, чем выбранный вами
рисунок, Visual Basic .NET заполнит форму несколькими копиями этого рисунка.
Чтобы удалить фоновый рисунок, на пятом шаге щелкните правой кнопкой мыши
на кнопке с тремя точками и выберите команду Reset (Сброс).

Виды границ
Границы способны не только посеять вражду между соседними государствами, но и помочь вам определить способ отображения формы на экране монитора. Visual Basic .NET предоставляет в ваше распоряжение семь таких способов. Все они описаны ниже, а соответствующие примеры можно увидеть на рис. 6.3.

82

Часть II. Создание пользовательского интерфейса

None. Границы и строка заголовка не отображаются, но все объекты формы будут
видны на экране. Пользователь не может переместить, изменить размеры или свернуть форму такого типа.
F i x e d S i n g l e . Отображаются строка заголовка, кнопки управления окном и
кнопка закрытия окна. Пользователь может перемещать, сворачивать и разворачивать окно, но не может изменять его размеры.
Fixed3D. Работает точно так же, как и окно типа F i x e d S i n g l e : единственное,
что добавлено, — это эффект трехмерности вокруг границ формы. Пользователь
может перемещать, сворачивать и разворачивать окно такого типа, но не может
изменять его размеры.
" i x e d D i a l o g . Отображаются строка заголовка, кнопки управления окном и
кнопка закрытия окна. Пользователь может перемешать, сворачивать и разворачивать окно, но не может изменять его размеры.
.Sizable. Отображаются строка заголовка, кнопки управления окном и кнопка закрытия окна. Пользователь может перемещать, сворачивать и разворачивать окно,
а также изменять его размеры. Этот стиль используется для всех форм по умолчанию.
Fixed ToolWindow. Отображаются строка заголовка и кнопка закрытия окна.
Пользователь может перемещать такое окно, но не может сворачивать, разворачивать и изменять его размеры.
S i z a b l e ToolWindow. Отображаются строка заголовка и кнопка закрытия окна.
Пользователь может перемещать такое окно (перетаскивая его за строку заголовка)
и изменять его размеры (перетаскивая стороны или углы окна).

Рис. 6.3. Семь способов отображения окна формы на экране
Таким образом, каждый из описанных способов не только позволяет отображать различные объекты на экране, но и определяет, может ли пользователь перемещать окно и изменять
его размеры.
А вот как можно изменить вид границ формы.
1. Откройте окно Solution Explorer.

Глава 6. Разработка форм

83

Чтобы сделать это, нажмите комбинацию клавиш , выберите команду View^Solution Explorer или щелкните, на панели инструментов на значке
Solution Explorer.
2. Дважды щелкните на форме, вид которой вы хотите изменить.
Вокруг выбранной вами формы появятся маркеры.
3. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View^Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
4. Щелкните на свойстве FormBorderStyle (Вид границы), относящемуся к категории Appearance.
Рядом с формой появится кнопка с направленной вниз стрелкой.
5. Щелкните на кнопке со стрелкой и выберите тип границы (например,
iTixed3D).
Visual Basic .NET изменит способ отображения формы на экране.

Сворачивание и разворачивание окна формы
Форма может отображаться на экране в развернутом виде (в таком случае она будет занимать все пространство экрана), в свернутом виде (на экране будет отображаться только ее заголовок) и в нормальном виде (окно формы будет занимать только часть экрана). Все три вида отображения формы представлены на рис. 6.4.
.VTIiis is a maximized form

И This is a normal form

Развернутое окно

Обычное окно

Свернутое окно

Рис. 6.4. Развернутое, обычное и свернутое окно формы

84

Часть II. Создание пользовательского интерфейса

Чтобы заставить окно формы в процессе выполнения программы открыться в каком-то
определенном виде, вы должны выполнить следующие действия.
1. Откройте окно Solution Explorer.
Чтобы сделать это, нажмите комбинацию клавиш , выберите команду View^Solution Explorer или щелкните на панели инструментов на значке
Solution Explorer.
2. Дважды щелкните на форме, параметры которой нужно изменить.
Вокруг выбранной вами формы появятся маркеры.
3. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View^Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
4. Щелкните на свойстве WindowState (Вид окна) категории Layout.
Рядом с формой появится кнопка с направленной вниз стрелкой.
5. Щелкните на кнопке со стрелкой и выберите нужную опцию (например,
Normal или Minimized).
Большинство форм отображают кнопки управления окном (кнопки сворачивания и разворачивания окна), благодаря чему пользователь может в любое время свернуть или развернуть
таковое. Конечно же, если вы хотите лишить его такой возможности, можете удалить эти
кнопки с экрана.
Если вы определите, что стилем отображения окна формы на экране будет None,
Fixed S i n g l e , Fixed ToolWindow или S i z a b l e ToolWindow, кнопки
управления окном отображаться не будут.
Скрыть или отобразить на экране кнопки управления окном вы можете следующим образом.
1. Откройте окно Solution Explorer.
Чтобы сделать это, нажмите комбинацию клавиш , выберите команду View^ Solution Explorer или щелкните на панели инструментов на значке
Solution Explorer.
Дважды щелкните на форме, параметры которой нужно изменить.
Вокруг выбранной вами формы появятся маркеры.
Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View^Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
Щелкните на свойстве MinimizeBox (Кнопка сворачивании окна) или MaximizeBox (Кнопка разворачивания окна), которые относятся к категории
Windows Style, и выберите значение True или F a l s e .
Если вы планируете разрешить пользователю разворачивать окно или изменять его
размеры, не забудьте закрепить объекты формы (кнопки, флажки, переключатели и
т.п.), поскольку в противном случае их будет кидать в разные стороны как лодки во
время шторма или же они будут вообще пропадать с экрана. О том, как можно закрепить объекты в окне формы, было рассказано в главе 5.

Глава 6. Разработка форм

85

Размещение формы на экране
Чтобы получить гарантию того, что во время работы программа будет выглядеть именно
так, как вы себе это представляли, необходимо точно указать, в каком месте экрана должна
открываться каждая форма. Если вы этого не сделаете, формы могут открываться, например,
одна над другой или, скажем, в тех частях экрана, на которые вы не рассчитывали.
Если для свойства WindowState вы определили значение Minimized или
Maximized, указывать местонахождение формы на экране не имеет смысла, поскольку в первом случае открытая форма BASIC будет занимать все пространство
экрана, а во втором случае она будет представлена только своим заголовком на панели задач Windows.
Чтобы определить положение открывающейся формы на экране, вам нужно для свойства
StartPosition (Начальная позиция) категории Layout выбрать одно из пяти возможных значений.
i; S Manual. Позволяет с использованием свойства Location (категория Layout) вручI
ную определить позицию формы на экране.
I S C e n t e r S c r e e n . Форма открывается в центре экрана.
WindowsDefauitLocation. Позволяет программе самостоятельно определить
оптимальное место для открытия формы (хотя вам оно может показаться не самым
оптимальным).
WindowsDef a u l t B o u n d s . Позволяет программе самостоятельно определить оптимальное место и оптимальный размер открываемой формы (хотя вам они могут
показаться не такими уж и оптимальными).
C e n t e r P a r e n t . Форма открывается в центре окна другой формы.
Чтобы выбрать один из этих пяти вариантов, выполните следующие действия.
1. Откройте окно Solution Explorer.
Чтобы сделать это, нажмите комбинацию клавиш , выберите команду View^Solution Explorer или щелкните на панели инструментов на значке
Solution Explorer.
2. Дважды щелкните на форме, параметры открытия которой нужно изменить.
Вокруг выбранной вами формы появятся маркеры.
3. Откройте окно Properties.
Для этого нажмите клавишу , выберите команду View^Properties Window,
в окне Solution Explorer щелкните на значке Properties Window или щелкните
правой кнопкой мыши в окне формы и выберите команду Properties.
4. Щелкните на свойстве StartPosition (Начальная позиция) категории Layout.
Рядом появится кнопка с направленной вниз стрелкой.
5. Щелкните на кнопке со стрелкой и выберите нужную опцию (например,
CenterScreen).
Для определения местонахождения формы на экране в процессе выполнения программы можно также использовать код BASIC. Вот как этот код может выглядеть:
A c t i v e F o r m . L o c a t i o n = New P o i n t fX, Y)

86

Часть II. Создание пользовательского интерфейса

Команда A c t i v e F o r m указывает Visual Basic .NET на необходимость переместить активную в данный момент форму в нужную позицию. Значения X и Y определяют, какое расстояние должно быть между окном формы и левой стороной экрана (X) и между окном формы и верхней стороной экрана (Y).

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

1. Откройте окно Solution Explorer.
Чтобы сделать это, нажмите комбинацию клавиш , выберите команду View^Solution Explorer или щелкните на панели инструментов на значке
Solution Explorer.
2. Щелкните на форме, которую собираетесь удалить.
3. Выберите команду Project^Exciude From Project (Проект^Убрать из проекта) или щелкните правой кнопкой мыши на форме и выберите команду Exclude From Project.
Visual Basic .NET удалит форму из окна Solution Explorer.
Если вы удалите форму, которая ранее была сохранена, она все еще будет сохраняться на диске вашего компьютера. Правда, теперь она уже не будет частью вашего проекта Visual Basic .NET. Чтобы физически удалить все следы существования
этой формы, используйте Windows Explorer. Вы найдете файл этой формы и удалите его из памяти компьютера.
Если вы хотите добавить к своему проекту уже существующую форму (например
ту, которую недавно из него удалили), выберите команду Project^Add Existing
Item (Проект^Добавить существующий элемент) или нажмите комбинацию клавиш и щелкните на форме, которую хотите включить в проект.

Тест на проверку полученных вами знаний
1. Что такое форма?
а. Термин Visual Basic .NET, обозначающий
окно программы.
б. Философское понятие, противоположное
"содержанию" программы.
в. Какая-то бесполезная шт:зуковина, которая при каждом запуске Visual Baste .NET
отображается на экране в ожидании того,
что я начну ее чем-то заполнять.
г. Форма - это моя реакция на Visual Basic
.NET. Если я пишу программу и она начинает работать, значит, я в хорошей
форме. Но если что-то не получается,
тогда я в плохой форме, и лучше меня в
это время не трогать.

Глава 6. Разработка форм

2. Если ваша программа состоит из нескольких
форм, как можно просмотреть каждую из них?
а. Никак. Это одна из причин, по которой программирование считается невероятно сложной задачей.
б. Необходимо купить еще несколько компьютеров, чтобы можно было просматривать каждую форму на отдельном мониторе.
в. Нужно щелкнуть на вкладке D e s i g n той
формы, которую я хочу просмотреть: Если
для нужной формы такая вкладка еще не
отображается, нужно открыть окно Solution
Explorer и дважды щелкнуть на названии
этой формы.

87

bft(ро/шы, /со/ио/мш
Когда ваша программа начинает функционировать, то обычно первой открывается форма,
созданная в самом начале процесса разработки проекта. Если вы хотите, чтобы в первую очередь открывалась какая-то другая форма, выполните такие действия.
1. Откройте окно Solution Explorer.
Чтобы сделать это, нажмите комбинацию клавиш , выберите команду View^Solution Explorer или щелкните на панели инструментов на значке
Solution Explorer.
2. Щелкните правой кнопкой мыши на названии проекта.
Откроется контекстное меню.
3. Выберите пункт Properties (Свойства).
Откроется диалоговое окно Property Pages (Свойства страниц), показанное
на рис. 6.5.
4. Щелкните на кнопке со стрелкой в ноле со списком Startup Object
(Запускаемый при старте обьект), чтобы увидеть список всех форм своего
проекта.
5. Выберите форму, которая должна отображаться первой, и щелкните на
кнопке ОК.

Bao
ltPropery
t Panes
J t-om
i nFropert-ii
G
ed
Bu
ln
ieral
m
I ports
Refer-nee Path
Strong Name
Desg
iner Defautsl
_J Confg
iurao
iln Propere
tis

tp'Jdjbeicl
?c
p
,jp|-aoiS
nalu

Output type-

—Г1

•ZJ

F;rnt
Fcrm2

Information
ProieeltcWer
„Output name

Cancel

J

РИС. 6.5. В этом диалоговом окне вы можете выбрать форму, которая будет открываться сразу же после запуска программы

acftbttnue u за/cftbanue Создание кнопок
>

Создание флажков и переключателей

>

Отображение текста на объектах

• у тоПы продуктивно работать, многие программы должны периодически получать данные
•^ от пользователя. Например, программе для каких-то целей может понадобиться информация о вашем семейном положении. Вместо того чтобы заставлять пользователя вводить эту
информацию вручную, можно просто предложить ему выбрать один из вариантов: "Женат", "Не
женат", "Жестоко разведен". Если пользователь должен выбирать только один из возможных
вариантов, для этой цели часто используются два или несколько переключателей.
В этой главе рассказывается, как создавать кнопки, флажки и переключатели для предоставления пользователю возможности выбора.

Нажми на кнопку — псиучшиь
/гезцлыпайг...
Нажатие кнопки — это самая простая задача для кого бы то ни было. Даже маленький ребенок может нажать на кнопку, чтобы включить или выключить, скажем, настольную лампу.
Поскольку кнопки сами по себе настолько просты и знакомы нам с детства, многие программы используют их в своем интерфейсе и позволяют на них "нажимать" с помощью мыши. Вместо того чтобы заставлять вас блуждать по разным меню в поисках нужной команды,
программа позволяет просто щелкнуть на одной из кнопок, которые всегда находятся перед
глазами. Единственное, что вам нужно сделать,— это определить, на какой же кнопке всетаки щелкнуть.
На самом деле, кнопка— это всего лишь область на экране, где пользователь может
щелкнуть с помощью мыши. На большинстве кнопок отображается текст, указывающий, какая команда выполняется при щелчке (например, OK, Cancel, Open, Exit).
Чтобы создать кнопку, вам нужно выполнить действия, перечисленные ниже.
1. Выберите команду View1^ Toolbox или нажмите комбинацию клавиш
. (Пропустите этот шаг, если панель Toolbox уже отображается
на экране.)
На экране появится панель Toolbox. Возможно, вам придется щелкнуть на кнопке
Windows Forms, чтобы найти инструмент Button (Кнопка).
2. Щелкните на инструменте Button.
Курсор мыши примет вид перекрестия. Если вы дважды щелкнете на инструменте
Button панели Toolbox, Visual Basic .NET автоматически создаст кнопку в окне

Глава 7. Элементы как средство предоставления пользователю выбора... 91

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

Создание флажкови
Группа флажков как бы говорит пользователю: "Выберите все, что считаете нужным".
Сказанное можно продемонстрировать следующим примером:
Если я, предположим, собираюсь в поход, мне нужно в з я т ь с собой
(отметьте в с е , что вам т р е б у е т с я ) :
П

П
П

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

Переключатели действуют примерно так же, как кнопки на пульте обычного телевизора.
В каждый конкретный момент времени вы можете выбрать для просмотра только один канал.
И из группы переключателей пользователь может каждый раз выбирать только один из предложенных вариантов. В данном случае пример должен быть несколько иным:
Мой месячный заработок (можно выбрать только один п у н к т ) :
отсутствует;
О до $100;
О до $1000;
О вам такая сумма и не с н и л а с ь .
Вот как можно создать флажок или переключатель.
1. Выберите команду ViewOToolbOX или нажмите комбинацию клавиш
. (Пропустите этот шаг, если панель Toolbox уже отображается
на экране.)
На экране появится панель Toolbox. Возможно, вам придется щелкнуть на кнопке
Windows Forms, чтобы найти инструменты Checkbox (Флажок) и RadioButton
(Переключатель).
2. Щелкните на кнопке инструмента CheckBox или на кнопке инструмента
RadioButton.
Курсор мыши примет вид перекрестия. Если вы дважды щелкнете на кнопке инструмента CheckBox или RadioButton, Visual Basic .NET автоматически создаст
флажок или переключатель в окне формы. Потом вы сможете переместить его в
нужное место и придать ему необходимые размеры.

92

Часть II. Создание пользовательского интерфейса

3. Поместите курсор мыши над тем местом, где должен быть нарисован объект,
нажмите левую кнопку мыши и перетяните его. Когда контур объекта примет нужные размеры, отпустите кнопку мыши.
Visual Basic .NET нарисует в окне формы флажок или переключатель.
В отличие от обычных кнопок, флажки и переключатели не требуют создания кодов BASIC для своей активизации. Вам лишь нужно будет написать код, определяющий, какой из предложенных вариантов был выбран пользователем. О том, как
:)то делается, подробно описывается в главе 16, но забегая вперед, скажем, что
свойство, определяющее, выбран объект или нет, называется Checked и относится
к категории Appearance. Если флажок или переключатель выбран, это свойство
принимает значение T r u e , в противном случае — F a l s e .

Выравнивание флажков и переключателей
Флажки и переключатели обычно отображаются слева от сопровождающего их текста.
Но Visual Basic .NET этим не ограничивается и предлагает еще восемь способов расположения флажков и переключателей относительно текста (рис. 7.1).

г

Top Let

Г

Middle У *

Bottom Let

Г

г
Top Cent»

T o p Right

Г

Middle Center

Middle Rjght Г

Bottom Center

Bottom RigM

Г

Г

Рис. 7.1. Девять способов выравнивания флажков и переключателей относительно сопровождающего их текста
Вы можете изменить способ выравнивания флажка или переключателя следующим образом.
1. Щелкните на флажке или переключателе, положение которого хотите выровнять.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду ViewO Properties
Window, в окне Solution Explorer щелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Щелкните на свойстве CheckAlign (Выравнивание флажка) категории Appearance.
Откроется графическое меню, состоящее из девяти прямоугольников, которые соответствуют положениям флажка или переключателя относительно текста (рис. 7.2).
4. Щелкните на одном из прямоугольников и выберите способ выравнивания.

Глава 7. Элементы как средство предоставления пользователю выбора... 93

Visual Basic .NET отобразит флажок или переключатель в соответствии со сделанным вами выбором.

Рис. 7.2. Определив значение свойства CheckAlign,
можно выбрать способ отображения флажка или переключателя относительно текста
Чтобы отобразить флажок или переключатель в определенной позиции, вам, возможно, придется изменить размеры самого объекта.
Вместо изменения свойства CheckAlign (определяет положение флажка или переключателя) можно изменить свойство TextAlign (Выравнивание текста) категории
Appearance, которое определяет положение текста относительно флажка или переключателя.

Группировка флажков и переключателей
Очень редко флажки и переключатели используются по одному. Почти всегда они собираются в группы, как стайки рыбок на мелководье. Чтобы выделить группу флажков или переключателей, можно использовать инструмент GroupBox (Группа), который рисует рамку
вокруг нескольких объектов. После того как рамка нарисована, внутри нее можно размешать
флажки и переключатели.
g предыдущих версиях Visual Basic инструмента GroupBox еще не было. Вместо
него использовался другой инструмент, называемый Frame (Рамка). Они очень похожи, но все же немного отличаются. Если вы уже программировали на Visual
Basic, не забывайте, что GroupBox работает несколько иначе, чем Frame.
Если вы создадите в окне формы несколько переключателей, то пользователь в
любой момент времени сможет выбрать только один из них. Если же вы, используя
инструмент GroupBox, выделите их в две отдельные группы, пользователь сможет
выбрать сразу два переключателя: по одному переключателю в каждой группе
(рис. 7.3).
А вот как можно создать группу.
1. Выберите команду View^Toolbox или нажмите комбинацию клавиш
. (Пропустите этот шаг, если панель Toolbox уже отображается
на экране.)
На экране появится панель Tool box. Возможно, вам придется щелкнуть на кнопке
Windows Forms, чтобы найти кнопку инструмента GroupBox (Группа).
2. Щелкните на кнопке GroupBox.
Курсор мыши примет вид перекрестия. Если вы дважды щелкнете на кнопке инструмента GroupBox, Visual Basic .NET автоматически нарисует рамку группы в
окне формы. Потом вам, скорее всего, придется переместить ее в нужное место и
изменить размеры.

94

Часть //. Создание пользовательского интерфейса

3. Поместите курсор мыши над тем местом, где должен быть нарисован объект,
нажмите левую кнопку мыши и перетяните курсор. Когда контур рамки
группы примет нужные размеры, отпустите кнопку мыши.
Visual Basic .NET нарисует в окне формы рамку для группы объектов. Теперь вы
можете приступать к созданию флажков и переключателей внутри области, выделенной для одной группы.
[ Ш PC-Politics

yoyr next leader?

WhattsyourpartyefflielHH»?i

Г Holdalottwy

Anoretetf

г Stage a coup

С Detnocnd

(;. Pick the guy wMi
the most money

RepubSooR

Г Flips coin

Communist -

Рис. 7.3. Используя инструмент GroupBox, переключатели можно разбить на две отдельные группы
Чтобы визуально выделить группу объектов, нужно для объекта GroupBox изменить свойство BackColor (Цвет фона), относящееся к категории Appearance. После того как вы это сделаете, цвет фона внутри области, выделенной рамкой группы, будет отличаться от фонового цвета всего остального окна.
Щелкните на рамке группы таким образом, чтобы вокруг нее отобразились маркеры, после чего вам достаточно будет произвести двойной щелчок на кнопке инструмента CheckBox или RadioButton, чтобы Visual Basic .NET автоматически создал флажок или переключатель, принадлежащие этой группе.

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

2. Каким свойством определяется текст, который
будет отображаться на кнопках, флажках и переключателях?
а. Текст определяется свойствами моего характера и воображения - что захочу, то и напишу.
б. Текст определяется свойствами решаемых
программой задач.
в. Определяющее значение имеют свойства и
привычки пользователей, для которых создается программа.
г. Свойством Text, принадлежащим к категории Appearance.

Глава 7. Элементы как средство предоставления пользователю выбора... 95

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

OtHod/гажение /некс^на на кнопках,
флажках, пе[геключайгеллх
и [гамках zftcfnn
После того как кнопка, флажок, переключатель и рамка группы будут нарисованы в окне
формы, нужно определить поясняющий текст, который должен на них отображаться. Это
достигается путем изменения свойства Text.
Чтобы изменить значение свойства Text, сделайте следующее.
1. Щелкните на объекте, для которого нужно изменить текст.
Visual Basic .NET отобразит маркеры вокруг выделенного объекта.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View^Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Дважды щелкните на свойстве Text категории Appearance.
Visual Basic .NET выделит текущее значение свойства Text.
4. Наберите текст, который должен отображаться на объекте.
Изменить штифт и начертание отображаемого на объекте текста вы также можете, воспользовавшись свойством Font (Шрифт) категории Appearance.

96

Часть II. Создание пользовательского интерфейса

Глава8

Использование текстовых полей
и надписей
главе...
>
У

Создание надписей и текстовых полей
Настройка параметров отображения текста

есмотря на огромные возможности графической составляющей пользовательского
интерфейса, иногда кнопок, флажков и переключателей бывает недостаточно для поддержки
нормального диалога с пользователем. Время от времени программе необходимо отобразить
на экране слово, предложение, абзац, а то и целую новеллу. Нередко и у пользователя возникает желание набрать "доброе" слово (а то и два) в адрес программы.
Если вы хотите просто отобразить текст для пользователя, примените объект, именуемый
Label (Надпись). Если вы хотите отобразить текст и позволить пользователю набрать чтонибудь в ответ, воспользуйтесь объектом TextBox (Текстовое поле).
Таким образом, текстовые поля выполняют сразу две функции:
I ^
| ^

отображают текст на экране;
предоставляют пользователю возможность набрать текст для программы.

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

Создание надписей и *пекс*по£ых полей
В повседневной жизни нас окружает множество надписей, таких как номера на дверях
квартир, названия на обложках журналов, цифры и буквы на номерах автомобилей. Очень
часто надписи привлекают наше внимание к тому, чего бы мы, не будь их, и не заметили.
Текстовые поля хоть и могут отображать текст, используются они в основном для предоставления пользователю возможности вводить какие-то данные для программы, например свое
имя, пароль или телефонный номер. Часто надписи применяются вместе с текстовыми полями с
целью сообщить пользователю, какого рода информацию он должен набрать в текстовом поле.
И надписи, и текстовые поля могут отображать текст на экране. Основное различие
между ними состоит в том, что внести изменения в текст текстового поля пользователь может, а в текст надписи — нет.
Чтобы создать надпись или текстовое поле, необходимо выполнить такие действия.
1. Выберите команду View^ToolbOX или нажмите комбинацию клавиш
. (Пропустите этот шаг, если панель Toolbox уже отображается
на экране.)

Глава 8. Использование текстовых полей и надписей

97

На экране появится панель Toolbox. Возможно, вам придется щелкнуть на кнопке
Windows Forms, чтобы найти инструменты Label (Надпись) и TextBox
(Текстовое поле).
2. Щелкните на кнопке Label или TextBox.
Курсор мыши примет вид перекрестия. Если вы дважды щелкнете на инструменте
Label или TextBox, Visual Basic .NET автоматически создаст соответствующий
объект в окне формы. Потом вы сможете переместить его в нужное место и придать ему необходимые размеры.
3. Поместите курсор мыши над тем местом, где должен быть нарисован объект,
нажмите левую кнопку мыши и перетяните курсор. Когда контур объекта
примет нужные размеры, отпустите кнопку мыши.
Visual Basic .NET создаст надпись или текстовое поле (в зависимости от того, на
кнопке какого инструмента вы щелкнули) в окне формы.
4. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View=>Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
5. Дважды щелкните на свойстве Text (категория Appearance) и наберите
текст, который должен отображаться внутри текстового поля или надписи.
Почти во всех случаях для текстового поля лучше удалить значение свойства
Text, чтобы на экране оно отображалось пустым и готовым для набора пользователем своего текста.
Для того чтобы текст отображался каким-то особым образом, используйте свойство Font (Шрифт), принадлежащее к категории Appearance.
Вам не нужно писать коды BASIC, чтобы сделать надпись и текстовое поле рабочими. Однако код BASIC нужно будет написать для считывания данных, сохраненных в качестве значения свойства Text, — таким образом программа узнает, какую
информацию оставил для нее пользователь. О том, как это делается, подробно рассказывается в главе 16.

Изменение внешнего вида отображаемого текста
Чтобы текст выглядел как-то по-особенному, можно изменить шрифт, его размер либо
способ начертания (полужирный или курсив). Делается это так.
1. Щелкните на надписи или текстовом поле, способ отображения текста которого вы хотите изменить.
2. Откройте окно Properties.
1

Чтобы сделать это, нажмите клавишу , выберите команду View ^Properties
Window в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Щелкните на свойстве Font (категория Appearance).
Рядом с ним появится кнопка с тремя точками.
4. Щелкните на кнопке с тремя точками.
На экране появится диалоговое окно Font.

98

Часть //. Создание пользовательского интерфейса

5. Установите шрифт, его размер, способ начертания, задайте нужные эффекты (например, Strikeout (Зачеркивание)), а когда закончите, щелкните
на кнопке ОК.
Тексты надписей и текстовых полей одновременно могут отображаться лишь одним шрифтом, с одним стилем и одним размером. Если вам вдруг захочется отобразить текст одного объекта разными шрифтами, выбросите эту идею из головы — у вас все равно ничего не получится.

Раскрашивание текста надписей и текстовых полей
Если вы любили в детстве писать слова на асфальте разноцветными мелками, то вам понравится идея изменения цветов при отображении текста объектов Visual Basic .NET.
Обычно Visual Basic .NET отображает черный текст на белом (для текстовых полей) или
на сером (для надписей) фоне. Для того чтобы "картинка ожила", можно изменить как цвет
текста, так v цвет фона.
Цвет, которым заполняется область надписи или текстового поля (цвет фона), опР^деляется свойством BackColor. Цвет, которым отображается сам текст, определяется свойством ForeColor. Оба свойства относятся к категории Appearance.
Чтобы изменить цвет фона или цвет текста, сделайте следующее.
1

Щелкните на надписи или текстовом поле, цвет которого вы хотите изменить.

2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View^Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
Щелкните на свойстве BackColor или ForeColor (категория Appearance).
Рядом с ним появится кнопка с направленной вниз стрелкой.
Щелкните на кнопке с направленной вниз стрелкой.
Откроется диалоговое окно с тремя вкладками: Custom, Web и System.
5

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

Настройка отображения границ
Обычно объект Label (Надпись) отображает текст, но не отображает каких бы то ни было
границ. Границы объекта TextBox (Текстовое иоле) видны на экране, но особой оригинальностью они не отличаются. Конечно же, это не единственно возможный вариант, и вы без
труда можете изменить способ отображения границ на экране.

Глава 8. Использование текстовых полей и надписей

99

1. Щелкните на текстовом поле или надписи, границы которых хотите изменить.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View^Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Щелкните на свойстве BorderStyle (Тип границы), относящемся к категории
Appearance, и выберите один из трех пунктов:
• None (устанавливается по умолчанию для надписей);
• FixedSingle;
• Fixed3D (устанавливается по умолчанию для текстовых полей).

Выравнивание текста относительно границ объекта
Visual Basic .NET может выравнивать текст надписей по горизонтали и по вертикали, а
текстовых полей — только по горизонтали.
Пользователь не сможет определить, как выровнен текст, если на экране не отображаются границы объекта.
Вот что нужно сделать, чтобы выровнятьтекст.
1. Щелкните на надписи или текстовом поле, текст которого нужно выровнять.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View=>Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Щелкните на свойстве TextAlign (Выравнивание текста) категории Appearance и выберите одну из следующих опций.
В случае текстового поля:
• L e f t (Слева);
• R i g h t (Справа);
• C e n t e r (По центру).
В случае надписи:
• Top Left (Слева вверху, устанавливается по умолчанию);
• Top Right (Справа вверху);
• Top C e n t e r (По центру вверху);
• Middle Left (Слева посередине);
• Middle Right (Справа посередине);
• Middle C e n t e r (В центре посередине);
• 3ottorn Left (Слева внизу);
• Bottom Right (Справа внизу);
• 3ottom C e n t e r (По центру внизу).

/ 00

Часть II. Создание пользовательского интерфейса

Haanfioutca *некс1по€мх полей
Текстовые поля со свойствами, установленными по умолчанию, могут быть не очень
удобными в использовании. Если вы набираете слишком много текста, он будет смещаться, и
набранный ранее текст уйдет из поля зрения. Для управления курсором внутри текстового
поля используются обычные в таких случаях клавиши.
| S . Удаляет символ справа от курсора.
| ^ Клавиша возврата. Удаляет символ слева от курсора.
f S Стрелка влево. Перемещает курсор на один символ влево.
i S Стрелка вправо. Перемещает курсор на один символ вправо.
| S +Стрелка влево. Перемещает курсор на одно слово влево.
I S +Стрелка вправо. Перемещает курсор на одно слово вправо.
1 S (или ). Перемещает курсор на начало строки.
I ^ (или ). Перемещает курсор в конец строки.
| S +любая клавиша управления курсором. Выделяет текст.
По своему усмотрению вы можете настроить текстовое поле так, чтобы оно прокручивало
текст как текстовый процессор, принимало пароли (отображая на экране вместо букв какойнибудь символ, например звездочку) или позволяло вводить только текст, длина которого не
превышала бы определенного значения.

Прокрутка текста
Если пользователь, набирая текст, достигает конца текстового поля, то при наборе каждого нового символа текст начинает смешаться, из-за чего ранее набранные символы один за
другим уходят с экрана. Но текст можно заставить прокручиваться, что делает возможным
отображение на экране сразу нескольких строк. И сделать это вовсе не трудно.
1. Щелкните на текстовом поле, текст которого должен прокручиваться.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду ViewOProperties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties..
3. Щелкните на свойстве Multiline (В несколько строк) категории Behavior.
Рядом с ним появится кнопка со стрелкой.
4. Щелкните на кнопке со стрелкой и выберите значение T r u e .
Пока вы не присвоите свойству Multiline (В несколько строк) значение T r u e
(Истина), вы не сможете изменить высоту текстового поля.
5. Щелкните на текстовом поле, которое вы выбрали на шаге 1, и измените его
высоту.
Или же щелкните на свойстве Height (Высота) категории Layout и укажите новое
значение высоты текстового поля.
6. Убедитесь, что свойство Wordwrap (Прокрутка), относящееся к категории
Behavior, имеет значение T r u e .

Глава 8. Использование текстовых полей и надписей

101

Свойство Wordwrap имеет значение True по умолчанию, однако если вы изменяли его на F a l s e , вам придется снова вернуть ему значение True. В следующий раз, когда вы запустите программу, это текстовое поле будет состоять из нескольких строк, и текст будет переходить из одной строки в другую.
Вы можете присвоить свойству ScrollBars (Полосы прокрутки) категории Appearance значение V e r t i c a l . В таком случае, если весь текст невозможно будет поместить в текстовое поле, из-за его большого объема, то при необходимости можно будет использовать полосу прокрутки.

Создание полей для ввода паролей
Если вы работаете на ЦРУ, СБУ, КГБ, ФБР, ГРУ или любую другую организацию, для которой свои и чужие секреты — это смысл жизни, вас наверняка заинтересует возможность
создания текстовых полей для ввода паролей.
Вместо того чтобы отображать на экране все, что вы набираете, поля для ввода паролей
на месте любой буквы или знака будут содержать какой-нибудь один символ, например, звездочку (*). На рис. 8.1 показано окно с таким полем, в котором уже набран пароль СуперТайна, но, как вы видите, вместо букв отображаются только звездочки.

Рис. 8.1. Когда пользователь набирает текст в поле
для ввода паролей, на экране все врет отображается один и тот же символ, например, звездочка

Чтобы создать поле для ввода паролей, нужно определить символ, который будет отображаться на экране при наборе любого знака или буквы.
1. Щелкните кнопкой мыши на текстовом поле, которое должно принимать
секретные сведения.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View1^ Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Щелкните на свойстве Multiline (категория Behavior).
Рядом с ним появится кнопка со стрелкой, направленной вниз.
4. Щелкните на кнопке со стрелкой и выберите значение F a l s e .

102

Часть II. Создание пользовательского интерфей

Если вы не сделаете этого, т.е. оставите для поля возможность состоять из нескольких строк, скрывать информацию оно не сможет. Таким образом Visual
Basic .NET дает понять, что не стоит создавать огромные пароли.
5. Дважды щелкните на свойстве PassChar (Символ пароля), относящемся к
категории Behavior, и наберите какой-нибудь символ (например, звездочку),
который будет заменять собой на экране любой введенный знак.
На экран может выводиться только какой-нибудь один символ. Как вы уже могли
заметить, наиболее часто для этой цели используется звездочка (*).

Ограничение длины текста
Чтобы приучить пользователя к лаконичности, можно ограничить максимальную длину
текста, принимаемого текстовым полем. Это предотвратит попытки некоторых пользователей
вводить в текстовые поля пространные сочинения в стиле "как я провел прошлое лето".
Определить максимальное количество символов, которое будет приниматься текстовым
полем, мо*но следующим образом.
1. Щелкните кнопкой мыши на текстовом поле, которое не должно принимать
слишком длинные "послания" от пользователя.
2. Откройте окно Properties.
Чтобы сделать это. нажмите клавишу , выберите команду View=>Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Дважды щелкните на свойстве MaxLenght (Максимальная длина), относящемся к категории Behavior, и укажите любое положительное число.
Это число и будет определять максимальное количество вводимых символов. Если таким числом будет 0 (нуль), значит ограничения сняты и пользователь может
вводить любое количество символов.
Свойство MaxLenght определяет максиммьное количество символов, которое может
быть набрано в текстовом поле пользователем. Однако это ограничение не распространяется на текст, который вы отображаете в текстовом поле с помощью свойства Text.

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

2. Если свойству PasswordChar текстового поля
присвоено значение * (звездочка), а свойству
MaxLength - значение 10, то что это значит?
а. Одну минутку, я должен вернуться на несколько страниц назад и прочитать об этом
еще раз.
б. Это значит, что мой пароль может состоять
максимум из 10 звездочек.
а. В этом текстовом поле можно набирать значения, состоящие максимум из 10 символов,
и при их наборе вместо символов будут отображаться звездочки.

Глава 8. Использование текстовых полей и надписей

103

Глава9

Использование списков и полей со
списком
& эйк>й главе...
> Создание списков и полей со списком
> Сортировка элементов, входящих в список
>

Настройка параметров отображения списков

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

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

PList Boxes vs. Combo Boxes
WafcrotB toGag *n Choke Buftetf
Todt^smenu;
This is a 1st box

This is a combo bat

UPptMIIWHffiHl
Oveicooked рсчк chocs
Dned-oirt fish filets
Tasteless hamburger patties
S ugar-tlavored tap «atei

3

Artificially colored laid
Salty brown gravy
Dusty mashed potatoes
•rcooked poik chop
Tasteless hambuiger panes
Suqar-ilavored tar

РИС. 9.1. ВОТ как выглядят СПИСОК И поле со СПИСКОМ

Глава 9. Использование списков и полей со списком

105

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

Как нарисовать объекты в окне формы
Работа списков похожа на обслуживание в ресторане быстрого питания. Вы можете выбрать для себя только то, что есть в меню; при этом обслуживающий персонал понятия не
имеет, как готовится что-либо другое. Поля со списком, напротив, похожи на серьезные заведения, где вы, просмотрев меню, можете сказать что-нибудь наподобие: ''Я вижу, что у вас
ресторан для вегетарианцев, но мне приготовьте, пожалуйста, поросенка с хреном".
Чтобы нарисовать список или поле со списком в окне формы, выполните следующие действия.
1. Выберите команду ViewToolbox или нажмите комбинацию клавиш
. (Пропустите этот шаг, если панель Toolbox уже отображается
на экране.)
На экране появится панель Toolbox. Возможно, вам придется щелкнуть на кнопке
Windows Forms, чтобы найти инструменты ListBox (Список) и ComboBox
(Поле со списком).
Если вы дважды щелкнете на инструменте ListBox или ComboBox, Visual Basic
.NET нарисует для вас эти объекты автоматически.
2. Щелкните на кнопке инструментов ListBox или ComboBox.
Курсор мыши примет вид перекрестия. Если вы хотите создать список, элементами которого будут флажки (как это показано на рис. 9.2), щелкните на кнопке инструмента CheckListBox (Список флажков).

ifPC-euffet
Ordinaiy list box

Che eked list box

Mercury flavored fish filets
Mad cow hamburger patties
Hoof and mouth disease lamb chops
Genetically modified slrawbernes
Something pink vulfi gravy on t
Sugarflavored lap water
Salt and sugar m.Kcd wifh arUoal ccJ

Me I a -ored lish tilef
Sa
' »J hamburger tatties

«- H о d mouth disease lamb chopi
G i » aty modified strawberries
ото* hmg pink with gravy on it

Рис. 9.2. Сравните между собой обычный список и список флажков
3. Поместите курсор мыши над тем местом, где должен быть создан объект.
4. Нажмите левую кнопку мыши и перетяните курсор. Когда контур обьекта
примет нужные размеры, отпустите кнопку мыши.
Visual Basic .NET нарисует в окне формы список или поле со списком и сразу же
присвоит им какие-нибудь безликие имена, наподобие L i s t B o x 3 или ComboBox2.

Настройка параметров поля со списком
В Visual Basic .NET поля со списком могут быть заданы в одном из трех стилей (рис. 9.3).
7

.-

106

^

S i m p l e (Простой). Отображает список элементов, который всегда открыт для
просмотра. В отличие от двух других стилей, поля со списком, отображенные в
стиле S i m p l e , в процессе выполнения программы не изменяют своей высоты, по-

Часть И. Создание пользовательского интерфейса

этому вам нужно будет самостоятельно определить высоту объекта, при которой
пользователям будет удобно просматривать список возможных вариантов.
DropDown (Раскрывающийся). Вначале на экране отображается значение, назначенное для свойства Text. Если пользователь щелкает на кнопке со стрелкой, на
экране появляется список готовых вариантов.
DropDownList (Раскрывающийся список). Вначале отображается пустое поле
(вне зависимости от того, присвоено ли какое-то значение свойству Text). Когда
пользователь щелкает на кнопке со стрелкой, на экране отображается список готовых вариантов.
В отличие от двух других стилей, в поле, отображаемом в стиле DropDownList,
пользователь не может набирать свои варианты ответа.

И Three styles for combo boxes

DropDown styte

e:!potatoes

ИДЕИ
»
AtNlcially colored laid
Sdlubiuwngravii
^ ru'Ty mashed polator I
J veiLujI- rfdpmk chops
Dried out fi',h Kiel!
Taitele;; liambuigfi pat
5 no» Ha voted lap water

1
SdHyhow-gca^
wius'v maihed poiarns;
D'etcooted jork chops
JriPd out tish IrUeli
Ta-.idei; han.bi.rgei pal
Sunai-flavored tapwarei

Рис. 9.З. Три стиля отображения полей со списком

Тест на проверку полученных вами знаний
1 . Какое главное различие между списком и
полем со списком?
а. В поле со списком пользователь может
указать свой вариант ответа, а в списке
он может только выбрать один из предложенных вариантов.
б. Первый объект СОСТОИТ ИЗ ОДНОЙ части
(список), второй - из двух частей (поле
плюс список).
в. Кажется, это как-то связано с обслуживанием в ресторанах. Наверное, в поле
со списком варианты "повкуснее",
г. Никакого различия не существует. Не зря
же они описываются в одной главе.

2. Почему ломимо флажков и переключателей для
предоставления выбора используются списки и
поля со списком?
а. Для разнообразия.
б. Списки И ПОЛЯ СО СПИСКОМ занимают на экране меньше места; к тещ же в поле со списком пользователь может ввести собственный вариант ответа.
в. Насчет списков не знаю, а поля со списком
просто симпатичней. Они так "прикольно"
раскрываются и закрываются,
г. Выбор - дело серьезное. Если пользователя
не устраивают варианты, предлагаемые посредством флажков и переключателей, он
может поискать что-нибудь в списках.

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

Глава 9. Использование списков и полей со списком

107

1. Щелкните на поле со списком, которое вы хотите изменить.
(Имеется в виду, что само поле вы уже создали.)
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View=>Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. В категории Appearance найдите свойство DropDownStile (Стиль поля со
списком) и шелкните на нем.
Рядом с ним появится кнопка со стрелкой.
4. Щелкните на кнопке со стрелкой, чтобы отобразить список возможных вариантов.
(Минуточку. А ведь само поле свойства тоже является полем со списком!)
5. Выберите стиль поля со списком, например S i m p l e или D r o p D o w n L i s t .
Visual Basic .NET отобразит поле со списком в указанном вами стиле.

Наполнение списка и поил со списком
элемен&ами для
После того как список или поле со списком созданы, для них нужно определить набор элементов, из числа которых пользователь сможет делать свой выбор. (В противном случае эти
объекты будут просто пустыми.) В Visual Basic .NET это можно сделать двумя способами:
"• S с использованием свойства Items (Элементы), относящегося к категории Data
(Данные);
I S посредством написания кодов BASIC.
Вот как можно добавить элементы, используя свойство Items.
1. Щелкните на списке или на поле со списком, к которому вы хотите добавить
элементы.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View^Properties
Window в окне Solution Explorer, щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Щелкните на свойстве Items (категория Data).
Рядом с ним появится кнопка с тремя точками.
4. Щелкните на кнопке с тремя точками.
Откроется диалоговое окно String Collection Editor, показанное на рис. 9.4.
5. Наберите значение элемента, который должен присутствовать в списке для
выбора, и нажмите клавишу .
6. Повторяйте шаг 5 до тех пор, пока не введете значения всех элементов, из
числа которых пользователь будет делать свой выбор.
7. Щелкните на кнопке ОК.

108

Часть II. Создание пользовательского интерфейса

Рис. 9.4. В диалоговом окне String Collection Editor
можно определить набор элементов, из числа которых
пользователь сможет сделать свой выбор
Если вы захотите как-то изменить список доступных пользователю вариантов ответа в процессе выполнения программы, вам нужно будет написать коды BASIC. Чтобы добавить к набору
элементов списка или поля со списком еще один элемент (который будет отображаться ниже
доступных ранее элементов), вам достаточно всего лишь написать следующий код BASIC:
BoxName.Items.Add

("Add me")

Вот какие действия совершаются в процессе выполнения этого кода.
1. Слово BoxName говорит Visual Basic .NET о необходимости найти список или
поле со списком, именуемое BoxName. (Разумеется, если вы хотите добавить
элемент к своему списку или полю со списком, вам нужно в этом месте указать
именно его имя.)
2. Команда I t e m s . Add говорит Visual Basic .NET, что нужно подготовиться к добавлению нового элемента к объекту, именуемому BoxName.
3. Код ("Add m e " ) указывает Visual Basic .NET на необходимость добавления
строки Add me (Добавь меня) в нижнюю часть списка элементов для выбора,
принадлежащего объекту BoxName. (В своей программе вы можете ввести
любую строку, также заключенную в кавычки.)
Обычно команда I t e m s .Add добавляет новый элемент в нижнюю часть уже существующего списка возможных вариантов. Однако если вы присвоите свойству
Sorted (Сортировать) категории Behavior значение T r u e , все элементы будут отсортированы в алфавитном порядке и новый элемент займет свое место в соответствии с этим порядком. Более подробно о сортировке элементов читайте в разделе
"Сортировка элементов списков и полей со списком".
Если вы хотите вставить новый элемент в какую-то определенную позицию в списке, воспользуйтесь вместо команды Add командой I n s e r t :
BoxName.Items.Insert

(X,

"Add m e " )

Вот как работает этот код BASIC.
1. Слово BoxName указывает Visual Basic .NET, что нужно найти список или поле со
списком, именуемое BoxName. (Если вы хотите добавить элемент к своему списку
или полю со списком, вам нужно в этом месте указать соответствующее имя.)

Глава 9. Использование списков и полей со списком

109

2. Команда I t e m s . I n s e r t сообщает Visual Basic .NET о необходимости подготовиться к добавлению нового элемента в определенную позицию списка
элементов, принадлежащего объекту ЗохКате.
3. Код (X, "Add ir.e") дает указание Visual Basic .NET добавить строку Add me
в позииию номер X. Первый элемент в списке имеет позицию номер 0, второй —
позицию номер 1 и т.д. Если вы хотите, чтобы строка Add me была второй в
списке элементов, вам нужно набрать ( 1 , "Add me"), поскольку именно вторая позиция в списке обозначается номером I.

Сортировка элементов списков и полей со списком
Порядок, в котором вы добавляете элементы в список доступных для выбора вариантов,
сохранится и при отображении данного списка на экране. Но при необходимости вы можете
отсортировать список элементов в алфавитном порядке.
Когда происходит сортировка элементов по алфавиту, регистр не учитывается. Например,
для Visual Basic .NET элементы ''Варяг" и '"ВАРЯГ" являются абсолютно равнозначными.
Для того чтобы отсортировать элементы по алфавиту, необходимо выполнить следующие
действия.
J. Щелкните на списке или на поле со списком, элементы которого хотите
отсортировать.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду
View^Properties Window, в окне Solution Explorer щелкните на значке
Properties Window или щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Щелкните на свойстве Sorted (категория Behavior).
4. Щелкните на кнопке со стрелкой и выберите значение True (или F a l s e ,
если хотите отменить сортировку).
Если выбрано значение True, элементы списка автоматически будут отсортированы в алфавитном порядке.
Visual Basic .NET позволяет сортировать элементы в порядке от А до Z. (Если элементы
состоят из цифр, то для них порядок сортировки будет от 0 до 9. Если элементами являются и
числа и текстовые строки, то в начале списка будут идти отсортированные числа, а за ними
отсортированные строки.) Элементы нельзя отсортировать в обратном порядке, т.е. от Z до А
(только разве что перевернув монитор вверх ногами).
Если алфавитный порядок сортировки вас не устраивает, можете отсортировать элементы
вручную в окне Sorting Collection Editor или указав точное расположение в списке каждого
элемента с помощью команды Items . I n s e r t .

Удаление элементов из списка
Добавлять и сортировать элементы— это не единственное, что вы должны уметь делать
для составления хороших списков. Не исключено, что может возникнуть необходимость удалить лишние или случайно внесенные элементы либо те элементы, которые уже потеряли
свою актуальность, — в общем, просто что-то удалить.
В Visual Basic .NET это можно сделать двумя путями.
| ^ Во-первых, с использованием команды Items .RemoveAt, указывающей, какой
1
именно элемент нужно удалить.

110

Часть II, Создание пользовательского интерфейса

| V Во-вторых, с помощью команды I t e m s . C l e a r , которая позволяет удалить весь
|
список сразу.
Вы не можете использовать команду Items . Remove At, не зная позицию элемента, подлежащего удалению. Например, чтобы удалить третий элемент списка, именуемого
lstToDo, нужно написать следующий кол BASIC:
LstToDo.Items.RemoveAt (2)
rfi*Hf»
Первый элемент занимает нулевую позицию (0), второй— первую (1), третий —
вторую (2) и т.д.
Если вы хотите удалить выделенные на данный момент элементы, напишите такой код;
ComboBoxl.Items.RemoveAt (ComboEoxI.Selectedltem)
Если вы собираетесь посредством команды Items . C l e a r удалить сразу весь набор элементов списка или поля со списком, достаточно указать имя этого объекта. Например, чтобы
очистить весь список элементов поля со списком, носящего название cboHideln, воспользуйтесь таким кодом BASIC:
C b o H i d e l n . I t e r n s . C l e a r ()
Прежде чем применить команду C l e a r , подумайте, действительно ли нужно удалять весь список элементов, и убедитесь, что это именно тот список.

Cq'елаиме список
Чтобы немного оживить список и выделить его из общей серой массы безликих потоков
информации, попробуйте изменить его шрифт, начертание и размер.
Обычно Visual Basic .NET использует для отображения текста шрифт MS Sans Serif, но вы можете назначить для этого любой другой имеющийся у вас шрифт. (Шрифт MS Sans Serif похож на
шрифт Helvetica, а используемый Visual Basic .NET шрифт MS Serif похож на Times Roman).
Вот как можно изменить шрифт, используемый для отображения элементов списков и полей со списком.
1. Щелкните на списке или на поле со списком, параметры которых нужно изменить.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу . выберите команду ViewOProperties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Щелкните на свойстве Font (Шрифт) категории Appearance.
Рядом с ним появится кнопка с тремя точками.
4. Щелкните на кнопке с тремя точками.
На экране будет отображено диалоговое окно Font.
5. Определите шрифт, начертание, размер текста, наличие дополнительных
эффектов, например Strikeout (зачеркивание), и щелкните на кнопке ОК.

Глава 9. Использование списков и полей со списком

111

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

112

Часть //. Создание пользовательского интерфейса

Глава 10

Настройка отображения
пользовательского интерфейса
паве...
У

Установка одинаковых размеров для нескольких объектов

> Выравнивание объектов
> Установка одинаковых интервалов между объектами
> Фиксирование положения объектов
И Й осле того как вы создали форму и разместили в ней некоторое количество объектов
* ^ •* (например, кнопки, текстовые поля, переключатели), можете упорядочить их отображение, использовав следующие возможности Visual Basic .NET:
•/ придавать сразу нескольким объектам одинаковые размеры;
| / выравнивать объекты относительно друг друга;
S размешать объекты на одинаковом расстоянии друг от друга;
I S фиксировать текущие позиции и размеры объектов.

Установка одинаковых fta3Meftoe
с/ля нескольких
Если вы создаш некоторое количество подобных объектов, например группу флажков,
переключателей или кнопок, и хотите, чтобы все они имели одинаковые размеры, поручите
эту работу Visual Basic .NET. Он сделает это все автоматически.
От вас лишь потребуется выполнить следующие действия.
1. Щелкните на первом объекте, который должен стать такого же размера, как
и другие объекты.
2. Удерживая нажатой клавишу , поочередно выполните щелчки на всех
остальных объектах, которые должны иметь одинаковые размеры.
Visual Basic .NET выделит все указанные вами объекты.
3. Щелкните на объекте, размеры которого послужат образном для всех остальных, выделенных на первом и втором шаге, объектов.
Объект, который послужит образцом для других, должен быть выделен последним. В таком случае его размеры останутся прежними, а все остальные объекты
примут его параметры.
4. Задайте команду Format^Make Same Size (Формат'ФОдинаковый размер), а
затем выберите одну из следующих опций:
• Width (Ширина) — ширина всех объектов станет одинаковой;

Глава 10. Настройка отображения пользовательского интерфейса 113

• S i z e to Grid (Размер по сетке)— размеры всех объектов будут выровнены
по линиям сетки, отображаемым в окне формы;
• Не i g h t (Высота) — высота всех объектов станет одинаковой;
• Both (Оба параметра) — высота и ширина всех объектов станут одинаковыми.
Как только вы выберете одну из этих опций, размеры выделенных объектов сразу
же будут изменены.
Если вам вдруг не понравятся проведенные преобразования, отмените их нажатием
комбинации клавиш или щелкните на кнопке Undo (Отменить) стандартной панели инструментов.

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

atgned

th»

Рис. 10.1. Различные способы выравнивания объектов
L e f t s (По левому краю) — местоположение всех объектов выравнивается по левому краю;
C e n t e r s (По центру) — через середину каждого объекта проходит условная вертикальная линия;
R i g h t s (По правому краю) — местоположение всех объектов выравнивается по
правому краю;
Tops (По верхнему краю) — местоположение всех объектов выравнивается по их
верхнему краю;
Middles (По середине) —- средины каждого объекта выравнивается вдоль горизонтальной линии;
Bottoms (По нижнему краю) — местоположение всех объектов выравнивается по
их нижнему краю;

114

Часть II. Создание пользовательского интерфейса

To Grid (По линиям сетки) — все объекты выравниваются по линиям сетки, отображаемым а окне формы.
Вы можете изменить интервалы между линиями сетки, щелкнув в окне формы (но
не на каком-либо ее объекте). Откроется окно Properties, где в категории Design
вы можете изменить значения свойств GridSize Width (Ширина сетки) и GridSize
Height (Высота сетки). Чем больше значение вы зададите, тем большее расстояние
будет между линиями сетки.
При необходимости выровнять несколько объектов, выполните следующие действия.
1. Удерживая нажатой клавишу , поочередно щелкните на всех объектах, которые хотите выделить.
Visual Basic .NET выделит каждый выбранный вами объект.
2. Щелкните на объекте, положение которого должно быть ориентиром для
всех остальных объектов.
Объект, выделенный последним, останется на месте, а все остальные будут выровнены с учетом его положения.
3. Активизируйте команду Format^ Align (Фор мат Вы ровнять), а затем выберите одну из доступных опций, например L e f t s или M i d d l e s .
Visual Basic .NET выровняет выделенные вами объекты по указанному объекту.
Вы всегда можете отменить внесенные изменения, нажав комбинацию клавиш
или щелкнув на кнопке Undo (Отменить) стандартной панели инструментов.

между оЗъеюпами
Упорядочить местоположение объектов в окне формы можно также путем определения
точного расстояния между ними.
Вот как это делается.
1. Удерживая нажатой клавишу , выполните поочередные щелчки на
всех объектах, местоположение которых вы хотите выровнять, определив
расстояние между ними.
Visual Basic .NET выделит все указанные вами объекты.
2. Щелкните на объекте, с учетом месторасположения которого должны быть
выровнены остальные выделенные объекты.
Объект, выделенный последним, останется на своем месте, в то время как все
другие объекты будут перемещены.
3. Задайте команду FormatsHorisontal Spacing/Vertical Spacing (Формат1^
Горизонтальное расстояние/Вертикальное расстояние), а затем выберите
один из следующих вариантов.
• Make Equal (Сделать равным)— объекты размещаются таким образом, что вертикальные или горизонтальные промежутки между ними становятся одинаковыми;
• I n c r e a s e (Увеличить)— все выделенные объекты перемещаются в сторону
от объекта, выделенного на шаге 2;

Глава 10. Настройка отображения пользовательского интерфейса 115

• D e c r e a s e (Уменьшить)-— все выделенные объекты размещаются притык к
объекту, выделенному на шаге 2;
• Remove (Передвинуть) —- Все выделенные объекты размещаются впритык друг
к другу.
Если вам не понравятся выполненные Visual Basic .NET перемещения объектов,
отмените их, нажав комбинацию клавиш или щелкнув на кнопке Undo
(Отменить) стандартной панели инструментов.

Тест на проверку полученных вами знаний
1 . Зачем нужно выравнивать объекты?
а. Чтобы у пользователей глаза не разбегались в разные стороны.
б. Это позволит создать ужасный и беспорядочный пользовательский интерфейс.
в. Таким образом можно создать аккуратный и упорядоченный интерфейс.
г. Минуточку, я, кажется, уже выбрал вариант в.

2. Когда вы выделяете группу объектов, желая их
выровнять или изменить их размеры, какой из
объектов Visual Base .NET в любом случае оставит без изменений?
а. Тот, который был выделен последним.
б. Тот, которой "ровнее" всех остальных.
в. Это непредсказуемо. Как Visual Base .NET
:
решит, так и будет.
г..„ Обычно Visual Basic .NET меняет все объекты,
причем до неузнаваемости.

Выравнивание по u,eHtnfiif
Иногда, чтобы придать интерфейсу более эстетический вид, целесообразно разместить
один или несколько объектов точно по центру формы. К счастью, вам необязательно делать
это вручную, Visual Basic .NET может сам выровнять объекты как по горизонтали, так и по
вертикали.
Чтобы выровнять объекты по центру, сделайте следующее.
1. Щелкните на одном или нескольких объектах, которые должны быть выровнены.
Чтобы выделить сразу несколько объектов, поочередно щелкайте на них, удерживая нажатой клавишу .
2. Выберите команду Format^Center in Form (Формат'ФПо центру формы), а

затем сделайте установку H o r i z o n t a l l y или V e r t i c a l l y , а возможно, и
обе сразу.
Visual Basic .NET разместит выделенные объекты точно по центру формы.

Фиксация, положения o£betctno€
Когда вы фиксируете положение объектов, вы как бы приклеиваете их к определенному
месту в окне формы, с тем чтобы в дальнейшем никто другой не мог случайно или намеренно
переместить их в другое место. Этот прием особенно полезен в том случае, когда над созданием программы работают сразу несколько программистов. Если один из них зафиксирует
положения объектов, другие уже не смогут просто так испортить его работу.

116

Часть II. Создание пользовательского интерфейс

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

Фиксирование положения всех объектов в окне формы
Для того чтобы зафиксировать положение и размеры всех объектов, созданных в какой-то
форме, необходимо выполнить такие действия.
1. Щелкните в окне формы на любом объекте (например, на текстовом поле),
2. Выберите команду Format^Lock Controls (Формат'ФЗаблокировать).
Visual Basic .NET зафиксирует положение всех объектов, принадлежащих этой
форме.
Теперь, если вы щелкнете на каком-нибудь из таких объектов, Visual Basic .NET отобразит вокруг него белые границы (рис. 10.2), и это будет означать, что положение объекта зафиксировано и его нельзя перемешать или изменять его размеры.
I P Locking objects on a form
К-.-;;" -^'We're

|

B H P H

Г:;:™;-:?::"

^locked

:: A

:, -. w"th
-•
' "• " ' ten

,

й

.

Рис. 10.2. При выделении в окне формы зафиксированных
объектов вокруг таковых отображаются белые границы

Чтобы снять фиксацию со всех объектов, еше раз выберите команду Formats Lock
Controls.

Фиксирование положения отдельных объектов
Далеко не всегда возникает необходимость в фиксировании положения сразу всех объектов
в окне формы. Вы можете зафиксировать положение лишь одного или нескольких объектов, с
тем чтобы оставить за собой возможность перемещать и изменять размеры всех остальных объектов. Вот что нужно сделать, чтобы зафиксировать положение только одного объекта.
1. Щелкните на объекте, положение которого вы хотите зафиксировать.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View^Properties
Window, в окне Solution Explorer щелкните на значке Properties Window или
щелкните правой кнопкой мышки в окне формы и выберите команду Properties.

Глава 10. Настройка отображения пользовательского интерфейса 117

3. Щелкните на свойстве Locked (Зафиксировать) категории Design.
Рядом с ним появится кнопка с направленной вниз стрелкой.
4. Щелкните на кнопке со стрелкой и выберите значение True (Истина).
Теперь при выделении этого объекта вокруг него будут отображаться белые границы, информирующие о том, что объект зафиксирован.
Чтобы разблокировать данный объект, повторите все те же действия, только вместо значения True выберите значение F a l s e .

/18

Часть II. Создание пользовательского интерфейса

Часть III

Создание меню

UhvO ЭЫОУЛ

6 люб^

мож-tiw

йолго

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

Глава 11

Разработка раскрывающихся меню
& этой гла£е,.,
> Создание меню
> Назначение имен
У Настройка меню
/Раскрывающиеся меню позволяют разбивать по группам и компактно отображать на*^
боры команд, выполняющих подобные действия. Благодаря этому вам не нужно будет засорять пользовательский интерфейс лишними наборами кнопок, флажков, переключателей, дополнительными панелями инструментов и т.д.

Основные компоненты ап^гоки меню
В заголовках меню большинства программ наиболее часто встречаются такие названия,
как File, Edit, Window и Help.
Меню File (Файл) обычно содержит команды, имеющие прямое отношение к операциям с
файлами (рис. 11.1). В число таковых входят операции открытия, закрытия, сохранения, печать файлов; здесь же находится и команда выхода из программы, позволяющая оторваться
от компьютера и пойти чего-нибудь перекусить.
Меню Edit (Правка), как правило, объединяет команды, относящиеся к процессу редактирования, например такие, как Undo (Отменить), Redo (Повторить), Cut (Вырезать), Сору
(Копировать), Paste (Вставить), Clear (Очистить) и Select All (Выделить все).
Меню Window (Окно) обычно содержит команды, касающиеся открытия, закрытия, выравнивания окон, а также команды переключения между разными окнами.
Заголовок
меню

Команды меню

вИ Playing with Menus
File
Hew
Open

HBI3J

OQSB
SBVB

Save As
Print Preview
Print
Jam Printer
Exit

"

:

-

-





. .

РИС. 11.1. Пример раскрывающегося меню,
созданного с помощью Visual Basic .NET

Глава 11. Разработка раскрывающихся меню

121

Меню Window присутствует только в тех программах, которые позволяют открывать сразу несколько окон (в частности, в текстовых процессорах). Если же программа работает лишь с одним окном, в меню Window просто нет необходимости.
В меню Help (Справка) вы найдете команды, с помощью которых можно получить справочную информацию о самой программе.
Обычно заголовки меню File и Edit расположены рядом друг с другом, а заголовки меню
с командами, которые вы вряд ли найдете в других программах, расположены между заголовками меню Edit и Window. Например, в большинстве текстовых процессоров есть меню
Tools (Сервис), где собраны команды наподобие Тезаурус, Расстановка переносов,
Макрос и некоторые другие, о которых 99 процентов населения планеты не имеют ни малейшего представления.
Если вы создаете меню, заголовки которых вряд ли можно встретить в интерфейсах других программ (иными словами, если это не Edit, Window и не какие-либо
другие общеизвестные заголовки меню), постарайтесь сделать так, чтобы ваши заголовки были максимально информативны и чтобы пользователи хотя бы приблизительно представляли, какие команды они смогут найти в этом меню.

Создание меню qust UHtOeficpeuca €auteu
nflOtflOMMbt
Чтобы создать раскрывающееся меню, сделайте следующее.
1. Щелкните на форме, в окне которой должно быть создано раскрывающееся
меню.
2. На панели ToolBox дважды щелкните на кнопке инструмента MainMenu
(Главное меню).
Visual Basic .NET создаст в окне формы пустое меню и отобразит в нижней части
экрана отдельное окно со значком MainMenul (рис. 11.2).
3. В окне формы щелкните в поле, где отображаются слова Туре Неге
(Наберите здесь) и введите название заголовка меню, например F i l e или
Формат.
Visual Basic .NET отобразит введенный вами текст как заголовок меню или как
название команды меню, и создаст рядом еще одно поле Туре Неге для ввода
нового заголовка меню или команды меню.
4. Повторите шаг 3 столько раз, сколько заголовков и команд меню вы хотите
создать.
Чтобы иметь возможность получить доступ к меню посредством нажатия "горячей клавиши", перед буквой, которая должна быть подчеркнута, наберите символ &. Например,
чтобы создать типичное меню File (с подчеркнутой буквой!7), наберите &Fiie.
Если вы щелкнете на команде созданного вами раскрывающегося меню, ничего не
произойдет, поскольку вы еще не написали коды BASIC, объясняющие программе,
что нужно делать при выборе какой-либо команды меню.

122

Часть ///. Создание меню

Kiest2 Microsoft Visual 8asic.NET |elesi(|ii| - Aliqned.vb IDesi. Щелкните на кнопке со стрелкой и выберите значение F a l s e .
При каждом следующем запуске программы эта команда будет выделяться серым.

Глава 11. Разработка раскрывающихся меню

129

Если команда выделена серым, то, естественно, в определенные моменты времени выделение с нее должно сниматься, т.е. команда должна снова становиться доступной. А для этого
вам опять понадобится написать код BASIC. Чтобы снять с команды выделение серым, нужно ее свойству Enabled присвоить значение True. Ниже приведен код, который снимает выделение с команды, названой именем mnuEditCut:
MnuEditCut.Enabled = True
Чтобы команда стала недоступной в процессе выполнения программы, также нужно написать код BASIC, присваивающий ее свойству Enabled значение F a l s e . Вот код, который делает недоступной (выделяет ее серым) команду mnuEditCopy:
MnuEditCopy.Enabled = F a l s e

Скрытие команд меню
Вы можете не только выделять команды меню серым, но и вовсе убирать их с экрана на
какое-то время. Например, некоторые программы не отображают никаких заголовков меню,
за исключением меню File и Help, до тех пор, пока пользователь не откроет или не создаст
новый файл. (В самом деле, зачем отображать меню Edit, если редактировать пока нечего?)
При необходимости удалить элемент меню с экрана сделайте следующее.
1. Откройте форму, содержащую меню, которые нужно отредактировать.
2. Щелкните на заголовке меню, где расположена команда, отображение которой нужно отменить.
Visual Basic .NET активизирует раскрывающееся меню.
3. Щелкните на команде, которую нужно убрать с экрана.
4. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду View1^ Properties
Window, в окне Solution Explorer шелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
5. Щелкните на свойстве Visible (Видимый), относящемся к категории Misc
(Разное).
Рядом с ним появится кнопка с направленной вниз стрелкой.
6. Щелкните на кнопке со стрелкой и выберите значение F a l s e .
В следующий раз, когда вы запустите программу, этой команды в меню вы не найдете.
Если команда в определенный момент времени на экране отсутствует, то наверняка наступит время, когда ее нужно будет отобразитьснова и сделать доступной. Для этого вам
опять-таки понадобится написать код BASIC. Чтобы отобразить команду на экране, нужно ее
свойству Visible присвоить значение True. Ниже приведен код, который возвращает на экран заголовок меню с именем mnuEdit:
M n u E d i t . V i s i b l e = True
Чтобы убрать команду с экрана в процессе выполнения программы, также нужно написать
код BASIC, присваивающий свойству Visible значение F a l s e . Ниже приведен код, который
отменяет отображение заголовка меню, именуемого mnuToo I s:
MnuTools- V i s i b l e = F a l s e
В заключение еще раз напомним вам, что раскрывающиеся меню призваны облегчить работу с программой и придать ей более профессиональный вид. Поэтому не жалейте времени
и усилий на создание качественного пользовательского интерфейса, задействуйте для этого
все доступные средства, и пользователи непременно скажут вам спасибо.

/30

Часть III. Создание меню

Глава 12

Подменю, расширяемые меню
и выпадающие меню
В'э/ной

ыа£е...

>

Создание подменю

>

Создание динамически расширяемых меню

>

Создание выпадающих меню

Ш^ оличество команд, которые можно разместить в раскрывающемся меню, всегда ог* ^ раничивается высотой экрана. А что делать, если вы создаете суперпрограмму, в которой столько команд, что всех раскрывающихся меню просто не хватает для их размещения? По-видимому, вам придется заняться созданием подменю (или еще раз подумать, нужно
ли создавать такую огромную программу).

Создание подменю
Подменю — это одно раскрывающееся меню, вложенное в другое раскрывающееся меню.
Таким образом можно создавать целую иерархию команд, размещая отдельные из них на разных уровнях вложенности. Например, в интерфейсе многих программ можно встретить меню
Format (Формат), внутри которого расположены такие команды, как TypeStyle (Начертание),
Font (Шрифт) и Size (Размер). Если вы щелкнете на команде Font, на экране отобразится
подменю со списком всех доступных для использования шрифтов. Пример вложенных подменю приведен на рис. 12.1.
Visual Basic .NET позволяет создавать системы подменю, включающие до четырех уровней вложенности (рис. 12.1). Хотя использование такого количества вложенных подменю
может показаться вам заманчивым, большинство программ применяют только один уровень
вложенности. Опыт показывает, что обнаружить команду, расположенную на третьем или
четвертом уровне вложенности, очень непросто.
Находящийся рядом с элементом меню треугольник, повернутый в виде стрелки, свидетельствует о том, что за этим элементом скрывается подменю. Когда вы создаете подменю,
Visual Basic .NET добавляет отображение такой стрелки автоматически.
Создается подменю следующим образом.
1. Откройте форму, содержащую раскрывающееся меню, к которому вы хотите
добавить подменю.
2. Щелкните на заголовке раскрывающегося меню.
Visual Basic .NET отобразит меню на экране.
3. Щелкните на команде, за которой должно раскрываться подменю.
Справа от выбранной команды Visual Basic .КЕТ отобразит поле Туре Неге
(Наберите здесь).

Глава 12. Подменю, расширяемые меню и выпадающие меню

131

4. Щелкните в поле Туре Неге и наберите название первой команды подменю.
Visual Basic .NET отобразит поля Туре Неге справа и снизу под только что созданной командой подменю.
5. Повторяйте шаг 4 до тех пор, пока не наберете названия всех команд, которые должны отображаться в подменю.
Если вы щелкнете в поле Туре Неге, расположенном справа от новой команды
подменю, вы создадите новое подменю.

Insert stibllmjnBfnwwage» (гею Лв1Н«(П1«яв
b t n t t dues tfrat Sli»ke»pe»re W M iffiterats
Produce

(illy wrote all my III ays

ргооГ' Iliat ShrtkHsiiiMre never e x i s t e d at all

Рис. 12.1. Вы можете спрятать команду за несколькими уровнями подменю
Чем больше вы создадите подменю и чем сложнее будет их структура, тем труднее
будет пользователям находить нужные команды и тем неудобнее будет ваша программа в использовании.
Вместо многоуровневой системы подменю многие программы используют для общения с пользователем диалоговые окна. (Об их создании подробно рассказывается в главе 13.) Диалоговые окна позволяют за один раз выбрать сразу несколько
команд и установок, что значительно удобнее, чем блуждание по разным подменю
в поиске лишь одной команды или установки.

команд меню € п/мцессе
выполнения
Иногда возникают ситуации, когда команду меню нужно изменить в процессе выполнения
программы. Так, в интерфейсе большинства программ имеется команда Undo (Отменить),
которая почти всегда изменяется. После того, как пользователь выбирает команду Undo, таковая исчезает с экрана, а на ее месте появляется команда Redo (Повторить).
Чтобы команда меню изменялась в процессе выполнения программы, нужно написать соответствующий код BASIC, изменяющий для этой команды значение свойства Text (Текст). Приведенный ниже код изменяет для команды mnuEditUndo название на экране Undo на Redo:
MnuEditUndo.Text = "Redo"
Следующий код возвращает на экран название Undo:
MnuEditUndo.Text = "Undo"

132

Часть III. Создание меню

Создание динамически
/tacutu/tscejioix меню
В интерфейсе большинства программ в меню File отображается список из четырех или
пяти открываемых последними файлов (рис. 12.2). Другой случай: если вы открываете в одной и той же программе несколько окон, в меню Window можно увидеть список файлов, открытых ни данный момент.
Такие меню называются динамически расширяемыми, и используются они для быстрого
доступа к определенным файлам в процессе работы программы. Visual Basic .NET предлагает
два спосооа создания динамически расширяемых меню:
* ^ в процессе разработки интерфейса программы;
S в процессе выполнения программы.
File j
Q Hew...
en...
> Browse...
^Workspace

CW*H
Ctrt*O
Ctrt*B

Import
iatc Software Products
l В « ф Conversion...
Preferences
1 Photo of a riead sndce alien
2 ComprernWng picture of bow
3 Secret map to Jimmy ttoffa'* body
« Mem bomb blueprint

РИС. 12.2. Динамически расширяемое меню File,
которое вы можете увидеть в программе Paint Shop Pro

Создание расширяемых меню в режиме конструктора
Если вы наперед знаете, что в процессе работы программы в раскрывающееся меню
должно быть добавлено несколько новых пунктов, то можете заранее создать некоторое количество пустых строк в меню, и позднее, используя коды BASIC, заполнить их конкретными
элементами.
Чтобы сделать это, выполните следующие действия.
1. Откройте форму, меню которой должно динамически расширяться.
2. Щелкните на заголовке раскрывающегося меню.
В нижней части открывшегося меню будет отображаться поле Туре Неге.
3. Щелкните в поле Туре Неге, наберите любой символ и нажмите клавишу
возврата, чтобы стереть его.
Таким образом вы создадите в раскрывающемся меню пустую строку.
4. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду ViewOProperties
Window, в окне Solution Explorer щелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.

Глава 12. Подменю, расширяемые меню и выпадающие меню

133

5. Щелкните на свойстве Visible (Видимый), которое относится к категории
Misc (Разное).
Рядом с названием свойства появится кнопка с направленной вниз стрелкой.
6. Щелкните на кнопке со стрелкой и выберите значение F a l s e .
Теперь созданный вами пустой элемент меню не будет отображаться на экране.
7. Дважды щелкните на свойстве Name (Имя) категории Design и укажите новое имя для только что созданного элемента меню.
Назовите элемент каким-нибудь запоминающимся именем, потому что вам еще
придется его использовать при написании кодов BASIC для отображения новых
строк в раскрывающемся меню.
Итак, выполнив все перечисленные действия, вы создали в раскрывающемся меню резервную пустую строку, однако чтобы заполнить эту строку текстом и отобразить ее на экране (т.е. для того чтобы меню стало действительно динамически расширяемым), нужно написать коды BASIC.
Предположим, вы назвали созданную пустую строку именем mnuFiieOne. Ниже приведен код BASIC, который выводит эту строку на экран и заполняет ее текстом.
M n u F i l e O n e . V i s i b l e = True
MnuFileOne.Text = "1 C:\My D o c u m e n t s \ F l a m e . t x t "
1. Первая строка говорит Visual Basic .NET: "Сделай команду меню, именуемую
mnuFileOne, видимой, чтобы она смогла отображаться на экране"'.
2. Вторая строка дает Visual Basic .NET другое указание: "Отобрази текст
1 C:\My Documents\Flame.txt в команде меню, именуемой mnuFileOne".
Выполнение двух этих шагов создает у пользователей иллюзию, что раскрывающееся меню динамически расширяется в процессе выполнения программы.

Добавление новых элементов меню в процессе
выполнения программы
Недостаток рассмотренного выше способа создания динамически расширяемых меню заключается в том, что вы не всегда можете заранее сказать, сколько именно новых элементов
нужно будет добавить. Поэтому, чтобы сделать программу более гибкой (правда, и более
сложной), вы должны написать коды BASIC, предназначенные для добавления в меню по мере необходимости новых элементов в процессе выполнения самой программы.
Более подробно использование кодов BASIC будет рассмотрено в четвертой части
этой книги. Поэтому вы можете сейчас лишь бегло просмотреть настоящий раздел
и вернуться к нему позже, когда будете больше знать о работе кодов BASIC.
А теперь попробуем создать динамически расширяемое меню с использованием кодов BASIC.
1. В окне формы создайте открывающееся меню и присвойте ему какое-нибудь
запоминающееся имя, например, mnuFirstMenu.
О том, как создаются раскрывающиеся меню, рассказано в главе 11.
2. Откройте редактор кодов для этой формы.
3. Наберите приведенный ниже код.

134

Часть III. Создание меню

Код, который вы видите ниже, в Visual Basic .NET называется методом. По существу, метод представляет собой маленькую программу внутри большой программы. Обычно методы создаются для решения каких-то несложных задач.
Public Sub AddMenuItem(ByVal NewStuff As String)
Dim myMenuItemNew As New Menultemf)
myMenuItemNew.Text = NewStuff
mnuFileMenu.Menulterns.Add(myMenuItemNew)
End Sub
. Введите следующий код куда-нибудь в текст программы, чтобы привести в
действие только что набранный метод, добавив тем самым в раскрывающееся меню новый элемент.
AddMenuItem

("Мой новый э л е м е н т меню")

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

Sub AddMenuItem(ByVal NewStuff_
As String)
Dim myMenuItemNew As New M e n u l t e m ( )
myMenuItemNew,Text
=
NewStuff
mnuFileMenu.MenuIterns.Add[myMenuItemNew)
End Sub
1. Первая строка сообщает Visual Basic .NET: "Этот метод называется
AddMenuItem (ему можно дать любое понравившееся вам имя). Метод принимает строку ( S t r i n g ) и сохраняет ее как переменную NewStuff".
2. Вторая строка приказывает Visual Basic .NET: '"Создай переменную
myMenuItemNew (ее можно назвать по-другому), которая будет представлять
собой объект, именуемый MenuIterrT.
3. Третья строка говорит Visual Basic .NET: "Присвой значение переменной
NewStuff свойству Text объекта, представляемого переменной
myMenuItemNew"'.
4. Четвертая строка дает указание Visual Basic .NET: "Добавь в раскрывающееся
меню, именуемое mnuFileMenu, новый элемент, представляемый переменной myMenuItemNew".
5. Наконец, пятая строка информирует Visual Basic .NET: "На этом список инструкций данного метода заканчивается".
В приведенном выше примере курсивом выделены имена, которые не являются
обязательными; вы можете присваивать таковые по своему усмотрению. Например, метод можно назвать не AddMenuItem (Добавление элемента меню), а, скажем, GrowMenu (Расширяемое меню). Не важно, какие именно имена вы присваиваете. Главное, чтобы вы их потом корректно использовали.

Глава 12. Подменю, расширяемые меню и выпадающие меню

135

Тест на проверку полученных вами знаний
1 . Объясните, зачем иногда нужно менять ко- 2. Для чего создаются подменю?
Чтобы подальше спрятать от пользователей
манды в раскрывающихся меню. .
а.
наиболее важные команды.
а. Чтобы пользователи не расслаблялись и
периодически задумывались, а все яи
б. Чтобы иметь возможность компактно отобраправильно они делают?
жать команды, выполняющие подобные действия, без необходимости создавать отдельные
б. Чтобы один и тот же интерфейс не надое-,
дал пользователям, нужно через каждые
пять минут изменять расположение ков. Большая разветвленная система меню вкушаманд в меню.
ет уважение к столь 'серьезной" программе,
в. Чтобы менять местами такие команды, как
г. Подменю должно быть побольше, чтобы польUndo (Отменить) и Redo (Повторить).
зователи постоянно находили в них для себя
г. Ничто не вечно, в том числе и порядок кочто-то новое и интересное.
манд в раскрывающихся меню.

Создание впадающих меню
Многие программы предоставляют пользователям доступ к командам, не только посредством раскрывающихся меню, но и через выпадающие меню, которые, согласно терминологии Visual Basic .NET, называются также контекстными меню. Контекстное меню появляется на экране каждый раз, когда пользователь щелкает где-либо правой кнопкой мыши. Есть
два способа создания контекстных меню:
S посредством создания новых команд, которые будут отображаться в контекстном меню;
f -/ путем копирования в контекстные меню уже существующих команд из раскры,
вающихся меню.

Создание команд для контекстных меню
Для того чтобы создать для контекстного меню новую команду, вы должны выполнить
следующие действия.
1. Откройте форму, для которой нужно создать контекстное меню.
2. В панели Toolbox дважды щелкните на кнопке инструмента ContextMenu
(Контекстное меню).
Кнопка ContextMenu относится к категории Windows Forms, но на экране она
обычно не отображается, а чтобы ее увидеть, нужно нажать кнопку с направленной вниз стрелкой и прокрутить вниз список инструментов.
После того как вы дважды щелкнете на этой кнопке, Visual Basic .NET отобразит
значок ContextMenu в отдельном окне нижней части экрана, а в самой форме
появится объект ContextMenu (рис. 12.3).
3. В окне формы щелкните на объекте ContextMenu.

Прямо под объектом ContextMenu откроется поле Туре Неге.
4. Щелкните в поле Туре Неге (Наберите здесь) и введите название команды,
которая должна отображаться в контекстном меню.

136

Часть III. Создание меню

5. Повторяйте шаг 4 до тех пор, пока не укажете названия всех команд, которые должны быть доступны через это контекстное меню.
После того как контекстное меню будет создано, вы в любой момент сможете его
открыть для редактирования, щелкнув на значке ContextMenu в окне, расположенном в нижней части экрана. Visual Basic .NET отобразит само меню в верхней части
окна формы, и вы сможете добавлять, удалять или перемещать его элементы. Более
подробную информацию о редактировании меню можно найти в главе 11.
к. ВОТНЕСДТ - Microsoft Visual Basic.NET lilesitinl - F-ormi.vh Desinn "

£Ие |dlt View £re|ect guild

Dita

loota Iflflndow Help

Debug
» = fftS BoCat
$ Ф* ^- "^" ^V -ь Г ¥i
C'U-!'H'IJ3(PJ-".:'L, ^m;« Fo™1.»b iDengnfl Fmmi -b

Eli CorHextMerui

Ready

Рис. 12.3. Создание контекстного меню для формы вашей программы

Как сделать контекстное меню выпадающим
После того как контекстное меню будет создано и вы присвоите ему (надеюсь, вы уже
умеете это делать) какое-нибудь запоминающееся имя, нужно сделать так, чтобы оно появлялось на экране при каждом щелчке пользователя в окне формы правой кнопкой мыши (т.е.
чтобы оно стало выпадающим).
1. Откройте форму, для которой создано контекстное меню.
2. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду ViewOProperties
Window, в окне Solution Explorer щелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
3. Щелкните на свойстве ContextMenu (Контекстное меню) категории Behavior
(Поведение).
Рядом с ним появится кнопка с направленной вниз стрелкой.

Глава 12. Подменю, расширяемые меню и выпадающие меню

137

4. Щелкните на кнопке со стрелкой.
Visual Basic .NET отобразит имена всех контекстных меню, созданных для этой
формы.
5. Щелкните на названии того контекстного меню, которое, по-вашему мнению, должно отображаться на экране при каждом щелчке правой кнопкой
мыши в окне формы.
Вот и все. Теперь, стоит пользователю щелкнуть правой кнопкой мыши, контекстное меню тут же появится на экране.

Копирование команд в контекстное меню
После того как контекстное меню будет создано и вы сделаете его выпадающим, вам еше
придется написать для него коды BASIC, отвечающие за то, чтобы выбор любой из команд
меню приводил к каким-нибудь действиям.
Поскольку в контекстных меню зачастую содержатся команды, которые уже имеются в
раскрывающихся меню, вы можете просто скопировать эти команды из раскрывающихся меню в контекстные.
Вот как это можно сделать.
1. Откройте форму с раскрывающимся меню, команды которого нужно скопировать.
2. Чтобы открыть раскрывающееся меню, щелкните на его заголовке.
Вначале вам, возможно, придется щелкнуть на значке меню в окне, расположенном в нижней части экрана. Visual Basic .NET отобразит все команды, содержащиеся в указанном вами меню.
3. Щелкните правой кнопкой мыши на той команде, которую нужно скопировать.
Рядом откроется выпадающее меню.
4. Выберите команду Сору (Копировать).
5. В окне, расположенном внизу экрана, щелкните на значке контекстного меню, в которое должна быть скопирована команда.
Visual Basic .NET отобразит это контекстное меню в окне формы.
6. Щелкните правой кнопкой мыши в поле Туре Неге контекстного меню.
Рядом откроется выпадающее меню.
7. Выберите команду Paste (Вставить).
Visual Basic .NET вставит скопировантю команду в выбранное вами поле контекстного меню.
Чтобы те команды, которые были скопированы из других меню, стали рабочими,
для них также нужно будет написать коды BASIC, даже несмотря на то, что в других меню коды для этих команд уже имеются.

138

Часть III. Создание меню

Глава 13

Диалоговые окна
В' э&ои гмг€е...
>

Создание диалоговых окон

> Добавление в диалоговые окна пиктограмм и кнопок
>

Использование стандартных диалоговых окон

/•Раскрывающиеся меню могут в значительной степени облегчить для пользователей
*^
процесс общения с программой (при условии, конечно, что пользователи знают, как
обращаться с этими меню). Но почти все программы для диалога с пользователями помимо
меню применяют и так называемые диалоговые окна.
Очень часто программы используют диалоговые окна с целью сообщить пользователю,
что именно они делают в данный момент. Например, на экране может появиться сообщение
наподобие '"Печать страницы 4 из 75" или ''Программа выполнила недопустимую операцию и
сейчас будет закрыта".
К тому же с помощью диалоговых окон программа может задавать пользователям вопросы, такие например, как '"Остановить печать?" или "Вы действительно хотите завершить выполнение программы?" Большие диалоговые окна могут быть буквально напичканы различными опциями, позволяя пользователям за один раз сделать немалое количество установок и
ответить на множество вопросов. Подобно тому как большинство программ, написанных под
Windows, используют похожие раскрывающиеся меню (File, Edit, Help), имеют между собой
много общего и диалоговые окна, используемые в разных программах.

Создание nfioc/пмх диалоговых окон
Небольшие диалоговые окна обычно отображают какое-нибудь сообщение для пользователя и одну или несколько командных кнопок. Типичное диалоговое окно состоит из следующих обязательных элементов:
| S

строка заголовка;

I S сообщение;
оросающаяся в глаза пиктограмма;
одна или несколько кнопок.
Строка заголовка определяет цель или назначение диалогового окна, например:
"Сохранение документа". Сообщением называется текст, который отображается в диалоговом окне, скажем, такой: "Проверка документа завершена"'. Пиктограмма делает визуальный
акцент на той информации, которая передается посредством диалогового окна. Кнопки позволяют сделать выбор, и обычно их количество колеблется от одной до трех штук.
Простейшее диалоговое окно отображает на экране сообщение и кнопку ОК. В этом случае пользователю ничего не остается, кроме как прочитать сообщение и щелкнуть на кнопке.
Чтобы создать такое окно, вам нужно просто набрать команду MsgBox и указать текст, который должен отображаться в строке заголовка и в самом окне.
Приведенный ниже код BASIC создает простое диалоговое окно, показанное на рис. 13.1.

Глава 13. Диалоговые окна

139

MsgBox

("Ready to t r y Linux y e t ? " ,

/'Windows just__crashed a g a i n " )

Это простейшее диалоговое окно совершенно безобидно. Оно всего лишь появляется на
экране и исчезает, как только пользователь щелкает на кнопке ОК.

Рис. 13.1. Вот как выглядит
простейшее диалоговое окно

Добавление пиктограмм
Пиктограммы помогают привлечь внимание пользователя к диалоговому окну. Visual
Basic .NET предлагает на ваш выбор четыре пиктограммы (рис. 13.2).
Critical (Критическая)
Exclamation (Предупреждающая)
Information (Информационная)
Question (Вопрос)
Рис. 13.2. Четыре пиктограммы, которые могут быть добавлены для отображения в простейших диалоговых окнах

•/ C r i t i c a l (Критическая)— красный кружок с белым крестиком внутри— окна с
такой пиктограммой появляются, как правило, в экстремальных случаях и сопровождают действительно важные вопросы, типа такого; "Еще один подобный шаг, и последние данные будут удалены с вашего компьютера. Вы уверены, что хотите этого?''
, S E x c l a m a t i o n (Предупреждающая) — восклицательный знак — акцентирует
внимание на предупреждениях, о которых пользователь обязательно должен знать,
например: "Память перегружена! Удалите ненужные программы."
?

1 ^ Information (Информационная)— буква " i " — привлекает внимание к не очень ин\
тересным сообщениям, наподобие такого: '"Печать всех 3 056 страниц вашего документа может занять некоторое время. Щелкните на кнопке ОК, когда будете готовы."
I S Q u e s t i o n (Вопрос)— вопросительный знак— сопровождает безобидные вопро•
сы, вроде "Вы действительно не хотите выходить из этой программы?"
Чтобы разместить в диалоговом окне пиктограмму, вначале нужно написать такой код:
Imports.Microsoft.VisualBasic.MsgBoxStyle
ПАС/

*'—-

740

_

Приведенная выше строка должна быть самым первым кодом в тексте вашей программы, иначе Visual Basic .NET не сможет ее правильно интерпретировать и программа будет работать некорректно.

Часть III. Создание меню

Если такая строка присутствует в кодах вашей программы, при создании диалоговых окон
вы можете добавлять слова C r i t i c a l , E x c l a m a t i o n , I n f o r m a t i o n или Q u e s t i o n между сообщением диалогового окна и его заголовком, например:
MsgBox

("Ready t o t r y Linux y e t ? " , C r i t i c a l , _
"Windows Crashed Again")

Такой код создает диалоговое окно, показанное на рис. 13.3.

Рис. 13.3. Отображение пиктограммы
Critical в диалоговом окне
Если вы не добавили в код программы строку Imports . M i c r o s o f t .
VisualBasic.MsgSoxStyle, при создании диалогового окна вместо слова
C r i t i c a l нужно будет набрать Microsoft.VisualBasic.MsgBoxStyle.
Critical:
MsgBox

("Ready to t r y Linux yet?",__

Г

"Windows Crashed Again")
Visual Basic .NET позволяет отобразить в диалоговом окне только одну стандартную пиктограмму. Если вас такое ограничение не устраивает, можете создать свое
диалоговое окно вручную. Для этого откройте отдельную форму, свойству Borderstyle присвойте значение Fixed Dialog, создайте в окне формы кнопки и рисунки. В этом случае вы можете разместить в окне столько рисунков, сколько посчитаете нужным.
Только не забывайте, что такой способ создания диалогового окна потребует от вас самостоятельно добавить все необходимые кнопки, надписи, рисунки, а для того чтобы окно стало
рабочим, нужно будет еше написать коды BASIC. Если же вы решили не усложнять себе
жизнь, а хотите создать диалоговое окно просто и быстро, воспользуйтесь командой MsgBox.

Добавление командных кнопок
В стандартном диалоговом окне можно разместить от одной до трех командных кнопок.
В табл. 13.1 приведены шесть возможных вариантов наличия командных кнопок .
Таблица 13.1. Возможные варианты наличия командных кнопок в стандартном
диалоговом окне
Отображение

Значение

Константа

Кнопка О К

OKOnly

Кнопки ОК и Cancel

OKCancel

Кнопки Abort, Retry, Ignore

AbortRetryIgnore

Глава 13. Диалоговые окна

141

Окончание табл. 13.1
Значение

Отображение

Константа

Кнопки Yes, No, Cancel

YesNoCancel

Кнопки Yes и No

YesNo

Кнопки Retry и Cancel

RetryCancel

Чтобы добавить в окно командные кнопки, выберите один из возможных вариантов
(например, кнопки ОК и Cancel) и наберите соответствующую константу в коде программы,
между сообщением диалогового окна и его заголовком:
MsgBox

("File not

found",

OKCancel,

"Cryptic Error_

Message")
Чтобы иметь возможность использовать перечисленные в табл. 13.1 константы для
добавления в диалоговые окна комбинации командных кнопок, первой строкой в
кодах вашей программы должна быть такая:
Imports.Microsoft.VisualBasic.MsgBoxStyle
Если такой строки в начале программы не будет, то при добавлении командных кнопок
придется использовать код Micro s o f t . Visual Basic .MsgBoxStyle:
MsgBox ( " F i l e not found",_
Microsoft.Visual3asic.MsgBoxStyle.OKCancel,_
" C r y p t i c Error

Message")

Чтобы добавить в диалоговое окно и пиктограмму, и командные кнопки, укажите
их в коде программы рядом, поставив между ними команду Or. Таким образом, если вы хотите отобразить в диалоговом окне информационную пиктограмму и
кнопки Yes, No (рис. 13.4), наберите следующий код:
MsgBox

("File not found", YesKo Or Information,_
"Cryptic Error
Message")

Рис. 13.4. Диалоговое окно с пиктограммой и командными кнопками

Как определить, на какой кнопке щелкнул пользователь
Если в диалоговом окне имеется только кнопка ОК, все предельно просто: щелчок пользователя на таковой приводит к закрытию диалогового окна. Но как быть, если кнопок две
или три? В этом случае у пользователя есть выбор, и. следовательно, вам нужно будет написать коды BASIC для определения того:
v S на какой кнопке щелкнул пользователь;
I •/ что делать программе, если пользователь выбрал ту или иную кнопку.

142

Часть III. Создание меню

Семи кнопкам, которые может выбрать пользователь, соответствуют определенные числовые значения (табл. 13.2).
Таблица 13.2. Командные кнопки, которые могут быть выбраны пользователем
Кнопка

Числовоезначение

Константа

OK

1

ок

Cancel (Отмена)

2

Cancel

Abort (Прервать)

3

Abort

Retry (Повторить)

4

Retry

Ignore (Пропустить)

5

Ignore

Yes (Да)

6

Yes

No (Нет)

7

No

Чтобы программа могла определить, на какой кнопке щелкнул пользователь, нужно написать код, в котором переменной будет присвоено значение, возвращаемое командой MsgBox:
Dim in^Reply As I n t e g e r
i n t R e p l y - MsgBox ( " F i l e n o t found",
" C r y p t i c Message")

OKCancel,_

Этот код отображает диалоговое окно с кнопками ОК и Cancel. Если пользователь
щелкает на кнопке ОК, переменной i n t R e p l y присваивается значение 1 (см.
табл. 13.2). Если пользователь щелкает на кнопке Cancel, переменной i n t R e p l y
присваивается значение 2.

использование с*пануа/ипнмх
диалоговых окон
С помощью простых диалоговых окон невозможно решить все проблемы, поэтому вам
наверняка захочется создать более сложные и в то же время хорошо всем знакомые диалоговые окна, наподобие File Save (Сохранение документа) или Print (Печать). Чтобы
помочь вам в этом нелегком деле, Visual Basic .NET предлагает на выбор несколько разработанных заранее стандартных диалоговых окон, каждое из которых представлено своим инструментом на панели Toolbox:
• S OpenFileDialog (Открытие документа);
SaveFileDialog (Сохранение документа);
ColorDialog (Цвет);
FontDialog (Шрифт);
PrintDialog (Печать);
PageSetupDialog (Параметры страницы).

Глава 13. Диалоговые окна

143

Кнопки инструментов для создания стандартных диалоговых окон относятся к категории Windows Forms панели Toolbox. Если вы не видите их в данный момент на экране, щелкните на кнопке любого инструмента (например, TextBox) и, нажимая кнопку с
направленной вниз стрелкой, прокрутите весь список инструментов панели Toolbox,
Тест на проверку полученных вами знаний
1 . Для чего в диалоговых окнах отображаются
пикгограммы?
а. На тот случай, если за компьютер сел
пользователь, который не умеет читать.
б. Чтобы привлечь внимание пользователей и
сделать визуальный акцент на отображаемом сообщении. Например, пиктограмма
"Критическая" призвана привлечь внимание
пользователя к сообщению, к которому он
должен отнестись очень серьезно.
в. Обычно пользователи игнорируют сообщения, которые не сопровождаются яркими картинками.
г. Никто не знает для чего. Наверное, традиция такая.

2. Что нужно сделать, чтобы стандартное диалоговое окно (например, Open или Save As) было
создано автоматически?
а. Написать специальный код BASIC: По
щучьему велению, по моему хотению, окно (такое-то) создайся!
б. Открыть нужное диалоговое окно и нажать на
компьютере кнопку RESET.
в. В панели Toolbox дважды щелкнуть на кнопке соответствующего инструмента (например,
OpenFileDialog или SaveFileDialog).
г. Создать нужное окно 10 или 20 раз, после чего у
вас это будет получаться почти автоматически.

Создание окна OpenFile
Диалоговое окно OpenFile позволяет пользователю выорать файл, который должен бьпь
открыт. Здесь же могут быть отображены только те файлы, которые удовлетворяют определенным условиям, например имеют расширение - ТХТ или .ЕХЕ.
Чтобы создать диалоговое окно OpenFile, выполните следующие действия.
1. Откройте форму.
2. На панели Toolbox дважды щелкните на кнопке инструмента OpenFileDialog.
Эта кнопка относится к категории Windows Forms. Возможно, чтобы ее увидеть,
вам придется прокрутить вниз список элементов данной категории (рис. 13.5.)
Visual Basic .NET отобразит значок созданного диалогового окна (и присвоенное
ему стандартное имя, наподобие OpenFileDLalogl) в специальном окне, расположенном в нижней части экрана.
После того как диалоговое окно OpenFile будет добавлено в форму, вам еще придется написать код BASIC, который должен открывать данное окно на экране. Вот этот код:
OpenFileDialogl-ShowDialog{)
З ^

O p e n F i l e D i a l o g l — это стандартное имя, которое Visual Basic .NHT присваивает диалоговому окну автоматически. Если вы впоследствии присвоите данному
окну какое-нибудь иное имя, то его нужно будет указать в приведенном выше коде
вместо имени O p e n F i l e D i a l o g l .

Если вы хотите определить список файлов, которые должны отображаться в окне OpenFile, то нужно будет воспользоваться специальным приемом, который называют применение
фильтра. Фильтр определяет для Visual Basic .NET, файлы какого типа нужно отображать
(например, только с расширением . ТХТ или . ВАТ).

144

Часть III. Создание меню

Рис. 73.5. Wra6bf найти кнопку OpenFileDialog,
прокрутите вниз список инструментов панели Toolbox
Фильтр состоит как бы из двух частей: из своего названия, которое отображается в списке
диалогового окна, и из собственно фильтра. Примеры некоторых фильтров и соответствующих им названий приведены в табл. 13.3. Для большей наглядности названия фильтров включают в еегя обозначения самих фильтров.
Так, текстовые файлы обычно имеют расширение . ТХТ, но некоторые из них имеют еше и
другое расширение— . ASC. Таким образом, название T e x t F i l e s ( * .ТХТ) говорит о том,
что в диалоговом окне будут отображены только те текстовые файлы, которые имеют расширение . ТХТ (те же текстовые файлы, которые имеют расширение . ASC, отображаться не будут).
Таблица 13.3. Фильтры и их названия
Фильтр

Название
All

) (Все файлы}

FiL-

Тех:. F± Les (*. ТХТ) (Текстовыефайлы}
Batch "Lies

('„BAT) (Командныефайлы)

Executable Files

(^.EXF.) (Выполняемые файлы)

.ТХТ
.ЗАТ
* . EXE

Вот КР.К определяются фильтры и их названия.
1. Откройте форму, которая содержит диалоговое окно OpenFile.
2. Щелкните на значке O p e n F i l e D i a l o g , который отображается в окне, расположенном под окном формы.
Л. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу . выберите команду View=> Properties
Window, в окне Solution Explorer щелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.

Глава 13. Диалоговые окна

145

4. Щелкните на свойстве Filter (Фильтр) категории Misc (Разное) и наберите
фильтр, который хотите использовать.
Фильтр состоит из короткого описания файлов, которые будут отобраны:
Text

files

(*.txt)|

*.txt

В этом примере текст, набранный до вертикальной черты, будет отображаться в диалоговом окне в списке Files of type (Тип файлов). А текст, набранный после вертикальной черты,
является фильтром, в соответствии с которым будут отбираться файлы для отображения.
Для того чтобы набрать вертикальную черту, необходимо нажать клавишу ,
а затем — клавишу, на которой изображена косая черта ( \ ) .
Вы можете создать и несколько фильтров сразу:
Text

files

(*.txt)|

*.txt

I

All

Files

(*.*)

[

*.*

При этом не забывайте каждый следующий фильтр отделять от предыдущего вертикальной чертой.
Если вы создаете несколько фильтров одновременно, вам нужно сообщить Visual Basic
.NET, какой из них должен отображаться сразу после открытия окна OpenFile, Для этого
свойству Filterlndex (Номер фильтра) нужно присвоить определенное числовое значение.
Когда вы создаете несколько фильтров, первому из них присваивается номер 1, второму — номер 2 и т.д. Таким образом, в предыдущем примере, чтобы при открытии диалогового окна сразу отображался фильтр T e x t f i l e s ( * . t x t ) , свойству Filterlndex нужно присвоить значение 1.
Итак, чтобы определить, какой фильтр должен отображаться в диалоговом окне первым,
сделайте следующее.
1. Откройте форму, для которой создано диалоговое окно OpenFile.
2. Щелкните на значке OpenFileDialog в окне, расположенном в нижней части
экрана.
3. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду Viewc^ Properties
Window, в окне Solution Explorer щелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
4. Щелкните на свойстве Filterlndex категории Misc (Разное) и наберите номер
фильтра, который должен отображаться сразу при открытии диалогового окна.
В следующий раз, когда вы запустите свою программу и откроете диалоговое окно OpenFile, сразу же будет включен указанный вами фильтр.

Как определить, какой файл выбран пользователем в
диалоговом окне OpenFile
После того как пользователь определил в диалоговом окне OpenFile, какой файл он хочет
открыть, и щелкнул на кнопке ОК, программа должна будет как-то узнать, а что именно выбрал пользователь. Путь к указанному пользователем файлу сохраняется как значение свойства Filename диалогового окна OpenFile. Поэтому вам нужно будет написать кол, который
создает новую переменную и присваивает ей значение свойства Filename:
Dim s t r W h a t F i l e As
strWhatFile

146

String

= OpenFileDialogl.filename

Часть III. Создание меню

В свойстве Filename запоминается как само название выбранного файла, так и
полный путь к нему (например, С:\Мои документы\Личное\Резюме. t x t ) .
Если пользователь закрыл диалоговое окно щелчком на кнопке Cancel, свойству
Filename присваивается значение "" (пустая строка).

Создание окна SaveFile
Диалоговое окно SaveFile выглядит почти так же, как и окно OpenFile. Разве что заголовки у этих окон разные. (В заголовке диалогового окна OpenFile отображается слово Open
(Открыть), а в заголовке окна SaveFile отображаются слова Save As (Сохранить как).)
Чтобы создать диалоговое окно SaveFile, сделайте следующее.
1. Откройте форму.
2. На панели Toolbox дважды щелкните на кнопке инструмента
SaveFileDialog. (Эта кнопка расположена в категории Windows Forms. Возможно, чтобы ее увидеть, вам придется прокрутить вниз список элементов
этой категории.)
Visual Basic .NET отобразит значок созданного диалогового окна и его название (чтото наподобие SaveF ileDialogl) в окне, расположенном в нижней части экрана.
После того как окно создано, для его отображения следует набрать следующий код:
SaveFilsDialogl.ShowDialog()
Как и в окне OpenFile, в окне SaveFile вы можете использовать фильтр для отбора тех файлов, которые могут быть здесь показаны. Чтобы получить такую возможность, нужно изменить значение свойства Filter диалогового окна SaveFile.
Как это сделать, рассказывается выше, в разделе "Создание окна OpenFile".

Как определить, какой файл выбран пользователем
в окне SaveFile
Как и в случае с окном OpenFile, название файла, который выбран в окне SaveFile, сохраняется в качестве значения свойства Filename. Чтобы программа определила, какой
именно выбор сделал пользователь, нужно создать новую переменную и присвоить ей значение свойства Filename:
Dim s t r W h a t F i l e As S t r i n g
StrWhatFile = SaveFileDialog.Filename
Диалоговое окно SaveFile само по себе файлы не сохраняет. Чтобы сохранить
файл, вам нужно будет написать дополнительный код BASIC, который отдаст компьютеру распоряжение физически сохранить файл на диске.

Создание окна Color
Диалоговое окно Color (Цвет) позволяет пользователю выбрать один из стандартных цветов или же определить и задать собственный цвет (рис. 13.6).
Вот что нужно сделать для создания такого диалогового окна.
1. Откройте форму.
2. На панели Toolbox дважды шелкните на кнопке инструмента ColorDialog. (Эта
кнопка расположена в категории Windows Forms. Возможно, чтобы ее увидеть, вам нужно будет прокрутить вниз список инструментов этой категории.)

Глава 13. Диалоговые окна

147

Visual Basic .NET отобразит значок созданного диалогового окна и его название
(что-то наподобие C o l o r D i a l o g l ) в окне, расположенном в нижней части экрана.
После того как диалоговое окно создано, для его отображения нужно набрать следующий код:
ColorDialogl.ShowDialog()

Banceota».
r ггггт ГГ
i f ггггт F g
m грцр | p
m ГЁЮН • Ш
m • • • • •• •
mS K i f i r •r

г г г г г г г г
г ггггг г г
Define Custom Соки»

OK

j

]

Cancel j

Рис. 13.6. Диалоговое окно Color позволяет пользователю выбрать нужный цвет

Как определить, какой цвет был выбран пользователем
Информация о выборе пользователя сохраняется как значение свойства Color диалогового
окна Color. Это значение можно использовать затем для определения цвета отдельных объектов (ForeColor) или их фона (BackColor). Например, фоновый цвет для объекта B u t t o n l
устанавливается следующим кодом:
Buttonl.BackColor = ColorDialogl.Color

Создание окна Font
Диалоговое окно Font (Шрифт) позволяет пользователям определить шрифт, размер и начертание набираемого ими текста (рис. 13.7). Каждым раз, когда пользователь выбирает какую-то новую опцию, в диалоговом окне отображается пример того, как будет выглядеть
текст при такой установке.
Чтобы создать диалоговое окно Font, выполните такие действия.
1. Откройте форму.
2. На панели Toolbox дважды щелкните на кнопке инструмента FontDialog. (Эта
кнопка относится к категории Windows Forms. Возможно, чтобы ее увидеть,
вам придется прокрутить внш список инструментов данной категории.)
Visual Basic .NET отобразит значок созданного диалогового окна и его название
(что-то наподобие F o n t D i a i o g : ) в окне, расположенном в нижней части экрана.
После того как диалоговое окно Font создано, для его отображения нужно набрать следующий код:
FontDialogI.ShowDialog()

148

Часть III. Создание меню

Font
|Mc
,nsoft Ssns Sefi

:
ont
stye
l
Bod
l

Sae
,g

Faaltmo Ln
i ovlpe

Tr*bC
ji F"et M'I
Verdana
sets
г Strfceo*i
г

J
—J

OK i
m
m
Cancelni|l

W
|AaBbYyZ Z

Scnpt

Рис. 13.7. В диалоговом окне Font можно определить
шрифт, начертание и размер текста

Как определить, какие опции были выбраны пользователем
в окне Font
Когда диалоговое окно Font открыто, пользователь может выбрать шрифт текста, его
размер и еще несколько дополнительных установок. Вся информация о заданных пользователем установках сохраняется в виде значений свойства Font (категория Misc) диалогового окна Font. Если вы щелкнете на знаке "плюс", отображаемом рядом с названием этого свойства
в окне Properties, Visual Basic .NET откроет список дополнительных свойств, хранящих всю
информацию о иыборе пользователя (табл. 13.4).
Таблица 13.4. Свойства, запоминающие установки, сделанные пользователем
в диалоговом окне Font
Свойство

Значение

Name (Имя)

Название выбранного шрифта (например, T i n e s New Roman)

Size (Размер)

Число, обозначающее размер шрифта (например, 3 или 12)

Bold (Полужирный)

Значение False или True

Italic (Курсив)

Значение False или True

Strikeout (Зачеркнутый)

Значение F a l s e или T r u e

Underline (Подчеркнутый)

Значение False или True

Чтобы программа знала, какую опцию выбрал пользователь, нужно написать код BASIC.
Выглядеть он должен приблизительно так:
Dim sLrWhatFont As S t r i n g
strWhatFont = F o n t D i a l o g ! . F o n t . N a m e
Для получения данных об установках, сделанных пользователем в диалоговом окне
Font, вначале нужно указать название диалогового окна (в нашем примере это
F o n t D i a l o g l ) , далее название свойства Font, а затем название того свойства,
данные о котором нужно получить (например, Name или Bold).

Глава 13. Диалоговые окна

149

Создание окна Print
Диалоговое окно Print (Печать) позволяет пользователям выбрать принтер, определить
диапазон печати и количество требуемых копий. Окно Print показано на рис. 13.8.
Чтобы создать такое диалоговое окно, нужно сделать следующее.
1. Откройте форму.
2. На панели Toolbox дважды щелкните на кнопке инструмента PrintDialog. (Эта
кнопка расположена в категории Windows Forms. Возможно, чтобы ее увидеть, вам придется прокрутить вниз список инструментов данной категории.)
Visual Basic .NET отобразит значок созданного диалогового окна и его название
(что-то наподобие P r i n t D i a l o g l ) в окне, расположенном в нижней части экрана.
3. На панели Toolbox дважды шелкните на кнопке инструмента PrintDocument.
(Эта кнопка расположена в категории Windows Forms. Возможно, чтобы ее увидеть, вам нужно будет прокрутить вниз список инструментов данной категории.)
Visual Basic .NET отобразит в окне, расположенном в нижней части экрана, значок
печатаемого
документа
и
его
название
(что-то
наподобие
PrintDocumentl). Обратите внимание: если вы назовете печатаемый документ
каким-нибудь своим именем, это же имя нужно будет указать и на шаге 7.
4. На панели Toolbox дважды щелкните на кнопке инструмента PrintDialog.
Значок этого диалогового окна отобразится в окне, расположенном в нижней части экрана.
5. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу , выберите команду Viewc:>Properties
Window, в окне Solution Explorer щелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
6. Щелкните на свойстве Document (Документ) категории Misc (Разное).
Рядом появится кнопка с направленной вниз стрелкой.
7. Щелкните на кнопке со стрелкой и выберите имя печатаемого документа (в
нашем случае это P r i n t D o c u m e n t l ) .

~ Printe~"_ _ „____
Name:
Status:
/ Tai* Ond"
• T«W Beoeric
- Whew I P T i :

„.

--

-_ ^
1
!

Сояшвг*

• r Z .
С

--I

-Г~,

t-

j "OK ( Caned
Рис. 13.8. В этом диалоговом окне можно указать страницы, которые должны быть распечатаны

150

Часть III. Создание меню

объект PrintDocument имеет свойство DocumentName (Имя документа),относяшееся к категории Misc. По значению данного свойства диалоговое окно Print определяет, какой документ должен быть выведен на печать.
После того как объекты PrintDialog и PrintDocument созданы, в текст программы нужно
добавить код, посредством которого диалоговое окно Print будет отображаться на экране:
PrintDialogl.ShowDialog{}
Диалоговое окно Print само по себе ничего не печатает, оно лишь может принять
установки от пользователя. Вам же еще нужно будет написать коды BASIC, которые должны реально выводить что-то на печать.

Создание окна PageSetup
В диалоговом окне PageSetup (Параметры страницы) пользователи могут определить
размеры печатаемых страниц и величину их полей (рис. 13.9).
Pane Setup

aly See
l ct
•• Portia*
С Landscape

Top:

Caned

Рис. 13.9. В диалоговом окне PageSetup можно указать размер выводимых на печать страниц

Вот как создается диалоговое окно PageSetup.
1. Откройте форму.
2. На панели Toolbox дважды щелкните на кнопке инструмента PrintDocument.
(Эта кнопка расположена в категории Windows Forms. Возможно, чтобы ее
увидеть, вам придется прокрутить вниз список инструментов категории.)
Visual Basic .NET отобразит в окне, расположенном в нижней части экрана, значок
печатаемого документа и его название (что-то наподобие PrintDocumentl). Обратите внимание: если вы назовете печатаемый документ каким-нибудь своим именем, эго же имя нужно будет указать и на шаге 6.
3. На панели Toolbox дважды щелкните на кнопке инструмента PageSetupDialog.
Значок этого диалогового окна отобразится в окне, расположенном в нижней части экрана.

Глава 13. Диалоговые окна

151

4. Откройте окно Properties.
Чтобы сделать это, нажмите клавишу . выберите команду View^Propefties
Window, в окне Solution Explorer щелкните на кнопке Properties Window или
щелкните правой кнопкой мыши в окне формы и выберите команду Properties.
5. Щелкните на свойстве Document (Документ) категории Misc (Разное).
Рядом с названием свойства появится кнопка с направленной вниз стрелкой.
6. Щелкните на кнопке со стрелкой и выберите имя печатаемого документа
(в нашем случае это PrintDocumentl).
Объект PrintDocument имеет свойство DocumentName (Имя документа), относящееся к категории Misc, по значению которого диалоговое окно PageSetup определяет, размеры и поля страниц какого документа устанавливаются пользователем.
Вам нужно будет написать код BASIC для определения имени этого документа, а
также коды BASIC для изменения (с учетом установок, сделанных пользователем)
параметров печатаемых страниц.
Добавив к форме объект PrintDocument и диалоговое окно PageSetup, вы сможете отобразить на экране окно PageSetup, набрав в тексте программы такой код BASIC:
PageSetupDialogl.ShowDialog()

152

Часть III. Создание меню

ЧастьIV

Основы создания кодов

ыы

Ура-а! Наконец-то начинаются главы, рассказывающие о том, как
создать собственные коды BASIC и таким образом заставить компьютер делать то, что вы так давно от него ждете. До сих пор нами
рассматривались лишь приемы построения пользовательского интерфейса (и написания некоторых сопутствующих ему кодов
BASIC). Но каждому понятно, что просто красиво выглядеть недостаточно (разве что только в том случае, если вы пытаетесь выскочить замуж за старенького мультимиллионера, жить которому осталось от силы пару месяцев). Представьте, что созданный вами интерфейс будет не только радовать глаз, но и начнет адекватно реагировать на все ваши действия.
Даже если вам кажется, что освоение кодов BASIC — занятие не
из легких, очень скоро вы сможете убедиться в обратном. Сами
по себе коды BASIC — это всего лишь наборы пошаговых инструкций для компьютера, точно указывающих ему, что нужно делать. Поэтому приготовьтесь начать отдавать компьютеру указания (другими словами, писать коды BASIC), и вы увидите, что
процесс программирования может быть простым и приятным.
Более того, он войдет в привычку, как рисование пользовательских интерфейсов или как периодические "уходы" в любимую
компьютерную игру.

Глава 14

Написание процедур обработки событий
8 э&ой главе...
У Использование редактора кодов
> Создание процедур обработки событий
> Просмотр процедур обработки событий

JW юбое действие, совершаемое пользователем в отношении компьютера, будь то щелЪг** чок кнопкой мыши, нажатие клавиши или набор текста какого-либо послания на
клавиатуре, называется событием. Как только событие происходит, Visual Basic .NET начинает искать код BASIC, который бы объяснил компьютеру, как он должен на это реагировать.
Коды BASIC, содержащие инструкции на тот случай, если наступит то или иное событие, называются процедурами обработки событий.
Любая программа Visual Basic .NET может содержать в себе тысячи процедур обработки
событий. Однако если вы создаете такую программу, то это значит, что либо программа будет невероятно сложной и огромной, либо программист из вас никудышный.
Сколько бы в программе ни было процедур обработки событий, возникает вопрос: а как
Visual Basic .NET определит, какую процедуру в какой момент нужно использовать?
Ответ на этот вопрос прост. Любое событие совершается в отношении какого-нибудь
элемента пользовательского интерфейса. Например, пользователь обычно щелкает кнопкой
мыши только тогда, когда курсор наведен на какой-то объект интерфейса (на кнопку, текстовое поле или на команду меню).
Каждый объект может иметь одну или несколько процедур обработки событий, и каждая
процедура соответствует какому-то определенному событию (например, щелчку кнопкой
мыши или нажатию клавиши).

с fieqaianofiaM tcoqo#
Редактор кодов — это окно, где вы можете набирать коды BASIC, благодаря которым ваша программа начнет делать что-то полезное. Вот как открывается редактор кодов.
1. Выберите команду View^Solution Explorer или нажмите комбинацию клавиш .
На экране появится окно Solution Explorer.
2. Щелкните в окне формы и выберите команду ViewOCode, нажмите клавишу или шелкните на кнопке View Code в окне Solution Explorer.
Visual Basic .NET откроет редактор кодов для выбранной вами формы.
Если вы хотите написать коды и сохранить их в файле, который не относится к
формам, на шаге 2 нужно щелкнуть на имени этого файла.

Глава 14. Написание процедур обработки событий

155

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

РазворачиваниеисворачиваниекодовBASIC
В идеальном варианте все коды BASIC должны помещаться на одном экране. В таком
случае вы или кто-либо другой сможете просматривать и модифицировать их без необходимости прокручивать экран. Если ваши программы короткие и лаконичные, они будут просты
для чтения, понимания и, следовательно, для внесения в них изменений.
К сожалению, в действительности коды BASIC редко размешаются на одном экране, а это
значит, что вам или кому-то еще приходится постоянно заниматься его прокруткой. Чтобы
облегчить вашу участь, Visual Basic .NET позволяет сворачивать и разворачивать отдельные
фрагменты кодов BASIC.
Свернутый фрагмент кодов
к. Test? - Microsoft Visual Basic.NET {design! - Aligned.*!)"
file £ i-lHenuIteKi("My пси sienu irero")

LaBell.Text =

3

tcReply

Ready

Ch1

Развернутый фрагмент кодов
Рис. 14. \. Сворачивая и разворачивая отдельные фрагменты кодов BASIC, вы сможете быстрее
понять весь текст программы
Visual Basic .NET изначально знает, как сворачивать и разворачивать коды отдельных процедур. Но если вы хотите сами определить, какой фрагмент кодов должен
быть свернут, выделите его и выберите команду Edit^Outlining^Hide Selection
(Правка1^Выделение^Скрыть выделенное).

756

Часть IV. Основы создания кодов

Чтобы свернуть фрагмент кода BASIC, достаточно щелкнуть на знаке "минус", который
отображается слева от данного фрагмента. Visual Basic .NET свернет этот фрагмент и отобразит рядом три точки, обозначая тем самым, что здесь скрыт отдельный фрагмент программы.
При необходимости повторно развернуть на экране скрытый фрагмент, щелкните на знаке
"плюс", который отображается слева от него. Окно редактора кодов со свернутыми и развернутыми фрагментами кодов программы показано на рис. 14.1.

соЗьипий
Все события мснуг быть разбиты на две категории.
| S
1
:

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

| S События, генерируемые системой. Наступают, когда программа Visual Basic
f
.NET сама производит какие-то действия, например открывает форму или изменяет
содержимое текстового поля.
Хотя Visual Basic .NET может реагировать на множество событий, вам, скорее всего, понадобится, чтобы создаваемый интерфейс реагировал только на некоторые из них, например
на нажатие определенных клавиш или на щелчки на конкретных объектах. Как только Visual
Basic .NET увидит, что произошло какое-то событие, он сразу же начнет искать инструкции,
которые вы оставили на этот случай.
Например, когда пользователь щелкает кнопкой мыши, Visual Basic .NET определяет, что
произошло событие ("Ага, это был щелчок кнопкой мыши".) Далее он идентифицирует объект, на котором щелкнул пользователь ("Пользователь щелкнул на кнопке ОК").
Затем Visual Basic .NET определяет, не написана ли для объекта процедура обработки событий, объясняющая компьютеру, что нужно делать, если произошло именно это событие.

Создание процедур обработки событий
Один объект может реагировать сразу на несколько событий. Например, кнопка может
отреагировать на щелчок на ней и на нажатие клавиши .
На одно и то же событие могут реагировать сразу несколько объектов. Например, кнопка
и переключатель могут отреагировать на один и тот же щелчок мыши, но обычно у каждого
из них имеются свои инструкции относительно того, что необходимо делать дальше.
Чтобы создать процедуру обработки событий, вам нужно выполнить следующие действия.
1. Определите, какая часть пользовательского интерфейса должна реагировать на событие.
2. Откройте редактор кодов.
3. Определите событие, на которое должен отреагировать Visual Basic .NET.
4. Напишите код BASIC, начинающий выполняться при наступлении указанного события.
Прежде чем приступать к написанию процедур управления событиями, убедитесь,
что всем объектам пользовательского интерфейса уже присвоены имена. Если вы
создадите процедуру для объекта, а затем переименуете его, вам нужно будет внести исправления в код процедуры.
Вот три составляющие пользовательского интерфейса, которые могут реагировать на события:

Глава 14. Написание процедур обработки событий

157

I S формы;
| */ объекты (кнопки, флажки, поля со списками и т.п.);
I •/ раскрывающиеся меню.
Для того чтобы создать процедуру обработки событий для любого элемента пользовательского интерфейса, необходимо сделать следующее.
1. Откройте форму, содержащую объект, для которого должна быть создана
процедура обработки событий.
Если вы дважды щелкнете на объекте (скажем, на кнопке или даже на самой форме), Visual Basic .NET сразу же откроет редактор кодов и создаст в нем процедуру, наиболее типичную для данного объекта.
2. Откройте редактор кодов, для чего нажмите клавишу или выберите
команду View^Code.
Visual Basic .NET отобразит его на экране (см. рис. 14.1).
3. Щелкните на списке Class Name (Название класса).
Откроется список названий объектов (таких как L a o e l l и Button2). Однако к
этому времени, и вы, надо полагать, об этом помните, необходимо было присвоить объектам собственные имена, поэтому названия объектов в открывшемся
списке не должны совпадать с автоматически генерируемыми именами.
4. Щелкните на списке Method Name (Название метода).
Откроется список событий, на которые может отреагировать выбранный вами
объект. Среди них будут, к примеру, события C l i c k (Щелчок кнопкой мыши) и
MouseHover (На объект наводится курсор).
5. Щелкните на названии события, на которое должен реагировать объект
(например, C l i c k ) .
Visual Basic .NET создаст пустую процедуру обработки событий. Теперь вы можете приступить к написанию кодов BASIC, с тем чтобы новая процедура начала
реально что-то делать (например, изменять свойства других объектов формы).
Вот как создается процедура обработки событий для команды раскрывающегося меню.
1. Щелкните на заголовке меню, в котором содержится нужная команда.
2. Дважды щелкните на названии команды, для которой требуется создать
процедуру обработки событий.
Visual Basic .NET создаст для этой команды пустую процедуру обработки событий, и вам останется только наполнить ее реальным содержанием.

Из каких частей состоит процедура обработки событий
Когда вы впервые создаете процедуру обработки событий. Visual Basic .NET сразу же
отображает пустую процедуру в окне редактора кодов. Пустая процедура обработки событий
состоит из двух строк:
Private Sub Buttonl_Click(ByVal sender As System.__
Object, ByVal e As System.EventArgs)_
Handles Buttonl.Click
End Sub

158

Часть IV. Основы создания кодов

Первая строка любой процедуры обработки событий состоит из следующих частей.
I S P r i v a t e Sub. Идентифицирует процедуру как подпрограмму.
.* S Название объекта. В данном примере объекту "кнопка" было присвоено имя
:•

Buttonl.

~ S Символ подчеркивания (_).
• •/ Название события. В данном примере этим событием является шелчок кнопкой
|
мыши (Click).
| V Пара круглых скобок, содержащих в себе данные, которые необходимы для
% работы подпрограммы.
| •/ Слово Handles и следующее за ним ключевое слово. По ключевому слову соI
бытию (в данном случае B u t t o n l . C l i c k ) ставится в соответствие процедура обX работки событий.
Не старайтесь сейчас вникнуть во все технические тонкости приведенной выше
процедуры обработки событий. На данном этапе важно, чтобы вы научились правильно идентифицировать различные части процедур обработки событий.
Рассмотренная процедура как бы говорит компьютеру: "Здесь содержатся инструкции,
которые н;жно выполнять каждый раз, когда пользователь щелкает мышью на кнопке, именуемой B u - t o n l " .
Поскольку в данной процедуре никакие инструкции пока не содержатся, щелчок на кнопке B u t t o n l не приведет к выполнению компьютером каких-либо действий.
При любом изменении имени объекта не забывайте вносить соответствующие изменения во все написанные для него процедуры обработки событий. Иначе Visual
Basic .NET не сможет разобраться, какая процедура для какого объекта написана.

Разделение окна редактора кодов на две части
Если ваша программа будет содержать большое количество процедур обработки событий,
не трудно догадаться, что их коды не смогут одновременно поместиться на экране. Одним из
способов решения этой проблемы является сворачивание отдельных частей программы, с тем
чтобы временно скрыть коды, в отображении которых на данный момент нет необходимости.
(Этот прием описан в разделе "Разворачивание и сворачивание кодов BASIC".)
Другим способом, который может помочь вам просматривать одновременно разные части
программы, является разделение окна редактора кодов на две части. В разделенном надвое
окне можно просматривать разные фрагменты кодов BASIC одной и той же программы.
~

Окно редактора кодов можно разделить только на две части (но не на три или,
скажем, четыре).

Для того чтобы разделить окно редактора кодов, выполните такие действия.
1. Выберите команду Window^Split (ОкноОРазделить).
Visual Basic .NET разделит окно редактора кодов на две части.
2. Поместите курсор над полосой разделения, нажмите левую кнопку мыши и,
перетянув курсор, настройте размеры верхнего и нижнего окна.
Когда полоса разделения примет нужное положение, отпустите кнопку мыши
(рис. 14.2).

Глава 14. Написание процедур обработки событий

159

Полоса разделения
-У., Test? - Microsoft Visual Basic.NET ((lesion] - Alinneit.vb"

£iie Edit )##w Eroject Build Qebttg loob Щпйа* iJeip

4 4
с

I

j-'JAhgned (TertPJ

- 1

—-- . it

j

41

Afenedvb*

3 | «AddMenultfUi

AddHenuIcem(r-•'.'=.: NevStuff

SJ i i

Menulteml.EenuTt-ms.Add(nyUfnuI

wnuFileXl.Text - "Bo ^he Cat"
пгдГИеХЗ.Visible = ~7'. •-•KinufileX2.Text = "Screps the Cat"
AdctHenuItemCMy пей menu item")
PageSetupDialogl.Showmelogn

.

Ready

Lobell Cliclei

Systein. Event Aras

Ln 426

Col 36

Ch38

INS

Рис. /4.2. Разделив окно редактора кодов на две част, вы сможете одновременно видеть
на экране разные фрагменты кодов своей программы

При необходимости снять разделение и вернуть окну редактора кодов прежний
вид, выберите команду Windows Remove Split (ОкноОСнять разделение).

использование fieqcuctnofia tcoqot?
Работа редактора кодов похожа на работу обычного текстового процессора. В табл. 14.1
приведен список команд (вызываются нажатием соответствующих клавиш), которые вы можете использовать при редактировании своих процедур обработки событий.
Таблица 14.1. Клавиши, используемые при редактировании кодов BASIC
Клавиши

Вызываемые действия



Удаляет символ, находящийся справа от курсора



Удаляет символ слева от курсора



Переносит курсор на начало строки



Переносит курсор в конец строки



Переносит курсор на первую строку кодов программы

160

Часть IV. Основы создания кодов

Окончание табл. 14.1
Клавиши

Вызываемые действия



Переносит курсор на последнюю строку кодов программы



Прокручивает окно редактора кодов на одну строку вниз без перемещения
курсора



Прокручивает окно редактора кодов на одну строку вверх без перемещения
курсора



Переход на следующую строку редактора кодов (не путайте со следующей
строкой кодов вашей программы)



Переход на одну строку выше в редакторе кодов (но не на предыдущую строку
кодов вашей программы)



Переход на одно слово вправо



Переход на одно слово влево



Переход на следующую страницу редактора кодов



Переход на предыдущую страницу редактора кодов



Включение и выключение режима вставки



Вырезать выделенный фрагмент текста



Скопировать выделенный фрагмент текста



Вставить вырезанный или скопированный фрагмент текста



Отменить последнее действие



Найти указанное слово
Вызов справки Visual Basic .NET



Переключение между частями окна редактора кодов (если оно было разделено
надвое}



Поиск и замена указанных слов другими словами



Отображение диалогового окна Print (Печать)

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

Глава 14. Написание процедур обработки событий

161

nfiofyeqiffi oSfiaSoinicu собьипий
Обычно программы Visual Basic .NET включают в себя несколько процедур обработки
событий, каждая из которых хранится в отдельном файле. Это избавляет вас от необходимости прокручивать окно редактора кодов в поисках нужной процедуры. Вы просто будете пользоваться списками Class Name и Method Name, расположенными в верхней части окна редактора кодов.
Список Class Name содержит перечень всех созданных для данной формы объектов,
таких как кнопки, переключатели, раскрывающиеся меню, а список Method Name — перечень всех возможных событий, на которые отреагируют объекты.
Чтобы найти нужную процедуру обработки событий, используя списки Class Name и
Method Name, сделайте следующее.
1. Щелкните на списке Class Name.
Visual Basic .NET отобразит перечень доступных объектов (рис. 14.3). Если вы,
предположим, создали кнопку и присвоили ей имя btnClickMe, вы обязательно
найдете ее в этом списке.
$Aligned (Tetl2)

Menue
tlm39
Menue
tlm4Q
Merm(elm41
MenutelmO
i
Menutelm42
Ubd1
PnntDa
io
l gi
PnnD
l ocumenti
PageSetupDaio
lg!

Рис. 14.3. В списке Class Name вы найдете имена всех
объектов, созданных для открытой на данный момент формы
2. Щелкните на имени нужного объекта.
3. Щелкните на списке Method Name.
Visual Basic .NET отобразит список всех возможных событий, на которые может отреагировать выбранный вами объект (рис. 14.4). Названия тех событий, для которых
уже созданы процедуры обработки, будут отображаться полужирным шрифтом.
Р CauseiValidationCI-ianged
$ ChanaeUlCues
Р
f
P
P
P
P
P

ConleKtMenuChanged
Conlioftdded
ContiqJRemoved
CusoiChanged
Disposed
DockChanaed
DoubleClict

P DragEnter

Рис. 14.4. Примерно так выглядит открытый список Method Name
4. Щелкните на названии нужного события.
Visual Basic .NET откроет соответствующую процедуру обработки событий.
162

Часть IV. Основы создания кодов

Ьсли вы щелкнете на сооытии, название которого дано полужирным шрифтом,
Visual Basic .NET откроет уже созданную процедуру обработки событий. Если
же вы щелкнете на событии, название которого отображено нормальным шрифтом (не полужирным). Visual Basic .NET откроет для него пустую процедуру обработки событий,
В табл. 14.2 приведен список некоторых (но далеко не всех) событий, на которые могут
отреагировать объекты пользовательского интерфейса.
Таблица 14.2. Наиболее часто используемые события
Название

Событие

Click

Пользователь щелкает один раз кнопкой мыши на данном объекте

Doubleclick

Пользователь дважды (два раза подряд) щелкает кнопкой мыши на данном объекте

DragDrop

Пользователь наводит курсор на объект, нажимает кнопку мыши, перетаскивает курсор
и отпускает кнопку мыши

DragOver

Пользователь наводит курсор на объект, нажимает кнопку мыши, перетаскивает курсор
в сторону

GotFocus

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

KeyDown

Пользователь нажимает какую-нибудь клавишу

KeyPress

Пользователь нажимает и отпускает одну из ANSI-клавиш, к которым относятся
символьные клавиши, их комбинации с клавишей , клавиша и клавиша
возврата

KeyUp

Пользователь отпускает клавишу

LostFocus

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

MouseDown

Пользователь нажимает кнопку мыши

MouseHover

Пользователь помешает курсор мыши на объект

MouseUp

Пользователь отпускает кнопку мыши

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

Глава 14. Написание процедур обработки событий

163

Написание nfiot^eqiffi ofyarfo/nfcu
Чтобы задуманный вами пользовательский интерфейс заработал, нужно создать процедуры обработки событий и заполнить их кодами BASIC. Рабочие процедуры обработки событий могут выполнять одну или более из перечисленных ниже задач.
I S Считывать значения, которые пользователь передает объектам пользовательского
i
интерфейса (получение данных от пользователя).
!
S Обрабатывать данные, которые представляют собой значения свойств объектов
:
пользовательского интерфейса (вычисление результата).
I S Изменять значения свойств объектов пользовательского интерфейса (отображение
I
на экране полученных результатов).

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

Вычисление результата
Процесс вычисления результата подразумевает использование для получения новых данных арифметических команд или команд обработки текстовых значений, описанных соответственно в главах 17 и 18.
Любые коды BASIC, которые были написаны для вычисления результатов, должны
быть сохранены в файлах модулей (см. главу 27) или в файлах классов (см. главу 31).
Таким образом, если ваша программа работает некорректно, вы можете быстро определить источник возникновения ошибки. Если программа возвращает неверный результат, значит, ошибку нужно искать в файлах модулей или классов. Если результат
вычисляется правильно, но по какой-то причине на экране отображается не то, что
нужно, значит, ошибка в кодах процедуры обработки событий.

Отображение полученных результатов на экране
Чтобы отобразить полученные данные для пользователя, необходимо присвоить новые
значения свойствам объектов пользовательского интерфейса (например, свойству Text текстового поля для отображения вычисленного значения или какого-нибудь сообщения). Таким
образом, пользовательский интерфейс выполняет две основные функции: принимает данные
от пользователя и отображает для него полученные результаты.

Процедура, которую должна иметь любая программа
Самая простая и самая важная процедура обработки событий, которая имеется в каждой
программе,— это процедура, останавливающая выполнение программы. Приведенная ниже
процедура при щелчке пользователя на кнопке B u t t o n l также сообщает Visual Basic .NET о
необходимости закончить выполнение программы:

Private Sub Buttonl_CIick(ByVal sender As System.__
Object, ByVal e As System.EventArgs) __

164

Часть IV. Основы создания кодов

Handles Buttonl.Click
Me .Close
End Sub
Если среди созданных вами процедур обработки событий не будет ни одной, останавливающей выполнение программы, пользователю, чтобы выйти из программы, не останется ничего другого, как перезагрузить компьютер или вообще его выключить. Поскольку такой способ выхода из программы не является самым оптимальным (более того, он просто ужасен),
никогда не забывайте создавать одну или несколько процедур для цивилизованного завершения работы программы.

Тест на проверку полученных вами знаний
1.
2. Для чего а редакторе кодов нужны списки
а. Событиями мы называем получение НоClass Name и Method Name?
белевских премий программистами за
а В списке Class Name содержится перенаписание исключительно гениальных
чень классных объектов, а в списке Method
программ,
Name содержится перечень методов, с поб. Для компьютера событием считается
мощью которых можно сделать классной всю
разлитый на клавиатуре кофе, з также
вашу программу.
треснутый от неудачного движения польб. Список Class Name содержит перечень всех
зователя монитор,
объектов, для которых могут быть созданы процедуры обработки событий, а список Method
в. События - это любые изменения, на коName включает перечень всех событий, на которые может отреагировать программа. ,
торые могут отреагировать объ»™.
События могут быть инициированными
пользователем (посредством нажатия клав. Трудно сказать, ясно лишь одно: не следует
виш, щелчков кнопкой мыши) и сгенериусложнять себе жизнь и лучше их вообще не
рованными системой {открытие форм,'
трогать.
изменение свойств объектов}.
г. В списке Class Name приводится классиг. События - зга то, что откладывается у вас
фикация неопытных и бестолковых пользовав памяти. События могут быть запомителей, а в списке Method Name - методы
нающимися и плою запоминающимися.
борьбы с ними.

Глава 14. Написание процедур обработки событий

165

Глава 15

Использование переменных
главе...
>

Чтение данных

У

Использование переменных

>

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

>* Представление объектов с помощью переменных
Мм осле того как вы определите для себя, что именно должна делать ваша программа,
* ^ •* можете приступать к написанию кодов BASIC. Сразу возникает вопрос: а что должно произойти, когда пользователь наберет имя, адрес или номер телефона в ответ на вопрос,
заданный программой? Очевидно, что программа должна принять эту информацию от пользовательского интерфейса и что-то дальше с ней делать. Если какая-то информация должна
быть сохранена только в течение некоторого промежутка времени (чтобы затем быть обработанной и измененной), для ее хранения используются переменные.

Ч/пениеданных
Любая информация, которую программа получает извне, обозначается термином данные. Почти все, даже самые простые, программы получают данные, обрабатывают их и передают дальше.
Например, текстовый процессор получает информацию от пользователя в виде последовательности набираемых букв и символов, компонует их в виде документа, аккуратно выводит все это на печать, •— и вот приказ об увольнении половины сотрудников фирмы готов.
Итак, информация на входе, производятся какие-то действия и преобразования, — и информация уже на выходе. Любая программа Visual Basic .NET различает данные двух видов, а
именно числа и строки.
Числа могут быть положительными и отрицательными, целыми и дробными, и вообще
любым сочетанием цифр, которое вы можете себе представить (включая телефонные номера
и коды к сейфу, где деньги лежат).
Строки— это наборы символов. Символами называется все, что вы можете набирать на
клавиатуре, включая буквы, знаки пунктуации и (не падайте в обморок) числа.
С технической точки зрения, компьютер понимает только числа. Когда компьютер
работает со строками, он использует числа для представления каждого символа.
Программа может интерпретировать наборы цифр и как числа, и как строки. Например,
большинство программ воспринимает вводимые пользователем телефонные номера как строки, а, скажем, возраст, вес или суммы потраченных денег—- как числа.
^ ^ ^

Одна буква рассматривается как строка. Одно предложение •— это тоже строка. Вы можете полностью набрать первый том романа "Война и мир" — и это тоже будет строка.
В строке может быть любое количество букв, пробелов, цифр и других символов.

Глава 15. Использование переменных

167

и их значения
Набранные вами числа и строки программа в дальнейшем должна будет извлечь и использовать в своей работе. Поэтому она как бы спрашивает себя: "Куда же мне записать эту ин1
формацию? Ага, запишу-ка я ее в месте, называемом ТелефонныйНомер (переменная). " Затем, когда эту информацию нужно будет обработать, программа обратится к переменной Т е лефонныйНомер и использует эти данные в своей работе.
Переменные могут содержать в себе самые разные данные, которые к тому же время от
времени могут меняться (потому они и называются переменными). Информация, которую переменная содержит в данный момент, называется значением переменной.

Использование переменных
Все переменные можно разделить на две группы:
• V переменные, которые вы создаете сами;
[ S переменные, которые созданы изначально и представляют собой свойства всех
I'
объектов пользовательского интерфейса.
Каждый раз, когда вы рисуете в окне формы новый объект, Visual Basic .NET автоматически создает для него целый набор переменных (которые уже известны вам как свойства) со
значениями, заданными по умолчанию. Просмотреть значения свойств объектов можно в окне Properties (Свойства), для чего нужно нажать клавишу или выбрать команду
ViewoProperties Window.
Значениями свойств могут быть числа (представляющие, например, высоту и ширину объекта), логические значения F a l s e и T r u e (определяющие, в частности, будет отображаться объект на экране или нет) и строки (в том числе текст, отображаемый на кнопках или в текстовых
полях). Таким образом, свойства отвечают за способ отображения объектов на экране.
Переменные можно рассматривать как имена, которыми обозначаются различные
фрагменты информации. Свойства являются специальными именами, которыми
обозначается информация об отображении и поведении объектов пользовательского интерфейса.
Чтобы создать собственную переменную, вам нужно вначале объявить ее, по сути, сказав
таким способом компьютеру: "Я хочу создать новую переменную и сообщаю тебе, какой тип
данных она должна содержать".

Объявление переменных
Чтобы объявить переменную, нужно указать:
S

имя переменной;

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

Dim МмяПеремеиной As

ТипДанных

Существует три причины, по которым Visual Basic .NET требует от вас указывать тип
данных для каждой создаваемой переменной.
. S Во-первых, вам самим будет легче потом разобраться, данные какого типа содерf
жатся в той или иной переменной.

168

Часть IV, Основы создания кодов

Во-вторых, предотвращается сохранение в переменной данных других типов, что
неминуемо привело бы к некорректной работе программы.
И в-третьих, таким образом достигается более эффективное использование памяти,
поскольку для хранения данных различных типов требуется разное количества
места на диске.
Старайтесь присваивать переменным имена, которые будут как-то описывать хранящуюся в них информацию (например, ВсегоКОплате или КодТовара). Для Visual
Basic .NET безразлично, назовете вы переменную ПВМОЕСУ или ДатаПродажи. Но
если имя переменной не будет ассоциироваться с ее значением, написанная программа будет сложной для понимания, в частности при внесении в нее изменений.
Как уже было отмечено, данные могут быть представлены в виде строк и чисел. Если вы
хотите создать переменную, содержащую текстовую информацию и носящую имя Регион,
вам нужно набрать следующую команду:
Dim Регион As

String

Если переменная будет содержать числовую информацию, нужно будет указать тип числовых данных. В табл. 15.1 приведен список всех возможных типов данных (для Visual Basic
.NET) и объемы памяти, которые требуются для хранения одного значения каждого типа.
Таблица 15.1. Типы данных Visual Basic .NET
Тип данных

Объем памяти,
байт

Диапазон принимаемых данных

Boolean

2

True (1) и False (0)

Byte

1

От 0 ДО 255

Char

2

От 0 до 65535

Date

8

Даты от 01.01.0001 до 31.12.9999

Decimal

16

+/-79228162514264337593543950335 без десятичной запятой;
+/-7,9228162514264337593543950335 с 28 знаками после запятой

Double

8

От -1,79769313486231Е+308 до
-4,94065645841247Е-324 (отрицательные числа);
от 4,94065645841247Е-324 до
1,79769313486231 Е+308 (положительные числа)

Integer

4

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

Long

8

От-9 223 372 036 854 775 808
до 9 223 372 036 854 775 807

Short

2

От-32 768 до 32 767

Single

4

От -3,402823Е+38 до -1,401298Е-45 (отрицательные числа);
от 1,401298Е-45 до 3.402823Е+38 (положительные числа}

String

Разный

От 0 до почти 2 миллиардов унифицированных символов

Глава 15. Использование переменных

169

Под унифицированными символами подразумевается специ&чьный стандарт, который каждой букве, цифре, знаку, а также буквам иностранных языков ставит в соответствие свой уникальный номер. Более подробную информацию об этом стандарте вы можете найти по адресу www. u n i c o d e . org.
Итак, если вы хотите создать переменную, именуемую Возраст, можете набрать такой кол:
Dim Возраст As I n t e g e r
или такой:
Dim Возраст As Byte
Отличие между типом данных Byte и I n t e g e r заключается в том, что Byte-переменная
может принимать значения из диапазона от 0 до 255, в то время как Integer-переменная
может принимать значения из диапазона от-2 147 483 648 до 2 147 483 647. Но поскольку
возраст человека вряд ли превысит 255 лет, лучше объявить, что переменная имеет тип Byte,
тем более что в этом случае она будет занимать только 1 байт памяти. А если вы объявите,
что она имеет тип I n t e g e r , то потребуется 4 байта памяти.
Старайтесь для каждой переменной из подходящих для нее типов данных использовать тот, который занимает наименьший объем памяти. В таком случае и вся ваша программа для своего выполнения потребует меньшего объема оперативной
памяти, а следовательно, будет работать более эффективно.
Попытка присвоить переменной значение, превышающее наибольшее из возможных (или меньшее, чем самое малое), которые допустимы для данных ее типа, приведет к сбою в работе программы. Например, если переменной, имеющей тип
Byte, присвоить, скажем, значение 2000, Visual Basic .NET воспримет это как
ошибку и прекратит выполнение программы.
Можно также в одной строке объявить сразу несколько переменных:
Переменная!, Переменная2 Аз ТипДанных
Например, если нужно определить, что переменные Доход и Расход будут иметь тип
I n t e g e r , наберите следующий код:
Dim Доход,

Расход Аз I n t e g e r

Но в Visual Basic .NET есть и другой способ объявления переменных: вместо кода
Dim МойТекст As S t r i n g
можно набрать
Dim МойТекстЗ
Первый код более длинный, но зато более понятный. Во втором случае использовано нечто, называемое символами объявления типов. Набрать такой код проще и быстрее, но прочесть и понять его по прошествии некоторого времени будет сложнее.
Если вы хотите, чтобы код вашей программы был легко читаемым, и вас не пугает
перспектива набора таких длинных слов, как Аз S t r i n g или As I n t e g e r , используйте первый метод. Но если вы хотите сэкономить время и усилия, если вас
не волнует, как будет читаться код программы, применяйте второй метод. Ниже
приведена небольшая таблица, содержащая символы объявления типов и примеры
их использования.

170

Часть IV. Основы создания кодов

Тип данных

Символ

Decimal
Double
Integer
Long
Single
String

Пример

Что соответствует

Dim Loot@
Dim Chip#
Dim Age%
Dim Does
Dim Hook!
Dim Name$

Dim Loot As Decimal
Dim Chip As Double
Dim Age As I n t e g e r
Dim Doc As Long
Dim Hook As S i n g l e
Dim Name As S t r i n g

Присвоение имен переменным
Вы можете назвать переменную любим именем и присвоить ей любое значение. Однако
неразумно называть переменную, предположим, именем ТелНомер и присваивать ей значение, являющееся чьим-то почтовым адресом.
Присваивайте переменным имена, определяющие каким-то образом данные, которые будут в них храниться. Например, если вы назвали переменную именем ТелНомер, то ее следует использовать для хранения именно телефонных номеров.
Давая переменным имена, вы должны неукоснительно придерживаться перечисленных
ниже правил, иначе Visual Basic .NET не примет их. Итак, все имена переменных должны:
| J начинаться с букв;
состоять максимум из 255 символов (минимум — из одного символа);
состоять только из букв, цифр и символов подчеркивания ( _ ); пробелы и знаки
пунктуации здесь не допустимы;
не быть зарезервированными в Visual Basic .NET словами, такими как End или Sub.
Если все назначенные вами имена будут удовлетворять перечисленным критериям, все
будет хорошо. (Это, конечно же, не гарантирует, что ваша программа сразу начнет работать
так, как вы хотите, но, по крайней мере, к вам претензий со стороны Visual Basic .NET не будет.) Примеры допустимых в Visual Basic .NET имен приведены ниже.
Телефон
Доход_за_прошлый_месяц
Ставка75
А вот примеры имен, на использование которых Visual Basic .NET ни за что не согласится.
ЮНегритят (Начинается с цифры.)
Десять негритят (Содержит пробел.)
Sub (Совпадает с зарезервированным в Visual Basic .NET ключевым словом.)
Чтобы по имени переменной можно было определить, к какому типу данных она
носится, некоторые программисты начинают такие имена с трехсимвольных п
фиксов, например:
1пт:Лремиальные (Нетрудно понять, что для переменной определен тип I n t e g e r . )
1пдПроценты (Такой префикс означает, что для переменной определен тип Long.)
s ^ П е т и ц и я (Эта переменная имеет тип S t r i n g . )

Глава 15. Использование переменных

171

Поскольку префиксы смотрятся не очень эстетично (хотя с точки зрения правильности присвоения имен — вполне корректно), в наших примерах встречаться они будут крайне редко.

Тест на проверку полученных вами знаний
Для чего напиган следующий код BASIC?
Dim Mon As ' I n t e g e r - ' -"/ - *Dim D o l l a r s g ', «' »• • }', • '•
а. Этот код должен ввести в заблуждение
других программистов, которые попытаются внести изменения в мою программу.
б. Таким образом объявляются переменные
Mon (тип I n t e g e r ) И D o l l a r s {тип
D e c i m a l ) . •.'.." .'--.
Код оценивает рыночную стоимость пров. граммы и определяет, за сколько доллаг. Код запускает Надстройку №ual Basic :NET,
конвертирующую монгольские тугрики в канадские доллары и наоборот./

2. Зачем нужно объявлять переменные?
а. Чтобы другие программисты знали, что данные переменные вы забронировали для собственного использования.
б. Объявленные переменные впоследствии будут опубликованы в Internet с целью установления гиперссылок на вашу программу.
в. Это связано с застой загорских прав. Объявив
переменные, вы становитесь их собственником
и можете рассчитывать на свою долю прибыли
Г, Объявляя переменную, вы даете компьютеру
. указами создать переменную определенного
. типа и присвоить ей указанное имя.

Присвоение переменным числовых значений
Теперь, когда вы знаете, как создать переменную и присвоить ей имя, возникает другой
вопрос: а как присвоить этой переменной конкретное значение? Ответ очень прост: нужно
использовать обычный знак равенства ( — ).
Чтобы присвоить переменной значение, наберите следующий код BASIC:
ИмяПеременной = Значение
Итак, вам не нужно говорить компьютеру: "Последний раз тебе повторяю: или ты присваиваешь переменной Ириска значение 36, или я выдергиваю штепсель из розетки!" Достаточно будет набрать код:
Ириска = 3 6
Переменная в каждый отдельный момент времени может иметь только одно значение. Если переменная уже имеет какое-то значение, но вы захотите присвоить ей
новое, старое значение бесследно исчезает.
Вы можете написать сразу две команды:
Ириска = 3 6
Ириска = 57
Visual Basic .NET посмотрит на первую строку и скажет себе: "Ага, переменной Ириска
нужно присвоить значение 3 6". Потом он, взглянув на вторую строку, присвоит этой переменной значение 57, а о значении 36 напрочь забудет.

Присвоение переменным текстовых значений
Текстовые значения присваиваются точно так же, как и числовые. Единственное различие
состоит в том, что текстовое значение должно быть заключено в кавычки. Благодаря этому
Visual Basic .NET может понять, где оно начинается, а где заканчивается.
172

Часть IV, Основы создания кодов

Например, можно присвоить значение, состоящее из одного слова:
Имя = "Майкл"
Или из двух слов:
Имя = "Майкл Джексон"
Или из любого другого количества слов, заключенных в кавычки:
Имя = "Степан Эдуардович Розенштейн-младший"
Не все текстовые переменныесостоят из букв. Если вам нужно, скажем, чтобы значением
переменной был телефонный номер или, например, некий секретный код, наберите следующее:
ТелНомер = "555-1234"
СекретныйКод = "123-45-6789"
Вы спросите, а что произойдет, если кавычки не будут набраны? Если просто набрать
ТелНомер = 555-1234
СекретньшКод = 123-45-6789
Без кавычек эти значения будут восприняты не как строки, а как числа, над которыми к
тому же еще нужно произвести операцию вычитания. Поэтому вместо телефонного номера
переменная ТелНомер примет значение, равное -679 (это разница 555-1234). В свою очередь, переменная СекретныйКод примет значение -6711.
Итак, вовсе не важно, состоит значение из букв или из цифр, но если вы хотите,
чтобы оно воспринималось как текст, возьмите его в кавычки.

Присвоение переменным значений других переменных
Помимо непосредственного присвоения переменным конкретных текстовых или числовых значений, одним переменным можно присваивать значения других переменных. Сделать
это можно, набрав следующий код BASIC:
ПерваяЛеременнал = ВтораяПеременная
Например, если переменной Василий нужно присвоить значение переменной НизкийХО,
достаточно ввести код
Dim НизкийКЭ, Василий As B i t e
Низкий1
1. Первая строка дает Visual Basic .NET указание: "Создай две переменные, назови их Низкий10 и Василий, и чтобы каждая из них могла принимать зна1
чения из диапазона от 0 до 255 (тип данных Byte) '.
2. Вторая строка говорит Visual Basic .NET: "Присвой переменной Низкий1

Массивы данных



Структуры данных

'г Коллекции данных
Ж ш дна переменная может содержать одно значение, но как быть, если вам нужно сохра^•^ нигь информацию о нескольких связанных межд\ собой объектах. Предположим,
нужно составить список всех знакомых, которые должны вам деньги. Создавать для каждого
из них переменную--- эго долгое и неинтересное занятие (тем более ч ю они лого не заслуживают), а настоящие программисты, как известно, не любят выполнять рупижио рабшу.
Идеальным вариантом было бы создание переменной, которая могла бы содержать любое
количестве связанных между собой значений. К счастью, Visual Basic ."NET paciio.naiaei кжой
волшебной переменной, способной запоминать одновременно множество значений. Правда,
называется она не волшебной неременной, а просто структурой данных. Visual Basic .NET
различает три вида структчр данных: массивы, структуры и коллекции.
Создание структуры данных — по способ, с помощью которого компьютер временно организовывает и сохраняет данные на период выполнения программы. Как только компьютер
выключается или программа завершает свою работу, вся информация, содержащаяся в структуре данных, теряется (конечно, если вы предварительно не написали специальных кодов
BASIC для ее сохранения i де-нибудь на жестком диске).

Создание массивов
Простейшая структура данных, которую вы можете создать, называется массивом. Массив
можно представить как цепочку звеньев, каждое и.? которых содержит одно значение. Звено
цепочки называется элементом массива. Каждому элементу массива соответствует свой уникальный номер, называемый индексом (рис. 20.1).
Элементы массива

\

Массив

Рис. 20.1. Массив состоит из набора элементов,
каждый из которых содержит одно значение
Чтобы создать массив, вам нужно определить:
S

его имя;

^

количество элементов (размер массива):

^

"нп данных, которые будут храниться в массиве.

Глава 20. Создание структур данных

213

Для этого наберите следующий код BASIC:
Dim ИмяМассива(Размер) As ТипДанных
Если вместо слова Dim набрать слово P u b l i c , будет создан массив, областью видимости которого станет вся программа.
Таким образом, чтобы создать массив, именуемый МойМассив, состоящий из
четырех элементов и способный хранить значения типа I n t e g e r , наберите
такой код:
Dim МойМассив(3) As I n t e g e r
Чтобы массив состоял из четырех элементов, его размер должен быть равен числу 3.
Почему именно 3? Потому что отсчет элементов начинается с нулевого номера. Первому элементу соответствует нулевой номер, второму элементу — номер 1 и т.д.
В предыдущих версиях Visual Basic можно было указать первый и последний номера элементов массива:
Dim МойМассив(1 То 3) As I n t e g e r
В Visual Basic .NET нумерация всегда (подчеркиваем, всегда) начинается с нулевого номера. Поэтому, если вы наберете такой код, Visual Basic .NET воспримет его
как ошибку.

Присвоение значений элементам массива
Элементы только что созданного массива не содержат никаких данных. Чтобы сохранить в
массиве какое-нибудь значение, нужно указать, какому элементу оно должно быть присвоено.
Предположим, вы создали массив, который может содержать в себе до пяти строк:
Dim Сотрудник(4) As S t r i n g
Если вы хотите первому элементу массива присвоить значение Данила Быстрое, наберите такой код:
Сотрудник(0) = "Данила Быстров"
Первому элементу массива соответствует нулевой номер.
Некоторые программисты, создав массив, предпочитают сразу же инициализировать
его, присвоив каждому элементу нулевое значение или пустую строку. Это можно
сделать использовав цикл For-Next (будет рассмотрен в главе 25), например:
Dim Сотрудник(4) As String
Dim I As Integer
For I = 0 To 4
Сотрудник(I) = ""
Next I
Как следует из сказанного выше, массив, размер которого равен четырем, состоит из пяти
элементов, первый из которых имеет нулевой порядковый номер, а пятый, соответственно,
четвертый порядковый номер (рис. 20.2).

214

Часть IV. Основы создания кодов

Элемент 1

Элемент О

Элемент 3

Элемент 4

Элемент 2
Рис. 20.2. Порядок нумерации элементов массива в Visual Basic .NET
Значения элементов массива можно присваивать другим переменным, например:
Dim Сотрудник(4) As S t r i n g
Dim Брат As S t r i n g
Сотрудник(3) = "Данила Быстров"
Брат = Сотрудник(3)
1. Первой строкой создается массив Сотрудник, состоящий из пяти текстовых
значений.
2. Второй строкой создается текстовая переменная, именуемая Брат.
3. Третьей строкой четвертому элементу массива (которому соответствует третий порядковый номер) присваивается значение Данила Быстров.
4. В четвертой строке переменной Брат присваивается значение элемента массива Сотрудник, которому соответствует третий порядковый номер. Ранее
этому элементу было присвоено значение Данила Быстров, поэтому теперь
переменная Брат также будет содержать значение Данила Быстров.
Обычно элементы массива содержат значения, относящиеся к одному типу данных,
например, только строки или только целые числа. Если же необходимо, чтобы в
массиве содержались данные разных типов, при создании массива вместо названия
одного из типов данных наберите слово Object:
Dim МойМассив As Object
Элементы такого массива могут содержать значения разных типов:
МойМассив(0) = "Спрут"
МойМассив(1) = 5 6
МойМассив(2) = 3.1415

Создание многомерных массивов
Когда вы создаете массив и указываете одним числом его размер, вы создаете одномерный массив — он представляет собой один сплошной ряд элементов. Но Visual Basic .NET
позволяет создавать также и многомерные массивы, которые могут иметь до шестидесяти
измерений. Необходимость создавать огромные массивы, характеризующиеся десятками измерений, возникает очень редко, но вот двухмерными массивами пользуются довольно часто.
Их можно представить в виде сетки, которая показана на рис. 20.3.

Глава 20. Создание структур данных

215

(0,0) (0,1) (0,2) (0,3) (0.4)
(1.0) (1.1) (1,2) (1,3) (1,4)
(2,0) (2,1) (2,2) (2,3) (2,4)
Рис. 20.3. Двухмерный массив может быть представлен в виде сетки
Порядок создания двухмерного массива тот же, что и одномерного, с той лишь разницей,
что, указывая его размер, нужно добавить еще одно ч и с л о — для дополнительного измерения. Таким образом, размер двухмерного массива определяется двумя числами:
Dim ДвухММассив

(Строки,

Столбцы)

As ТипДанных

Размер трехмерного массива будет определяться тремя числами и т.д.:
Dim ТрехММассив

(X,

Y,

Z)

As ТипДанных

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

Изменение размеров массива
После того как массив будет создан, вы в любой момент сможете увеличить или уменьшить его размер. Предположим, вы уже создали массив из пяти элементов, значениями которых являются строки:
Dim МойМассив(4)

As

String

Если вдруг появится необходимость добавить несколько новых элементов, воспользуйтесь командой ReDim:
ReDim МойМассив(7)

As

String

Эта команда добавляет три ( 7 - 4 = 3) новых элемента к ранее созданному массиву МойМассив. Этой же командой можно удалить лишние элементы:
ReDim МойМассив(2)

As

String

Q помощью команды ReDim можно также изменить и размер многомерного массива. Однако она не позволяет добавлять или удалять измерения многомерного
массива.
При использовании команды ReDim для добавления или удаления элементов массива все
данные, которые уже были сохранены в этом массиве, теряются. Если вы хотите, чтобы
прежняя информация осталась на своих местах при добавлении новых элементов (в случае
удаления элементов такая возможность отсутствует), вместе с командой ReDim используйте
команду P r e s e r v e :
ReDim P r e s e r v e

МойМассив(25)

As

String

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

216

Часть IV. Основы создания кодо

Если вы используете комбинацию команд ReDim P r e s e r v e для изменения размеров
многомерного массива, повлиять можно только на размер последнего измерения. Допустим,
был создан двухмерный массив:
Dim МойМассив(2,

5)

As S t r i n g

Теперь, если вы хотите увеличить данный массив, сохранив прежние значения, изменить
можно только размер последнего измерения:
ReDim P r e s e r v e МойМассив(2,

17)

As

String

Ехли вы попытаетесь применить указанную комбинацию команд для увеличения
размеров другого измерения (не последнего), Visual Basic .NET воспримет это как
оыибку и откажется выполнять ваше указание.

Создание
А что если вам нужно сохранить различные связанные между собой данные в одном месте? Обычная переменная может хранить в каждый конкретный момент времени только одно
значение. Массив может хранить цепочки связанных между собой значений, но вам нужна
именно одна переменная с несколькими значениями одновременно. К счастью, в Visual Basic
.NET это можно сделать путем создания структуры данных, называемой (здесь не обойтись
без тавтологии) структурой.

Структуры и переменные
Структура, по сути, объединяет в себе несколько переменных вне зависимости от их типов данных. Чтобы создать структуру, нужно набрать такой код BASIC:
S t r u c t u r e ИмяСтруктуры
0бъявлениеПеременной1
Объяв. ":енкеПеременной2
End St r ас и г е
Например, при необходимости создать структуру, содержащую имя, адрес и код клиента,
наберите код:
Structure Клиент
Publ_: Имя As String
Public Адрес As String
Publ ~c Ко,ц As Integer
End Structure
Структуры относятся к пользовательским типам данных, поскольку после создания любой
из них нужно создать еще и переменную, которая будет представлять эту структуру:
Переменна.-! As ИмяСтруктуры
Чтобы создать переменную для представления структуры Клиент, наберите код:
Семенов А. з Кл и е к т
Эта строка говорит Visual Basic .NET: "Создай переменную Семенов, которая будет представлять структуру Клиент. Данная структура содержит переменные Имя, Адрес и Код".

Глава 20. Создание структур данных

217

Чтобы получить возможность использовать структуру, нужно пройти два этапа:
I S определить структуру;
1 S объявить переменную для представления этой структуры.

Сохранение данных
После того как будет создана структура и объявлена переменная, которая должна ее представлять, остается только присвоить этой переменной значения. Чтобы сделать это, нужно
указать переменную, представляющую структуру, а через точку — ту переменную структуры,
которой будет присвоено значение:
ИмяПеременной.ПеременнаяСтруктуры = НовоеЗначение
Допустим, вы создаете следующую структуру:
Structure Коты
Public Имя As String
Public Возраст As Integer
Public Мальчик As Boolean
End Structure
He забывайте, что структура создается в два этапа: вначале появляется сама структура, а
затем объявляется переменная, которая будет эту структуру представлять. Поэтому следующим шагом должно быть объявление такой переменной:
S t r u c t u r e Коты
P u b l i c Имя As S t r i n g
P u b l i c Возраст As I n t e g e r
P u b l i c Мальчик As B o o l e a n
End S t r u c t u r e
Dim МойКот As Коты
После того как будет объявлена переменная, представляющая структуру, можно приступить к сохранению данных. Для этого необходимо указать имя переменной, представляющей
структуру, и имя переменной структуры, которой должно быть присвоено значение:
Structure Коты
Public Имя As String
Public Возраст As Integer
Public Мальчик As Boolean
End Structure
Dim МойКот As Коты
МойКот.Имя = "Васька"
МойКот.Возраст = 3
МойКот.Мальчик = True
Вот как Visual Basic .NET интерпретирует эти коды.
д^т~ры сами по себе не очень-то полезны. Поэтому многие программисты используют
их в комбинации с массивами. Этот прием позволяет создавать массивы, содержащие не просто связанные, но и сгруппированные (а значит, и правильно организованные) данные.
Чтобы создать массив, состоящий из структур, нужно просто создать структуру, а затем
объявить массив, типом данных которого будет созданная структура (это означает, что каждый элемент массива будет представлять собой структуру):
Зт г и с т и г е

Коты

Publ ic 'Лия Аз Зтгing
Public Возраст Ае
Public Мальчик А а Воо
End Siructure
!Ji"i КОУ-Ъ- оты ( 3 ) As Коты
Как будет организован такой массив, показано на рис. 20.4.

Определение
структуры

Structure Коты
Имя As String
Возраст As Integer
Мальчик As Boolean
End Structure

Объявление массива,
состоящего из структур"

Dim МоиКоты(З) As Коты

Имя = "Васька"
Возраст - 3
Мальчик = True

Имя = "Тишка"
Возраст = 5
Мальчик = True

Имя = "Мурка"
Возраст = 2
Мальчик = False

Имя = "Лева"
Возраст = 1
Мальчик = True

МоиКоты(О)

МоиКоты(1)

МоиКоты(2)

МоиКоты(З)

РИС. 20.4. Создав массив структур, можно правильно и эффективно организовать связанные данные

Глава 20. Создание структур данных

219

Коллекции данных
Коллекция — это специальная структура данных, работающая как супер-массив, который
может расширяться до любых пределов и содержать в себе данные любых типов, начиная от
строк и чисел и заканчивая другими массивами и структурами.
Одна из проблем обычных массивов заключается в том, что если они имеют большие размеры,
то для поиска сохраненных данных иногда приходится просто просматривать поочередно все их
элементы. Один из вариантов решения этой проблемы— назначение специальных "ключей" для
каждого сохраненного элемента данных. Каждый ключ представляет собой строку и является уникальным, что позволяет по его значению быстро найти нужный элемент коллекции.
Чтобы создать коллекцию, нужно только объявить переменную, которая будет ее представлять:
Dim Поставщики As New C o l l e c t i o n { )
Эта строка говорит Visual Basic .NET: "Создай переменную, которая будет представлять
коллекцию данных, и назови ее Поставщики".

Добавление информации в коллекцию данных
Теперь, когда коллекция у нас уже имеется, можно приступать к созданию ее элементов. Для
этого нужно указать само значение и уникальный ключ, по которому позднее можно будет найти это значение в коллекции данных. И данные, и ключ должны быть строками (тип S t r i n g ) .
Код, добавляющий значение в коллекцию данных, должен выглядеть следующим образом:
ИмяКоллекции.Add

(Значение,

Ключ)

Вместо слова Имя Кол л е к ц и и наберите имя переменной, которая представляет эту коллекцию, вместо слова К л ю ч — уникальное (не совпадающее с другими ключами) текстовое
значение, а вместо слова З н а ч е н и е — то значение, которое должно быть присвоено этому
элементу (им может быть число, строка или другая структура данных).
Так, если нужно добавить к коллекции Поставщики название "Батлер и партнеры 1 ' и поставьте ему в соответствие ключ "13", наберите следующий код BASIC:
Dim Поставщики As New C o l l e c t i o n ( )
Поставщики.Add ("Батлер к п а р т н е р ы " , " 1 3 " )
Если вам не нравится каждый раз брать ключ в кавычки, можете воспользоваться
командой T o S t r i n g и преобразовать числовое значение в строку:
Dim Поставщики As New C o l l e c t i o n ( )
Поставщики .Add ( " Б а т л е р и п а р т н е р ы " , 13 . T o S t r i r . g }

Определение количества элементов коллекции
Если вы уже что-то сохраняли в своей коллекции, то рано или поздно захотите проверить
количество созданных элементов. Для этого достаточно набрать такой код BASIC:
ИмяРСоллекции. C o u n t
Возвращаемое этим кодом число в точности соответствует текущему количеству элементов
вашей коллекции. Чтобы запомнить его, создайте переменную и присвойте ей это значение:
Dim X Аз Integer
X = ИмяКоллекции.Count

220

Часть IV. Основы создания кодов

Это же число можно использовать как часть другого кода BASIC, например в цикле F o r N e x t (он будет описан в главе 25):
Dim X Аз I n t e g e r
For X = 0 to ИмяКоллекции.Count
1
Здесь может быть любой код
Next X

Чтение информации, сохраненной в коллекции
Для того чтобы найти какое-нибудь значение, сохраненное в коллекции, нужно воспользоваться такой командой BASIC:
ИмяКоллекции.Item(X)
Вместо буквы X наберите уникальный ключ, который соответствует нужному элементу.
Так, если необходимо найти элемент коллекции Поставщики, которому соответствует ключ
"13", наберите:
Поставщика.Item("13")
Этим кодом будет возвращено значение элемента, сохраненного вместе с ключом "13".
Указанное значение потом можно будет присвоить какой-нибудь другой переменной или
использовать для проведения вычислений в других кодах BASIC:
Dim НаПечать As S t r i n g
Dim Поставщики As New C o l l e c t i o n ( )
Поставщикл.Add ("Батлер и партнеры", "13")
НаПечать = Поставщики.Item{"13")
В данном случае переменной НаПечать будет присвоено значение Б а т л е р и п а р т н е р ы .

Удаление данных из коллекции
Удалить данные из коллекции еще проще, чем записать их туда. Для этого нужно всего
лишь набрать такую команду BASIC:
ИмяКоллек дии.Remove(X)

Как вы уже могли догадаться, вместо буквы X нужно набрать ключ элемента, подлежащего удалению Если из коллекции П о с т а в щ и к и ]гужно удалить элемент, которому соответствует ключ "13", наберите:
Поставщики.Remove("13" )

Глава 20. Создание структур данных

221

Глава 21

Борьба с ошибками
$' эй1ойгла£е...
> Классификация ошибок
> Стратегия поиска ошибок
> Ловушки для ошибок
> Ликвидация пойманных ошибок
аже если вы напишете тысячи программ, все равно последующие ваши программы
не будут застрахованы от ошибок, Можно неправильно написать слово или, скажем,
забыть набрать какую-то команду. И как бы аккуратно и внимательно вы ни старались писать
коды программы, вряд ли она будет работать так, как вам того хотелось бы. А то, что заставляет программу работать некорректно (или вообще не работать), называется ошибкой.
Каждая созданная программа содержит ошибки, включая WordPerfect, Linux, Paint Shop
Pro и Microsoft Windows XP. Основное различие между ошибками в вашей программе и
ошибками в коммерческих продуктах заключается в том, что вам за исправление своих ошибок никто платить не станет. А исправлять их придется в любом случае.
Но не стоит расстраиваться. Многие ошибки вовсе не критичны. Они не могут остановить
работу программы или испортить исходные данные; максимум, на что они способны, — это немного замедлить выполнение программы, отобразить на экране не тот цвет или оттенок и т.п.
Но существуют и более опасные ошибки. Так, говорят, что из-за программной ошибки недавно взорвался один из спутников NASA. Причиной взрыва послужила какая-то одна неправильно набранная команда.
Ничто не совершенно, поэтому каждая программа может содержать в себе ошибки. Даже программисты-профессионалы с учеными степенями регулярно пишут несовершенные программы.
Ошибки в программах — это жизненный факт. Они так же неизбежны, как тараканы на
кухне. Вы никогда от них полностью не избавитесь, но постараться уничтожить их как можно
больше вы просто обязаны.

Классификации ошибок
Чтобы ошибку ликвидировать, ее нужно сначала обнаружить. Если программа маленькая,
наподобие той, которая отображает на экране окно H e l l o , w o r l d ! , у ошибок мало мест,
где можно спрятаться. Но если это большая программа, ошибки могут быть повсюду, и найти
их будет не легче, чем иголку в стоге сена.
Врага нужно знать в лицо, поэтому, чтобы облегчить процесс поиска, программисты делят ошибки на три категории:
$ •/ синтаксические ошибки;
г •/ рабочие ошибки;
i S логические ошибки.

Глава 21. Борьба с ошибками

223

Синтаксические ошибки
Синтаксические ошибки обычно появляются при вводе кода, т.е. когда вы неправильно
набираете какую-нибудь команду или ключевое слово. Например, если вы наберете
I n t e g g e r вместо I n t e g e r , Visual Basic .NET не зная, что означает слово I n t e g g e r , даже
не попытается продолжить выполнение программы.
Когда Visual Basic .NET сталкивается с такой ошибкой, он выделяет неправильно набранное слово, с тем чтобы вам легче было найти эту ошибку и устранить ее. Как только слово
будет исправлено, программа снова станет рабочей.
Если программа содержит хотя бы одну синтаксическую ошибку, она работать не будет. Поэтому, как только ваша программа начнет функционировать, это будет означать, что синтаксических ошибок в ней точно нет. Теперь вас могут беспокоить только рабочие и логические ошибки.

Рабочие ошибки
Рабочие ошибки более хитрые и менее очевидные, чем синтаксические, поскольку могут
быть обнаружены только в процессе выполнения программы, когда она сталкивается с данными, которые не способна обработать. Программа может содержать массу таких ошибок, но
вы даже не будете подозревать об их существовании до тех пор, пока она не пройдет испытания в так называемых полевых условиях.
Попробуем провести аналогию с повседневной жизнью. Представьте, что вы заходите в
ресторан Mc'Donalds и на вопрос официанта "Что будете заказывать?" с серьезным видом отвечаете: "Два билета до Хельсинки, пожалуйста". Вряд ли найдется официант, который сразу
сможет адекватно отреагировать на ваши слова. Но поскольку это человек, а не компьютер,
через некоторое время он что-нибудь да ответит. Компьютер же просто прекратит работ)'
(зависнет или остановит выполнение программы).
Вернемся опять к кодам BASIC и рассмотрим такой пример. Вот обычная формула, вычисляющая какой-то результат:
С р е д к и й Б а л = СуммаБалов / К о л и ч е с т в о П о п ы т о к
Этот код работает корректно до тех пор, пока переменная КоличествоПопытск не принимает нулевое значение. Но поскольку делить на нуль нельзя, программа прекращает свою работу.
Чтобы обнаружить все рабочие ошибки, вам нужно протестировать работу программы
при любых мыслимых ситуациях: начиная с того, что кто-то нажимает не ту клавишу, и заканчивая тем, что какой-то идиот в поле В о з р а с т набирает отрицательное значение.
Поскольку количество возможных глупостей стремится к бесконечности (вспомните законы Мэрфи), теперь можно понять, почему каждая программа, тем более большая, содержит
в себе ошибки. (Интересно, как вы теперь будете себя чувствовать, находясь в самолете, который управляется бортовым компьютером?)

Логические ошибки
Самыми хитрыми и сложными с точки зрения устранения являются логические ошибки.
Они случаются, если компьютер получает неправильную команду или если таковая входит в
противоречие с другими командами. "Как же т а к ? — удивитесь в ы . — Кто мог дать неправильную команду, если кроме меня никто эту программу не писал?" Верите вы этому или нет,
но набрать ошибочную команду очень даже легко.
Те, у кого есть дети-подростки, знают, что если попросить их убрать в своей комнате или
купить что-нибудь к ужину, то они сделают это, но совсем не так. как вы это себе представляли. Вместо того чтобы убрать грязную одежду в стиральную машину, а разные бумажки
выбросить в мусорное ведро, они затолкают это все под кровать или просто перенесут в другую комнату. А о том, что покупается к ужину, лучше вообще не вспоминать.

224

Часть IV. Основы создания кодов

В любом случае дети выполнят ваши инструкции, но проблема в том, что эти инструкции
были недостаточно точны. Если оставить им возможность для свободной интерпретации полученных указаний, они обязательно 'этим воспользуются. Компьютер поступит точно так же.
Поскольку вы уверены, что дали компьютеру правильные инструкции, вы не можете ответить на вопрос, почему он некорректно работает. А это значит, что теперь нужно искать те
команды, которые оказались для него недостаточно точными. Если программа большая, скорее всего, вам придется просматривать в поисках ошибки все коды. Строка за строкой. (И
скажите теперь, разве программирование не одно из самых приятных занятий?)

Cinficuneiusi ахо/ни за outucf/сами
Обычно процесс поиска и ликвидации ошибок проходит четыре стадии.
1. Определение факта наличия ошибок в программе.
2. Поиск ошибок.
3. Поиск причин возникновения ошибок.
4. Ликвидация ошибок.
Самое неприятное в этом процессе то, что, найдя и удалив одну ошибку, вы тем
самым можете породить две или три новые. Теперь придется заново повторить
весь процесс в поиске только что внесенных ошибок. Желаем удачи!

А есть ли в программе ошибки?
Лучший способ определить, есть ли в программе ошибки, — это дать попользоваться ею
посторонним людям. (В мире коммерческих разработок программного обеспечения таких посторонних людей обычно называют покупателями.)
Чем больше вы найдете людей, согласных протестировать вашу программу, тем
больше вероятность того, что будут найдены даже самые скрытые ошибки. В числе
этих ошибок могут быть как те, из-за которых зависает компьютер, так и те, которые просто возвращают недостаточно точный результат по причине, скажем, неправильного округления десятичных дробей.
После того как наличие ошибок в программе будет установлено, останется отследить и
удалить их. (Программисты, которые с оптимизмом смотрят на вещи, называют найденные
ошибки незадокументированиыми возможностями.)

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

Глава 21. Борьба с ошибками

225

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

Ликвидация ошибок
После того как будет найден код, являющийся непосредственным виновником возникновения ошибки, останется только его исправить. Но прежде чем это сделать, хорошенько подумайте! Иногда исправление одной ошибки провоцирует возникновение дюжины других.
Чтобы пояснить данную мысль, проведем следующую аналогию. Представьте, что в вашем доме начала протекать труба. Можно разрушить стену и полностью заменить трубу.
Проблема с водопроводом будет решена, но, ломая стену, вы наверняка повредите перекрытия и по потолку пойдут трещины. Можно заменить потолок, положив вместо него бетонные
плиты. Но это даст дополнительную нагрузку на фундамент, он просядет, и трещины пойдут
уже по стенам. Теперь, наверное, легче будет просто построить новый дом. Итак, начав с починки водопровода, можно закончить списанием дома под снос.
С программными ошибками может происходить то же самое. Иногда легче просто переписать часть кодов программы, чем пытаться выловить из них все ошибки.
Лучший способ борьбы с ошибками — не делать их вовсе. Конечно, это примерно то же
самое, что сказать: "Чтобы не испытывать недостатка в деньгах, нужно всегда их иметь".
Поскольку от ошибок не застрахована ни одна программа, вы можете лишь попытаться
свести их количество к минимуму. Вот несколько советов, которые помогут вам в этом.
Разбейте программу на много маленьких подпрограмм, каждая из которых будет решать какую-то одну задачу. Чем меньше программа, тем легче найти и
удалить ошибки. На этом принципе основано объектно-ориентированное программирование, речь о котором пойдет в седьмой части книги.
Тестируйте программу после каждого внесения в нее изменений. Если программа до изменения каких-то двух строк работала корректно, то понятно, что
ошибка "сидит" именно в этих строках.
Делайте перерывы на отдых. Если программа не работает и вы никак не можете понять в чем дело, оставьте ее на некоторое время и займитесь чемнибудь другим. Когда вы вернетесь к ней снова, решение проблемы может
прийти на ум само собой, и вы даже будете удивлены, как можно было сразу
этого не понимать.

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

226

Часть IV. Основы создания кодов

ся дальше функционировать (она "зависает"), или, в худшем случае, в том, что происходит
сбой в работе всего компьютера.
Чтобы избежать подобных проблем, Visual Basic .NET предлагает вам возможность создания программных ловушек для ошибок, приводящих к серьезным сбоям в работе программы. Специальный кол говорит компьютеру: "Вот тебе инструкции на тот случай, если возникнет ситуация, с которой ты не сможешь справиться". Инструкции могут быть самыми
простыми, например как те, что указывают на необходимость отобразить на экране сообщение. И, конечно же, это лучший вариант, чем перезагрузка компьютера.
Простейшая ловушка для ошибок выглядит следующим образом:
Try
' Код, р а б о т у к о т о р о г о нужно п р о т е с т и р о в а т ь
Catch
1
Инструкции на случай в о з н и к н о в е н и я ошибок
End Try
Рассмотрим это на примере:
Try
Dim intX As Integer
irtX = 9 / CInt(TextBoxl.Tex")
Catch
MscBox ("Деление на ноль!")
End Try
1. Visual Basic .NET выполняет коды, расположенные между командами Try
(первая строка) и Catch (четвертая строка). В данном случае во второй строке создается переменная intX типа I n t e g e r , а в третьей строке число 9 делится на число, которое пользователь набрал в текстовом поле TextBoxl, a
полученный результат присваивается переменной intX.
2. Коды, расположенные между командами Catch (четвертая строка) и End
Try (шестая строка), выполняются только в том случае, если обнаружится
ошибка при выполнении кодов, расположенных между командами Try
(первая строка) и Catch (четвертая строка). В нашем примере при возникновении ошибки на экране отображается окно с сообщением "Деление на
ноль ! ". Вы, наверное, уже догадались, что ошибка может возникнуть, если
пользователь наберет в текстовом поле TextBoxl число 0.
3. Шестая строка (End Try) сообщает Visual Basic .NET, что на этом коды ловушки для ошибок заканчиваются.
Если ошибка произойдет при выполнении кодов, расположенных за пределами
строк Try-Catch, данная ловушка компьютеру ничем не поможет.
Ловушки дтя ошибок сами по себе очень удобны и полезны, поскольку не позволяют
компьютеру попасть в безвыходное положение и зависнуть. Благодаря этому вам при отладке
программы намного реже придется тянуться к кнопке RESET.

Глава 21. Борьба с ошибками

227

Cfteqc0i£a Visual /3osic J/€J д
о*пслежи#аш4Л и ifqcuettusi otuuSotc
В Visual Basic .NET есть два основных метода, позволяющих выявить и удалить ошибки:
пошаговое выполнение программы и просмотр текущих значений.
~ S При пошаговом выполнении программы вы построчно отслеживаете производимые компьютером действия. Пока программа работает правильно, вы переходите
от одной строки к другой. Как только в работе происходит сбой или переменная
принимает некорректное значение, вы точно можете сказать, в какой строке содержится ошибка.
Просматривая текущие значения переменных, вы можете видеть, какие данные используются на каждом шаге выполнения программы. Как только переменная принимает неправильное значение, вы сразу можете локализовать ошибку.

у

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

Пошаговое выполнение программы
Если вы совершенно не представляете, где могла спрятаться ошибка, придется пошагово
выполнять программу, начиная с самой первой строки. При этом можно использовать одну из
трех перечисленных далее команд.
'( S D e b u g ^ S t e p Into (Отладка^Пошаговое выполнение) или клавиша < F 1 1 > — каждый раз при выборе этой команды программа выполняет коды одной строки и пе•
реходит на другую строку. Коды всех процедур также выполняются пошагово.
. ^ D e b u g ^ S t e p Over (Отладка^Пошаговое выполнение с перешагивание через процедуры) или клавиша < F 1 0 > — коды программы также выполняются пошагово, но
отдельные процедуры выполняются целиком. Если вы уверены, что данная процедура не содержит ошибок, выберите эту команду, и вам не придется выполнять
пошагово все ее коды.
S
F

D e b u g ^ S t e p Out (Отладка^Выход из процедуры) или комбинация клавиш
— если вы начали пошаговое выполнение процедуры и решили, что в
ней ошибок нет, эта команда позволяет быстро завершить ее.
Эти три команды можно использовать в любой последовательности. Вначале выберите команду Step Into, чтобы начать пошаговое выполнение программы. Затем,
если вы вошли в какую-то процедуру и не хотите дальше пошагово выполнять ее,
выберите команду Step Out. И, наконец, используйте команду Step Over при необходимости "перешагнуть" через процедуру, в правильности выполнения которой
вы не сомневаетесь.

Вот как следует использовать команды Step Into и Step Over на практике.
1. Выберите команду D e b u g ^ S t e p Into (или нажмите клавишу ) либо
команду Debug^Step Over (или нажмите клавишу ).
Visual Basic .NET откроет окно с кодами вашей программы, в котором слева от
выполняемой в данный момент строки будет отображаться желтая стрелка
(рис. 21.1).

228

Часть IV. Основы создания кодов

2. Повторяйте первый шаг для каждой строки, точность выполнения которой
вы хотите проверить. Если вы хотите завершить процедуру без пошагового
выполнения оставшихся кодов, выберите команду D e b u g ^ S t e p Out.
3. Для того чтобы прервать процесс пошагового выполнения программы, выберите команду Debug^Stop Debugging (Отладка^Остановить отладку)
или нажмите комбинацию клавиш .
:к- Trojan Но гее - Microsoft Visual Basic.NET Ibreakl - Formt.vb
File

£dit

yiew

£raje ct

guild

Lb, *

Eebug

о -

Ioofe

• - JT

W i nd a w

-



- Thieed [L33-] 'По Name.

' Program [1328] TrojanHorse ex

Help

C«UQ

-

ja

' * *

Fora} .vb 1
a

^ j

*Fqrm1 ITrojanHoite]
I:,.,: .-.,

3 y 3 L era.

*.

- StackFrwie Troia-Нпгче eAe'TioianH r;e Fr

UM2

,l

• •New

W J I I F O E H I S . F>. -Tn



-



Г
_

J

:

_

л]
1

Si сg •.

F -_> ! • .- .' !v- ••(t
:!y:f\:"?.Ne
Focml

ф-'

-

:

J

I m - i a l i i eCompcnen1;

j

l i . ^ . i



-

d

e

: • • -

. . •

-





, • . , -

:1Spoee|)

!"-E'.?T.DI

#-.-r ;r.:-,

" U i n d o i i 3 Form D e s i g n e r

nents

generated сo

...- S y a t e m . Conipcr.er.r.H n ( 5 s

»

l .

C

o

n

t

a

i

n

e

r

,•;":;."; C h e c k b o x 5 As S v - ^ e i o . И L r i F o r m s . C h e c k B o x
-"'|Lln15'

Ready

Zi
Call

Oil

INS

Рис. 21.1. Visual Basic .NET пошагово выполняет коды вашей программы
Если на экране отображается пользовательский интерфейс вашей программы, то,
чтобы прервать процесс пошагового выполнения ее кодов, можно выбрать команду
E x i t — в таком случае завершается выполнение программы в целом.

Определение точек останова
Команды Step Into и Step Over приступают к пошаговому выполнению программы, начиная с самой первой строки. Если программа невелика, то в этом нет ничего плохого. Но если программа большая, у вас не хватит терпения начинать каждый раз сначала (тем более что
в этом нет никакой необходимости).
Чтобы избежать пошагового выполнения части кодов, которые, как вы надеетесь, работают правильно, используйте точку останова. Точка останова говорит компьютеру: "Выполни
все коды цо этой точки, а затем жди команду Step Into или Step Over для дальнейшего пошагового выполнения программы".
Точка останова создается следующим образом.

Глава 21. Борьба с ошибками

229

1. Откройте окно кодов путем нажатия клавиши , выбора команды
View^Code (Вид^Коды) или щелчка в окне Solution Explorer на кнопке
View Code.
2. Щелкните на строке, где должна быть создана точка останова.
3. Нажмите клавишу (или щелкните правой кнопкой мыши и выберите в
открывшемся меню команду Insert Breakpoint).
Слева от строки, выбранной в качестве точки останова, отобразится большая
красная точка.
После того как точка останова будет создана, нажмите клавишу (или выберите команду DebugOStart), чтобы сразу выполнить все коды от начала программы до строки с
точкой останова. Для дальнейшего пошагового выполнения программы можно использовать
команды Step Into (клавиша ) и Step Over (клавиша ).
Чтобы удалить точку останова, повторите те же три шага, щелкнув на строке, к которой
таковая относится.
Для того чтобы сразу удалить все точки останова, созданные в вашей программе,
нажмите комбинацию клавиш или выберите команду Debugs
Clear All Breakpoints (ОтладкамУдалить все точки останова).

Просмотр значений переменных
Пошаговое выполнение программы может быть по-настоящему полезным, если вы при
этом видите, какие изменения происходят с данными. Чтобы иметь возможность отслеживать
текущие значения переменных, воспользуйтесь окном Watch (Просмотр).
Это окно говорит компьютеру: "Вот переменные, которые меня интересуют. В течение
всего процесса пошагового выполнения программы отображай здесь их текущие значения".
Чтобы получить возможность пользоваться окном Watch, выполните такие действия.
1. Выберите команду Debug^Step Into (ей соответствует клавиша ) или
команду Debug^Step Over (клавиша ).
Visual Basic .NET откроет окно с кодами вашей программы.
2. Щелкните правой кнопкой мыши на переменной, значения которой вас интересуют.
Откроется контекстное меню.
3. Выберите команду Add Watch (Добавить для просмотра).
4. Выберите команду Debug^Windows^Watch (ОтладкаООкна^Просмотр)
или нажмите комбинацию клавиш , чтобы отобразить на экране окно Watch (рис. 21.2).
При пошаговом выполнении программы в окне Watch постоянно будут отображаться текущие значения переменных, выбранных для просмотра.
5. Выберите команду Debug^Step Into (клавиша ) или команду Debug^Step Over (клавиша ).
В момент, когда очередная выполняемая строка изменит значение переменной,
выбранной для просмотра на шаге 2, в окне Watch сразу же отобразится ее новое
значение.
6. Выберите команду Debug^Stop Debugging или нажмите комбинацию клавиш , чтобы остановить пошаговое выполнение программы.
Остановив пошаговое выполнение программы вы можете вернуться к редактированию кодов.

230

Часть IV. Основы создания кодов

Точка останова


У

-

D

i

x

i

F

o

o

d

M

i

c

r

o

s

o

f

t

V

i

s

u

a

l

B

a

s

l

c

.

N

E

T

(

b

r

e

a

;dR J0ew E'ojeef guild Ее bug
• _! - L* У &

* 4J ^ '"• -

k

l

-

d

o

q

s

.

v

l

i

loote Window Help
5 3 ' '—

> i-"bog

- ^

en [l522]PcgF03d e>'
• Tbeed [144, • N^Nnmei
^ fc, .T . - — «^ * ** %, ^ v
A Tc

i

Ptulf•-•!-(;i o'Jti 3 u t t o n l _ C l i c k ( B i V a l
:L.i,s-. CEOBonus л- '^maJK " 2QI - n HySelaty, CEOSslacy Ar : i n
HySalary • 1000
CEOSalacy - BySalary ' СЕОВоп
t e x c b O K l . T e x t = •..-;•.:. (CEOSalar

I Type

Kane
CEO;d

single

LnJi

Ready.

CoH

Ch1

Рис. 21.2. Окно Watch отображает текущие значения выбранных для просмотра переменных

Тест на проверку полученных вами знаний
1 . Что по-вашему является ошибкой?
а. Решение заняться программированием.
б. Тот фает, что команды Visual Baac.NET
обозначаются английскими словами. С
русскими словами все было бы намного проще.
в. Разные глупые действия, совершаемые
неопытными пользователями.
г. Все, что заставляет программу работать не так как нужно или вообще не
работать.

Глава 21. Борьба с ошибками

2. Как Visual Basic .NET помогает "отлавливать"
ошибки?
а. Каждая ошибка выделяется определенным
цветом и, когда вы на нее смотрите, начинает
дрожать.
б. Когда вы сообщаете Visual Basic .NET, что намерены заняться "ловлей" ошибок, включается
динамичная музыка, которая добавляет вам
злости и решительности.
в. Позволяет выполнить программу пошагово и
проследить за принимаемыми переменными
значениями.
г. Не дает им размножаться.

231

ЧастьV

Создание разветвлений
и циклов

ммо лежйц t t лм^жем м Н4.Й

Любая программа представляет собой набор инструкций для компьютера, объясняющих, что ему делать дальше. Простейшие программы выглядят подобно переменю команд, подлежащих последовательномувыполнению.
Но слепое выполнение полученных инструкций — это далеко не то,
что способны делать серьезные программы. Большинство программ получают информацию от пользователя и сами решают, что
с ней делать дальше.
Итак, данная часть книги посвящена вопросам создания программ,
которые могут принимать решения самостоятельно. Кроме того, вы
узнаете, как дать компьютеру инструкции, которые должны быть
выполнены несколько раз подряд. Такие инструкции называются
циклами. Они фактически говорят компьютеру: "Видишь этот набор команд? Их нужно выполнять снова и снова, пока я не разрешу
тебе остановиться".
Ваша программа должна самостоятельно принимать решения и
многократно повторять нужные команды. Лишь "живые" и динамичные программы в состоянии заставить компьютер делать что-то
по-настоящему полезное.

Глава22

Условные операторы If-Then
/3 эй1ой главе...
> Использование логических значений
> Условные операторы If-Then и If-Then-End If
>

Условные операторы I f - T h e n - E l s e и I f - T h e n - E l s e l f

ш
амые примитивные программы последовательно выполняют некий набор инструкций,
^ * а затем останавливаются. Разумеется, программы, которые каждый раз выполняют
одни и те же действия, не могут представлять особого интереса, поэтому нужно научить их
изменять свое поведение в зависимости от поступающих извне данных. Этими данными могут быть щелчок мыши или нажатие клавиши, информация, введенная в текстовое поле формы или взятая из файла базы данных.
После того как данные получены, программа должна решить, как на них реагировать.
Большинство решений принимается в форме Если-То (If-Then), например: "Если пользователь щелкнул на кнопке Печать, то нужно вывести открытый документ на печать". Если программу научить таким образом реагировать на поступление внешних данных и самостоятельно принимать решения о своих последующих действиях, она начнет поддерживать диалог с
пользователем и будет выглядеть даже более сообразительной, чем это есть на самом деле.

Логические значения
Чтобы иметь основание для принятия решения, нужно получить данные. Если данные получены, нужно решить, что делать дальше. Принятое программой решение зависит от выполнения или невыполнения условия, чему соответствуют значения True (Истина) и F a l s e
(Ложь). Именно эти два значения называются логическими.
В Visual Basic .NET логические значения могут быть представлены:
I S отдельными переменными;
I S выражениями.

Присвоение логических значений переменным
Логическое значение может быть присвоено только переменной, имеющей тип B o o l e a n .
Это означает, что она может принимать лишь одно из двух значений: True или F a l s e . Вот
пример кода, посредством которого объявляются логические переменные:
Dim F l a g ,

CheckMe As B o o l e a n

Теперь эти переменные могут принимать только одно из двух логических значений:
Flag = True
CheckMe = F a l s e
Проверить значение логической переменной можно двумя способами. Первый из них —
проверить, соответствует ли присвоенное значение значению T r u e :

Глава 22. Условные операторы If-Then

235

If Flag = True Then
Второй способ (более быстрый) позволяет сделать то же самое без необходимости набора
= True:
If Flag Then
Проверять, соответствует ли значение переменной значению True, необязательно
поскольку Visual Basic .NET в любом случае определяет, какое из двух значений
присвоено переменной.
Чтобы проверить, присвоено ли переменной значение F a l s e , можно набрать
If Flag = F a l s e Then
Или можно убрать = F a l s e , а перед названием переменной набрать слово Not:
If Not Flag Then

Логические значения выражений
Логические значения могут соответствовать не только отдельным переменным, но и
группам переменных, собранных в отдельное выражение. В простейших выражениях сравнивается значение одной переменой с некоторым заданным значением, например:
Возраст > 21
Если переменная Возраст будет иметь значение, превышающие число 21, выражению
будет соответствовать логическое значение True (Истина). Если же значение переменной
будет равно или меньше числа 21, выражению будет соответствовать логическое значение
F a l s e (Ложь).
Выражение которому соответствует одно из логических значений, может быть использовано в качестве условия оператора If-Then:
Tf Возраст > 21 Then
Вместо заданного постоянного значения в выражении можно использовать значение другой переменной — в таковом случае сравниваться уже будут значения двух переменных:
If Возраст > ОграничениеПоВозрасту Then
Какое логическое значение будет соответствовать выражению Возраст > ОгранпчениеПоЗозрасту, зависит от значений двух переменных: Возраст и ОграниченкеПоБозрзсту.
Сравнивать можно не только числа, но и строки. В приведенном ниже примере имя, набранное в текстовом поле txtName (оно сохраняется как значение свойства Text), сравнивается со строкой Степан Разин. Если набранное имя совпадает с этой строкой, выражение
принимает значение True, если не совпадает — F a l s e :
If

(txtName.Text = "Степан Разин") Then
В приведенном примере наличие круглых скобок вовсе не обязательно. Они просто
помогают визуально выделить проверяемое выражение.

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

236

Часть V. Создание разветвлений и циклов

Если вы забыли, как обработать сразу несколько логических значений, вернитесь к
разделу "Логические операторы" главы 17.

Условныйonefiariioft Jf-Jhm
В Visual Basic .NET самым простым средством, с помощью которого программа может
сделать какой-то выбор, является условный оператор If-Then. Он проверяет, соответствует
ли значению или выражению логическое значение True. Если соответствует, программа выполняет определенную инструкцию, а если нет — эта инструкция игнорируется.
Вот как условный оператор If-Then выглядит в терминологии кодов BASIC:
If ЛоптческоеЗначение Then Инструкция
Продемонстрируем это на примере:
If Коллчество > 25 Then t x t N o t e . T e x t = " З а п о л н е н ! "
Visual Basic .NET интерпретирует данный код следующим образом.
1. Эта команда говорит компьютеру: "Проверь значение переменной Количество и, если оно больше числа 25, присвой свойству Text текстового поля
t x t N c t e значение Заполнен !".
2. Потом она, команда, добавляет: "Если значение переменной Количество
меньше или равно числу 25, пропусти эту инструкцию и переходи к выполнению кодов следующей строки программы."
Рассмотрим другой пример:
If Красный Or Желтый Then Сообщение = "Стоп"
Вот как это воспримет Visual Basic .NET.
1. Эта команда говорит: "Проверь значения переменных Красный и Желтый.
Если хотя бы одно из них равно значению True, присвой переменной Сообщение значение Стоп".
2. Затем она сообщает: "Если значения переменных Красный и Желтый совпадают со значением F a l s e , пропусти эту инструкцию и переходи к выполнению кодов следующей строки программы."
Условный оператор If-Then проверяет истинность или ложность условия, а затем выполняет или не выполняет какую-то одну инструкцию. Но что делать, если в зависимости от
условия должно быть выполнено или не выполнено сразу несколько инструкций? В таком
случае нужно воспользоваться разновидностью оператора If-Then, а именно оператором
If-Then-End If.

Oneftafnoft 7f-Jhen-£nd Jf
Этот оператор проверяет, соответствует ли выражению или переменной логическое значение True, и если это так, программа выполняет заданный набор инструкций. Синтаксис
оператора If-Then-End If выглядит следующим образом:
If Условие Then
Инструкция!
Инструкцкя2
End If

Глава 22. Условные операторы If-Then

237

Посредством данного кода программа говорит компьютеру: "Проверь, соответствует ли
переменной или выражению Условие логическое значение True, и если соответствует, выполни все инструкции, указанные между словами Then и End If".
Рассмотрим пример:
If ПравильныйОтвет = True Then
ЗадачаРешена = True
t x t M e s s a g e . T e x t = "Отличный р е з у л ь т а т ! "
End I f
Вот как Visual Basic .NET интерпретирует эти колы.
15 можно заменить противоположным (Курс 4 ложно, продолжай выполнять инструкции, набранные
между этой строкой и строкой Loop. Как только условие станет истинным
(это произойдет когда переменная Счетчик примет значение 5), заканчивай
выполнение этого цикла и переходи к следующим кодам программы".
4. В четвертой строке значение переменной Счетчик увеличивается на единицу.
5.* Пятая строка говорит: "На этом набор инструкций цикла заканчивается. Возвращайся опять к проверке условия".
На каждой итерации значение переменной Счетчик увеличивается на единицу. Как только оно станет равным 5, условие примет истинное значение и выполнение цикла прекратится.
Чтобы цикл не превратился в бесконечный и программа не зависла, убедитесь, что
по крайней мере одна из команд цикла может через какое-то количество итераций
сделать условие истинным.

Циклы, выполняющие не менее
одной
Иногда возникает необходимость, чтобы набор инструкций цикла выполнялся хотя бы
один раз. Циклы Do-While и Do-Until для решения такой задачи не подойдут, поскольку
они вначале проверяют условие, а затем могут выполнить или не выполнить набор инструкций. В Visual Basic .NET есть еще два типа циклов, которые предназначены для решения
именно таких задач. Они вначале выполняют одну итерацию, затем проверяют условие и, в
зависимости от того, выполняется оно или нет, переходят к новой итерации или завершают
свою работу.

Циклы Do-Loop Until
Эти циклы продолжают выполнение итераций до тех пор, пока проверяемое условие не
станет истинным. Выглядят они так:

Глава 24. Создание циклов

251

Do
' Набор инструкций
Loop U n t i l Условие
Такой код говорит Visual Basic .NET: "Выполни набор инструкций, затем проверь условие. Если оно истинно, переходи к следующим кодам программы, а если ложно, начинай все
сначала1'.
Рассмотрим следующий пример:
Dim Счетчик As I n t e g e r
Счетчик - О
Do
Счетчик = Счетчик + 1
Loop Until Счетчик > 4
Вот что этот код означает для Visual Basic .NET.
1. В первой строке создается переменная типа I n t e g e r и ей присваивается имя
Счетчик.
2. Во второй строке переменной Счетчик присваивается нулевое значение.
3. Третья строка говорит: "Отсюда начинается выполнение инструкций цикла
Do-Loop U n t i l " .
4. В четвертой строке значение переменной Счетчик увеличивается на единицу.
5. Пятая строка говорит Visual Basic .NET: "На этом выполнение набора инструкций цикла Do-Loop U n t i l завершается. Проверь, какое логическое значение соответствует условию, представленному выражением Счетчик > 4.
Если False, переходи к строке, с которой начинается этот цикл, и снова выполняй набор его инструкций, если True — переходи к реализации следующих кодов программы".
При каждом повторном выполнении набора инструкций цикла значение переменной
Счетчик увеличивается на единицу. Когда оно станет равным 5, условие будет считаться истинным, а выполнение цикла остановится.
Уоедитесь, что повторные итерации рано или поздно приведут к тому, что проверяемое условие станет истинным. В противном случае цикл будет выполняться до
бесконечности и программа просто зависнет.

Циклы Do-Loop While
Подобные циклы нередко можно встретить в повседневной жизни. Суть их в том, что они
повторяются до тех пор, пока выполняется какое-то условие. Например, если ребенку насыпать в тарелку его любимую кашу и дать ложку, то он будет опускать ложку в тарелку, набирать кашу и возвращать ложку себе в рот. Этот "цикл" будет повторяться до тех пор, пока в
тарелке будет оставаться каша. Как только каша закончится, выполнение цикла прекратится.
Ребенок, конечно, может потребовать добавку, но это будет уже другой цикл.
В кодах BASIC цикл Do-Loop While выглядит так:
DO

' Набор инструкций
Loop While Условие

252

Часть V. Создание разветвлений и циклов

Код говорит Visual Basic .NET: "Выполни набор инструкций и проверь, какое логическое
значение соответствует выражению или переменной, выступающим в качестве условия. Если
это True, переходи к строке Do и снова выполняй набор инструкций, а если F a l s e — заканчивай выполнение данного цикла и переходи к следующим кодам программы".
Проиллюстрируем сказанное таким примером:
Dim Счетчик As Integer
Счетчик:= О
Do
Счетчик = Счетчик + 1
Loop While Счетчик < 5
Вот как эти коды будут восприняты Visual Basic .NET.
'• ^ первой строке создается переменная типа I n t e g e r и ей присваивается имя
Счетчик.
2. Во второй строке переменной Счетчик присваивается нулевое значение.
3. Третья строка говорит: "Отсюда начинается выполнение инструкций цикла
Do-Loop While".
4. В четвертой строке значение переменной Счетчик увеличивается на единицу.
5. Пятая строка говорит Visual Basic .NET: "На этом выполнение набора инструкций цикла Do-Loop While завершается. Проверь, какое логическое значение соответствует условию, представленному выражением Счетчик < 5.
Если таковым является True, переходи к строке, с которой начинается этот
цикл, и снова выполняй набор его инструкций. Но если это значение F a l s e ,
переходи к выполнению следующих кодов программы".
При каждом повторном выполнении набора инструкций цикла значение переменной
Счетчик увеличивается на единицу. Когда оно станет равным 5, условие перестанет выполнятся и цикл будет остановлен.
Убедитесь, что повторные итерации рано или поздно приведут к тому, что проверяемое условие станет ложным. В противном случае программа зависнет.

цикллцч,ше?
Хотя некоторые циклы выглядят очень похожими друг на друга, выполняемые ими действия заметно различаются. Чтобы не запутаться, имеет смысл выбрать из них один-два и всегда стараться при написании программы использовать только их. В таком случае вам будет
легче писать программу, а другим программистам будет легче читать ее коды.
Если выполнение инструкций цикла при определенных условиях может быть пропущено,
выберите для себя один из этих двух циклов:
Do While Условие
1
Набор инструкций
Loop

Do U n t i l Условие
' Набор инструкций
Loop

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

Глава 24. Создание циклов

253

Do
' Набор инструкций
Loop Until Условие

Do
1

Набор инструкций

Loop While УелоEiie

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

Тест на проверку полученных вами знаний
1. Чем циклы D o - U r i t i l отличаются от циклов Do-While?
а. Циклы Do-Until более правильные, поскольку предпочитают истинные условия,
в то время как циклам Do-While
больше нравятся ложные условия.
б. Ничем не отличаются, разве что пишутся
по-разному.
в. Цикл Do-While прекращает выполнение итераций, как только проверяемое
условие
становится ложным, а цикл Do;
U n t i l прекращает свою работу сразу
после того, как проверяемое условие
становится истинным.
г. А по-моему, они одинаковые.

254

2. Почему цикл Do-While может ни разу не выполнить набор своих инструкций?
а. Потому что вы просто забудете написать эти
инструкции.
б. Это недоработка Visual Basic .NET- иногда
цикл "забывает" выполнять свои инструкции.
в. Потому, что условие проверяется до выполнения первой итерации, а если ему сразу соответствует значение F a l s e , Visual Basic
.NET переходит к выполнению следующих
кодов программы.
г. Свой вариант.

Часть V. Создание разветвлений и цикло

Глава25

Циклы, которые умеют считать
В'atHOU

главе...

У Цикл For-Next
> Прямой и обратный порядок отсчета
> Ключевое слово Step

иклы, рассмотренные в главе 24, выполняются некоторое количество раз — до тех
пор, пока проверяемое условие не станет истинным или ложным. Но довольно часто
возникают ситуации, когда вы заранее можете точно сказать, сколько именно должно быть
выполнено итераций. Конечно, используя циклы Do-While и Do-Until, также можно было
бы создать код, который выполнял бы определенный набор инструкций заданное количество
раз. Но зачем заново изобретать велосипед, если можно просто воспользоваться циклом
For-Nexr, специально предназначенным для подобных целей.
Выглядит цикл For-Next следующим образом:
Dim Счетчик As I n t e g e r
For Счетчик = Начало То Конец Step X
НаборИнструкций
Next Счетчик
Здесь словом Счетчик обозначена переменная, содержащая числовое значение. Начало — это значение, присваиваемое переменной Счетчик перед началом выполнения первой
итерации. Конец— это значение переменной Счетчик, при котором набор инструкций выполняется последний раз. Буквой X обозначено число, которое добавляется к значению переменной Счетчик при выполнении каждой итерации (другими словами, X— это шаг, с которым изменяется значение переменной Счетчик). Если ключевое слово Step и число X опушены, шаг принимается равным единице.

Afa/c /iadb/нае/н цикл
Если вам нужно, чтобы набор инструкций был выполнен ровно три раза, наберите такой код:
Dim X Аз I n t e g e r
For X = 1 То 3
1
Набор инструкций
Next X
Вот как работает этот код.
л5^^*
1. Первой строкой создается переменная типа I n t e g e r и ей присваивается имя X.
2. Вторая строка говорит компьютеру: "Присвой переменой X значение 1. Выполняй этот цикл до тех пор, пока переменная X будет принимать значения 1,
2 или 3. Если переменная X примет какое-нибудь другое значение (например,
4), прекрати выполнение данного цикла.

Глава 25. Циклы, которые умеют считать

255

3. В третьей строке вы можете набрать одну или несколько инструкций, которые
будут выполняться па каждой итерации. В числе этих инструкций могут быть
также и другие циклы For-Next.
4. Четвертая строка говорит: "Присвой переменной X следующее значение
(поскольку в данном случае шаг установлен по умолчанию, т.е. равен единице,
следующее значение будет на единицу больше предыдущего) и снова переходи ко второй строке".
Итак, следующей строкой определяется цикл, набор инструкций которого будет выполнен
три раза:
For X = 1 То 3
Поскольку шаг, с которым изменяется значение переменной X, по умолчанию равен единице, количество итераций в конечном счете определяется разностью между числом, которое
присваивается переменной X перед выполнением цикла, и числом, после присвоения которого переменной X выполняется последняя итерация.
Для большей ясности продемонстрируем это на примере:
For 1209 То 1211
' Набор инструкций
Next X
Хотя здесь значения переменной X совсем другие, чем в первом примере, набор инструкций также будет выполнен ровно три раза:
• первая итерация, X = 1209;
• вторая итерация, X = 1210;
• третья итерация, X = 1211.
Применять такие нестандартные числа имеет смысл в том случае, если они как-то
соотносятся с данными, используемыми вашей программой. Например, они могут
быть порядковыми номерами клиентов из вашей базы данных:
For КодКлиента = 1250 То 1290
' На каждой итерации обрабатывается информация по
' клиенту, чей код соответствует присвоенному в
' данный момент значению переменной КодКлиента
Next КодКлиента
В этом цикле значение переменной КодКлиента используется не только для отсчета количества итераций, но и для ссылки на информацию в базе данных о конкретном клиенте.
СОВЕТ ± Вели значения переменной будут использоваться только для отсчета количества
итераций, начинайте таковой с числа 1, чтобы легче было понять, сколько именно
итераций будет выполнено. Например, если инструкции должны повторяться пять
раз, наберите код
For X = 1 То 5
' Набор инструкций
Next X
И только если эти значения имеют какой-то дополнительный смысл в отношении
информации, обрабатываемой в процессе выполнения цикла, используйте коды наподобие следующих:

256

Часть V. Создание разветвлений и циклов

For ИмяЛерсменной = 3213 To 3218
' Набор инструкций
Next ИмяПеременнсй

Л/иямой и o^ftafilfibtu nofuiqoK
Обычно при выполнении циклов For-Next значение переменной, которая используется
в качестве счетчика, увеличивается на единицу после каждой итерации. Но шаг можно изменить и увеличивать значение сразу на 5, 10 или, скажем, на 27 единиц. Чтобы сделать это,
нужно в коды добавить ключевое слово S t e p и указать величину шага, например:
Dim Счетчик As Integer
For Счетчик = s~art To end Step шаг
1
Набор инструкций
Next Счетчик
Ключевое слово Step говорит компьютеру: "Вместо того чтобы изменять значение переменной Счетчик с шагом 1, изменяй ее на число, указанное после меня". Если вы хотите,
чтобы шаг равнялся, предположим, числу 16, наберите такой код:
Dim X Аз Integer
For X = 0 То 32 Step 16
' Набоо инструкций
NexL X
В результате будет выполнено три итерации:
• первая итерация. X = 0;
• вторая итерация, X = 16;
• третья итерация, X -- 32.
При желании можно создать цикл, который будет отсчитывать итерации в обратном порядке. Например, чтобы отсчитать три итерации в обратном порядке, наберите такой код:
Dim X As I n t e g e r
For X •

= 3 To 1 S t e p -1
' Набор инструкций
Next X
Вот как программа будет выполнять его.
1. Первой строкой создается переменная X типа I n t e g e r .
2. Вторая строка говорит компьютеру: "Присвой переменной X значение 3 и отсчитывай итерации в обратном порядке до числа 1 с шагом - 1 " .
3. В третьей строке содержится набор инструкций, которые выполняются на каждой итерации.
4. Четвертая строка говорит: "'Уменьши значение переменной X на единицу и,
если оно сше не равно числу 1, снова выполняй набор инструкций".
Хотя цля Visual Basic .NET совершенно безразлично, с каким шагом и в каком порядке вы
производите отсчет итераций, старайтесь использовать для этого простейшие варианты, чтобы вам и другим людям, которые будут смотреть колы вашей программы, легче было понять,
сколько именно итераций будет выполнено.

Глава 25. Циклы, которые умеют считать

257

Обратный порядок отсчета, или нестандартный шаг, следует использовать
лишь в тех случаях, если значения счетчика как-то учитываются при выполнении инструкций на каждой итерации (т.е. если это действительно необходимо).
В противном случае вы просто сделаете коды программы более сложными для
понимания.
В заключение этого раздела рассмотрим еше один пример. Как вы думаете, что произойдет, если будет набран такой код:
Dim J As I n t e g e r
For J = 1 To 7 Step 5
1
Набор инструкций
Next J
Этот код будет выполняться следующим образом.
1. Перед выполнением первой итерации переменной J присваивается значение 1.
2. Перед выполнением второй итерации переменной J присваивается значение 6
(шаг равен числу 5; 1 + 5 = 6).
3. После того как выполнение второй итерации завершится, переменной J будет
присвоено значение 11 (6 + 5 = 11). Поскольку число 11 не принадлежит к
диапазону J = 1 То 7, третьей итерации не будет, и выполнение цикла остановится.

и ее использование
Если переменная, применяемая для отсчета количества итераций, не была ранее объявлена, цикл For-Next создает ее самостоятельно. Так, приведенным ниже кодом создается переменная XXL, значение которой изменяется с шагом 10:
For XXL = 1 То 50 Step 10
' Набор инструкций
Next XXL
Следующим кодом создается переменная KLM, значение которой изменяется с шагом 1,5:
For KLM = 1 То 7 Step 1.5
' Набор инструкций
Next KLM
В циклах For-Next обычно задается шаг, равный целому числу (например, 1, 2, 5
или 28). В этом случае легче определить количество выполняемых итераций. В
первом примере значение счетчика изменяется с шагом 10, поэтому нетрудно понять, что всего будет выполнено пять итераций.
Во втором примере в качестве шага указано число 1,5. Поскольку это число дробное, человеку определить количество итераций уже сложнее (компьютеру все равно, он и не такое может посчитать). Во втором примере, как и в первом, тоже будет
выполнено пять итераций, хотя это уже и не так очевидно.-Поэтому, чтобы не усложнять без надобности коды программы, избегайте применения в качестве шага
дробных чисел.

258

Часть V. Создание разветвлений и циклов

Создавая циклы For-Next, никогда (повторяем, никогда!) не изменяйте в процессе выполнения итерации значение счетчика. Это может привести к созданию бесконечного цикла и к зависанию программы. Проиллюстрируем сказанное на таком
примере:
For X = 1 То 5
X = 3
Next X
Вот к чему приведет выполнение этого кода.
1- В первой строке переменной X присваивается значение 1 и указывается, что
цикл будет выполняться до тех пор, пока ей, переменной X, не будет присвоено значение, превышающее 5.
2. Во второй строке переменной X присваивается значение 3.
3. В третьей строке значение переменной X увеличивается на единицу (оно становится равным 4), и цикл переходит на следующую итерацию.
На каждой итерации переменной X будет присваиваться значение 3, по завершении итерации оно будет увеличиваться на единицу, и поскольку число 4 меньше числа 5 (значение,
при котором выполнение цикла останавливается), цикл будет повторяться снова и снова и без
внешнего вмешательства никогда не завершится. Поэтому при написании инструкций, предназначенных для выполнения на каждой итерации, убедитесь, что среди них нет тех, которые
самостоятельно изменяют значение счетчики.

ftoiqa ?or-Next лучше, нем qfitjiue циклы
Цикл For-Next разработан специально для таких случаев, когда количество итераций
заранее известно.
В подобных ситуациях можно, конечно, использовать и другие типы циклов. Например,
ниже приведены два цикла, выполняющие ровно по шесть итераций:
Dim X As I n t e g e r
X = 0

Dim X As I n t e g e r
For X = 1 To 6

Do While X < б
X = X + 1
1
HaCop инструкций
Loop

' Набор инструкций
Next X

Как видите, в данном случае цикл For-Next намного проще и понятней, чем цикл DoWhile. Ранее уже было отмечено, что существует огромное множество способов написания
кодов, корректно выполняющих одну и ту же задачу (наверное, их даже больше, чем способов написания неправильных кодов, которые не смогут выполнить задачу как надо). Но почти
всегда самый простой спо;об является одновременно и самым лучшим.

Глава 25. Циклы, которые умеют считать

259

Тест на проверку полученных вами знаний
1. Сколько итераций выполнит такой цикл:
For ID = 15 То 1 Step - I
1

Набор инструкций
Next ID

а. Пятнадцать итераций.
б. Тут без калькулятора не обойдешься.
в. Чего гадать? Надо набрать этот код и
проследить за его выполнением.
г. ф он вообще не будет выполняться! Он
ведь набран на бумаге, а не на компьютере.

260

2. Какой цикл лучше: F o r - N e x t или DoWhile?
а. Если заранее известно, сколько должно быть
выполнено итераций, лучше использовать
цикл F o r - N e x t .
б. F o r - N e x t лучше, потому что он не похож
на остальные циклы.
в. Лучше D o - W h i l e . F o r - N e x t , наверное,
настолько сложный, что под него выделена
отдельная глава.
г. Все циклы плохие, не стоит на них зацикливаться.

Часть V. Создание разветвлений и ци

Глава26

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

Afa/c /iadb/на/о/н вложенные циклы
Если вы создаете один цикл внутри другого, итерация внешнего цикла не будет выполненной, пока не будут выполнены все итерации вложенного цикла. Проиллюстрируем сказанное на таком примере:
Dim J l.s I n t e g e r , Имя As S t r i n g
Do While Имя = "Майкл"
For J = 1 To 5
1
\абор инструкций
Next С
Loop
Вот как этот код будет воспринят компьютером.
1. в первой строке создается переменная J типа I n t e g e r и переменная Имя ти~
па S t r i n g .
2. Вторая строка говорит компьютеру: "Сравни значение переменной Имя со
строкой Майкл. Если они совпадают, переходи на третью строку. Если не
совпадают — заканчивай выполнение данного цикла".
3. Третья строка дает указание: "Присвой переменной J значение 1, с каждой
итерацией увеличивай его на единицу и продолжай выполнять набор инструкций цикла For-Next до тех пор, пока переменная J на примет значение
больше 5".
4. Четвертая строка содержит набор инструкций, которые выполняются на каждой итерации цикла For-Next.
5. Пятая строка говорит: "Увеличь значение переменной J на единицу и снова
переходи к третьей строке".
6. Шестая строка сообщает: "На этом выполнение очередной итерации цикла
Do-While заканчивается. Переходи на вторую строку и снова сравнивай значение переменной Имя со строкой Майкл". (Обратите внимание: если среди
инструкций цикла Do-While нет команды, которая могла бы изменить значение переменной Имя, цикл превратится в бесконечный и программа зависнет.)

Глава 26. Вложенные циклы

261

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

по использованию
вложенных циклов
Visual Basic .NET позволяет вкладывать друг в друга любое количество циклов.
Для вас как программиста главное — не запутаться в их кодах и видеть "общую
картину". Помочь в этом могут отступы, которые обозначат границы каждого цикла. Посмотрите на код, набранный без отступов:
Do While Имя = "Сэм"
Do
For К = 20 То 50 S t e p 10
Do
Do U n t i l ID - 13
* Набор инструкций
Loop
Loop While Возраст > 21
Next К
Loop U n t i l Код = 1234
Loop
А теперь посмотрите на те же команды, оформленные с применением отступов:
Do While Имя = "Сэм"
Do
For К = 20 То 50 S t e p 10
Do
Do U n t i l ID = 13
л
Набор инструкций
Loop
Loop While Возраст > 21
Next К
Loop U n t i l Код = 1234
Loop
Для компьютера оба кода идентичны, но для человека намного предпочтительней второй
вариант. Если начало и окончание циклов помечено посредством отступов, код становиться
намного проще для чтения и понимания. Редактор кодов Visual Basic .NET может автоматически добавлять отступы, но если вы хотите лично контролировать данный процесс, можете
делать это вручную.
Если вы создаете вложенные циклы, убедитесь, что команды вложенных циклов не изменяют значения переменных, используемых в качестве счетчиков для внешних циклов.
В противном случае может быть создан один большой бесконечный цикл, и в поисках
ошибки вам придется просматривать коды всех внешних и вложенных циклов.
Другой проблемой при создании вложенных циклов может стать выход одного цикла за
пределы другого, например:

262

Часть V. Создание разветвлений и циклов

For К = 1 To 4
For J = 2 To 10 Step 2
Next К
Next С
На самом деле это уже превращается в попытку (надеюсь, непреднамеренную) создать не
вложенные циклы, а пересекающиеся. Разумеется, такой код нелогичен и работать не будет.
К счастью, Visual Basic .NET автоматически отлавливает подобные ошибки, а их исправление
не составляет большого труда.

завершение циклов
Циклы, которые начинаются с ключевого слова Do, продолжают выполнять итерации до
тех пор, пока соответствующее проверяемому условию логическое значение не изменится на
противоположное. Цикл For-Next выполняет заранее заданное количество итераций. Но
что делать, если в процессе выполнения очередной итерации возникает необходимость немедленно прекратить выполнение всего цикла? Специально для таких случаев существует
команда E x i t (Выход).
Чтобы немедленно завершить выполнение цикла, начинающегося со слова Do, наберите
команду E x i t Do:
Dim X As I n t e g e r
X = 0
Do While X < 6
X = X + 1
If X = 4 Then E x i t Do
Loop
Цикл Do-While должен выполняться до тех пор, пока значение переменной X будет
меньше 6. Но на самом деле он закончится еще раньше, поскольку по достижении переменной X значения, равного 4, вступит в действие команда E x i t Do и цикл будет прерван.
Для немедленной остановки цикла For-Next используется команда E x i t For;
For 0 = 1 То 100
If Q = 50 Then Exit For
Next Q
Изначально этот цикл должен выполнить 100 итераций, но поскольку при значении Q,
равном 50, запускается команда E x i t For, произведено будет всего 50 итераций.
Используйте команды немедленного выхода из циклов осторожно и только в тех случаях, когда это действительно необходимо. Сразу же проверьте, не будут ли такие выходы преждевременными и не приведет ли это к возникновению ошибок, чтобы при отладке программы вы не ломали себе голову над вопросом iLHy почему она работает неправильно?1'
При использовании команды E x i t для выхода из вложенного цикла завершается
не весь цикл, а именно этот вложенный цикл, а далее продолжается выполнение
итерации внешнего цикла.

Глава 26. Вложенные циклы

263

Тест на проверку полученных вами знаний
1 . Сколько циклов может быть вложено друг в
друга?
а. Их вообще нельзя вкладывать. Это же не
условные операторы.
б. Теоретически количество вложенных циклов
ничем не ограничено. Однако не забывайте,
что чем больше циклов вы вложите друг в
друга, тем сложнее будет потом понять, что
каждый из них делает.
в. Количество вложенных циклов ограничивается терпением и трудолюбием каждого отдельно взятого программиста.
г. Ничем, Если бы за каждый вложенный цикл
платили деньги, это был бы хороший бизнес.

264

2. Что нужно сделать, чтобы вложенные друг в
друга циклы стали легче для чтения и понимания?
а. Нужно выучить на память эту главу, и тогда картина начнет проясняться.
б. О! Нужны годы практики, чтобы научиться
наконец читать и понимать коды вложенных циклов.
в. Нужно снабдить их обильными комментариями- тогда и "чайнику" все будет понятно.
г. Нужно добавить отступы, чтобы лучше
было видно, где каждый из циклов начинается и где заканчивается.

Часть V. Создание разветвлений и циклов

ЧастьVI

Создание подпрограмм

OkN\\>Xi.

Наконец пришло время узнать, как разбить одну большую программу Visual Basic .NET на много маленьких подпрограмм, чтобы
она стала проще для написания, чтения, понимания и внесения изменений. Вместо того чтобы писать одну огромную монолитную
программу (похожую на каменное изваяние, вытесанное с огромным трудом из цельной скалы), намного разумней будет написать
ряд маленьких подпрограмм и соединить их в одно целое (подобно
тому как из маленьких кирпичиков складывается большое здание).
Разделив программу на несколько подпрограмм, вы без труда сможете протестировать каждую из них, проследить за ее выполнением.
Решить маленькую задачу просто. Решить последовательно много
маленьких задач тоже несложно, это лишь вопрос времени. Вот почему разработка подпрограмм — это путь, которым идут все опытные программисты, создающие серьезные программные продукты.

Глава27

Общие процедуры
главе...
> Создание общих процедур
У Присвоение имен общим процедурам
> Использование общих процедур
ш ж роцедуры -— это небольшие подпрограммы, из которых состоит одна большая про* ^ •** 1рамма (аналогично тому, как из отдельных кирпичиков складывается здание). В
Visual Basic .NET есть два вида процедур: процедуры обработки событий и общие процедуры.
ПроцсОуры обработки событий, равно как и кнопки, флажки, переключатели, являются частью пользовательского интерфейса. Они сохраняются в файле формы и выполняются лишь при
условии, что случается некоторое событие в отношении объекта, для которого они написаны
(например, пользователь щелкает на кнопке или выбирает команду контекстного меню).
Общие процедуры не относятся к какому-то конкретному объекту пользовательского интерфейса. Они ничего не делают до тех пор, пока процедуры обработки событий (или другие
общие процедуры) не прикажут им начать работу.
Итак, нужны ли процедуры обработки событий? Да. Они обеспечивают способность пользовательского интерфейса адекватно реагировать на действия пользователей. Нужны ли общие процедуры? Нет. Они создаются только из прихоти программистов.
Но вот какая возникает проблема. Если одна или несколько процедур обработки событий
должны осуществлять одинаковые или подобные действия (что случается довольно часто),
коды для их выполнения придется набирать по нескольку раз для каждой отдельной процедуры, а это уже делает работу программиста довольно рутинной и скучной. Более того, при необходимости модифицировать коды для одного какого-то выполняемого действия вносить
изменения придется во все процедуры обработки событий, где такие коды встречаются.
Чтобы избавить себя от необходимости набирать одни и те же коды для разных процедур обработки событий, сохраните их в общей процедуре. То есть общая процедура позволяет сохранять
коды, общие для разных объектов и разных событий, в одном месте и в одном экземпляре. Теперь,
если нужно будет их модифицировать, достаточно внести изменения только один раз.

incucoe файлы мафией
Любая программа, написанная на языке Visual Basic .NET, состоит не менее чем из одного
файла формы, а каждый файл формы содержит в себе процедуры обработки событий, которые делают программу рабочей. Если же вы создаете общую процедуру, можете также сохранить ее в файле формы.
Правда, сохраняя общие [[роцедуры и процедуры обработки событий в одном файле формы, вы делаете коды программы запутанными и сложными для понимания. Представьте, что
было бы, если бы в один ящик своего стола вы складывали все свои тетрадки, дискеты, компакт-диски, носовые платки, журналы и еще много всякой всячины. И в первом и во втором
случае процесс поиска нужного компонента или вещи превращается в нелегкую задачу. В качестве альтернативного варианта Visual Basic .NET предоставляет возможность сохранять
общие процедуры отдельно, в файлах модулей.

Глава 27. Общие процедуры

267

Многие программисты предпочитают сохранять общие процедуры, выполняющие
один класс задач, в отдельных файлах. Например, процедуры, отвечающие за печать документов, сохраняются в одном файле, а процедуры, отвечающие за их редактирование,— в другом. Таким образом, если вдруг возникнут ошибки при выводе документа на печать, нетрудно будет понять, что искать их нужно в том файле, где содержатся общие процедуры, отвечающие за данный процесс.
На рис. 27.1 показана структура файла, в котором сохранены сразу все процедуры, выполняемые программой. При возникновении какой-либо ошибки найти таковую во всем этом
обилии кодов будет крайне тяжело. Но если вы разобьете подобные процедуры на разные
группы и сохраните их в отдельных файлах, как это показано на рис. 27.2, коды уже не будут
казаться такими сложными и запутанными, а процесс поиска ошибок потребует меньшего
времени и усилий.
Коды для сохранения файлов
Коды для проведения математических вычислений
Коды для открытия файлов
Коды для отображения графических элементов
Коды для печати файлов
Коды для отображения сообщений на экране
Коды + я обработки статистических данных
Рис. 27.1. Если все коды вашей программы будут сохранены в одном
файле, модифицировать их и исправлять ошибки будет очень тяжело
Модуль 1
Коды для сохранения файлов
Коды для печати файлов
Коды для открытия файлов
Модуль2
Коды для отображения графических элементов
Коды для отображения сообщений на экране
Модул ьЗ
Коды для проведения математических вычислений
Коды для обработки статистических данных
Рис. 27.2. Коды программы, разбитые по группам и сохраненные в отдельных файлах,
более легки для понимания и внесения изменений

268

Часть VI. Создание подпрограмм

Программа Visual Basic .NET может состоять из любого количества файлов модулей или не иметь таковых вообще.
Для создания нового файла модуля выполните следующие действия.
1. Выберите команду Project^-AddModule (Проект^>Добавить модуль).
Откроется диалоговое окно Add New Item (Создание нового элемента), показанное на рис. 27.3.
Add New Item - DngFood
_J Web Propel Herat
_j Local Po
i |eellemj
'„J Modee
l rFe
li s

Ca
lss

Component User Control
Ca
lss

DataSel

Hum:
Open

Hdp

Рис. 27.3. Окно создания для программы нового файла модуля
2. Щелкните на значке Module, а затем — в текстовом поле Name.
3. Наберите имя нового файла модулей.
Не забудьте указать расширение . VB.
4. Щелкните на кнопке Open.
Visual Basic .NET отобразит в окне Solution Explorer название только что созданного файла (если в данный момент это окно открыто), а в окне кодов откроет
пустой файл модулей, который будет выглядеть так, как показано ниже (вместо
слова Kodulel должно отображаться название файла, которое вы указали на
третьем шаге):
Module Modulel
End Module

Создание общих n
Код общей процедуры представлен ниже:
P u b l i c Sub ИмяПроцедуры()
' Инструкции
End Sub

Глава 27. Общие процедуры

269

Обратите внимание, что этот код имеет пять составляющих:
S ключевое слово Public (или P r i v a t e ) ;
S

ключевое слово Sub;

'? S название процедуры (ее имя);
| S

пара круглых скобок ( ) ;

*'S

ключевые слова End Sub.

Слово P u b l i c указывает на тот факт, что процедура является глобальной. Если вы сохранили общую процедуру в файле модуля, вызывать ее может любая другая общая процедура или процедура обработки событий, сохраненная в файле модуля или в файле формы.
Если вы хотите ограничить область видимости процедуры теми процедурами, которые
сохранены в том же файле, наберите вместо слова P u b l i c ключевое слово P r i v a t e :
P r i v a t e Sub ИмяПроцедуры()
1

Инструкции

End Sub
Если вы сохраняете общую процедуру в файле формы, вызывать ее могут только те
процедуры, которые сохранены в этом же файле. Следовательно, процедуры, сохраненные в файле формы, не могут быть глобальными.
Ключевое слово Sub идентифицирует данный фрагмент кода как процедуру (если вместо
слова Sub набрать слово F u n c t i o n , будет создана общая функция, которая описывается в
главе 29). Имя процедуры является тем словом, которое используют другие общие процедуры
и процедуры обработки событий для ее вызова. Вызов определенной процедуры означает, что
к ней обращаются со словами: "Эй! Уважаемая, теперь твоя очередь что-то делать."
Пара круглых скобок называется списком аргументов (он будет подробно рассмотрен в
главе 28). Простейшие общие процедуры имеют пустые списки аргументов, о чем свидетельствует пустая пара круглых скобок.
Коды общей процедуры заканчиваются словами End Sub.
Создать и сохранить общую процедуру можно:
i S во-первых, в файле формы (т.е. в том же файле, где хранится информация об объек\
тах пользовательского интерфейса, таких как кнопки, раскрывающиеся меню и т.п.);
S во-вторых, в файле модулей.
Сохраняя коды общих процедур в отдельных файлах, вы можете создать целую
библиотеку полезных процедур, которые затем будут использованы в других создаваемых вами программах Visual Basic .NET. Вообще, оптимальным вариантом
является сохранение всех общих процедур в отдельных файлах модулей, а всех
процедур обработки событий— в файлах форм. В таком случае всекоды, относящиеся к работе пользовательского интерфейса, будут отделены от кодов, выполняющих вычисления и обработку данных.

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

270

Часть VI. Создание подпрограмм

При необходимости создать и сохранить общую процедуру в файле формы, вы должны
выполнить такие действия.
1. Чтобы открыть окно кодов, в окне Solution Explorer щелкните на названии
файла формы и нажмите клавишу , выберите команду View^Code или
щелкните на значке View Code.
2. Прокрутите окно кодов таким образом, чтобы увидеть блок с надписью
Windows Form Designer generated code (рис. 27.4).
3. Щелкните прямо под надписью Windows
code и наберите код общей процедуры.
Eraject Build Qebug Toob

tfttdow

Form

Designer

generated

Help

~l *4 Sou
lto
inD
'ogFood II proe
ict]
* н

|



П

Р

И

t v e m d e s Public S!.ib Disposed
;'y5^^s . Dispose
components.Dispose

Put l i t

SIJJ

FcocedureName o |

End Sub
recced f-Jr. Buttonl_Click [£ у''*-1 sender As Object,
Ccnsr CIOBor.us As S i n a l e = 2C.S
Pirn MySalary, CEOSalary Ai £ir.ale
HySalary " 10C0
CEOHalacy - HySalary * CEOEcnus
texcbo/l.Tot -L fCEOSalatyJ

E'/Val e

.,
„[ .

Ln б б Ш Ш Col 31

Seedy

Oi31

Рис. 27.4. ^Сод общей процедуры можно набрать прямо под надписью windows Form

Designer generated code

Создание и сохранение общих процедур в файлах модулей
Если вы еще не создали файл модуля, вернитесь, в начало этой главы, к разделу
"Что такое файлы модулей". Здесь вы найдете описание последовательности действий, отвечающих за создание файла модуля.
Далее вам необходимо создать и сохранить общую процедуру в файле модуля.
1. Выберите команду ViewoSolution Explorer или нажмите комбинацию клавиш .
Откроется окно Solution Explorer.
2. Дважды щелкните на имени файла модуля, в котором хотите создать общую
процедуру.

Глава 27. Общие процедуры

271

Visual Basic .NET откроет в окне кодов пустой файл модуля, который будет выглядеть следующим образом (вместо слова Module! должно отображаться действительное название файла):
Module Module!
rir.ci Module
3. Наберите коды процедуры в любом месте между строками МосиДе1 и End
YcdulG.
При создании глобальных общих процедур, которые могут быть вызваны любым
кодом вашей программы, используйте ключевое слово P u b l i c . Если нужно создать общую процедуру, вызывать которую смогут только процедуры, сохраненные
в этом же файле, наберите вместо P u b l i c ключевое слово P r i v a t e .

Л^исвоеяие имен, оЗщим nftoi^qifftaM
В отличие от процедур обработки событий, имена которых состоят из названия соответствующею объекта и названия события, общие процедуры могут быть названы любыми именами., которые, впрочем, должны:
•/' состоять не более чем из сорока символов;
S начинаться с буквы и включать только буквы, цифры и символы подчеркивания ( _ );
•/ не совпадать с зарезервированными в Visual Basic .NET ключевыми словами
(такими как End, Sub и P r i v a t b ) .
Процедурам рекомендуется давать такие имена, которые будут как-то описывать выполняемые ими действия, например:

Коды названных такими именами процедур будут выглядеть так:
b_. :.c S'So Р.!-лчу1С::енкеСреднего { )

P ' - b l i c S"_:b СохрднениеУэсс^ва ( )

Вызов
Каждая общая процедура содержит в себе одну, несколько или множество инструкций.
1^-лтт одной процедуре требуется, чтобы были выполнены коды, сохраненные в другой процедуре, она должна пытать эту другую процедуру, воспользовавшись ее именем.

Часть VI. Создание подпрограмм

Вызвать для выполнения другую процедуру можно двумя способами. Во-первых, можно
просто указать имя этой процедуры:
ИмяПроцедуры {>
А во-вгорых, можно набрать ключевое слово C a l l и уже после него указать имя нужной
процедуры:
C a l l ИмлПроцедуры()
Для Visual Basic .NET совершенно безразлично, каким образом вы будете вызывать
другие процедуры, но чтобы коды были более понятными, выберите для себя какой-то один способ и придерживайтесь его постоянно.
Набрать лишь название процедуры проще, но если вы используете ключевое слово
C a l l , то впоследствии будет легче найти в программе те коды, которые вызывают
процедуры, сохраненные в других файлах.
Рассмотрим такой пример. Допустим, вы создали такую общую процедуру:
P u b l i c Sub Warning(>
MsgBox

("Your computer w i l l blow up in 3 s e c o n d s ! " _
,

,"Warning!")

End Sub
Единственное, что способна делать данная процедура, — это отображать на экране диалоговое окно, показанное на рис. 27.5.
Чтобы запустить эту процедуру из другого места программы (например, из какой-нибудь
процедуры обработки событий), достаточно набрать ее имя:
P u b l i c £ub cmciAierT._Click ()
Warn i.nc ()
End Sue
Тот же результат можно получить путем ввода перед названием процедуры ключевого
слова Cal-.:
P u b l i c Sub crr.dAlert_Click( )
Call Warning()
End Sub
Your computer will blow up fit 3 seconds!

Рис. 27.5. Диалоговое окно, открываемое
при вызове процедуры Wa rning ()
Оба последних кода эквивалентны такому коду:
Public Sub cmdAlert_CIick()
KsgBox

("Your computer w i l l blow up in 3 seconds!
,

,"Warning!")

End Sub

Глава 27. Общие процедуры

273

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

Тест на проверку полученных вами знаний
2. Как можно вызвать общую процедуру?
1 . Для чего создаются общие процедуры? .' >
а. Для того чтобы программа содержала
а. Открыть коды, программы, найти нужную
побольше кодов и ее можно было подо- - процедуру и нажать клавишу .
::
роже продать., ; V ' ; --*.* '.;•*•
б. Надо присвоить процедуре номер, подклю1
б. Многие программисты занимаются этим»
', . чить к компьютеру модем и с другого халжелая создать видимость выполнения f;v фона позвонить на этот номер [вам ответит
какой-то
работы.
'•
приятный женский голос),,.
в. Для того, чтобы не набирать заною одни и
•в. Это мокнр сделатьдвумя способами: либонате же инструкции/а также дпя того, чтобы ;
бравее и ^ , либо нэбравкшочевоеслоеоса11,
коды программы были проще для пониа посте него -опять таки имя процедуры.
мания и для внесения в них изменений.

274

Часть VI. Создание подпрограмм

Глава28

Использование аргументов
В'э*нойглаве...
>

Передача аргументов процедуре

>

Возможные проблемы при передаче аргументов

> Досрочный выход из процедуры

т£ огда процедура вызывает общую процедуру, она ссылается на ее имя. Если вызов
* V» происходит только по имени, управление просто передается вызываемой процедуре,
без какой-либо сопроводительной информации. При этом вызывающая процедура как бы говорит вызываемой: "Эй! Теперь твоя очередь работать. Начинай!"
Но довольно часто вызываемой процедуре, для того чтобы приступить к работе, нужно
иметь дополнительные сведения и инструкции. В частности, ей могут понадобиться специфические данные, на основании которых она сможет выполнять какие-то действия или использовать их для проведения расчетов.
Любая процедура, которая вызывает общую процедуру, может предоставить и необходимые для ее работы данные. Эти данные программисты называют аргументами. В таком случае вызывающая процедура говорит вызываемой: "'Эй! Теперь твоя очередь работать. Возьми
нужные тебе данные и начинай!"

2)ял него нужны
Аргументы — это данные (числа, строки либо переменные, содержащие в себе числа или
строки), которые нужны общей процедуре для выполнения ее работы. Воспользовавшись аргументами, можно создать простую, похожую на шаблон, процедуру, которая заменит собой несколько подобных процедур, использующих в своей работе заранее определенные значения.
Рассмотрим в качестве примера две общие процедуры. Одна из них отображает диалоговое окно с предупреждением:
P u b l i c Sub D i s p l a y C a u t i o n ()
TxtReadMe.Text = "Внимание! Это последняя попытка"
End Sub
Вторая отображает диалоговое окно с сообщением:
P u b l i c Sub D i s p l a y M e s s a g e ( )
TxtReadMe.Text = "Поздравляем! Отличная попытка"
End Sub
Любую из этих процедур можно вызвать, воспользовавшись одним из двух способов:
~ ^ D i s p l a y C a u t i o n ( ) или C a l l D i s p l a y C a u t i o n ( )
i ^

D i s p l a y M e s s a g e ( ) или C a l l D i s p l a y M e s s a g e ( )

Глава 28. Использование аргументов

275

Однако создавать для каждого сообщения отдельную процедуру —- это не лучший вариант. Вместо того чтобы писать несколько почти одинаковых процедур, можно написать лишь
одну, заменив специфическую информацию аргументом. Например:
P u b l i c Sub D i s p l a y ( ByVal Сообщение As S t r i n g )
TxtReadMe.Text = Сообщение
2nd Sub
Такая процедура говорит компьютеру: "Создай текстовую переменную Сообщение и
присваивай ей значения, которые будут передавать вызывающие меня процедуры. Каким бы
ни было переданное значение, присвой его свойству Text объекта txtReadMe".
Чтобы вызвать процедуру, для работы которой нужны дополнительные данные, приведите таковые в круглых скобках. Например, чтобы вызвать процедуру Display, наберите в
круглых скобках текст, который должен быть отображен на экране:
Display("Внимание! Это последняя попытка")
Или:
Display("Поздравляем! Отличная попытка")
Или:
Call Display("Внимание! Это последняя попытка")
Или:
Call Display("Поздравляем! Отличная попытка")

jLefteqan.a nftOtyeqiffie значений а/ггцмешпов
Для вызова процедуры и передачи ей данных (называемых аргументами) предусмотрены
два метода:
S ИмяПроцедуры (Аргумент)
: S C a l l ИмяПроцедуры (Аргумент)
Допустим, вами была создана такая общая процедура:
P u b l i c Sub Display(ByVal Сообщение As S t r i n g )
TxtReadMe.Text = Сообщение
End Sub
Чтобы вызвать эту процедуру и отобразить на экране сообщение "Внимание! Это последняя попытка", можно набрать один из двух кодов:
~ ^ Display("Внимание! Это последняя попытка")
. •/ C a l l Display("Внимание! Это последняя попытка")
Не имеет значение, какой из этих вариантов когда будет использоваться, но лучше остановиться на каком-то одном из них и применять его постоянно.
Теперь проследим за пошаговым выполнением вызываемой процедуры Display.
1. Код, посредством которого процедура вызывается, говорит компьютеру: "Найди
процедуру, именуемую Display, и передай ей текстовое значение Внимание !
Это последняя попытка". В данном случае строка Внимание ! Это последняя попытка является аргументом.

276

Часть VI. Создание подпрограмм

2. Visual Basic .NET находит общую процедуру Display и дает ей указание присвоить переменной Сообщение передаваемое значение.
3. Затем процедура Display говорит компьютеру: "Присвой значение переменной Сообщение свойству Text объекта txtReadMe". Поскольку значением переменной Сообщение является строка Внимание ! Это последняя попытка, свойству Text объекта txtReadMe будет присвоено это же значение.
Если znn вызова процедуры вы наберете код
D i s p l a y ( " П о з д р а в л я е м ! Отличная попытка")
свойству Text объекта txtReadMe будет присвоено значение Поздравляем! Отличная
попытка
Таким образом, создавая процедуры, использующие для своей работы значения аргументов, вы можете избавиться от необходимости писать по многу подобных процедур, обрабатывающих заранее определенные данные.

значений
Чтобы создаваемая общая процедура смогла получать внешние данные (значения аргументов), нужно задать для нее список аргументов. По сути, этим списком определяется,
сколько значений и каких типов может принять процедура.
Если создаваемой процедуре для работы дополнительные данные не нужны, список аргументов не создастся, о чем свидетельствует пара пустых скобок:
P u b l i c Л'-лЪ Самодостаточная ( )
End Sub
Чтобы вызвать такую процедуру, достаточно набрать один из двух кодов:
J Самодостаточная()
S C a l l Самодостаточная!)
А чтобы создать процедуру с одним аргументом, необходимо набрать такой код:
РпЫ i c ->UD ОдинАргумент (ByVal Число As I n t e g e r )
End Sub
Данная процедура объявляет о создании аргумента, представляемого переменной Число
типа i n t e g e r . Чтобы вызвать такую процедуру, нужно указать ее имя и значение аргумента:
S
S

ОдинАргукент(4)
C a l l ОдинАргумент(4)
Если при вызове подобной процедуры вы укажете значение не того типа (в нашем
случае отличное от типа Inr.eger), Visual Basic .NET воспримет это как ошибку и
откажется продолжать выполнение программы.

Аргументы-значения и аргументы-ссылки
Чтобы отдельные общие процедуры не могли повредить или удалить данные, используемые другими частями программы, Visual Basic .NET по умолчанию передает процедурам для

Глава 28. Использование аргументов

277

обработки только значения переменных, но не сами переменные. На тот факт, что процедуре
будут передаваться только значения, указывает ключевое слово ByVal.
Если процедуре в качестве аргумента передается значение, создается отдельная копия исходных данных, и процедура работает только с этой копией. Таким образом, как бы процедура не изменяла полученные значения, на исходных данных это никак не отразится и их целостность не будет нарушена.
Если при создании списка аргументов вы забудете набрать слово ByVal, Visual
Basic .NET добавит его автоматически.
На самом деле у вас есть возможность выбора: передавать процедуре для обработки только значения переменных или сами переменные. Если процедуре
передается значение переменной, она имеет дело лишь с копией исходных
данных. Но если передаются сами переменные, процедура получает возможность изменять исходные данные. Во втором случае появляется вероятность
возникновения ошибки, поскольку процедура может изменить данные, используемые другими частями программы. По умолчанию Visual Basic .NET передает процедуре только копии исходных данных (т.е. только значения переменных). Но если вам это действительно необходимо, можете позволить процедурам вносить изменения в исходные данные. Для этого вы должны вместо слова
ByVal набрать ключевое слово ByRef:
P u b l i c Sub НазваниеПроцедуры(ByRef_
ИмяПеременной As I n t e g e r )
End Sub

Объявление сразу нескольких аргументов
Процедура может использовать а своей работе сразу несколько аргументов. Но прежде в
списке аргументов необходимо указать их имена и типы получаемых данных. Объявляя аргументы, отделяйте их друг от друга запятыми. Ниже приведен код процедуры, которая объявляет, что будет использовать значения сразу трех аргументов, а именно I, S и D:
P u b l i c Sub Yellow(ByVal I As I n t e g e r , _
ByVal S As S t r i n g , ByVal D As Double)
End Sub
Вызвать эту процедуру и передать ей значения 30, Yes и 12 . 9 можно с помощью одного
из двух следующих кодов:

}У Yellow(30, "Yes", 12.9)
j ^ Call Yellow(30, "Yes", 12.9)
Теоретически никаких ограничений на количество используемых аргументов не существует, но чем больше вы их создаете, тем сложнее становится процедура и увеличивается вероятность того, что впоследствии вы не сможете вспомнить, зачем все эти аргументы нужны
и что вообще делает процедура.

278

Часть VI. Создание подпрограмм

возможные ошибки п/ги nefieqane
данных n/ioi$eqi/fie
Наиболее часто при вызове процедуры и передаче ей данных возникают ошибки двух типов. Во-первых, количество значений, передаваемых процедуре, может не совпадать с количеством объявленных для нее аргументов. Во-вторых, передаваемые данные могут не соответствовать типу объявленных аргументов.

Неверное количество переменных
Создавая процедуру и объявляя список аргументов, вы определяете точное количество
значений, которые должны быть переданы процедуре при ее вызове. Если набрать код, вызывающий процедуру, и попытаться передать ей другое количество значений (неважно, большее
или меньшее), это будет воспринято как ошибка и программа работать не станет. Например:
P u b l i c Sub Green(ByVal Число As I n t e g e r )
End Sub
Чтобы эта процедура работала правильно, ей нужно передать одно значение типа
I n t e g e r . Ни один из приведенных ниже способов вызова процедуры Green не является
корректным, поскольку в каждом случае передается ошибочное количество аргументов:
%•/ Green ()
»• G r e e n ( 9 , " S t o p ! " )
[ • Green("OK", " N o " , 334)

Неправильный тип данных
Вызывая процедуру, не забывайте о том, что передаваемые значения должны соответствовать тому типу данных, который был объявлен для аргументов в момент ее создания. Рассмотрим в качестве примера такую процедуру:
P u b l i c Sub Green(ByVal Строка As S t r i n g )
End Sub
Чтобы вызвать эту процедуру, нужно передать ей в качестве аргумента одно текстовое
значение. Приведенные ниже способы вызова процедуры являются ошибочными, поскольку
передаваемые значения — это числа, а не строки:
\S Green(42)
\s

Green (1)

!•

Green(12.053)

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

Глава 28. Использование аргументов

279

Чтобы немедленно прервать выполнение какой-либо процедуры, наберите такой код:
E x i t sub
Проиллюстрируем это на примере следующей процедуры:
P u b l i c Sub ПрерванныйЦикл()
X=О
Do
X = X + 1
If (X = 13) Then
E x i t Sub
End I f
Loop U n t i l X = 25
End Sub
Цикл Do-Until должен был выполнить 25 итераций, по окончании которых переменной
X было бы присвоено значение 2 5. Однако в самом цикле содержится оператор If-Then,
который при достижении переменной X значения 13 прерывает выполнение процедуры посредством команды E x i t Sub.

280

Часть VI. Создание подпрограмм

Глава29

Создание функций
$ э*ной глаёе...
У Вызов функций
У Использование аргументов
V Быстрое завершение функций
С^^^ункции представляют собой миниатюрные полпрограммы, которые получают дан*
ные, производят вычисления и возвращают результат. В Visual Basic .NET имеется
целый набор встроенных функций, обозначаемых разными загадочными именами. К их числу
относятся, в частности, функция Sqr (принимает число и возвращает его квадратный корень)
и функция LCase (принимает произвольную строку и возвращает этот же текст, набранный
строчными буквами). Четыре из числа наиболее часто используемых функций описаны в
табл. 29.1.
Таблица 29.1. Наиболее часто используемые функции Visual Basic .NET
Встроенная функция
Abs { ч л с л о )
D a

t e

Производимые действия
Возвращает модуль числа
Возвращает текущую дату

LCase ( с о р о к а >

Преобразует символы в символы нижнего регистра

Sqr (число)

Возвращает квадратный корень числа

Но Visual Basic .NET не ограничивается использованием только встроенных функций —
вам предоставляется возможность создавать собственные функции. Код обычной функции
выглядит так:
P u b l i c F u n c t i o n ИмяФункции(СписокАргументов) As
ТмпДанных
ИмяФункции = Значение
End F u n c t i o n
Если функция сохраняется в файле модуля, то слово P u b l i c указывает на тот факт, что
она может быть вызвана любой общей процедурой или процедурой обработки событий, сохраненной в каком-либо файле этой же программы. (Если сохранить функцию в файле модуля, но вместо слова P u b l i c ввести слово P r i v a t e , вызвать ее смогут лишь те процедуры,
которые сохранены в этом же файле.)
Если функция будет сохранена в файле формы, вызывать ее смогут только те общие процедуры или процедуры обработки событий, которые сохранены в этом же
файле формы.
Ключевое слово F u n c t i o n указывает на то, что подпрограмма является функцией. Вместо слова ИмяФункции наберите любое допустимое в Visual Basic .NET имя, но желательно

Глава 29. Создание функций

281

такое, которое будет каким-то образом описывать выполняемые функцией действия. СписокАргументов может быть пустым, а может объявлять некоторое количество аргументов.
Словом ТипДанных определяется, значение какого типа будет возвращаться функцией.
Приведенный выше фрагмент кода может быть набран несколько иначе:
Public Function ИмяФункции(СписокАргументов) As_
ТипДанных
R e t u r n Значение
End F u n c t i o n
Этот код отличается от предыдущего тем, что вместо непосредственного присвоения
имени функции возвращаемого значения использовано ключевое слово R e t u r n . Создавая
свою функцию, вы можете выбрать любой из этих способов определения значения, которое
должно быть возвращено.

Создание qbi/нщий
Создать и сохранить функцию можно:
1 S в файле модуля;
I S в файле формы.
Если вы сохраняете функцию в файле формы, она может быть вызвана и использована
только процедурой или функцией, сохраненной в этом же файле. Но если вы создаете и сохраняете функцию в файле модуля, она может быть вызвана любой процедурой или функцией, сохраненной в любом файле вашей программы.
Хорошим решением является сохранение всех функций в файлах модулей. В этом
случае коды, отвечающие за работу пользовательского интерфейса, не будут смешиваться с кодами, выполняющими обработку данных и производящими вычисления.

Создание функции в файле формы
Вот каким образом вы можете создать функцию в файле формы.
1. Чтобы открыть окно редактора кодов, в окне Solution Explorer щелкните на
названии файла формы, затем нажмите клавишу , выберите команду
View^Code или щелкните на значке View Code.
2. Прокрутите окно редактора кодов таким образом, чтобы был виден блок с
надписью Windows Form Designer generated code.
3. Щелкните прямо под надписью Windows
code и наберите код функции.

Form Designer g e n e r a t e d

Создание и сохранение функции в файле модуля
(Если файл модуля еще не создан и вы не знаете, как это сделать, вернитесь к главе 27, к
разделу "Что такое файлы модулей".)
Чтобы создать и сохранить функцию в файле модуля, выполните действия перечисленные ниже.
1. Выберите команду View^Solution Explorer или нажмите комбинацию клавиш .

282

Часть VI. Создание подпрограмм

Откроется окно Solution Explorer.
2. Дважды щелкните на названии файла модуля, в котором хотите сохранить
создаваемую функцию.
Visual Basic .NET в окне кодов откроет пустой файл модулей, который будет выглядеть так, как показано ниже (правда, вместо слова Modulel должно отображаться действительное имя файла):
Module Modulel
End Module
3. Наберите коды функции в любом месте между строками Module и End

Module.

/Зозв/гащаеммй(гезцлыпсип
Где-нибудь в кодах функции обязательно нужно либо набрать имя функции и сопоставить
ему значение или выражение, либо ввести ключевое слово Return, после него набрать значение или выражение. Это значение или значение, вычисляемое выражением, и будет тем результатом, который должна возвратить функция. Например:
P u b l i c F u n c t i o n ЯрдыМетры(ByVal Ярды As S i n g l e )
Single
Const Коэффициент = 0.9
ЯрлыМетры = Ярды * Коэффициент
End F u n c t i o n

As_

Или, что то же самое:
Public Function ЯрдыМетры(ВуУа1 Ярды As Single) As__
Single
Const Коэффициент = 0.9
R e t u r n Ярды * Коэффициент
End F u n c t i o n
Если вы не присвоите имени функции никакого значения или не наберете ключевое
слово Return, функция не вернет никакого результата, т.е. станет совершенно
бесполезной.
Функция в качестве результата может возвращать данные любого типа, в том числе
I n t e g e r , S t r i n g и Boolean. Более подробную информацию об использовании различных
типов данных вы можете найти в главе 15.
Существует три основных различия между функциями и процедурами.
Каждая функция производит вычисления и возвращает одно (и только одно)
значение. Процедуры же создаются для решения различных задач и выполнения определенных действий.
Где-нибудь в кодах функции должно быть указано значение, которое она
возвращает. Для процедуры ничего подобного делать не нужно.
Для каждой функции нужно определить тип данных, которые она возвращает в качестве результата. Для процедуры, опять-таки, этого делать не нужно.

Глава 29. Создание функций

283

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

Public Function ЯрдыМетры(ByVal Ярды As Single) As_
Single
Const Коэффициент = 0.9
ЯрдыМетры = Ярды * Коэффициент
End Function
Private Sub Buttonl_Click(3yVal sender As_
System.Object, ByVal e As System.EventArgs)_
Handles Buttonl.Click
Dim Метры As Single
Метры = ЯрдыМетры(CSng{txtЯpды.Text))
txtMeT-pbi.Text = CStr (Метры)
End Sub
Процедура обработки событий дает компьютеру указание: "Когда пользователь
щелкнет не кнопке B u t t o n l , ты должен выполнить ряд действий.
1. Создай переменную Метры, которая будет принимать значения типа S i n g l e .
2. Возьми значение, сохраненное в свойстве Text объекта т;у^ярды, преобразуй
его к типу S i n g l e и используй в качестве аргумента функции Ярдь:Метрь:.
3. Функция ЯрдыМетры возьмет это значение, умножит его на коэффициент 0,9
и вернет полученное значение как свой результат. Возьми этот результат и
присвой его переменной Кетры.
4. Значение, сохраненное в переменной Метры, преобразуй к текстовому виду и
присвой его свойству Text объекта txtMeT-ры."
Сравните коды, вызывающие процедуру и функцию. Процедуру можно вызвать так:

ИмяПрсцедуры(СписокАргументов)
либо так:

C a l l ИмяПроцедуры(СписокАргументов)
Чтобы вызвать функцию, нужно возвращаемое ею значение присвоить какой-нибудь переменной:

Переменная = ИмяФункции(СписокАргументов)
Если функция возвращает логическое значение, она может быть использована как
условие оператора I f - T h e n или других условных операторов:

If ИмяФункции(СписокАргументов)
' коды BASIC
End I f

284

Then

Часть VI. Создание подпрограмм

Поскольку функции возвращают какое-то одно значение, их можно использовать при вычислении математических выражений:
Переменная1 = ИмяФункции(Аргументы) + Переменная2
Например, процедура, вызывающая функцию ЯрдыМетры, может выглядеть так:
P r i v a t e Sub cmdConvert_Click()
D—in. Метры As S i n g l e , NewValue As Single
NewValue = (ЯрдыМетры(Метры) + 32) * 4
End Sub

Шип данных принимаемых
и возвращаемых значений
Поскольку функция возвращает только одно значение, обязательно нужно указать какойто один тип данных, которому это значение будет соответствовать.
Посмотрим еще раз на уже знакомую нам функцию:
P u b l i c Function ЯрдыМетры(ByVal Ярды As Single) As_
Single
Const

Коэффициент = 0.9

ЯрдыМетры = Ярды * Коэффициент
End

Function

Первая строка кодов этой функции заканчивается указанием на тип данных S i n g l e , который и будет соответствовать возвращаемому результату. Функции могут возвращать значения различных типов, среди которых и такие:
• ^ Integer;
Long;
' Boolean;
Single;
Double;
Decimal;
^' String.
Неважно, какой именно тип данных возвращается функцией, но тип переменной, которой
присваивается возвращаемое значение, обязательно должен с ним совпадать. Например:
Public Function ЯрдыМетры(ByVal Ярды As Single)

As_

Ccnst Коэффициент = 0.9
ЯрдыМетры = Ярды * Коэффициент
End

Function

P r i v a t e Sub Buttonl_Click(ByVal sender As_
System.Object,

ByVal e As System.EventArgs) __
Handles B u t t o n l . C l i c k

Глава 29. Создание функций

285

Dim Метры As S i n g l e
Метры = ЯрдыМетры(СБпд
txtMeTpbi.Text = CStr (Метры)
End Sub
Функция ЯрдыМетры возвращает значение типа S i n g l e ; переменная Метры, которой
присваивается возвращаемое значение, также имеет тип S i n g l e , поэтому такой код является
правильным.
Но допустим, что переменная Метры была объявлена как текстовая переменная:
Dim Метры As S t r i n g
В таком случае строка
Метры = ЯрдыМетры(CSng (txtHpflbi.Text) )
будет содержать ошибку, поскольку тип возвращаемого функцией результата и тип переменной, которой этот результат присваивается, не совпадают.

Тип принимаемых данных
Аргументы — это исходные данные (числа, строки либо переменные, содержащие числа
или строки), которые нужны функции для нормальной работы.
При объявлении списка аргументов нужно указать не только их количество и названия, но
и значения каких типов данных каждый из них будет представлять.
Каждый аргумент может представлять данные самых разных типов, в том числе и тех, которые возвращают функции (см. выше).
Ниже показана первая строка функции, которая использует в своей работе значения двух
аргументов типа I n t e g e r :
P u b l i c F u n c t i o n Convert(ByVal Fl As I n t e g e r , ByVal_
F2 As I n t e g e r ) As S i n g l e
Итак, при вызове такой функции ей необходимо передать два значения типа I n t e g e r , a
возвращаемое значение присвоить переменной типа S i n g l e . Далее представлены процедура
B u t t o n l _ C l i c k , несколько раз вызывающая функцию Convert, и комментарии, описывающие допущенные ошибки:
P r i v a t e Sub B u t t o n l _ C l i c k ( B y V a l s e n d e r As_
System.Object,
ByVal e As System.EventArgs)
Dim X, Y, Z As I n t e g e r
Dim А, В, С As S t r i n g
Dim L, M, N As S i n g l e
L = Convert(X, Y) ' В этой строке ошибок нет
С = Convert(А, В) ' А и В не I n t e g e r , С не S i n g l e
Z = Convert(M, N) ' М и N не I n t e g e r , Z не S i n g l e
Y = Convert("OK", X) ' Y не S i n g l e , "OK" - строка
End Sub

286

Часть VI. Создание подпрограмм

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

Передача неверного числа аргументов
При объявлении списка аргументов определяется обшее количество значений, которые
должны быть переданы функции в момент ее вызова. Если при вызове функции вы попытаетесь передать ей большее или меньшее количество значений, это будет воспринято как ошибка и программа откажется работать. Рассмотрим в качестве примера такую функцию:
P u b l i c F u n c t i o n Flash(ByVal Set As S t r i n g )

As S i n g l e

End F u n c t i o n
Для нормальной работы этой функции ей требуется передать одно текстовое значение.
Поэтому ни одна из предпринимаемых ниже попыток вызова функции не будет успешной,
поскольку значение либо не передается вовсе, либо передается более чем одно значение:
X = Flash
X = F l a s h ( " S u n " , "Moon")
X = F l a s h f ' S " , "M", " F " , 12)

Несоответствие типов данных
При вызове функции убедитесь, что ей передаются значения тех же типов, которые были
объявлены для ее аргументов. Обратимся еще раз к знакомой нам функции:
P u b l i c F u n c t i o n Flash(ByVal Set As S t r i n g )

As S i n g l e

End F u n c t i o n
При вызове этой функции ей нужно передать одно значение текстового типа. Все предпринимаемые ниже попытки вызова функции ни к чему не приведут, поскольку передаваемые
значения являются числами:
| ^ X = Flash(14.2135)
1,У X = F l a s h ( l O l )
I/ X = F l a s h ( 0 . 0 0 1 0 1 )

завершение fiaJotiibi qbi/нщии
Обычно функции продолжают свою работу до тех пор, пока не будет выполнена последняя инструкция. Однако в случае необходимости выполнение функции можно прервать.
Для этого достаточно набрать такой код:
Exit Function
Прежде чем команда E x i t F u n c t i o n будет приведена в действие, имени функции должно быть присвоено какое-то значение (т.е. должен быть определен возвращаемый функцией результат). В противном случае программа, скорее всего, будет работать некорректно.

Глава 29. Создание функций

287

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

288

2. Какая строка вызывает функцию, а какая процедуру:
Dim А, В, С As S i n g l e

А = 3


О

С = Black(А, В) 'Стр.А
FlashColour(С) 'Стр.5
а. В строке 4 переменной с присваивается значение, возвращаемое функцией B l a c k , а а строке 5 вызывается процедура F l a s h C o l o u r .
б. Первая строка вызывает процедуру, потому что
она самая длинная, а последняя строка вызывает функцию, потому что ома не похожа на все
остальные.
в. Вы можете выбрать звонок другу.
г. Вы можете выбрать подсказку зала.

Часть VI. Создание подпрограмм

ЧастьVII

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

;

#
ф
,
р
р
^
это именно то,
что поможет вам быстро и без особых усилий создавать надежные
; и качественные программы/ Секрет заключается в том, что методы
ooMinBO^pHeHrapOBaHHorp4 про!раммирования позволяют пра. вильно организовать структуру программы, а следовательно, упро1
шают процесс ее написания и поиск возможных ошибок. '
В этой части дается краткий^ обзор принципов и приемов объектно' ориентированного программирования, достаточный для того, что• бы вы смошн.1йачать исподьзоветь их при написании своих прог грамм. Конечно, сам факт применения методов объектноориентированного программирования не'гарантирует того, что вы
i* сразу же станете профессиональным программистом, но ваши шан*. сы написать эффективно работающую программу резко возраста\ ют. А создать^функционирующую программу не всегда удается да; же людям, работающим на крупные корпорации н правительства.
!

Глава30

Так что же это такое - объектноориентированное программирование?
В'э*£ой главе...
>

Создание структурированных программ

> Объектно-ориентированное программирование как способ решения различных проблем

i r r e отставая от новейших тенденций и достижений в области программирования,
* •* Visual Basic .NET предоставляет вам возможность для написания своих самых потрясающих программ использовать методы объектно-ориентированного программирования.
Конечно, если вы не будете знать, что это такое и "с чем его едят", все эти потенциальные
возможности останутся вами не замеченными и не использованными.
Поэтому, прежде чем сказать: "Мне это не нужно, я могу программировать и так", не поленитесь и прочтите следующие главы, чтобы иметь хотя бы общее представление о данном
предмете.
Одна из причин, почему было создано такое направление, как объектно-ориентированное
программирование, заключается в том, что несмотря на попытки многих учебных заведений
подготовить хороших программистов, программирование остается настолько специфической
сферой деятельности, что относится скорее к области искусства, чем к науке. Даже если вы
закончите вуз и получите диплом специалиста по компьютерным наукам, это еще не означает, что вы сможете программировать лучше, чем какой-нибудь школьник-вундеркинд.
Поэтому, чтобы сделать процесс написания программ более простым и поддающимся обычной
человеческой логике, постоянно разрабатываются новые техники и приемы программирования.
Овладев ими, вы сможете программировать на качественно более высоком уровне.

Л/гикципыc/nfiif/c/ni/ftHOio
На заре программирования почти никто не утруждал себя составлением каких-либо планов собственных программ. Программисты просто начинали писать коды программ, добавляя
в них по мере необходимости все новые и новые команды. Создаваемые программы хотя и
работали, но понять их коды было практически невозможно. Со временем эти коды даже стали называть спагетти, поскольку понять в них что к чему было так же сложно, как распутать
настоящие спагетти, приготовленные в итальянском ресторане.
Но зап>тайные коды работающих программ— это еще не проблема. Настоящие проблемы начинались тогда, когда нужно было модифицировать эти коды, с тем чтобы как-то изменить существующую программу или добавить к ней новые возможности. Поскольку структура кодов не имела никакой логики и была в высшей степени запутанной, добавление новых
кодов почти всегда сопровождалось появлением множества ошибок, в результате чего программы вовсе выходили из строя.

Глава 30. Так что же это такое — объектно-ориентированное...

291

Еще более серьезные проблемы, связанные с отсутствием планирования при написании
программ, случались из-за того, что программисты не могли удержать в своей голове множество разрозненных деталей, теряли их след, забывали о них, и хотя программы работали, это
было не совсем то или совсем не то, что задумывалось изначально. Поскольку разобраться в
написанных кодах и правильно их откорректировать было практически невозможно, большинство программистов просто начинали писать свои программы заново. Новые версии программ, опять-таки, были далеки от совершенства, процесс повторялся снова и снова, и в конечном результате некоторые программы так и не доводились до конца.
Одним из первых методов, разработанным для решения подобных проблем, а также для
усовершенствования процесса создания больших программ, был метод, названный структурным программированием. В основу этого метода положено три идеи:
г S делить большую программу на множество маленьких подпрограмм;
'•' S объявлять переменные и типы принимаемых ими значений;
; V использовать в маленьких программах только последовательные команды, команI
ды ветвления и команды циклов.

Разделение большой программы на множество подпрограмм
Написать одну большую программу, решающую сразу много задач, гораздо сложнее, чем
написать несколько маленьких программ, каждая из которых предназначена для решения всего одной небольшой задачи. Поэтому, теоретически, можно написать много маленьких программ, занимающихся решением разных проблем, а затем объединить их для создания одной
большой программы, решающей сразу множество задач.
Этот прием не только упрощает процесс написания больших программ, но и значительно
облегчает процесс внесения в них изменений и поиска ошибок, поскольку теперь не нужно
модифицировать программу в ц е л о м — достаточно определить соответствующую подпрограмму и работать только с ней.
Visual Basic .NET поддерживает такую практику, автоматически разделяя коды пользовательского интерфейса на отдельные процедуры обработки событий. Если же вы пишете коды
BASIC для обработки данных и проведения вычислений, Visual Basic .NET также позволяет
вам создавать небольшие общие процедуры и сохранять их в отдельных файлах модулей (о
чем рассказывалось в главе 27).

Объявление переменных
Изначально можно было создавать переменные в любом месте программы и присваивать
им значения любых типов, благодаря чему разобраться, что делает программа, было практически невозможно. Поэтому и было решено, что все переменные должны объявляться заранее. В этом случае другие программисты могли понять, для чего в программе используется та
или иная переменная.
Как средство борьбы с ошибками было принято еще одно решение: при объявлении переменных должен указываться тип данных, которые эти переменные могут содержать. Если вы
попытаетесь присвоить переменной значение другого типа (не того, который был для нее
объявлен), это сразу же будет воспринято как ошибка и выполнение программы прекратится.
Этим способом предотвращается создание и распространение программ, неправильно сохраняющих данные. А как известно, некорректные данные приводят к сбоям в работе компьютеров, на которых они обрабатываются.
Сделав обязательным объявление переменных и типов принимаемых ими значений, Visual
Basic .NET помогает вам создавать программы, понятные и простые для внесения в них изменений. (Информацию об использовании переменных вы найдете в главе 15.)

292

Часть VII. Объектно-ориентированное программирование

Использование последовательных команд, команд
ветвления и команд циклов
Самые большие проблемы в ранних программах возникали при использовании специальной команды, обозначаемой словом GOTO. Эта команда, по сути, говорила компьютеру:
"Перейди в конец программы и выполни эту инструкцию, затем перейди на начало программы и выполни эту инструкцию, потом перейди к середине программы и сделай это, потом перейди в начало, затем перейди туда-то и т.д."
Из-за постоянных переходов из одного конца программы в другой практически невозможно было понять, что именно эта программа делает. Идея структурного программирования
положила этому конец и ограничила перемещение по программе выполнением только трех
видов команд: последовательных, ветвления и команд циклов.
При выполнении последовательных команд выполняется одна инструкция, затем вторая и т.д.
Если используется команда ветвления, компьютер выполняет один из возможных наборов
инструкций. В Visual Basic .NET эти команды представлены операторами I f - T h e n и
S e l e c t - C a s e (они рассматривались в главах 22, 23).
Если выполняются команды циклов, компьютер несколько раз подряд повторяет один и
тот же набор инструкций. Команды циклов, используемые в Visual Basic .NET, рассмотрены в
главах 24, 25.
Как видите, ни одна из команд не может осуществлять переходы из одного конца программы в другой, а потому все последовательно выполняемые инструкции оказываются компактно собранными в отдельных частях программы, что значительно облегчает их понимание
и дальнейшую модификацию.

Хотя разработка и внедрение идей структурного программирования знаменовали собой
большой т а г вперед, две крупные проблемы оставались нерешенными. Несмотря на то, что
разные части программы становились изолированными друг от друга, каждая из них попрежнему имела доступ к одним и тем же данным. Поэтому, если ошибка в одной части программы приводила к нарушению целостности данных, она не могла быть изолирована и в се
поисках приходилось просматривать коды всей программы.
Более того, если нужно было изменить источник данных (например, какой-нибудь файл,
где хранились данные, перемещался из одного каталога в другой), приходилось просматривать коды всей программы и вносить изменения во все команды, которые как-то ссылались на
эти данные. Если хотя бы одна такая команда пропускалась, возникала ошибка.
Вторая нерешенная проблема заключалась в том, что процесс написания небольших подпрограмм, как правило, занимал много времени.
Чтобы ускорить его, многие программисты копировали части уже работающих программ
и вставляли их в свои программы. Это было достаточно удобно, поскольку стоило только
внести небольшие коррективы— и фрагмент программы готов. Кроме того, если этот фрагмент мог быть использован в других частях программы, он копировапся еще несколько раз.
Теперь уже несложно было иметь по нескольку вариантов одной и той же подпрограммы в
кодах своей программы.
Но что если возникала необходимость внести в эту подпрограмму какие-то изменения?
Приходилось опять-таки просматривать коды всей программы, находить эти скопированные
фрагменты и изменять каждый из них по отдельности.

Глава 30. Так что же это такое — объектно-ориентированное...

293

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

Инкапсуляция: разделение данных и команд
Как и структурное программирование, ООП рекомендует делить большие программы на
несколько маленьких подпрограмм. Но в отличие от структурного программирования, просто
разбивающего связанные между собой наборы команд на группы, объектно-ориентированное
программирование изолирует как инструкции, так и обрабатываемые ими данные в отдельных подпрограммах. Чтобы лучше понять этот принцип, взгляните на рис. 30.1, демонстрирующий различие между обычными программами и программами, написанными с использованием приемов ООП.
Обычная
программа

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

Коды для открытия файла

[Объект File]

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

Коды для открытия файла
Коды для изменения файла
Коды для сохранения файла
[Q&b6in:.,Window]

.

Коды'для отображения окна
Коды для сворачивания окна
1 Коды для закрытия окна


Принимайте участие в технических конференциях

>

Освойте С#

> Пишите программы для операционных систем Macintosh, Linux, Palm OS и PocketPC

/ i t еперь, когда настоящая книга почти прочитана, вы наверняка думаете о том, что
*г $ •* делать дальше, и как наиболее эффективно организовать процесс дальнейшего освоения языка Visual Basic .NET.
Ответ на данный вопрос вы найдете, прочитав последнюю часть книги, в которой содержатся общие рекомендации относительно того, как стать знатоком и специалистом по использованию одного ич самых мощных и перспективных на сегодняшний день языков программирования, каковым является Visual Basic .NET.

Hutnautne специализированные
периодические издания
Если вы кроме Visual Basic .NET успели немного изучить и английский язык, найдите
возможность просматривать специализированный журнал I'isual Basic Programmer's Journal.
В нем обсуждаются различные вопросы, связанные с Visual Basic .NET, дается обзор создаваемых надстроек, приводятся листинги кодов, которые вы можете использовать при создании своич программ.
Ни один из других компьютерных журналов не содержит так много полезной информации
о языке Visual Basic .NET. Более подробные сведения об этом издании вы можете получить
по адресу:
S

Usual Basic Programmer's Journal, Fawceltc Technical Publications, 209 Hamilton
Avenue, Palo Alto, CA 94301-2500; Tel: 650-833-7100; Fax:650-853-0230;
www . vbpz • corn.

Глава 33. Десятка полезнейших советов, которые вы вряд ли найдете... 315

JLoqnuututnecb на инфо/гмационные
Visual Saslc 2)e(/eLoftey
Корпорация Pinnacle Publishing, Inc. выпускает ежемесячные информационные бюллетени
Visual Basic Developer, где вы найдете работающие подпрограммы Visual Basic .NET, которые можно копировать и использовать при создании собственных программ. Конечно, эта услуга стоит денег (около $ 149 в год), по если вы сможете убедить свое начальство в полезности научных инвестиций, по вашему карману эта сумма не ударит.
Более подробно об информационных бюллетенях Visuul Basic Developer вы можете узнать
по адресу:
S

Visual Basic Developer, Pinnacle Publishing, Inc., 1000 Holcomb Woods Parkway, 200,
Suite
280.
Roswell,
GA
30076;
Tel: 770-992-9401;
Fax: 770-993-4323;
w w w . p i n p u b . corn.

инфо/гмацию в Internet
Если у вас есть доступ к Internet, почаще посещайте Web-страницы, посвященные Visual
Basic .NET. Число таких Web-страниц постоянно растет, поэтому здесь указаны адреса лишь
некоторых из них:
^ Carl and Gary's Visual Basic Home Page: www. c e v b . c o n
•f Planet Source Code's Visual Basic section: www. p l a n e t - s o u r c e - c c d e - coxi/vb
S

Visual Basic Explorer Home Page: www. v b e x p l o r e - r . crjrr:

S VB Tips & Tricks Home Page: www. vbLt.. c o n
Намного оольший список адресов вы можете получить, набрав в своем Wcbброузере в качестве параметра поиска слова Visual Basic .NET.

Лосещаи/не технические конфе/генции
Периодически, по нескольку раз в год. где-нибудь в Штатах, Европе или Азии компания
Microsoft совместно с журналом Visual Basic Programmer's Journal проводит технические
конференции, носящие официальное название Visual Basic Technical Summit. Здесь можно
принять участие в обсуждении различных вопросов, связанных с языком Visual Basic .NET,
послушать, о чем говорят представители компании Microsoft, купить по дешевке надстройки
для Visual Basic .NET и просто познакомиться со многими людьми, так или иначе связанными с программированием на Visual Basic .NET. Для получения более полной информации об
них технических конференциях, обращайтесь по адресу:
S

316

Visual Basic Programmer's Journal, Fawcette Technical Publications. 209 Hamilton
Avenue, Palo Alto, CA 94301-2500; Tel: 650-833-7100;
Fax:650-853-0230;
www. v b p j . corn.

Часть VIII. Горячие десятки

программные
через посредников
Fie покупайте Visual Basic .NET или любые надстройки для этого приложения непосредственно у производителя. Большинство фирм, выпускающих программное обеспечение, без
зазрения совести устанавливают иены на свои продукты ничуть не ниже, чем в розничной сети. Поэтому покупать что-либо у них настолько же неразумно, как платить полную цену за
подержанный автомобиль.
Если хотите сэкономить деньги, обратитесь к дилерам, распространяющим программное
обеспечение по почте. Они предоставляют солидные скидки (до пятидесяти процентов), и вообще с ними всегда можно договориться.
К числу наиболее известных дилеров принадлежат такие компании, как Programmer's
Paradise, Provantage и VBxtras. Все они специализируются на распространении программного
обеспечения, и у них можно приобрести приложение Visual Basic .NET и все сопутствующие
ему надстройки.
Более подробные сведения иы сможете получить по следующим адресам:
;;

^ Programmer's Pwnd\se, 1157 Srwewsbe/ry Avenue, Shrewsbe/77. N.I07702; Tel: 732389-8950; Fax: 732-389-0010; www. p r o g r a m m e r s p a r a d i s e . com


Provantage, 7249 Whipple Avenue NW, North Can/on, OH 30339; ТИ: 330-494-8715;
Fax: 330-494-5260; w w w . p r o v a n t a g e . c o n

• VBx/ras, 1905 Power Fe/vy, Suite 100,
Fax: 770-952-6388; www. v b x t r a s . com

A/lan/a. GA30339; Tel: 770-952-6356;

Visual Basic J/S7 с С#
и qfiLfZuaiu языками программирования
Одним из самых больших преимуществ среды .NET является то обстоятельство, что вы можете писать одну и ту же программу, используя cpaiy несколько языков программирования.
Следовательно, можно объединить усилия нескольких программистов, пишущих программы на
разных языках, и использовать среду .NET для создания одной большой программы.
Если вы уже освоили другой язык программирования или просто хотите повысить свою
квалификацию, попробуйте написать программу сразу на нескольких языках. Например,
язык Visual Basic .NET можно использовать для создания пользовательского интерфейса, а
С# -— для написания работающих кодов программы, которые будут проводить какие-то
вычисления.
Возможно, вас испугает перспектива применения нескольких языков одновременно, но
в этом есть свои неоспоримые преимущества. Допустим, если вы уже имеете работающую
программу, написанную на языке С или COBOL, можете скопировать ее в среду .NET. а затем использовать ячык Visual Basic .NET для создания подходящею пользоиательского интерфейса.
Предоставляя возможность комбинировать Visual Basic .NET с другими языками программирования, компания Microsoft надеется, что вы сумеете извлечь из этого максимальную
выгод\, вплоть до того, что научитесь создавать такие программные продукты, кочорые будут
конкурировать даже с программным обеспечением, выпускаемым самой Microsoft.

Глава 33. Десятка полезнейших советов, которые вы вряд ли найдете... 317

nfwettfnoe Visual /Zasic J/€J~
Одним из наиболее эффективных способов достижения мастерства в использовании какого-либо языка программирования является непосредственное изучение ре&1ьно существующих и действующих программ и участие в их разработке. Хотя работающие программы
Visual Basic .NET можно найти в сети Internet, но лучше самому принять участие в одном из
открытых проектов, в котором такие программы создаются.
Открытые проекты содержат в себе работающие коды, которые каждый желающий может
изучить и проверить в действии. При этом основная идея заключается в том, что чем большее
количество людей принимает участие в проекте, тем более совершенным он становится.
Чтобы найти открытый проект, в котором используется Visual Basic .NET, посетите Webстраницу SourceForge ( h t t p : / / s o u r c e f o r g e . n e t ) . Там вы сможете найти не только сам
проект, к которому можно присоединиться, но и выбрать категорию такового (например, открытая видеоигра, мультимедиапрограмма или коммуникационные утилиты)- Какой бы проект вы ни выбрали, им наверняка уже кто-нибудь занимался, так что вы сможете как изучать
работающие коды, так и добавлять к ним что-то свое,

JIfiuodfieinutne nftozfiaauiif для соединил
справочной сиейьемы
Любая хорошая Windows-программа имеет работающую в режиме on-line справочную
систему, позволяющую неопытным пользователям быстро находить ответы на свои вопросы
с помощью указателей и гиперссылок, а также избавляющую от утомительного и неэффективного штудирования многостраничных справочных пособий. Если вы намерены создать с
помощью Visual Basic .NET серьезную программу, то должны позаботиться и об аналогичной
справочной системе.
В создании собственной справочной системы нет ничего сложного, за исключением того,
что этот процесс занимает много времени и превращается в рутинную работу. К счастью,
можно приобрести специальную программу, значительно упрощающую эту задачу. Двумя
наиболее популярными программами, создающими справочные системы для других программ, являются RoboHelp и ForeHelp. Они делают процесс создания экранных подсказок таким же простым, как процесс набора обычных текстовых документов. Каждая созданная с
помощью этих программ справочная система может быть тут же протестирована и проверена
на предмет того, как она будет выглядеть после присоединения к вашей программе.
В мире современного программного обеспечения наличие эффективной справочной системы является необходимым условием для продвижения какого-либо продукта на рынке, поэтому уделите данному вопросу должное внимание.
Для получения более подробной информации о программах RoboHelp и ForeHelp обращайтесь:
' • floboHdp, t-Help Cwpwa/bn. 7777 Fay Avenue, La Jolla, CA 92037; Tel: 858-459i
6365; Fax: 858-459-6366; w w w . G h e l p . c o m
•s S ForeHelp, VoreYront, Inc., 4710 Table Mesa DHve, Suite B, Boulder, CO80305;
[
Tel: 303-499-918J; Fax: 303-494-5446; www. ff. corn

318

Часть VIM. Горячие десятки

Co3qa£autne инсталляционные
/tftOZflCUlAlM
После того как программа создана, встает вопрос о ее распространении. Любую программу можно просто скопировать на дискету (или дискеты) в надежде на то, что будущие пользователи смогут ее правильно установить на своих компьютерах. Но лучше все же доверить
этот процесс специальным инсталляционным программам.
Инсталляционная программа берет на себя функции проводника и шаг за шагом контролирует процесс копирования программного продукта на диск другого компьютера. Используя специальную инсталляционную программу, можно не только оказать услугу будущим покупателям
вашего продукта, но и сопровождать его процесс установки отображением логотипа своей компании и рекламной информации, различными визуальными и звуковыми эффектами.
Помочь создать инсталляционные программы для любых программ, написанных на языке
Visual Basic .NET, могут такие приложения, как installSheild и Wise. Более подробную информацию о них можно получить по адресам:
' S Wise Insralltv-. Wise Solutions, 5880 North Can/on Center Road, Suite450, Can/on,
ь
MI 48187; Tel: 734-456-2100; Fax: 734-456-2345; www. w i s e s o l u t i o n s . c o n
S
"

InstellShfiW, Ins/allSheilrf Corpora/ion, 900 National farkway, Suitel25 Schau/Hburg,
IL 60173-5108; Tel: 847-240-9111; Fax: 847-619-0788; www. i n s t a l l s h e i l d . c o m

JluutUffle /3asic-ftfioifiaMMbi qust

^Macintosh, Linux, Talttt OS и TocketTC
Первая версия Visual Basic, выпущенная компанией Microsoft в 1991 году, имела большой
успех у программистов, поскольку позволяла быстрее и более простым способом создавать
качественные приложения. В связи с этим представители компании Microsoft пообещали в
скором времени адаптировать язык Visual Basic для других операционных систем.
После выпуска приложения Visual Basic для MS-DOS, которому, правда, была уготована
весьма недолгая жизнь, компания Microsoft забыла о своем обещании, сделав исключение лишь
для платформы Windows СЕ (известна также как операционная система PockctPC). Если Microsoft когда-нибудь адаптирует среду .NET и для других операционных систем, в частности для
Linux и Macintosh, вы, надо полагать, сможете писать на Visual Basic .NET программы, которые
будут одновременно работать на компьютерах с разными операционными системами.
Но пока это лишь предположение, не имеющее практического воплощения, вам придется
довольствоваться написанием на Visual Basic .NET программ, которые работают только в
среде Windows. Если же вы захотите написать на данном языке программу для Macintosh, ничего у вас из этого не выйдет.
Однако вы можете использовать клон Visual Basic для Macintosh, называемый REALBasic.
Как и Visual Basic, REALBasic позволяет вначале нарисовать объекты пользовательского интерфейса и определить их свойства, а затем написать коды программы, которые будут обрабатывать данные.
REALBasic во многом похож на Visual Basic. Он даже может конвертировать коды программ, написанных с помощью более ранних версий языка Visual Basic, в коды REALBasic.
Более того, на языке REALBasic можно написать программы для Macintosh, а затем перекомпилировать их для запуска в среде Windows. Другими словами, одни и те же коды можно использовать для создания программ для Windows и для Macintosh.

Глава 33. Десятка полезнейших советов, которые вы вряд ли найдете... 319

Подобные клоны Visual Basic имеются и для систем Palm OS и PocketPC, используемых в
карманных компьютерах. С помощью языка NSBasic писать программы можно с применением ноутбука или настольного компьютера, а затем их можно протестировать, используя программу эмуляции Palm OS или PocketPC. Это позволяет убедиться, что после загрузки в карманный компьютер новые программы будут работать без ошибок.
В заключение отметим, что существует еше язык XBasic, являющийся открытым BASICкомпилятором, с помощью которого можно создавать программы для Windows и Linux. Вы
можете не только изучать коды, делающие XBasic функционирующим компилятором, но и
использовать их для написания своих программ, работающих сразу под Windows и Linux.
Еше несколько адресов, по которым мы советовали бы вам обратиться:
S MZALBasicfoal Software, Inc., PMB 220, 3300 Bee Caves Road, Suite 650, Aus/in,
TX 78746; Tel: 512-263-1233; Fax: 512-263-1441; www. r e a l b a s i c .ест,

320

S

NSBasic,NS Basic Corpora/ion, 77 Hill Crescent, Toronto, Canada M1M IJ3; Tel:416264-5999; Fax: 416-264-5888; w w w . n s b a s i c . c o i r .

^

XBasic, www. x b a s i c . o r a

Часть VIII. Горячие десятки

Глава34

Советы по использованию интерфейса
Visual Basic .NET
главе
> Использование окна Properties
> Окно Solution Explorer
> Настройка панели Toolbox
> Использование списка Class View
mtf оличество одновременно отображаемой компьютером информации ограничено раз* V* мерами монитора, поэтому Visual Basic .NET использует различные окна для демонстрации именно тех данных, которые необходимы в каждый отдельный момент времени. Поскольку вы уже знакомы с этими окнами и в общих чертах знаете, для чего каждое из них
предназначено, остается только дать вам несколько советов относительно того, как лучше их
применять и как сделать процесс программирования на Visual Basic .NET максимально легким и приятным занятием.

использованиео/сна
В окне Properties (F4) можно просмотреть и изменить свойства объектов пользовательского интерфейса, которые определяют способ отображения таковых, т.е. объектов, на экране
и реакцию на некоторые действия пользователей. Чтобы помочь вам быстрее найти нужные
свойства, информация в окне Properties может быть отсортирована либо в алфавитном порядке, либо по категориям.
Чтобы отсортировать названия свойств по алфавиту, щелкните в окне Properties на кнопке Alphabetic (По алфавиту), а для того чтобы разбить свойства по категориям, щелкните в
окне Properties на кнопке Categorized (По категориям).
Окно Properties может одновременно отображать свойства лишь одного объекта. Если
вам нужно просмотреть свойства другого объекта, щелкните на нем или выберите его название в списке Object. Чтобы открыть список с названиями всех объектов созданного вами
пользовательского интерфейса, нажмите кнопку со стрелкой списка Object, затем найдите
название объекта, свойства которого нужно изменить, и щелкните на нем. Вы увидите значения всех свойств данного объекта в окне Properties.

Окно Solution Exfitorer
В още Solution Explorer отображается список всех файлов, из которых состоит открытый
на данный момент проект. С помощью этого окна можно открывать файлы для редактирования кодов или изменения элементов пользовательского интерфейса, исключать файлы из
проекта или удалять их физически. Для этого достаточно щелкнуть правой кнопкой мыши на
названии нужного файла и в открывшемся меню выбрать одну из команд:

Глава 34. Советы по использованию интерфейса Visual Basic. NET 321

i S View Code — для редактирования кодов Basic;