| Пособие-самоучитель on-line "Visual Basic с нуля" |
Глава 3. Переменные. Инструкция If...Else. Таймер.
Скачать исходник программы "Часики" или "Однорукий бандит" | Дата создания 15.10.2004 {Автор 4us}

Переменные. Option Explicit.
Все, пора поговорить о переменных. Без них ничего делать мы больше не можем. Я не буду долго и нудно грузить тебя теорией. Но минимум знать надо.

Очень желательно, чтобы программа начиналась с инструкции Option Explicit. Она будет требовать явно объявлять переменные. То есть, если ты написал имя переменной с ошибкой, то при запуске программы VB найдет это место и ткнет тебя носом, потому что имя переменной с ошибкой не совпадает с именем объявленной переменной. Переменную надо объявлять явно с помощью инструкции Dim.

Сейчас я поясню эту муть на примере, иначе сам не понимаю, что написал.

‘объявляем явно переменную MyStroka как строковую (т.е. текстовую)

Dim MyStroka As String

‘потом присваиваем ей значение “переменная”, но имя переменной ‘написано с ошибкой

MySroka=”переменная”

При запуске программы VB сразу найдет это место, как ошибку, и выделит его. Если у нас не будет прописана инструкции Option Explicit, то наша ошибочная переменная будет определена, как новая. Но значение правильной переменной MyStroka мы не присвоили, потому что присвоили ее новой переменной с ошибкой в имени. Тогда в дальнейшем, когда мы захотим получить значение правильной переменной, его в ней не просто не будет.

Вот вроде понятно.

Чтобы не дурить себе всем этим голову, нажми кнопку “Инструменты” (Tools), выбери “Опции” и в окрывшемся окне ОПЦИИ на вкладке “Редактор” поставь галочку напротив надписи “Требовать определение переменной”, потом OK. Теперь при создании новой программы, (Но только новой. В старую эту инструкцию надо прописывать в (General) вручную.) VB автоматически пропишет Option Explicit.

Таким образом любую надпись, кроме зарезервированных VB слов можно сделать переменной. Но начинаться имя должно со буквенного символа. Например Peremenaia, Ima1, X, LastNumber, z001. Не надо использовать в именах математические операторы. И нельзя объявлять две переменные с одинаковыми именами. В принципе, для удобства чтения кода и солидности существуют определенные правила написания имен переменных. Но я их придерживаться не буду. Если охота, поищи в Интернете что-нибудь про Венгерское соглашение.

Нас же интересуют переменные следующего типа

Long ‘длинное целое число со знаком от –2 147 483 648 до 2 147 483 647

Integer ‘целое число со знаком от –32 768 до 32767

String ‘строка символов

Boolean ‘логическое, принимает два значения или “True” (Истина) или “False” (Ложь)

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

