Beep
Совершим экскурсию внутрь одного из этих двух «ларцов». А чтобы экскурсия была не бесцельной, поставим задачу: Извлечь из компьютера при нажатии на кнопку короткий звук (звон, пик).
Я знаю, что этот звук находится внутри «ларца» Microsoft. А если бы не знал? – Сел бы читать учебник или справочник, или систему помощи Help. Эта глава ни в коем случае не расскажет вам, где находятся все объекты. Для этого объектов слишком много. Она только расскажет вам, как добраться до нужного объекта, местоположение которого вам уже заранее известно.
Напишите слово Microsoft и поставьте точку. Перед вами развернется список, представляющий содержимое пространства имен Microsoft. В нем 3 строки (Рис. 2.1).
Рис. 2.1
Каждая из этих 3 строк – не что иное, как еще одно пространство имен. Получается, что внутри «ларца» Microsoft находятся другие 3 «ларца» поменьше: CSharp, Visual Basic, Win32. В знак того, что это именно «ларец», то есть пространство имен, а не что-нибудь другое, в строке стоит значок из двух фигурных скобок {}.
Заглянем внутрь «ларца» Visual Basic. (Почему именно внутрь него? – Потому что я знаю, что нужный нам звук сидит там.) Для этого сделаем двойной щелчок на соответствующем пространстве имен и снова нажмем точку. Перед нами развернется список того, что входит внутрь Visual Basic. Прокрутим немного этот список (Рис. 2.2).
Рис. 2.2
Мы видим, что внутрь пространства имен Visual Basic входит еще одно пространство имен – CompilerServices, внутри которого тоже, наверное, что-нибудь есть. Но нам туда не надо. Потому что кроме него мы видим в списке и множество других строк, обозначенных другими значками. Не будем пока разбираться в смысле этих значков, а выберем двойным щелчком строку Interaction и снова нажмем точку. Перед вами развернется список того, что входит внутрь Interaction. Выберем строку Beep. Это и есть наша «игла». Она-то и заставляет компьютер издать короткий звук. Вот как будет выглядеть теперь ваша процедура:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Microsoft.VisualBasic.Interaction.Beep()
End Sub
Запустите проект, нажмите кнопку, и если звуковая система вашего компьютера в порядке, вы услышите короткий звук. Скажем, что сработал метод Beep объекта Interaction (по аналогии с тем, как в 1.3.9 мы говорили, что сработал метод Hide (он прятал элементы переключателя)).
Итак, игла, яйцо, утка и заяц в коде присутствуют. Вы скажете: Неужели нужно запоминать так много названий этих «животных»? Отнюдь нет. Вам достаточно знать только название «иглы», а система помощи (4.4.9) или Object Browser (4.2.4) подскажут вам, где она находится.
Если вы были внимательны, то у вас наверняка возникли еще кое-какие вопросы. Надеюсь ответить на них и для этого следующий пример рассматриваю более подробно.
Build, Debug, Data
Build используется для компиляции проекта, Debug – при отладке проекта. Их работа описана в соответствующих местах книги. Data используется при работе с базами данных.
Целые числа или десятичные дроби? Числовой тип Decimal
Вы спросите: зачем использовать типы целых чисел Integer и Long, если типы десятичных дробей Single и Double обеспечивают нам работу как с целыми, так и с дробными числами? Здесь дело в наличии или отсутствии абсолютной точности вычислений. При использовании типов десятичных дробей вполне мыслима ситуация, когда дважды два будет не точно 4, а, скажем, 4.00000000000381. Связано это с особенностями представления десятичных дробей в компьютерах. В большинстве реальных задач такая маленькая погрешность несущественна, однако существуют задачи, где точность нужна абсолютная. При использовании же типов целых чисел VB присматривает за тем, чтобы все числа и результаты были абсолютно точными целыми числами. При сложении, вычитании и умножении это, сами понимаете, не проблема, а вот при делении компьютеру приходится округлять.
Совет: Если вы уверены, что переменная всегда должна быть целым числом и никогда дробным, объявляйте ее целым типом, если есть хоть маленькое сомнение – дробным.
Однако абсолютная точность бывает нужна и при работе с дробными числами. Например, в финансовых расчетах доллары или рубли – это целая часть десятичной дроби, а центы или копейки – сотые доли этой дроби. Ошибаться здесь нельзя ни на копейку. В этой ситуации идеально подходит тип Decimal. Этот тип хоть и имеет дробную часть, сложение и вычитание дробных чисел выполняет абсолютно точно. Количество значащих цифр у него рекордное (см. таблицу в 5.4.2).
Попробуем теперь проверить работу типа Decimal.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a, b, c As Decimal
a = 1234567890123456789
b = 0.0098765432109
c = a + b
WriteLine(a) : WriteLine(b) : WriteLine(c)
End Sub
Запустите проект. Вот результат:
1234567890123456789
0,0098765432109
1234567890123456789,0098765432
Как видите, VB, как и положено, обрезал сумму до 29 значащих цифр.
Символы типа. Обратите внимание, что значения переменным а и b я дал не длинные, тип Decimal может проглотить и гораздо длиннее. Попробуем добавить цифр к литералу переменной а. VB подчеркивает литерал и выдает подсказку об ошибке, в которой мы видим слово overflow. В чем дело? Снова укоротим литерал, поставим на него курсор мыши и увидим подсказку «Long». Почему? Ведь переменная a имеет тип Decimal! Дело в том, что VB без явного приказа человека не хочет причислять литералы к типу Decimal. А приказ такой – буква D в конце литерала:
a = 12345678901234567890123456789D
Теперь все в порядке. Буква называется символом типа (Literal type character).
Если вы захотите заставить VB причислить литерал к определенному числовому типу, то вот вам соответствующие символы типов:
Short |
Integer |
Long |
Single |
Double |
Decimal |
S |
I |
L |
F |
R |
D |
Часть I Программирование без программирования
У этой части две цели:
Научить самым основным и элементарным приемам работы в VB.
Показать, что в VB можно добиваться впечатляющих результатов практически безо всякого программирования.
Доказательством тому – проекты «Калькулятор» и «Плеер», причем «Калькулятор» получится у вас гораздо ярче и забавнее, чем стандартный калькулятор Windows.
Эта часть нужна для того, чтобы, прочтя ее, вы могли сказать себе: «Я вполне освоился и могу делать в VB интересные вещи, не особенно напрягаясь». То есть (поясню) почти без программирования. Почти, но не абсолютно. Простенький программный текст все-таки придется писать.
В 1 главе вы создадите свой первый проект на VB.
Во 2 главе вы погрузитесь в глубины библиотеки классов .NET Framework. Ведь для того, чтобы строить дом из классов-кубиков, нужно уметь нужные кубики находить и прилаживать на место.
В 3 главе вы создадите собственный калькулятор, снабдив его фотографией, музыкой и даже видео. Цель главы – распахнуть перед вами основные простые и одновременно яркие возможности VB и показать, что создавать простые проекты действительно легко. В завершение главы вы создадите еще и собственный плеер.
Завершается часть главой 4 «Работа в среде Visual Studio .NET», которая излагает основные приемы работы на компьютере при программировании на VB.
Я постарался написать книгу так, чтобы сесть за компьютер и программировать на VB мог даже тот, кто ни разу в жизни за компьютер не садился. Специально для такого человека я написал Приложения 1 и 2, в которых объясняю все элементарные и необходимые для этого вещи: как устроен компьютер, какова структура папок на диске, как работать с текстом в текстовом редакторе, как управляться с окнами Windows. Если вы чувствуете пробелы хотя бы в одной из этих областей, то ни в коем случае не садитесь за компьютер и дальше не читайте, а читайте сначала Приложения.
Кстати, вы прочитали Введение? Там содержится нужная в дальнейшем терминология.
Часть II Программирование на VB – первый уровень
Кончилась наша сладкая жизнь. Вернее, в ней наметился большой перерыв. Действительно, жизнь наша была беззаботной. Ведь калькулятор и плеер достались нам без труда. Работы мало – удовольствия много. Хотелось бы, чтобы так было всегда… Но жизнь сурова и предлагает свой традиционный выбор – или засучить рукава или надеть легкую обувь для бега. Действительно, калькулятор и плеер мы создали, а есть ли у вас ощущение, что вы можете самостоятельно сделать что-нибудь другое? Вряд ли, ведь вас вели за ручку.
И все же … есть ли еще возможности почти без программирования быстренько получить что-нибудь «эдакое»? Есть, и их много. В популярных журналах, посвященных программированию, вы найдете немало программок из двух-трех строчек кода, скопировав которые в свой компьютер, вы получите на экране (и не только на нем) любопытные вещи. Только вот беда – хоть этих строчек всего две-три, по-настоящему понять их нет никакой возможности и самостоятельно ничего похожего вы сделать не сможете. Кто вы в таком случае – программист или переписчик иероглифов? Вот то то и оно! И от этого факта не уйдешь. Программирование – это гора, которую не объедешь, это тот самый гранит науки, который придется грызть.
Совет: грызите потихоньку, не надо пытаться откусить сразу большой кусок – можно поломать зубы.
В этой части начинается настоящее программирование. Цель ее – провести вас от создания самых простых программ до сложных. Вы изучите такие серьезные вещи, как переменные величины, циклы, ветвления, процедуры, графику, работа со временем, управление компьютером при помощи мыши и клавиатуры. Подробно разбирается создание трех довольно солидных проектов. Заканчивается часть заданием на самостоятельное создание проекта. Предполагается, что после выполнения этого задания у вас должно возникнуть ощущение всесильности. Вы должны почувствовать, что теперь вам по плечу программа любого размера.
Эта часть состоит из 10 глав. Не все читатели пройдут сквозь их огонь и воду. Но с теми, кто пройдет, можно идти в разведку. По пути вас ждет много интересного: графика, рисунки, узоры, движение объектов по экрану, мультики, диалог с компьютером, измеритель шустрости, определитель – «экстрасенс» ли вы, пароль на калькулятор, проект «Будильник» и первая в вашей жизни собственная игра «Гонки». В путь!
Числовые переменные Математика Точность
Простые арифметические вычисления лучше делать на калькуляторе, чем на компьютере, а вот сложные – наоборот.
Числовые типы данных
Данные – это то, над чем работает программа, чтобы получить результат. А программа – это инструкция о том, что нужно делать с данными, чтобы получить результат. Так, в нашем проекте Калькулятор данными были числа, вводимых нами в два верхних текстовых поля, а результатом – число в нижнем текстовом поле. В проекте Плеер данными были звуковые и видеофайлы на диске, а результатом – звук в наушниках и изображение на экране.
Данные часто выступают в качестве значений переменных. Поэтому мы имеем право говорить о типах данных точно так же, как говорим о типах переменных. Это одни и те же типы. Литералы, которые мы пишем в тексте программы – тоже данные, ведь программа работает и над ними тоже. Поставьте курсор мыши на любой литерал в тексте программы и увидите подсказку с названием типа данных, к которому, по мнению VB, относится этот литерал. Поэтому в дальнейшем я не буду различать типы данных и типы переменных.
Вкратце и без пояснений типы данных VB перечислены в 5.2.3. В этом подразделе мы будем говорить только о типах числовых данных.
В VB имеется 7 числовых типов. В таблице все они приведены, а подробные пояснения – в следующих разделах. Для справки я привел сведения и по простым нечисловым типам.
Тип | Описание | Размер ячейки (в байтах) | Диапазон значений типа | ||||
Byte | Целое число –положительное | 1 | От 0 до 255 | ||||
Short | Целое число – короткое | 2 | От -32768 до 32767 | ||||
Integer | Целое число – обычное | 4 | От -2147483648 до 2147483647 | ||||
Long | Целое число – длинное | 8 | От -9223372036854775808 до 9223372036854775807 | ||||
Single | Десятичная дробь обычной точности | 4 | От ±3.4028235*10+38
до ±1.401298*10-45. Точность – примерно 7 значащих цифр. | ||||
Double | Десятичная дробь двойной точности | 8 | От ±1.79769313486231570*10+308
до ±4.94065645841246544*10-324. Точность – примерно 17 значащих цифр. | ||||
Decimal | Десятичная дробь длинная, абсолютной точности | 16 | Число длиной в 29 цифр, причем десятичная точка может стоять в любом месте.
Самое большое число такое: ±79228162514264337593543950335, а самое маленькое – такое: ±0.0000000000000000000000000001 | ||||
Boolean | Логический тип | 2 | Всего два значения: истина – ложь | ||||
Char | Символ | 2 | Любой из 65536 знаков, букв, цифр и других символов | ||||
String | Строка | * | Произвольный текст | ||||
Date | Дата и время | 8 | Любая дата с рождения Христа и до 9999 года. Любое время суток. |
* – Размер ячейки под строковую переменную зависит от размеров строки и от компьютера.
Что дальше?
Итак, проект готов и работает. Что дальше? Пока не очень понятно, как нам запрограммировать что-нибудь посложнее, например, игру с перестрелкой из введения. Могу пояснить. Вы растягиваете форму во весь экран и придаете ей не цвет, а фотографию или нарисованный вами рисунок города. Это делается просто (см. 3.6). Получается город во весь экран. Далее берете в Toolbox и расставляете по форме объекты типа PictureBox (изображение) – это ваши будущие автомобили, прохожие, гангстеры, пули и т.п. Затем придаете каждому объекту нужную фотографию. Наконец, пишете для каждого из этих объектов программу поведения, включая реакцию на нажатия клавиш клавиатуры и мышиные щелчки. Игра готова, можно запускать. Основная трудность здесь, конечно, в написании программы, она будет достаточно сложной и вам предстоит еще многому научиться, чтобы почувствовать себя в силах ее создать.
В VB много любопытных и полезных элементов управления. Так, вставив в форму объект типа Timer, вы сможете управлять работой проекта «по секундам». Многие элементы управления на Toolbox не показаны. Но их легко туда поместить и пользоваться ими. Так, вставив в форму объект типа Windows Media Player, вы сможете сопровождать игру музыкой, звуковыми эффектами и видео. Глава 3. познакомит вас со многими полезными и приятными возможностями VB.
Однако, чтобы понять эту главу, вам придется съесть небольшой «пуд соли». Это – Глава 2.
Что делает оператор присваивания с памятью
Я только что рассказывал о работе оператора присваивания, используя такие выражения, как «компьютер знает», «компьютер помнит» », «компьютер присваивает». Но нам необходимо более строгое понимание работы этого оператора, понимание ближе к «железу», к оперативной памяти.
Рассмотрим пример программы:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a, b, y As Integer
a = 10
b = 6
y = a + b + 1
Debug.WriteLine(y + 200)
End Sub
В программе встречаются три переменные, все они объявлены. Компьютер отведет для них в памяти три четырехбайтовые ячейки. Вот как будет работать оператор присваивания:
Выполняя оператор присваивания (например, y=a+b+1), компьютер сначала смотрит на его правую часть (a+b+1). Если в ней встречаются переменные (в нашем случае это a и b ), то компьютер перед вычислением ищет их значения в отведенных ячейках памяти (и находит там 10 и 6, так как их туда перед этим записали операторы а=10 и b=6), подставляет эти значения в правую часть и вычисляет ее. Затем вычисленное значение (17) компьютер записывает в ячейку памяти, отведенную под переменную, поставленную в левой части (y).
Таким образом, когда мы говорим "Компьютер запомнил, что а равно 2", мы подразумеваем "Компьютер записал в ячейку памяти, предназначенную для а, число 2".
А теперь рассмотрим, как будут заполняться информацией ячейки a, b, y в процессе выполнения нашей программы. В самом начале выполнения программы в них находятся нули. Первым выполняется оператор а=10. Согласно только что приведенному определению оператора присваивания в ячейку a будет записано число 10. Затем выполняется оператор b=6 и в ячейке b появляется шестерка. Затем выполняется оператор y=a+b+1. Компьютер смотрит, что находится в ячейках a и b, видит там 10 и 6, подставляет их в выражение a+b+1, получает 17 и записывает в ячейку y. Наконец выполняется оператор Debug.WriteLine(y+200). Компьютер заглядывает в ячейку y, видит там 17, вычисляет 17+200 и выводит 217 в окно Output.
Что такое программа на VB?
Что такое программа с точки зрения VB и большинства других объектно-ориентированных языков программирования, удобнее всего рассмотреть на аналогии. Представьте себе, что к вам, живущему в большом городе, в гости приехал ваш знакомый, никогда не выезжавший из своего поселка. Он хочет сходить на футбол, а вам идти вместе с ним некогда. Чтобы он смог добраться до стадиона и вернуться живым и здоровым, вы пишете ему на листе бумаги такую инструкцию.
Что делать, если тебе хочется сходить на футбол
1. Спустись на лифте во двор 2. Дойди до метро 3. Доберись до станции "Спортивная" 4. Купи билет на стадион "Лужники" 5. Иди на трибуны и смотри футбол 6. Возвращайся на метро до станции "Отрадное" 7. Дойди до нашего дома и подъезда 8. Поднимись на лифте 9. Позвони в дверь Как спускаться на лифте 1. Подойди к лифту и нажми кнопку 2. Когда дверь откроется, проверь, есть ли там кабина 3. Если есть, заходи 4. Нажми на кнопку с цифрой 1 5. Когда дверь откроется, выходи Как дойти до метро 1. Поверни налево и дойди до угла 2. Перейди улицу 3. ……………….. Как доехать до станции "Спортивная" 1. ………………….. 2. …………………... Как переходить улицу 1. Найди переход 2. Посмотри на светофор 3. ………………….. ……………………………………………………….. Что делать, если лифт застрянет 1. Нажми на кнопку вызова диспетчера 2. ………………….. Что делать, если ты заблудился 1. Спроси у прохожих, где здесь поблизости телефон-автомат 2. Позвони домой ……………………………………………………….. |
Как видите, на листке – несколько инструкций. Они – двух типов. Одни начинаются со слов «Что делать, если …», другие – со слова «Как…».
Самая верхняя главная инструкция состоит из 9 команд и предписывает строгий порядок действий для достижения цели. Инструкции, начинающиеся со слова «Как», описывают каждое из этих действий более подробно. Так, инструкция «Как дойти до метро» подробно описывает выполнение команды «Дойди до метро». Так как в этой инструкции встречается команда «Перейди улицу», которая сама нуждается в пояснении, то имеется инструкция «Как переходить улицу». И так далее.
Зачем я написал так много инструкций типа «Как»? Не проще ли было написать одну длинную главную инструкцию из «пары тыщ» команд, в которой бы задавались по порядку все мелкие действия от начала до конца похода, начиная с «Подойди к лифту и нажми кнопку» и кончая «Подойди к дверям нашей квартиры и позвони»? – Возможно и проще, но вот инструкция в этом случае получилась бы слишком длинной. Почему длинной? Потому что, например, переходить улицу надо будет раз восемь, и выходит, что в инструкции придется восемь раз писать одни и те же пояснения, как это делать. И еще по той причине не нужно писать длинную инструкцию, что человеку гораздо приятней и удобней воспринимать короткие инструкции, чем длинные.
Порядок выполнения команд в инструкциях строго определен. Попробуйте нарушить его и увидите, что произойдет. Например, сначала попытайтесь пройти на трибуны, и только потом купить билет. Или сначала зайдите в дверь лифта и только потом проверьте, есть ли там кабина.
Однако жизнь сложна, и в ней могут происходить события, которые трудно привязать к какому-то конкретному этапу выполнения инструкции. Например, вы можете заблудиться (причем, в любом месте, как по пути туда, так и по пути обратно), или ваш лифт может застрять. На этот случай пишутся инструкции, начинающиеся словами "Что делать, если …" и предписывающие, как реагировать на то или иное событие.
В программировании на VB все эти инструкции называются процедурами. Команды, из которых они составлены, называются операторами. Весь набор инструкций на листке назовем программой. А события так и будем называть событиями.
Программа не должна содержать команд, которые исполнитель программы не способен выполнить. Например, «Перелети через улицу». Когда дело касается возможностей человека, тут более-менее все ясно. А если мы пишем программу для компьютера? Нам нужно четко знать, что компьютер умеет, а что не умеет. Лучше всего, если перед нами будет справочник, в котором перечислены все команды, которые компьютер способен исполнить. И такой справочник есть – это система Help, которой вы можете пользоваться, программируя на VB.
Но вы удивитесь, когда увидите, насколько «слабы», «мелки», «маломощны» все команды, которые умеет выполнять компьютер. На каком бы языке вы ни программировали, нигде вы не найдете таких шикарных команд, как «Рассчитай траекторию полета на Луну» или «Выиграй в шахматы у Каспарова». На любом языке вы можете отдавать только очень примитивные команды, типа «Умножь 5 на 4» или «Нарисуй на экране кружочек». Но ведь вы точно знаете, что компьютер уже давно и рассчитал траекторию полета на Луну, и выиграл у Каспарова! В чем тут волшебство? Волшебства нет, есть волшебники. – Приходит хмурый программист и из примитивных команд языка программирования пишет длинную программу, вычисляющую траекторию полета на Луну, или еще более длинную программу, выигрывающую у Каспарова.
Исходя из сказанного, можно заключить, что знание программирования состоит из двух областей:
Знание списка команд, из которых составляются программы
Умение по правилам записывать команды друг за другом так, чтобы получилась нормальная программа.
Дальнейшее усложнение
Закройте проект и сделайте еще одну копию его папки – «Красим форму 2». Над копией будем продолжать работу. Откройте проект из этой папки.
Работа для второй кнопки. Давайте напишем программу и для второй кнопки (Button2). Пусть при щелчке по ней:
Ширина горизонтальной полосы прокрутки становится равной 200
В текстовом поле TextBox1 появляется текст «Ширина полосы = 200»
Вновь становится виден элемент переключателя (RadioButton2).
Кнопка Button2 окрашивается в красный цвет.
В результате картинка должна стать такой, как на Рис. 1.21.
Рис. 1.21
В режиме дизайна (проектирования) сделаем по кнопке Button2 двойной щелчок мышкой. Перед нами – снова окно кода, но в нем появилась заготовка другой процедуры, то есть новое приглашение – на этот раз приглашение для ввода операторов, реагирующих на щелчок кнопки Button2. Введем их. Теперь содержимое окна кода таково:
Public Class Form1
Inherits System.Windows.Forms.Form
Windows Form Designer generated code
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
HScrollBar1.Width = 100
TextBox1.Text = "Ширина полосы = 100"
RadioButton2.Hide()
Button2.BackColor = Color.Yellow
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
HScrollBar1.Width = 200
TextBox1.Text = "Ширина полосы = 200"
RadioButton2.Show()
Button2.BackColor = Color.Red
End Sub
End Class
Пояснение: Для того, чтобы элемент RadioButton2 стал снова виден, мы использовали его метод Show. Кнопка же красится в красный цвет.
Запустите проект. Пощелкайте по кнопкам. Картинка у вас попеременно будет иметь вид то Рис. 1.20, то Рис. 1.21 .
Visual Studio .NET 2003 для удобства программиста отделяет процедуры в окне кода горизонтальной чертой. В книжке я не буду этого делать, ограничившись пропуском строки.
Аналогия. Давайте проведем аналогию между нашей программой и программой, которую мы дали любителю футбола в 1.1
Та программа состояла из нескольких процедур, эта также состоит из нескольких (двух) процедур.
Та программа описывала поведение одного человека в городе, эта описывает поведение нескольких объектов на форме.
В той программе процедуры состояли из команд, записанных одна за другой и выполнявшихся в порядке записи. В этой программе – то же самое: процедуры состоят из операторов, записанных один за другим и выполняющихся в порядке записи.
В той программе встречались процедуры двух типов ("Как…" и "Что делать, если…"). В этой программе обе процедуры одного типа - "Что делать, если нажата кнопка". О процедурах типа "Как…" поговорим позже.
В той программе события – это "Застрял лифт", "Заблудился", в этой события - это нажатия на кнопки.
Красим форму. А как же с обещанной покраской формы? Ах, да, забыл! Поместите на форму третью кнопку и создайте для нее такую процедуру:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Me.BackColor = Color.White
End Sub
Me – по-русски «Я». Так называют в окне кода формы саму форму, несмотря на то, что ее официальное имя – Form1. Красим мы ее в белый цвет (White). Результат нажатия на кнопку 3 виден на Рис. 1.22.
Рис. 1.22
DebugWriteLine
Пусть вам нужен инструмент для вывода чисел и текста в специальное окно VS, которое называется Output. Зачем такой вывод нужен, вы узнаете позже.
Чтобы найти этот инструмент, заглянем в «ларец» System. Наберите в начале новой строки внутри процедуры это слово и точку. Перед вами развернется список того, что входит внутрь пространства имен System. Мы видим, что туда входят другие пространства имен, например Diagnostics. Кроме них мы видим и множество других элементов, помеченных разными значками. Будем называть их объектами. Впоследствии вы обнаружите, что в большинстве своем они совсем не похожи на то, что мы называли объектами раньше – форму и элементы управления.
Объекты бывают разных видов. Укажем некоторые виды:
классы | |||
структуры | |||
модули | |||
перечисления |
Это еще не «иглы», но уже нечто вроде «яйца». Все эти объекты – важные инструменты программирования, вместилища полезных свойств, методов и других нужных вещей.
Наша же дорога ведет мимо – внутрь пространства имен Diagnostics. Выберите его в упомянутом списке и введите точку. Перед вами развернется список объектов, которые входят внутрь пространства имен Diagnostics.
Выберите здесь класс Debug и снова введите точку. Перед вами развернется список того, чем обладает класс Debug. Будем называть это компонентами (members) класса. Обратите внимание, что значки здесь уже другие: нет ни классов, ни модулей, ни других объектов. А есть то, чем эти объекты обладают, то есть компоненты. В случае класса Debug это свойства и методы. Вот значки наиболее распространенных компонентов:
свойства | |||
методы (многие методы называются также функциями) | |||
события |
Вот это уже настоящие «иглы». Выберем метод WriteLine, а в скобках после него напишем 3+2. Кстати, после ввода открывающей скобки VB услужливо предложит подсказку на тему о том, что должно быть в скобках. Со временем вы научитесь эту подсказку понимать.
Вот как выглядит теперь наша процедура:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Microsoft.VisualBasic.Interaction.Beep()
System.Diagnostics.Debug.WriteLine(3 + 2)
End Sub
Если вы не видите сейчас на экране окна Output, проделайте View ® Other Windows ® Output. Запустите проект, в окне Output вы увидите возникающие строчки служебной информации, связанной с запуском и компиляцией вашего проекта. Затем на экране появится форма. Нажмите кнопку, вы услышите звук и в окне Output появится число 5. Все верно. Завершите работу проекта. В окне Output появится строчка служебной информации, связанной с завершением работы вашего проекта.
Диалог с компьютером
Напишем программу, которая осуществляла бы такой диалог человека с компьютером:
КОМПЬЮТЕР ВЫВОДИТ НА ЭКРАН: Здравствуй, я компьютер, а тебя как зовут?
ЧЕЛОВЕК ВВОДИТ С КЛАВИАТУРЫ: Коля
КОМПЬЮТЕР ВЫВОДИТ НА ЭКРАН: Очень приятно, Коля. Сколько тебе лет?
ЧЕЛОВЕК ВВОДИТ С КЛАВИАТУРЫ: 16
КОМПЬЮТЕР ВЫВОДИТ НА ЭКРАН: Ого! Целых 16 лет! Ты уже совсем взрослый!
Очевидно, что человек в процессе беседы имеет право вводить с клавиатуры какие угодно имена и какой угодно возраст.
Пусть компьютер задает свои вопросы в InputBox, человек вводит свои ответы в тот же InputBox, а последнюю реплику компьютер подает в MsgBox. Для хранения в памяти имени человека выдумаем переменную imya, а для возраста – vozrast.
Вот программа:
Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
Dim imya As String
Dim vozrast As Integer
imya = InputBox("Здравствуй, я компьютер, а тебя как зовут?")
vozrast = InputBox("Очень приятно, " & imya & ". Сколько тебе лет?")
MsgBox ("Ого! Целых " &
vozrast & " лет! Ты уже совсем взрослый!")
End Sub
Обратите внимание на запятые, точки и некоторые пробелы внутри кавычек. Если бы их не было, слова бы сливались вот так:
КОМПЬЮТЕР ВЫВОДИТ НА ЭКРАН: Очень приятноКоляСколько тебе лет?
КОМПЬЮТЕР ВЫВОДИТ НА ЭКРАН: Ого! Целых16лет! Ты уже совсем взрослый!
Диалог будет отличаться только той информацией, которую вводит человек. Так, в другой раз по этой же программе будет осуществлен следующий диалог:
КОМПЬЮТЕР: Здравствуй, я компьютер, а тебя как зовут?
ЧЕЛОВЕК : Фантомас!
КОМПЬЮТЕР: Очень приятно, Фантомас! . Сколько тебе лет?
ЧЕЛОВЕК: 100
КОМПЬЮТЕР: Ого! Целых 100 лет! Ты уже совсем взрослый!
Не подумайте, что эта программа очень умна. Она совершенно не анализирует, какую информацию человек ввел с клавиатуры. Поэтому с ней возможен и такой диалог:
КОМПЬЮТЕР: Здравствуй, я компьютер, а тебя как зовут?
ЧЕЛОВЕК: Сгинь с моих глаз!
КОМПЬЮТЕР: Очень приятно, Сгинь с моих глаз!. Сколько тебе лет?
ЧЕЛОВЕК: -2
КОМПЬЮТЕР: Ого! Целых -2 лет! Ты уже совсем взрослый!
Задание 15.
Напишите программу для следующей задачи: Компьютер запрашивает названия двух планет, радиусы их орбит (в миллионах километров) и скорости движения по орбите (в миллионах километров в сутки). После этого он вычисляет продолжительность года на планетах и выдает результат в таком виде:
Продолжительность года на планете Земля – 365 суток, а на планете Эоэлла – 12 суток.
Результат нужен в трех вариантах: вывод в текстовое поле, метку и MsgBox.
Указание для тех, кто не знает физики и геометрии: Год равен времени одного оборота по орбите, а оно равно длине орбиты, деленной на скорость движения по орбите. Длина орбиты равна 2?R, где R – радиус орбиты.
Edit
Undo. Отменить последние действия. Работает не только в окне кода, но и в окне конструктора.
Redo. Вернуть отмененные действия. Работает не только в окне кода, но и в окне конструктора.
Cut, Copy, Paste, Delete. Обычные и привычные для вас команды перемещения, копирования, удаления слов и фрагментов текста вашей программы. Применяются не только к тексту в окне кода, но и к элементам управления на форме в окне конструктора. Как проводят эти действия с текстом, рассказано в Приложении 2. А с элементами управления вот как: Часто, когда нам нужно иметь на форме несколько совершенно одинаково настроенных элементов управления, удобнее не брать их поодиночке в Toolbox и настраивать каждый по0отдельности, а разместив один на форме и тщательно настроив его нужным образом, затем скопировать несколько раз. Копировать можно двумя способами:
Щелчок по копируемому объекту ® Edit ® Copy ® щелчок по форме ® Edit ® Paste ® Edit ® Paste…
Щелчок по копируемому объекту правой клавишей мыши ® пункт Copy в выпавшем контекстном меню ® щелчок по форме правой клавишей мыши ® пункт Paste в выпавшем контекстном меню ® еще несколько раз пункт Paste… Так быстрее.
Аналогично используются Cut (вырезать для переноса в другое место) и Delete (уничтожить).
Find and Replace. Команды поиска и замены в тексте вашей программы отдельных слов и фрагментов.
Advanced ® Word Wrap. Программный текст в окне кода автоматически переносится со строки на строку.
Advanced ® Make Uppercase. В выделенном фрагменте делает все буквы заглавными.
Advanced ® Make Lowercase. В выделенном фрагменте делает все буквы строчными.
Advanced ® Comment Selection (Uncomment Selection). Данные пункты меню ставят и снимают кавычки комментариев сразу во всех строках выделенного вами фрагмента кода. Зачем это нужно? У программистов при отладке программы часто возникает необходимость заставить несколько строк кода не выполняться. Но стирать их жалко, так как они еще могут понадобиться. Тогда программисты ставят в начале каждой из этих строк одинарную кавычку. VB думает, что эти строки – комментарий, и не выполняет их, что и требовалось. Когда эти строки кода понадобятся вновь, программист кавычки удаляет. Когда таких строк много, ставить и снимать кавычки в каждой строке по-отдельности утомительно.
Еще о пользе переменных
Переменные быстры. Значения переменных величин не обязаны, подобно тексту элементов управления, отображаться «на медлительной поверхности проекта». Они спрятаны глубоко в сверхбыстрой оперативной памяти компьютера, там над ними удобно проводить вычисления и разнообразные логические преобразования. Фактически вся мыслительная работа компьютера проводится над переменными величинами. И лишь иногда, когда человеку понадобится, они показываются «на поверхности» в виде содержимого текстовых полей или как-нибудь еще.
Создавая калькулятор, мы не ведали ни о каких переменных, поэтому вместо изящного
Рез = Чис1 + Чис2
писали громоздкое
Результат.Text = Val(Число1.Text) + Val(Число2.Text)
Вообще, попытки использовать для вычислений вместо переменных текстовые поля напоминает попытку неуклюжих королей-тугодумов (текстовых полей) из разных государств договориться между собой. После безуспешных попыток они вызывают своих шустрых министров иностранных дел (переменные величины), которые в два счета договариваются и отдают готовый договор на подпись королям (имеется в виду, что результат вычислений показывается в текстовом поле).
Улучшаем калькулятор. С учетом сказанного попробуем улучшить программу калькулятора:
Public Class Form1
Inherits System.Windows.Forms.Form
Windows Form Designer generated code
Dim Чис1 As Double 'Переменная, содержащая число из текстового поля Число1
Dim Чис2 As Double 'Переменная, содержащая число из текстового поля Число2
Dim Рез As Double 'Переменная-результат, предназначенный для текстового поля Результат
Private Sub Кл_сложения_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Кл_сложения.Click
Чис1 = Число1.Text 'Значения исходных данных переходят из текстовых полей в переменные
Чис2 = Число2.Text
Рез = Чис1 + Чис2 'Обработка переменных для получения результата
Результат.Text = Рез 'Значение результата переходит из переменной в текстовое поле
End Sub
Private Sub Кл_вычитания_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Кл_вычитания.Click
Чис1 = Число1.Text
Чис2 = Число2.Text
Рез = Чис1 - Чис2
Результат.Text = Рез
End Sub
Здесь не показаны процедуры умножения и деления, так как они совершенно аналогичны процедурам сложения и вычитания. Переменные Чис1, Чис2 и Рез встречаются в каждой процедуре, поэтому в данном случае удобно объявлять их не в каждой процедуре, а один раз – вне процедур. Теперь каждая процедура может этими переменными пользоваться. Переменными же, объявленными внутри процедуры, может пользоваться только процедура, в которой они объявлены, а другие не могут. Традиционно объявления таких «общих» переменных делаются перед текстом всех процедур, как это сделал я.
Остальное ясно из комментариев к тексту программы. Нельзя сказать, что программа стала короче, мы пока не умеем писать короткие программы. Зато мы получили возможность спокойно работать с переменными, а эта возможность нам понадобится в будущем, когда мы будем бороться с вводом в текстовые поля нечисловой информации.
Эта схема, когда информация из текстовых полей (или других средств задания исходных данных) передается в переменные, затем обрабатывается, а уж затем из переменных передается обратно – в текстовые поля – весьма разумна и я рекомендую ей пользоваться.
Три совета. Дорогие читатели-новички! Вот вам три моих совета, по своей силе приближающихся к непререкаемым приказам:
1. Программы, которые вы видите в книге, вам необходимо вводить в компьютер и выполнять их, даже если они кажутся вам понятными, и даже если я явно этого не требую. В ряде случаев вы получите неожиданные результаты, из чего сделаете вывод, что программы эти вы поняли не до конца и «как хорошо, что я не поленился их проверить».
2. В каждой из этих программ экспериментируйте, то есть разными способами изменяйте в них то, что я как раз в этот момент объясняю. Например, если я объясняю оператор For i=1 To 5, пробуйте For i=1 To 10 и смотрите, что будет.
3. Выполняйте и сверяйте с ответом все задания. Это, конечно, главный совет из трех. Учтите, что сверенная с ответом правильно работающая программа – ваша победа, сверенная с ответом неправильно работающая программа – временное поражение, отказ от сверки – разгром.
Если вы пожалеете времени и пренебрежете этими советами, то через несколько страниц можете обнаружить трудности в понимании материала и вскоре не сможете правильно составить большинство программ.
File
New ® Project. Удаляет из среды все открытые проекты и создает новый проект.
Open ® Project. Удаляет из среды все открытые проекты и открывает для работы один из проектов, сохраненных вами ранее.
Add Project ® New Project. Если у вас в среде уже открыты проекты, то добавляет к ним новый пустой проект.
Add Project ® Existing Project. Если у вас в среде уже открыты проекты, то добавляет к ним один из проектов, сохраненных вами ранее.
Close Solution. Удаляет из среды решение, то есть все проекты.
Save All. Сохраняет решение, то есть все содержимое всех открытых проектов.
Print. Распечатывает программу или другую информацию проекта на принтере.
Page Setup. Настройка печати.
Recent Projects. Небольшой список проектов, с которыми вами велась работа в последнее время. Щелчок по проекту открывает его. Это быстрее, чем Open ® Project.
Exit. Выход из VS.
Format
Это меню имеет дело с размерами, формой и местоположением элементов управления на форме и друг относительно друга, то есть с тем, с чем вы и так прекрасно справляетесь безо всяких меню. Однако, когда элементов управления на форме много и их нужно расположить как-то упорядоченно, это меню помогает сэкономить время.
Меню Format недоступно, когда вы работаете в окне кода или запустили проект.
Смысл пунктов меню показан в Таблица 4.1. В левой части таблицы вы видите открытое меню Format. В центральной части таблицы я для удобства поместил соответствующую панель инструментов VS для выполнения тех же действий. О панелях инструментов читайте в следующем разделе.
Создайте проект. Расположите на форме несколько кнопок, меток и других элементов управления разной величины и продолговатости. Выделите один или несколько объектов на форме. Чтобы выделить несколько объектов, щелкайте по ним при нажатой клавише Ctrl или обведите их рамочкой. Попробуйте применить эти пункты. Посмотрите, что получится. Это тот случай, когда легче понять на опыте, чем разбираться в объяснениях.
Меню Format | Панель инструментов Layout | Смысл инструментов | |||
Левый верхний угол выделенного элемента управления совмещается с ближайшим узлом сетки | |||||
Выравнивание выделенных эл-в управления по горизонтали | |||||
Выравнивание выделенных эл-в управления по вертикали | |||||
Выравнивание выделенных эл-в упр-я по ширине, высоте, размеру | |||||
Выравнивание горизонтального промежутка между выделенными эл-ми упр-я, увеличение, уменьшение, уничтожение его. | |||||
Выравнивание вертикального промежутка между выделенными эл-ми упр-я, увеличение, уменьшение, уничтожение его. | |||||
Центрирование выделенных эл-в упр-я на форме по горизонтали и вертикали | |||||
Перенесение выделенных эл-в упр-я на передний или задний план | |||||
«Запирание» и «отпирание» выделенных эл-в упр-я | |||||
Таблица 4.1
Пояснения:
В пунктах Align и Make Same Size выравнивание осуществляется относительно элемента управления, выделенного последним.
Order. Бывает, что в результате вашего проектирования формы некоторые элементы управления перекрываются другими. Для примера поместите на проект две большие кнопки так, чтобы одна частично или полностью закрывала другую. Тогда приобретает важность вопрос – какой из объектов ближе к вам, а какой дальше. Управлять этим вы можете, выбрав Bring to Front (выдвинуть на передний план) или Send to Back (задвинуть на задний план).
Lock Controls. Иногда неловким движением мыши вы можете сдвинуть или изменить размер объекта в тщательно сконструированном вами проекте. Чтобы этого не произошло, и нужен этот пункт. Объекты примерзнут к месту. Когда вы захотите их разморозить, снова выберите этот пункт.
Форматирование чисел
Одни и те же значения могут выглядеть по-разному. Например, в школьной тетрадке одну и ту же дату вы можете записать так – 25.12.03 и так – 25 декабря 2003 года. Одно и то же число вы можете записать так – 500 и так – 5*102. Что касается VB, то он выбирает внешний вид данных, исходя из своих соображений, которые не всегда совпадают с нашими желаниями. В этом случае возникает необходимость строго указать компьютеру, в каком виде (формате) мы хотим лицезреть то или иное значение.
Взгляните на такую программу:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a As Double = 1230000000000000000
WriteLine(a)
End Sub
Запустите проект. Вот результат:
1,23E+18
Что это значит? Это значит, что VB не любит слишком длинных чисел и представляет их вам не в привычном для обычного человека, а в так называемом экспоненциальном или научном формате. Число 1,23E+18 это то же самое число 1230000000000000000, только выглядящее по-другому. Конструкция E+18 означает просто умножение на 1018. Таким образом, 1,23E+18 означает 1,23*1018. По-другому, вам нужно передвинуть запятую на 18 позиций направо – и получится нормальное число.
А теперь взгляните на такую программу:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim a As Double = 0.00000000000654
WriteLine(a)
End Sub
Результат:
6,54E-12
Конструкция E-12 означает просто умножение на 10-12
или, что то же, деление на 1012. Таким образом, 6,54E-12 означает 6,54*10-12. По-другому, вам нужно передвинуть запятую на 12 позиций налево – и получится нормальное число.
Если после этих объяснений вы все еще не полюбили экспоненциальный формат, вы можете приказать компьютеру, чтобы он вас не утомлял им, а показывал результаты по-человечески. Для этого в операторе WriteLine(a) нужно использовать функцию форматирования, то есть управления внешним видом. Функция эта называется Format. Для конкретности возьмем первую из наших двух программ, ту, где присутствует большое целое число. Здесь нужно вместо a написать Format(a, "#"). Получится
WriteLine(Format(a, "#"))
Символ # внутри кавычек означает, что вы желаете видеть число в обычном виде и без дробной части. Вот тот же результат в новом формате (проверьте):
1230000000000000000
А теперь разберем наиболее популярные возможности функции Format по форматированию чисел (а форматировать она может, кстати, данные и других типов). Возможности эти иллюстрирует следующая программа:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim a As Double = 12345.67890123
Dim b As Double = -0.0729
WriteLine(Format(a, "#"))
WriteLine(Format(a, "0"))
WriteLine(Format(a, "#.###"))
WriteLine(Format(a, "0.000"))
WriteLine(Format(a, "########.##########"))
WriteLine(Format(a, "00000000.00000000000"))
WriteLine(Format(b, "########.##########"))
WriteLine(Format(b, "00000000.00000000000"))
WriteLine(Format(b, "0.##########"))
WriteLine(Format(b, "P"))
WriteLine(Format(a, "E"))
WriteLine(Format(a, "C"))
WriteLine(Format(a, "Ж###У###Ч###К###А####.#К###А###Ш###Т##А#Н#К#А"))
End Sub
Запустите проект. Вот результаты:
12346
12346
12345,679
12345,679
12345,67890123
00012345,67890123000
-,0729
-00000000,07290000000
-0,0729
-7,29%
1,234568E+004
12345,68р.
ЖУЧК1А2345,6К789А012Ш3ТАНКА
Поясним то, что мы увидели. В скобках функции Format располагаются через запятую два аргумента. Первый аргумент – это то, что мы форматируем – переменная, число, выражение. Второй аргумент – строка в кавычках, при помощи которой мы и управляем внешним видом числа. Символы в кавычках называются символами формата и спецификаторами формата (мы не будем вдаваться в тонкости, объясняя какие из них какие). Вот пояснение действия этих символов (полный смысл символов # и 0 становится ясен по прочтении нескольких строчек таблицы):
Символы и результаты |
Пояснение |
# |
Вы желаете видеть число в обычном виде и без дробной части |
12346 | |
0 |
Вы желаете видеть число в обычном виде и без дробной части |
12346 | |
#.### |
Вы желаете видеть число в обычном виде. После запятой вы желаете видеть не больше 3 знаков, целая часть дроби все равно будет показана полностью |
12345,679 | |
0.000 |
Вы желаете видеть число в обычном виде. После запятой вы желаете видеть ровно 3 знака, целая часть дроби все равно будет показана полностью |
12345,679 | |
########.########## |
После запятой вы желаете видеть не больше 10 знаков. Если целая часть состоит из одного нуля, то ноль перед запятой показан не будет |
12345,67890123 ?,0729 |
|
00000000.00000000000 |
После запятой вы желаете видеть ровно 10 знаков, недостающие места будут заполнены нулями. Если целая часть дроби короче 8 цифр, недостающие места будут заполнены нулями. |
00012345,67890123000 ?00000000,07290000000 |
|
0.########## |
Слева от запятой действуют «законы 0», а справа – «законы #» |
?0,0729 | |
P |
Число переводится в проценты умножением на 100 и добавлением знака % |
-7,29% | |
E |
Число показывается в экспоненциальном виде |
1,234568E+004 | |
C |
Число показывается в виде валюты страны, на которую настроена Windows |
12 345,68р. | |
Последняя строчка процедуры «с Жучкой и Каштанкой» показывает, что внутрь кавычек мы можем добавлять любые символы и они будут отображены на соответствующих местах. Это открывает перед нами возможности необычного форматирования. Надо только, чтобы эти символы не совпадали со стандартными, а то VB спутается. |
Результат.Text = Val(Число1.Text) / Val(Число2.Text)
можете написать
Результат.Text = Format(Val(Число1.Text) / Val(Число2.Text), "0.####################")
Только имейте в виду – если ваш результат будет такой маленький, что двадцати цифр, указанных мной после точки, не хватит, то ничего, кроме нулей, вы и не увидите, а вот экспоненциальный формат покажет вам результат, пусть и непривычный для чтения.
Фейерверк возможностей
В этой главе на примере создания двух проектов – Калькулятора и Плеера – я хочу познакомить вас с простыми и приятными возможностями VB. Глава поневоле носит несколько рекламный оттенок. Перед вами распахнется скатерть-самобранка, на которой вы увидите в основном то, что повкуснее и не требует разгрызания. Однако, среди вкусного абсолютно все полезно, и почти все совершенно необходимо. Несмотря на легкость материала, эта глава служит фундаментом для остальных, поэтому читать ее «по диагонали» никак нельзя, без нее не будет понятно дальнейшее.
Объекты и пространства имен
В предыдущей главе вы познакомились с некоторыми объектами (кнопка, метка и т.п.), их свойствами (Width, BackColor и др.) и методами (Hide, Show). Вся мощь ваших возможностей в VB определяется тем, с каким количеством объектов, их свойств, методов и других элементов вы знакомы и умеете правильно пользоваться.
Все стандартные объекты вам предоставляет Библиотека классов .NET Framework, о которой я упоминал во Введении. Для начинающего данная библиотека кажется лабиринтом. В этой главе мы поучимся передвигаться по лабиринту в поисках нужного нам объекта, а заодно и познакомимся с некоторыми из объектов.
Понятие объекта – центральное в VB и достаточно сложное для новичка. Углублять это понятие мы будем на всем протяжении книги.
Переменные величины
Чтобы сделать в VB что-нибудь более существенное, чем примитивные калькулятор и плеер, нам нужно резко увеличить объем знаний о VB. Первая ступенька на лестнице набора знаний – переменные величины. Удовольствие больше для Холмса, чем для Джекки Чана. Но что может сделать Джекки Чан с Холмсом?
Первые шаги
В этой главе вы создадите и опробуете на компьютере свою самую первую программу на VB. Для этого глава и написана.
Работа в среде Visual Studio NET
Начиная со следующей главы мы будем изучать программирование уже по-серьезному. Но выходя на бой, нужно привыкнуть к доспехам. Не будем ли мы спотыкаться в нашей броне? Наша броня – Visual Studio .NET. Мы не можем допустить, чтобы головоломка из окон, панелей инструментов, меню и кнопок среды VS стала для нас камнем преткновения. И наоборот – знание VS придаст нашему программированию необходимые удобство и мощь. Поэтому сейчас мы будем изучать именно работу в среде VS, то есть программировать не будем, а будем учиться нажимать на кнопки.
Не все, что здесь изложено, пригодится вам немедленно, но даже если вы очень спешите, внимательно проглядите весь материал главы, чтобы, когда возникнет необходимость, знать, что для решения возникшей проблемы средство есть и вы о нем где-то читали. В любом случае когда-нибудь в будущем, споткнувшись в очередной раз, вы бросите все и изучите эту главу систематически.
Если вы решили изучать книжку, начиная с этой главы, знайте, что самые основы работы в среде VS уже изложены в 1.3 и далее на примерах создания проектов. В частности, в 1.3.3 кратко описана работа с Toolbox, в 3.2.1 – с окном свойств.
Кроме этого, некоторую часть материала, относящегося к среде VS, мне показалось уместным изложить позже, в тех местах книги, где в них возникнет необходимость. Вот эти места: Глава 9. «Отладка программы», 11.5.9«IntelliSense», 21.3«Структура проекта и решения. Окно Solution Explorer.», 24.4«Работа в VS с базами данных без проекта с помощью Server Explorer».
Все остальное изложено здесь.
В этой же главе я кратко излагаю процесс инсталляции Visual Studio .NET на ваш компьютер и порядок установки вашего готового проекта на другие компьютеры. Если вы даже не собираетесь делать ни того, ни другого, все равно внимательно проглядите этот материал, так как в нем содержатся необходимые сведения о VS.
Главное меню
Какое же приложение Windows без своего меню?! Нашему калькулятору оно, вроде бы, ни к чему, но, все равно, интересно и полезно сделать хотя бы простенькое.
Главное меню Visual Studio NET
А теперь кратко рассмотрим все нужные нам на первых порах пункты главного меню среды VS. О многих из них мы уже говорили или будем говорить позже и поэтому они здесь только упомянуты.
Обратите внимание, что меню VS и отдельные его пункты значительно меняют свое содержание в зависимости от того, что мы сейчас делаем. Так, пункт Format не виден (как ненужный), когда мы работаем в окне кода.
Help
Когда вы пишете оператор на VB, вы должны, во-первых, понимать, что он означает и что означает каждая его часть, а во-вторых, вы должны знать правила его записи. К тому же библиотека классов .NET Framework чрезвычайно богата, в нее входят тысячи элементов – свойств, событий и др. Невозможно запомнить смысл и правила записи каждого элемента. Вот здесь-то и нужен Help – система помощи, которая позволит вам быстро найти информацию по любому элементу. Если, конечно, вы знаете английский.
Пользоваться помощью VB можно по-разному. Самый распространенный способ – такой:
F1. Если вы хотите узнать подробности о каком-то слове из вашей программы, например, Width, вы щелчком мыши ставите на него текстовый курсор и нажимаете на клавиатуре клавишу F1. Появляется окно с пояснениями или указаниями (обычно оно присоединяется к центральной группе окон). Вы узнаете, какому классу принадлежит интересующее вас свойство или, скажем, метод. Если вы спрашиваете об объекте, то узнаете, какому пространству имен принадлежит его класс. По ссылке Members (компоненты) из окна помощи узнаете все свойства, методы и другие элементы, принадлежащие данному классу. Свойств здесь, между прочим, вы найдете больше, чем в окне свойств, так как здесь приведены и те свойства, которые имеют смысл только в режиме [run]. Например, свойство SelectedText объекта TextBox, которое выдает фрагмент текста, выделенного нами в текстовом поле.
По ссылке Overview прочтете общие слова и основной материал, касающийся данного класса, и т.д.
Нижеперечисленные средства помощи вы найдете в пункте Help главного меню VS.
Dynamic Help. Это еще более удобный способ. Выберите этот пункт. Перед вами появляется окно Dynamic Help (динамическая помощь). Поместите его в одну из групп окон. Когда вы вводите программный текст, это окно рекомендую держать открытым. В процессе ввода текста VB видит, какое слово и какой оператор вы вводите, и без вашей просьбы выводит в окно Dynamic Help заголовки справок по этому слову и по этому оператору, и по другим словам в операторе, а также заголовки справок по сопутствующим темам. Вам остается только в случае необходимости выбрать нужный заголовок. Аналогичная информация появляется и когда вы просто щелкнете мышью на любом слове программы. Аналогичная же полезная информация, касающаяся уже не слов VB, а вашей деятельности, появляется в этом окне, когда вы работаете в окне конструктора и в других окнах.
Contents представляет вам информацию о VB в систематизированном виде. Здесь вы лучше всего узнаете, что в VB есть, а чего нет. Но помните, что это не учебник, а справка.
Index удобен тогда, когда вы заранее знаете название элемента, который вас интересует (например, Button). Вы вводите это слово в поле и видите заголовки справок по этому слову.
Search. Этот пункт полезен тогда, когда вы ищете информацию не только по конкретным словам VB, но и по набору слов, например, «window types».
Show Start Page. Этот пункт к справке не относится, но полезен тем, что вызывает на экран стартовую страницу.
Имена переменных Ключевые слова VB
Как правильно давать имена элементам VB, мы уже говорили. Повторю:
Имя может состоять из букв, цифр и знаков подчеркивания, причем не должно начинаться с цифры. И не должно состоять из одних подчеркиваний.
Правда, в VB имя определяется несколько более широко, но то правило, которое я дал, можно считать хорошим советом.
В школе переменные величины мы привыкли обозначать буквами (a, s, d ... ). Большинство языков программирования, в том числе и VB, позволяет обозначать переменные именами из многих букв. Вот два равносильных фрагмента программы:
a=3; | Summa=3; | ||
b=4+a; | ШУРА=4+Summa; | ||
Debug.WriteLine(a, b) | Debug.WriteLine(Summa, ШУРА) |
В том и другом случае будут напечатаны числа 3 и 7. Очевидно, компьютеру все равно, какими именами мы обозначаем переменные величины или другие элементы, в смысл имен он не вдумывается и не удивляется, что переменная Summa никакой суммой не является, а просто числом 3.
Примеры правильной
записи имен:
a
s25
oshibka
polnaja_Summmma
_1
__________tri_plus_dva__a1b88qqQQQQQQQQQQQQ
_Это_не_имя_Уж_поверьте
Примеры неправильной
записи имен:
polnaja summa | содержится символ (пробел), не являющийся буквой, цифрой или знаком подчеркивания | ||
1 | начинается с цифры | ||
8as | начинается с цифры | ||
Domby&Son | содержится символ & , не являющийся буквой, цифрой или знаком подчеркивания | ||
Это верное имя Да да да | содержится символ (пробел), не являющийся буквой, цифрой или знаком подчеркивания |
VB игнорирует в именах разницу между строчными и прописными буквами. Так, для него Summa
и sUmmA – одно и то же имя. Но он присматривает за тем, чтобы в окне кода данное конкретное имя было написано всегда одинаково, а именно так, как объявлено (правда, я не уверен, что он так присматривает за всеми русскими буквами, во всяком случае Visual Basic 6.0 не всегда присматривал).
Ключевые слова. Ключевые слова (Keywords) – это служебные слова VB, которые он широко использует в тексте программы. Мы уже знакомы с некоторыми из них: Dim, Integer, Double, Sub и др. В нижеприведенной таблице перечислены все ключевые слова VB.
AddHandler |
AddressOf |
Alias |
And |
AndAlso |
Ansi |
As |
Assembly |
Auto |
Boolean |
ByRef |
Byte |
ByVal |
Call |
Case |
Catch |
CBool |
CByte |
CChar |
CDate |
CDec |
CDbl |
Char |
CInt |
Class |
CLng |
CObj |
Const |
CShort |
CSng |
CStr |
CType |
Date |
Decimal |
Declare |
Default |
Delegate |
Dim |
DirectCast |
Do |
Double |
Each |
Else |
ElseIf |
End |
Enum |
Erase |
Error |
Event |
Exit |
#ExternalSource |
False |
Finally |
For |
Friend |
Function |
Get |
GetType |
GoTo |
Handles |
If |
Implements |
Imports |
In |
Inherits |
Integer |
Interface |
Is |
Let |
Lib |
Like |
Long |
Loop |
Me |
Mod |
Module |
MustInherit |
MustOverride |
MyBase |
MyClass |
Namespace |
New |
Next |
Not |
Nothing |
NotInheritable |
NotOverridable |
Object |
On |
Option |
Optional |
Or |
OrElse |
Overloads |
Overridable |
Overrides |
ParamArray |
Preserve |
Private |
Property |
Protected |
Public |
RaiseEvent |
ReadOnly |
ReDim |
#Region |
REM |
RemoveHandler |
Resume |
Return |
Select |
Set |
Shadows |
Shared |
Short |
Single |
Static |
Step |
Stop |
String |
Structure |
Sub |
SyncLock |
Then |
Throw |
To |
True |
Try |
TypeOf |
Unicode |
Until |
Variant |
When |
While |
With |
WithEvents |
WriteOnly |
Xor |
#Const |
#ExternalSource |
#If...Then...#Else |
#Region |
- |
& |
&= |
* |
*= |
/ |
/= |
\ |
\= |
^ |
^= |
+ |
+= |
= |
-= |
Dim [Sub] As Integer
[Sub] = 99
Я также не рекомендую использовать на первых порах в качестве имен для создаваемых вами переменных имена популярных объектов, их свойств, методов и др. Например, если вы назовете переменную именем Button1, BackColor или WriteLine, то VB, может, и не спутается, но спутаетесь вы.
Называем по-русски. Взгляните в текст любой программы. Он состоит в основном из ключевых слов на английском (на латинице) и имен. Причем и тех и других так много, что глаза разбегаются и непонятно, где ключевое слово, а где имя. А если это имя – то создано ли оно программистом или взято из библиотеки классов .NET Framework – сразу не поймешь. Нам, русскоязычным, здесь удобнее: мы можем имена давать на русском (на кириллице). Разница между английскими и русскими буквами сразу бросается в глаза и разбирать текст программы становится не в пример легче: все, что мы создали сами, названо по-русски, а все, что досталось от VB – по-английски. Я так и делаю.
InputBox
Как мы можем задать, сообщить компьютеру какую-нибудь величину? Оператором присваивания – раз. А теперь рассмотрим еще один удобный и приятный способ – InputBox.
В вашем проекте о прямоугольнике вы можете хоть сто раз нажимать на кнопку – результаты все время будут одинаковые. Это потому что исходные данные a=27018 и b=3954 никто не меняет. Скучно. Хорошо бы компьютер при нажатии на кнопку каждый раз спрашивал нас, чему на этот раз равны стороны прямоугольника. А мы бы ему отвечали. А уж потом он вычислял.
Для этого нам нужно слегка изменить программу. Скопируйте папку предыдущего проекта и работайте над копией. Вот что у вас должно быть в процедуре нажатия на кнопку:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a, b, S
a = InputBox("Введите длину прямоугольника")
b = InputBox("Введите ширину прямоугольника")
S = a * b 'Площадь
Debug.WriteLine(S)
End Sub
Сравните с предыдущей программой. Как видите, заменены первые две строки: a=27018 и b=3954. Также из учебных соображений выкинуто все, касающееся периметра.
Конструкция
a = InputBox("Введите длину прямоугольника")
есть оператор присваивания и означает она приказ компьютеру вывести сначала на экран такое окно, как на Рис. 5.1.
Рис. 5.1
После этого человек вводит в белое текстовое поле этого окна любое число и нажимает ОК. Далее компьютер присваивает переменной a введенное значение и продолжает работу, то есть переходит к выполнению следующего оператора.
Если вам не нравится строка WindowsApplication1 в заголовке окна, то вы можете задать свою строку, дополнив оператор следующим образом:
a = InputBox("Введите длину прямоугольника", "Ввод данных")
Результат вы видите на Рис. 5.2.
Рис. 5.2
Запустите проект. Проверьте его работу.
Если при вводе вы нажимаете не кнопку ОК, а кнопку Cancel или крестик, VB считает, что вы не «отменили ввод», а ввели так называемую пустую строку (что это такое, выяснится позже, сейчас достаточно знать, что выполнять умножение над пустыми строками бессмысленно и VB выдаст ошибку).
Не вводите также нечисловую информацию, иначе VB по той же причине выдаст ошибку.
Инсталляция Visual Studio NET
Чтобы работать с VB, на вашем компьютере должна быть установлена (инсталлирована) Visual Studio .NET.
Если вы не знаете, установлена ли VS на вашем компьютере, попробуйте запустить ее из стартового меню, где она должна находиться в Программах под именем Microsoft Visual Studio .NET или Microsoft Visual Studio .NET 2003. Если в стартовом меню ее нет, то почти наверняка она не установлена. Есть еще способ проверки – посмотреть в Панели управления Windows, в пункте Установка и удаление программ. Самый лучший способ – добраться до запускающего файла программы. Вот его адрес: Program Files \ Microsoft Visual Studio .NET 2003 \ Common7 \ IDE \ devenv.exe. Сделайте по нему двойной щелчок – если VS запустится – все в порядке.
Если VS не установлена, ее надо установить. Если вы никогда ничего не устанавливали, то в начале 4.6 вы можете прочесть, что такое установка программ на компьютере вообще. По правде говоря, инсталляция VS – дело не для новичка. Но если рядом нет никого, кто мог бы вам помочь …? В общем, смело вперед. Вероятность того, что у вас получится, достаточно велика.
VS предъявляет довольно высокие требования к компьютеру и операционной системе. Требования эти быстро меняются от года к году. В 2004 году требовался как минимум Pentium II – 450 Мгц с 192 Mb памяти, а рекомендовался Pentium III – 600 Мгц с 256 Mb памяти. Что касается операционных систем, то полную функциональность программирования могли обеспечить только Windows 2000, Windows XP Professional и Windows Server 2003.
Чтобы установить VS, вам нужен инсталляционный пакет компакт-дисков. На разных компьютерах и для разных версий Windows установка идет немного по-разному.
Вот последовательность ваших действий по установке VS:
Вставьте диск №1 из пакета в дисковод CD-ROM. Для этого нужно сначала нажать на кнопку дисковода и подождать, когда из него выдвинется поднос для диска. Аккуратно, без перекосов, установите диск на поднос блестящей ненадписанной стороной вниз. Старайтесь не дотрагиваться до блестящей поверхности пальцами. Снова нажмите на кнопку дисковода. Поднос вдвинется в дисковод, унося с собой диск.
Далее возможно одно из двух. Если автоматически запустится мастер установки, то перепрыгните через два пункта (к пункту «Начнет работу мастер инсталляции»). Если же через пару минут ничего не произошло, то читайте следующий пункт.
Вам нужно добраться до файла Setup.exe на компакт-диске. Для этого зайдите в значок Мой компьютер на рабочем столе Windows (или в стартовом меню) и найдите в открывшемся окне значок дисковода CD-ROM. Щелкните по нему правой клавишей мыши и в возникшем контекстном меню выберите пункт «Открыть». Перед вами откроется окно со списком папок и файлов компакт-диска.
Найдите в этом окне файл Setup.exe и двойным щелчком запустите его на выполнение.
Начнет работу мастер инсталляции. Он ведет всю установку. Ваши действия задаются мастером. Ваше дело – отвечать на его вопросы и выбирать из предложенных вариантов. Время от времени вам придется выполнять просьбу мастера вставить в дисковод другой диск. Иногда компьютер будет просить вас перезагрузиться, иногда – согласиться на условия лицензирования (чтобы показать, что вы согласны на эти условия, выбирайте пункт I agree или I accept). Сейчас я по порядку рассмотрю ключевые моменты установки.
Прежде чем устанавливать на ваш компьютер собственно программу VS мастер установки должен установить целый ряд программ, примерный список которых вы видите на Рис. 4.3 и без которых VS работать не может. Так как на большинстве компьютеров этих программ нет, то в инсталляционном пакете VS они предусмотрительно содержатся. Поэтому через некоторое время вы увидите окно установки (Рис. 4.1) с выделенным шагом 1. Это значит, что компьютер обнаружил отсутствие некоторых нужных программ и предлагает их установить.
Рис. 4.1
Щелкните шаг 1. Через некоторое время вы увидите (Рис. 4.2) сообщение, которое заинтересует тех, кто собирается разрабатывать и размещать на своем компьютере Web-приложения (см. Глава 23. ) и использовать свой компьютер, как Web-сервер.
Рис. 4.2
Если не собираетесь, то нажмите Skip и переходите к следующему пункту. Если собираетесь, то щелкните Setup Instructions. В появившейся инструкции вы прочтете, что вам придется немедленно дополнить установку операционной системы Windows, добавив в нее и настроив так называемые Internet Information Services и FrontPage Server Extensions. Там же подробно указывается, как это сделать. Сохраните эту инструкцию, иначе потом до нее не доберетесь. Сделайте то, что в ней сказано. Для этого вам может понадобится системный диск Windows. После того, как инструкция выполнена, возвращайтесь к установке VS. Снова вставьте 1 диск и щелкните по 1 шагу установки.
Теперь компьютер показывает вам (Рис. 4.3), каких именно программ ему недостает для начала установки VS:
Рис. 4.3
Главными среди этих программ являются Internet Explorer 6 и .NET Framework. Последняя является даже не программой, а, как я уже говорил, целой платформой, на которой основывается работа не только VS, но и других программ. Она настолько важна, что фирма Microsoft собирается включить ее в следующую версию Windows. Нажимайте Install Now и выполняйте все, что скажет мастер, пока не установятся все необходимые программы. Наконец вы увидите ту же самую картинку, что на Рис. 4.3, но против каждой программы будет поставлена галочка в знак того, что программа установлена. Нажимайте Done. 1 шаг установки завершен.
Вскоре мастер покажет вам картинку (Рис. 4.4) в знак того, что можно приступать ко 2 шагу инсталляции, то есть уже непосредственно к установке VS.
Рис. 4.4
Щелкайте шаг 2.
После заключения лицензионного соглашения вам будет предоставлена возможность выбирать компоненты VS, которые вы хотите установить (Рис. 4.5).
Рис. 4.5
Установите флажок у Visual Basic .NET. Снимите флажки у Visual C++ .NET, у Visual C# и у Visual J#. Если вы хотите пользоваться полными возможностями VS, установите все остальные флажки, как показано на рисунке. Если вы хотите немного сэкономить место на диске, то оставьте их так, как предлагает мастер. Если у вас совсем уж не хватает места, вы можете их даже снять. В этом случае вам придется смириться с тем, что некоторые возможности VS будут недоступны. Таблица справа сверху показывает вам объем выделенного компонента, поле посредине – его смысл, а диаграмма справа снизу – свободное место на диске.
Нажимайте Install Now. Компьютер довольно долго копирует файлы с инсталляционных дисков на жесткий диск и наконец выдает картинку с сообщением, что 2 шаг установки завершен (Рис. 4.6).
Рис. 4.6
Нажимайте Done.
Компьютер показывает такую же картинку, как на Рис. 4.4, но с выделенным 3 шагом. Вам предлагается установить справочную библиотеку MSDN Library, которая одновременно является основой системы Help.
Щелкайте шаг 3. На ваш компьютер будет установлена MSDN Library. В процессе установки вы увидите ряд окон. Названия этих окон в порядке их появления и указатель на текущее окно вы можете видеть на Рис. 4.7 в левом столбце. В том числе вы увидите окно лицензионного соглашения (выбирайте пункт I agree или I accept) и окна, сообщающие вам ту или иную информацию (нажимайте Next, что значит «Дальше»).
В одном из окон вам нужно будет выбрать тип установки (Рис. 4.7).
Рис. 4.7
Выбирайте одно из трех:
Full – полная установка (требует 1,8 Гигабайта на диске).
Minimum – минимальная установка. Требует 620 Мегабайтов на диске. Для начинающих этого достаточно. В случае необходимости вы всегда можете получить информацию с компакт-диска.
Custom – выборочная установка – для опытных программистов, которые знают, как устроена MSDN Library.
В окне Ready to Install нажимайте кнопку Install – мастер приступит к длительному копированию файлов на ваш компьютер, после чего окном Finish завершит установку MSDN Library.
После установки MSDN Library шаг 4 предлагает сделать апгрейд VS через Интернет или со специального диска. Если не хотите, нажимайте Exit.
Установка VS закончена. После окончания инсталляции можете вынуть компакт-диск и запускать Visual Studio .NET.
Integer, Long, Short, Byte – целые числа
Создайте проект с кнопкой и введите такую программу:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim a, b, c As Integer
a = 201234567
b = 201234567
c = a + b
WriteLine(c)
End Sub
Каждая из переменных a и b имеет значение где-то около 200 миллионов. Работает программа нормально. Вот результат:
402469134
Посмотрим, насколько большие числа способна воспринимать наша программа. Добавим пару цифр к значению a:
a = 20123456789
VB подчеркивает литерал и выдает всплывающую подсказку об ошибке, в которой мы видим слово Integer. В чем дело?
Как видно из таблицы, число типа Integer занимает в памяти 4 байта. Значит, под переменные а и b компьютер отводит в памяти ячейки по 4 байта каждая. 4 байта – это небольшой объем памяти и уместиться в него может целое число не слишком большого размера, а именно, как мы видим в таблице – в диапазоне плюс-минус два миллиарда с небольшим. Мы же, дописав две цифры, превысили это число, вот VB и сказал нам, что типу Integer не по чину быть таким большим.
Зададим а и b значения двухмиллиардные:
a = 2012345678
b = 2012345678
VB не возражает, но когда мы запускаем проект и нажимаем на кнопку, выдает сообщение об ошибке, в котором мы видим слово overflow, что означает «переполнение».
Дело в том, что суммируя, вычитая или умножая числа типа Integer, VB присматривает, чтобы и результат умещался в тип Integer. Ведь два миллиарда плюс два миллиарда будет четыре миллиарда, а это слишком много для Integer.
Что же делать, если нам нужно больше? В этом случае наши переменные должны быть рассчитаны на более длинные числа. Для того, чтобы переменная имела право принимать значения очень больших целых чисел, она должна быть объявлена не как Integer, а как Long
(Длинное Целое). Под переменную типа Long компьютер, как мы видим в таблице, отводит в памяти 8 байтов и поэтому она может принимать значения чисел длиной в 19 цифр.
Объявите все три переменные, как Long. Тогда все будет в порядке. Вы скажете: это нелогично, достаточно было объявить типом Long одну переменную c! Попробуйте и посмотрите, будет ли работать программа. Не работает. Опять overflow! VB считает, что так безопаснее. Строговато, но делать нечего. Впредь объявляйте все
переменные, участвующие в вычислениях, самым вместительным типом из тех, что могут понадобиться для результатов вычислений.
Зачем нужен Integer, если есть Long? Ну, хотя бы для того, чтобы экономить память. Из соображений экономии можно использовать и типы Short и Byte (см. таблицу).
Задание 10.
Население Москвы равняется а=9000000 жителей. Население Васюков равняется b=1000 жителей. Вся Москва переехала в Васюки. Сколько там стало жителей? Используйте переменные величины – сначала типа Short, а когда не получится – Integer.
Экономим чернила
Все-таки операторы у нас получаются очень длинные. Нельзя ли записывать их покороче? Можно. Есть два способа.
Как мы в дальнейшем улучшим наш калькулятор
Обеспечим вразумительные сообщения об ошибке при делении на ноль и при неправильном вводе чисел в текстовые поля.
Снабдим его паролем, чтобы все, кому не лень, не могли наслаждаться его возможностями (то и другое см. в 7.7).
Обеспечим привычный для глаз вид результатов (см. 5.4.7).
Но для этого нужно знать переменные величины.
Как увидеть значение переменной величины
Необходимо помнить, что если слева от знака равенства стоит переменная величина, то VB выполняет оператор присваивания «в уме». Это значит, что результат его выполнения не отображается на экране, а только запоминается. Вы будете глядеть на экран, на котором ничего не изменилось, и не будете знать не только значения переменной величины, но даже выполнился ли вообще оператор или нет. Как же все-таки узнать значение переменной величины? Первый способ такой.
В метке и текстовом поле. Садитесь за компьютер, создайте проект, в нем – кнопку, метку и текстовое поле. Запишите для кнопки такую процедуру:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim
a, b
a = 5 + 5
b = a + 2
Label1.Text
= a
TextBox1.Text
= b
End Sub
Оператор Dim «объявляет» переменные величины. Зачем это нужно, написано в 5.2, а пока скажу, что все
переменные нужно сначала объявить, а уж потом пользоваться. Запустив проект и щелкнув по кнопке, вы увидите в метке число 10, а в текстовом поле – число 12.
При помощи Debug.WriteLine. Для учебных целей и для отладки программ вместо меток и текстовых полей удобней пользоваться оператором Debug.WriteLine (его применение уже описано в 2.1.2). Создайте вторую кнопку и запишите для нее процедуру:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim a, b
a = 5 + 5
b = a + 2
Debug.WriteLine(a)
Debug.WriteLine(b)
End Sub
Запустив проект и щелкнув по кнопке, вы увидите числа 10 и 12 в окне Output. Если вы не видите окна Output, то ваши действия: View ® Other Windows ® Output.
Есть много и других способов увидеть значения переменных величин, но о них позже.
Как VB реагирует на наши ошибки
В 1.1 на примере похода на футбол я уже показал вам, к каким катастрофическим последствиям могут привести ошибки в программе. Что будет, если вы допустите ошибку в программе на VB? Это зависит от того, что это за ошибка и сумеет ли VB ее своевременно обнаружить. Рассмотрим 3 типа ошибок.
Смысловые ошибки – 1. Итак, вы сохранили свой первый проект. Закройте его – File ® Close Solution. Создайте новый проект. Он предназначен для того, чтобы мы намеренно допускали в нем ошибки и учились их исправлять. Назовите проект как-нибудь, например, «Ошибки». Поместите на форму одну-единственную кнопку (Рис. 1.15).
Рис. 1.15
В режиме проектирования сделайте двойной щелчок по этой кнопке и в возникшей заготовке процедуры в окне кода введите такой код:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a = 90
Button1.Width = 100 - a
End Sub
Поясним его.
Оператор Dim a = 90 означает «Объявим, что существует переменная a и присвоим ей значение 90». Другими словами, «Пусть а будет равно 90». Оператор Button1.Width = 100 - a означает «Сделать ширину кнопки Button1 равной 100 – a», то есть в нашем случае 10. Если вы подзабыли, что такое переменная величина, читайте 5.1.
Запустите проект, нажмите кнопку. Кнопка стала слишком узкой, так как 10 – достаточно маленькая величина. Мы склонны считать это нашей ошибкой, но не можем требовать от VB, чтобы он такие ошибки обнаруживал. Действительно, откуда ему знать, может, нам нравится иметь такие узенькие кнопки. Таким образом, существуют смысловые (с точки зрения человека) ошибки в коде и дизайне проекта, которые VB ошибками не считает и поэтому не обнаруживает и в принципе обнаруживать не должен.
Смысловые ошибки – 2. Завершите выполнение проекта. Изменим код процедуры (я показываю только тело):
Dim a = 300
Button1.Width = 100 - a
Явная ерунда. Получается, что ширина кнопки должна стать отрицательной (-200). Так не бывает. Запустите проект, нажмите кнопку. Кнопка исчезает. Завершите выполнение проекта. Вот эту-то ошибочку VB мог бы обнаружить и дать нам знать. Но не захотел. Или не смог. Просто сделал ширину кнопки нулевой. А нам показалось, что она исчезла. Считать ли это недостатком VB? Не знаю. Во всяком случае мы должны знать, что VB не настолько умен и услужлив, чтобы обнаруживать все наши даже явные глупости.
Завершите выполнение проекта. Напоминаю, что перед любым изменением кода или дизайна проекта его выполнение нужно завершать.
Ошибки выполнения. Пока мы VB только ругали. Пришла пора хвалить. Изменим код процедуры:
Dim a = 0
Button1.Width = 100 / a
Знак «/» означает деление. Что получается? Сначала мы требуем, чтобы переменная a стала равной 0, после чего хотим, чтобы число 100 было поделено на 0. Но делить на 0 – не в человеческих силах. Интересно, может быть компьютер сможет то, что не дано человеку? Запустите проект, нажмите кнопку. VB выдает сообщение об ошибке (Рис. 1.16).
Рис. 1.16
Что же произошло? После нажатия кнопки VB начал честно выполнять процедуру и первый оператор Dim a = 0 выполнил без проблем. При выполнении второго оператора он столкнулся с необходимостью деления на 0 и, будучи не в силах это сделать, прервал работу программы и выдал соответствующее сообщение.
Сообщение предназначено для того, чтобы пояснить человеку, знающему английский и имеющему некоторый опыт в программировании, в чем состоит ошибка. Если у вас такого опыта нет, запомните, что слово «overflow» из текста сообщения является часто указанием на деление на 0.
Также VB любезно подсветил оператор, который не сумел выполнить, и пометил стрелкой-указателем строку, в которой он находится. Мы сразу же знаем, где искать ошибку.
Подробнее о том, как справляться с ошибками, вы можете прочитать в Глава 9. , а сейчас жмите кнопку Break в окне сообщения. Выполнение программы прервано, но не завершено. Оно замерло на моменте ошибки. Теперь для разгадки, в чем ошибка, полезно узнать, чему в настоящий момент выполнения программы (то есть перед выполнением помеченного оператора) равны значения переменных, свойств и других элементов проекта. Для этого достаточно поместить курсор мыши на этот элемент, не нажимая, и взглянуть на всплывшую подсказку. На Рис. 1.17 курсор поставлен на свойство Width и мы видим в подсказке, что ширина кнопки равна 96. Это та ширина, которая была до выполнения оператора Button1.Width = 100 / a, то есть та первоначальная ширина кнопки, которую мы видели до момента нажатия на нее.
Рис. 1.17
Поместите курсор на переменную a – и VB вам подскажет, что a действительно в этот момент равна нулю.
Сейчас в нашем простейшем случае вся эта информация не нужна, но в будущем, зная значения переменных, свойств и других элементов проекта на момент ошибки, вы легче ее найдете.
Завершите выполнение проекта нажатием кнопки (Stop Debugging) на панели инструментов и исправьте ошибку.
Итак, VB не в силах обнаружить ошибки выполнения заранее, еще до запуска проекта. Действительно, откуда ему знать, что в момент деления переменная a
будет равна 0? Это ж надо в другую строку заглядывать!
Ошибки выполнения еще называют исключениями (Exceptions).
Однако, существует целый ряд ошибок, которые VB обнаруживает именно заранее. Вот они.
Ошибки компиляции (построения, build errors). Если вы разговариваете с иностранцем, то для того, чтобы он вас понял, ваши предложения должны быть правильно грамматически построены и иметь понятный иностранцу смысл. Компьютер – тот же иностранец, но он кроме этого еще и очень «тупой» иностранец, поэтому все, что вы пишете в окне кода, должно быть абсолютно правильно с точки зрения VB и грамматически и по смыслу, иначе он вас просто не поймет. Я пока не буду углубляться в то, что такое «смысл» с точки зрения VB.
Когда вы запускаете проект на выполнение, VB прежде всего смотрит, нет ли в программе грамматических и смысловых ошибок, и только если все правильно, разрешает проекту выполняться. Этот поиск ошибок происходит даже раньше запуска, еще в процессе ввода вами программного текста в окно кода. Пусть вы неправильно записали слово Width (см. Рис. 1.18) и не заметили этого. Когда вы убираете текстовый курсор из строки, которую вводили, VB уже начинает над строкой работать. Он немного подправляет ее внешний вид, приводя к стандартному. В частности, знаки арифметических операций и знаки равенства берутся в пробелы; расставляются, как положено, заглавные буквы. Но самое главное, VB обнаруживает некоторые ошибки и подчеркивает их волнистой линией.
Рис. 1.18
Поместите курсор мыши на подчеркнутую часть строки, не нажимая, и взгляните на всплывшую подсказку. По тексту ее можно догадаться об ошибке. В нашем случае в тексте подсказки мы видим слово ‘Wids’. Наверное, с ним что-то не в порядке. Исправьте ошибку, подчеркивание пропадет.
Некоторые ошибки VB обнаруживает только тогда, когда вы запускаете проект на выполнение. Бывает, что и вы сами не замечаете подчеркивания и запускаете проект. В обоих случаях VB выдает сообщение (Рис. 1.19):
Рис. 1.19
Переводится оно так: «Были ошибки построения (компиляции, build errors). Продолжать работу проекта?». Это примерно то же самое, что спросить: «Тормоза не работают. Мчимся дальше?». Но даже если вы ответите Yes, VS все равно запустит на выполнение предыдущую версию проекта, в которой еще не было ошибок. Отвечайте No и исправляйте ошибки.
VB ошибается и сам. VB не всегда правильно находит место ошибки, а найдя, часто неправильно определяет, в чем ошибка состоит. Поэтому бывает, что программисту приходится превращаться в детектива, ищущего преступника по недостоверным свидетельским показаниям.
Совет. Я не буду здесь останавливаться на сложном процессе поиска ошибок, так как вы еще к этому не готовы (читайте Глава 9. ). Если VB выдает ошибку, еще раз посмотрите, так ли выглядит ваш код, как положено. Нет ли чего лишнего? Все ли английские буквы в тексте действительно английские, или среди них есть русские? Человеку очень легко спутать английские буквы с русскими того же начертания (особенно букву «с»), компьютер же не спутает никогда и придерется.
Какая польза от переменных величин?
Самая крохотная и простая польза в том, что с их помощью удобно решать несложные вычислительные задачи. Например, даны стороны прямоугольника: a=27018, b=3954. Вычислить его площадь и периметр (напомню, что периметр – это сумма длин сторон прямоугольника).
Создайте проект с кнопкой. Задачу решает следующая программа:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a, b, S, p
a = 27018 'Длина прямоугольника
b = 3954 'Ширина прямоугольника
S = a * b 'Площадь
p = a + a + b + b 'Периметр
Debug.WriteLine(S)
Debug.WriteLine(p)
End Sub
После запуска и щелчка по кнопке вы увидите в окне Output следующие два числа:
106829172
61944
Первое из этих чисел – площадь, второе – периметр. Без применения переменных величин операторы получились бы более громоздкими и менее понятными:
S = 27018 * 3954 'Площадь
p = 27018 + 27018 + 3954 + 3954 'Периметр
что особенно заметно в больших программах. К тому же, чтобы изменить значение длины или ширины, вам достаточно изменить число в одном месте программы, а не в трех.
Есть масса и других преимуществ, которые вы почувствуете в следующих главах.
Какие вам нужны компьютер и Windows?
Visual Studio .NET предъявляет довольно высокие требования к компьютеру и операционной системе. Полную функциональность программирования могут обеспечить только Windows Vista, Windows 2000, Windows XP Professional и Windows Server 2003. Для установки Visual Studio .NET вам понадобится несколько Гигабайтов свободного дискового пространства.
Команда "Добавить контрольное значение" (меню "Отладка")
Эта команда выводит окно диалога "Добавление контрольного значения" для задания контрольного выражения. Это значение может быть любым допустимым в Basic выражением. Контрольные выражения обновляются в окне отладки каждый раз при входе в режим прерывания.
Кнопка панели инструментов:
.Команда Интервал по горизонтали (меню "Формат")
Изменяет расстояние по горизонтали между выделенными объектами.
Выровнять интервал по горизонтали Перемещает выделенные объекты, беря за основу крайние, так что расстояния между ними становятся равными. Крайние объекты остаются на месте.
Кнопка панели инструментов:
.Увеличить интервал по горизонтали Увеличивает горизонтальный интервал на единицу сетки, беря за основу объект с фокусом. Когда объект приобретает фокус на его границах появляются белые маркеры. Размер единицы сетки изменяется на вкладке Общие окна диалога Параметры.
Кнопка панели инструментов:
.Уменьшить интервал по горизонтали Уменьшает горизонтальный интервал на единицу сетки, беря за основу объект с фокусом. Когда объект приобретает фокус на его границах появляются белые маркеры. Размер единицы сетки изменяется на вкладке Общие окна диалога Параметры.
Кнопка панели инструментов:
.Устранить интервал по горизонтали Удаляет горизонтальный интервал, беря за основу объект с фокусом, так, что объекты касаются друг друга краями. Когда объект приобретает фокус на его границах появляются белые маркеры.
Кнопка панели инструментов:
.Примечание. Объект с фокусом не перемещается, зато вокруг него перемещаются остальные объекты.
Примечание. Если выполнение команды Интервал по горизонтали не привело к ожидаемому результату, следует переместить некоторые объекты вручную и затем повторить команду. Также бывает полезно использовать команду Интервал по вертикали.
Команда Интервал по вертикали (меню "Формат")
Изменяет расстояние по горизонтали между выделенными объектами, беря за основу объект с фокусом. Когда объект приобретает фокус на его границах появляются белые маркеры.
Выровнять интервал по вертикали Перемещает выделенные объекты, беря за основу самый верхний и нижний, так что расстояния между ними становятся равными. Крайние объекты остаются на месте.
Кнопка панели инструментов:
.Увеличить интервал по вертикали Увеличивает вертикальный интервал на единицу сетки, беря за основу объект с фокусом. Размер единицы сетки изменяется на вкладке Общие окна диалога Параметры.
Кнопка панели инструментов:
.Уменьшить интервал по вертикали Уменьшает вертикальный интервал на единицу сетки, беря за основу объект с фокусом. Размер единицы сетки изменяется на вкладке Общие окна диалога Параметры.
Кнопка панели инструментов:
.Устранить интервал по вертикали Удаляет вертикальный интервал, беря за основу объект с фокусом, так, что объекты касаются друг друга краями.
Кнопка панели инструментов:
.Примечание. Объект с фокусом не перемещается, зато вокруг него перемещаются остальные объекты.
Примечание. Если выполнение команды Интервал по вертикали не привело к ожидаемому результату, следует переместить некоторые объекты вручную и затем повторить команду. Также бывает полезно использовать команду Интервал по горизонтали.
Команда "Изменить контрольное значение" (меню "Отладка")
Эта команда выводит окно диалога "Изменение контрольного значения" для редактирования или удаления контрольного выражения. Команда доступна только при установленном контрольном выражении, даже если окно отладки скрыто.
Кнопка панели инструментов:
. Клавиша быстрого вызова: CTRL+W.Команда "Компоненты группы" (контекстное меню окна просмотра объектов)
Переключает режим отображения компонентов класса между списком по алфавиту и списком компонентов, сгруппированных по типам.
Команда "Контрольное значение" (меню "Отладка")
Эта команда выводит окно диалога "Контрольное значение" с текущим значением выделенного выражения. Эта команда служит для просмотра текущего значения переменной, свойства или другого выражения, для которого не задано контрольное выражение. Выделите выражение в окне модуля или в окне отладки и затем выполните команду "Контрольное значение". Для добавления контрольного выражения из окна диалога "Контрольное значение" следует нажать кнопку "Добавить".
Кнопка панели инструментов:
. Клавиша быстрого вызова: SHIFT+F9.Команда "Копировать" (контекстное меню окна просмотра объектов)
Эта команда служит для копирования текста для выделенного класса или компонента в буфер обмена.
Команда Краткие сведения (меню "Правка")
Выводит синтаксис использования выбранной в окне модуля переменной, функции, инструкции, метода или процедуры.
Эта команда отображает синтаксис и выделяет текущий параметр. Для функций или процедур с параметрами параметр выделяется жирным шрифтом по мере его ввода, до тех пор пока не введена запятая, отделяющая его от следующего параметра.
Чтобы краткие сведения появлялись при наборе текста автоматически необходимо выбрать параметр Краткие сведения на вкладке Редактор окна диалога Параметры.
Кнопка панели инструментов:
. Клавиша быстрого вызова: CTRL+I.Команда "Масштаб"
Эта команда служит для уменьшения или увеличения изображения выбранной формы. Допускается выбор или ввод коэффициента масштабирования в пределах от 10 до 400 процентов.
Команда доступна только на панели инструментов "UserForm".
Панель инструментов
Команда "Настройка" (контекстное меню)
Эта команда выводит окно "Настройка" для добавления, удаления, изменения или создания специальных панелей инструментов.
Команда "Описание" (контекстное меню)
Эта команда выводит в окне модуля место описания переменной или процедуры, на имя которой установлен указатель. Если описание находится в библиотеке, на которую имеется ссылка, оно выводится в окне просмотра объектов.
Команда "Отобразить следующую инструкцию" (меню "Отладка")
Выделяет цветом следующую выполняемую инструкцию. Эта команда используется для помещения курсора на строку, которая будет выполняться следующей.
Команда доступна только в режиме прерывания.
Кнопка панели инструментов:
.Команда "Печать" (меню "Файл")
Команда позволяет распечатать формы и тест программ на принтере, указанном в Панели управления Microsoft Windows.
Кнопка панели инструментов:
. Клавиша быстрого вызова: CTRL+P.Параметры окна диалога
"Принтер" Определяет принтер, используемый для печати.
"Диапазон печати Определяет диапазон печати:
"Выделенный текст - Печать выделенного текста программы.
"Текущий модуль - Печать формы и/или текста программы для выделенного модуля.
"Текущий проект - Печать формы и/или текста программы для всего проекта.
"Печатать Задает распечатываемый объект. Допускается выбор любого числа параметров, в зависимости от значения диапазона печати.
"Рисунок формы - Печать изображения формы.
"Программу - Печать текста программы в выбранном диапазоне.
"Качество Определяет качество печати: высокое, среднее, низкое или черновик.
"Печать в файл" Если это флажок установлен, результат печати направляется в файл, указанный в окне диалога "Печать в файл". Оно появляется после нажатия кнопки "OK" в окне диалога "Печать".
"OK" Начало печати.
"Отмена" Закрытие окна диалога, не выполняя печать.
"Установка" Вывод стандартного окна диалога "Параметры страницы".
Команда "Переместить" (контекстное меню)
В зависимости от того, является ли активным окно или панель элементов, выполняются следующие действия:
Указатель мыши принимает форму
и становится возможным перемещение активного окна.Появляется окно диалога Порядок страниц для изменения порядка страниц в панели элементов.
Допускается перемещение выбранной страницы в влево или вправо относительно других страниц.