Теперь, где их объявлять. Если ты объявишь переменную в теле процедуры объекта, например кнопки, то доступна она будет только в этой процедуре. В другой, скажем, кнопке, ее использовать нельзя. Чтобы переменную использовать во всей форме, надо объявить ее в разделе деклораций (это в самом верху кода –(General) – (Declarations). Ну а чтоб она была видна во всей программе (в разных, например, формах) она должна быть объявлена в стандартном модуле с ключевым словом Public. Но модулей мы пока не создавали и оставим это до поры в стороне. Ну вот, на первое время этого о переменных хватит. Чтобы было совсем понятно, вот пример объявления переменных:

`Option Explicit`

`Dim MyStream As String
Dim K14 As Long
Dim Flag As Boolean
Dim Numder As Integer`

`Private Sub Form_Load()
Dim Flag2 As Boolean
Dim l99little As String
End Sub`

Таймер. Программа “Часики”.

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

Enabled – False (по умолчанию True) означает, что таймер выключен

Interval – 1000 (время, в миллисекундах, через которое таймер срабатывает, если конечно включен). Таймер будет срабатывать каждые 1000 мск, т.е. каждую секунду, как в нормальных часах.

Кроме того, нам понадобятся три лейбла: Label1 для секунд, Label2 для минут и Label3 – сами догадайтесь для чего. Правильно, для отображения соответственно часом, минут и секунд. Все.

Поставьте в свойствах лейблов такие установки:

Alignment – 2-Центровка (Это чтоб цифры были по центру лейблов)
BorderStyle – 1-Фиксировано (это чтоб размер формы нельзя было изменить)
Caption – 00 (на всякий случай, т.е. значение лейблов изначально будет “00”)
Нажмите Font и выберите размер шрифта 14, а начертание – полужирное. После этого подберите подходящий размер окон Лейблов, чтобы цифры в них выглядели покрасивше.

Должно получиться как на рис.8.

Рисунок 8.

Сделай подпрограмму Form_Load .

`Option Explicit`

`Private Sub` `Form1_Load()`

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

`Form1.Caption = "Часики"`

Дальше, для того, чтобы наши часы сразу показывали текущее время, надо его взять из компьютера. Чтобы получить системное время есть функция Time (Label1.Caption=Time). Но она дает полное время одной строкой (16:23:42). Нам надо выбирать из нее секунды, минуты и часы, чтобы распихать по свои лейблам. Для этого возьмем готовые функции, которые предоставят нам это все по частям:

`Label1.Caption = Second(Time) 'стало быть секунды
Label2.Caption = Minute(Time) 'ну минуты
Label3.Caption = Hour(Time) ' и часы`

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

Запустим таймер.

`Timer1.Enabled = True`

Вот она, булева алгебра. То есть Timer1.Enabled может быть либо включен (True), либо выключен (False).

Процедура Form1_Load()закончена

`End Sub`

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

`Private Sub Timer1_Timer()`

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

`Label1.Caption = Label1.Caption + 1`

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

Оператор условия If.

По-русски оператор If будет выглядеть следующим образом:

Если Вася любит Машу Т огда
Маша клевая
В противном случае Если Вася любит Петю Т огда 'если не исполняется верхнее условие
Вася козел

............

И в противном случае 'если не выполняется ни одного условия
Вася дурак
Конец Если

Куски оператора If выделены синим цветом. Если записать это программно, то

If Vasia+Masha =”Love” Then
Masha=”Good”

ElseIf Vasia+Petia=”Love” Then
Vasia=”Kozel”

Else
Vasia=”Durak”
End If

Оператор If проверяет первое условие, верно ли (True) выражение Vasia+Masha=”Love”. Если верно, выполняются операторы, стоящие за ним, но до ветки ElseIf. Если выражение неверно (False), то следующие за первой строкой операторы не выполняются, а VB переходит к следующей части оператора ElseIf и так пока не проверит все условия. Если ничего не выполняется, обрабатываются операторы, стоящее за веткой Else.

Все очень просто. Это вообще мой любимый оператор. Без него – никуда.

Если нам не нужно проверять дополнительные условия, а скажем, нужно если выполняется, то делать то-то, а если нет, то другое, оператор имеет вид:

If Vasia+Masha =”Love” Then
Masha=”Good”
Else
Vasia=”Durak”
End If

Это, так называемые, блоковые формы оператора If, самые длинные. Можно его использовать в одну строку, т.е. если выполняется условие, то то-то:
If Vasia+Masha =”Love” Then Masha=”Good” Else Vasia=”Durak”
Или
If Vasia+Masha =”Love” Then Masha=”Good”
А теперь применим знание этого оператора на практике. Чтобы у нас показания времени в нашей программе «Часики» до десятка были с ноликами 01, 02, 03, а не 1, 2, 3 мы проверяем условие, меньше ли длина числа, записанного в лейбле двух. Если да, то прибавляем впереди нолик. Для этого используем функцию Len("строка"), которая определит число символов в строке. Если в строке, например 5 символов, то Len даст число 5. У нас получится:

`If` `Len(Label1.Caption) < 2 Then Label1.Caption = "0" & Label1.Caption` ‘для первого лейбла
Но ведь и при загрузке системного времени в подпрограмме Form1_Load нам тоже нужна такая проверка. Не будем же мы переписывать одно и тоже в двух разных процедурах. Мы сделаем свою процедуру и будем обращаться к ней по мере необходимости. Назовем ее, к примеру Zero. В конце нашей программы на свободном месте набираем на клавиатуре:

`Private Sub` `Zero()
If Len(Label1.Caption) < 2 Then Label1.Caption = "0" & Label1.Caption
If Len(Label2.Caption) < 2 Then Label2.Caption = "0" & Label2.Caption
If Len(Label3.Caption)< 2 Then Label3.Caption = "0" & Label3.Caption
End Sub`

Таким образом у нас теперь есть своя собственная подпрограмма, которая называется Zero. Никаких событий для ее выполнения нет, и чтобы она работала, в нужном месте, просто пишем ее название Zero. А нужные эти места в последней строчке в порцедурах Form1_Load() и Timer1_Timer() прямо (перед End Sub).

Ну вот, с ноликами все в порядке, зато часы не работают. В подпрограмме Timer1_Timer() у нас всего один оператор. Чтобы часы работали, как настоящие, нам надо, чтобы, когда секунд становилось больше 59, они обнулялись, при этом минуты увеличивались бы на один. Используя оператор If это плевое дело:

`If` `Label1.Caption > 59 Then
` `Label1.Caption = "0"
Label2.Caption = Label2.Caption + 1
End If
'То же самое для Лейбла2:
If Label2.Caption > 59 Then
Label2.Caption = "0"
Label3.Caption = Label3.Caption + 1
End If`

Ну, а для Лейбла3 вообще фигня. Надо, чтоб, если больше 23 часов, показывало не 24, а 00:

`If` `Label3.Caption > 23 Then Label3.Caption = "0"`

Теперь ставим ссылочку на нашу программу проверки ноликов Zero :

`Zero`

И готово, т.е.

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

`Option Explicit``
` `Private Sub` `Form_Load()
Form1.Caption = "Часики"
Label1.Caption = Second(Time)
Label2.Caption = Minute(Time)
Label3.Caption = Hour(Time)
Timer1.Enabled = True
Zero
End Sub`

``Private Sub Timer1_Timer()
Label1.Caption = Label1.Caption + 1
If Label1.Caption > 59 Then
Label1.Caption = "0"
Label2.Caption = Label2.Caption + 1
End If
If Label2.Caption > 59 Then
Label2.Caption = "0"
Label3.Caption = Label3.Caption + 1
End If
If Label3.Caption > 23 Then Label3.Caption = "0"
Zero
End Sub``

``Private Sub Zero()
If Len(Label1.Caption) < 2 Then Label1.Caption = "0" & Label1.Caption
If Len(Label2.Caption) < 2 Then Label2.Caption = "0" & Label2.Caption
If Len(Label3.Caption) < 2 Then Label3.Caption = "0" & Label3.Caption
End Sub``

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

«Однорукий бандит» - имитация работы известного аппарата для азартных игр. Смысл программы в следующем. В трех Лейблах отображаются меняющиеся цифры от 1 до 7. Для работы с ними используются три переменные Number. Их изменение управляется тремя таймерами. Первоначально интервалы у таймеров одинаковы – 10 мск. В трех переменных Zamedlenie генерируются случайные числа.

`Zamedlenie1 = Int(Rnd * 20) + 10`

Работает это так. Rnd генерирует псевдослучайное число от 0 до 1. На двадцать умножаем, чтобы получить целую часть числа (можно умножать на что угодно, но не меньше 10, а то не получится целая часть). Функция Int отбрасывает дробную часть. Прибавляем в конце 10, чтобы исключить значение 0, а то таймер не остановится. Т.е., если Rnd генерирует, например, число 0,156, то

Zamedlenie1= Округляем (0,156*20) + 10 = 3 + 10 = 13. Очень просто.

При каждом срабатывании таймеров увеличивается его интервал на значение замедления, пока Интервал не становится больше 300 (это задано программно: Timer1.Interval > 300

После этого таймер выключается. Чтобы узнать, все ли таймеры выключились, я использую переменную Flag, которая накапливает в себе количество выключившихся таймеров. Когда Flag=3, считаем, что все три таймера закончили работу (а так оно и есть) и начинаем обрабатывать результаты ( подпрограмма Raschet() ). Изначальный капитал игрока храниться в переменной Summa, а при различных выигрышах она изменяется на сумму трех переменных Bonus, а при проигрыше на переменную BonusMinus. Почему ее значение отрицательное? Просто мне так захотелось, хотя это, конечно, извращение. В Лейблах 4 и 5 выводятся всякие прикольные надписи, в зависимости от результата игры. Ну и кроме того, чтобы во время работы таймеров кнопка не нажималась, она по состоянию переменной FlagClick либо позволяет запустить таймеры, либо меняет свою надпись.

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

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

Ну вот, практически и все. Остальное ты должен додумать сам. Удачи.

Copyright © 2004 4us