Visual basic з нуля
Змінні. Інструкція Option Explicit.
Все, пора поговорити про змінних. Перевантажувати інформацією я тебе не буду, але мінімум знати треба.
Дуже бажано. щоб програма починалася з інструкції Option Explicit в секції General. Ця інструкція змушує програміста явно оголошувати змінні. При її відсутності будь-яке слово, що не суперечить синтаксису VB, може бути змінною.
Що відбувається, якщо ми не використовуємо інструкцію Option Explicit? А то, що ми взагалі можемо не оголошувати змінні. Адже це здорово! А ось і ні! А чому немає, видно з наступного:
При відсутності Option Explicit, якщо нам потрібна нова змінна, ми просто вводимо її в код програми, наприклад,
і опс, Visual Basic вже підметушився і зарезервував для змінної пам'яті, причому зарезервував по повній програмі - максимально. Справа в тому, що якщо явно не ставити тип переменнной, VB вважає змінну типом Variant, так як така змінна може містити майже будь-які дані: і цілі, і дробові, і строкові. Зате і пам'яті ця змінна використовує дуже багато. Якщо ж ми явно оголосимо змінну і поставимо її тип за тими нашими потребами, то раціональне використання пам'яті - на обличчя.
Якщо тебе це міркування не переконало, то уявімо ситуацію, коли ти повторно використовуєш свою змінну для, наприклад, зміни її значення. І при цьому робиш друкарську помилку (а помилок робиться дуже багато), пропускаєш букву h:
Для Visual Basic в цьому ніякої помилки немає. Він при компіляції швиденько резервує пам'ять під нову змінну NewCislo, вважаючи її типом Variant і у нього ніяких проблем. Проблеми у тебе. І критичні. По-перше, ти маєш непотрібну змінну NewCislo зі значенням 1, про яку ти знати не знаєш. По-друге, якщо ти чекаєш, що значення твоєї початкової змінної NewChislo збільшилася на 1 і стало 8, то це абсолютно марно. А ось очікувати, що результат виконання твоєї програми дасть непередбачуваний результат можна сміливо.
Інша річ, якщо ти використовував інструкцію Option Explicit. В цьому випадку, при запуску програми, Visual Basic тут же знайде нову неоголошену змінну і зупинить виконання програми на рядку з помилкою.
Будь-яке слово, крім зарезервованих VB, можна зробити ім'ям змінної. Але починатися ім'я має з літерного символу. Наприклад Peremenaia, Ima1, X, LastNumber, z001. Не треба використовувати в іменах математичні оператори. І не можна оголошувати дві змінні з однаковими іменами. В принципі, для зручності читання коду і солідності існують певні рекомендовані правила (щось на зразок стандартів) написання імен змінних. Але, так як використання цих правил - суто особиста справа кожного, я їх дотримуватися не буду. Якщо полювання, пошукай в Інтернеті що-небудь про Угорське угоду, Угорську нотацію або угоду Реддік.
Отже, при явному оголошеня змінної дуже бажано явно задавати її тип. У вкрай рідкісних випадках, коли тип даних, що зберігаються в змінної заздалегідь невідомий, використовується як раз тип Variant. У Visual Basic найбільш часто використовуються наступні типи даних (а відповідно змінних):
Long 'довге ціле число зі знаком від -2 147 483 648 до 2 147 483 647
Integer 'ціле число зі знаком від -32 768 до 32767
String 'рядок символів
Boolean 'логічне, приймає два значення або "True" (Істина) або "False" (Брехня)
Поки що нам цього вистачить. Якщо цікаво, то перелік типів даних, підтримувані VB, можна подивитися тут.
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 m99little As String
End Sub
Таймер. Програма "Годинки".
Тепер розберемо використання нового об'єкта - Timer (таймер). Зліва, де компоненти форми, вони ж інструменти-елементи, намальований такий будильничек. Це таймер і є. Він завжди невидимий, але потрібний елемент. Всього їх одночасно можна використовувати близько 30 штук. Але нам така кількість таймерів не треба.
Створимо новий exe-проект і помістимо один таймер на форму. На основі його ми зробимо зараз маленькі годинничок. У властивостях цього таймера поставте наступні установки:
Enabled - False (за замовчуванням True) означає, що таймер вимкнений
Interval - 1000 (час, в мілісекундах, через яке таймер спрацьовує, якщо звичайно включений). Таймер буде спрацьовувати кожні 1000 мск, тобто щосекунди, як в нормальних годиннику.
Крім того, нам знадобляться три лейбла: Label1 для секунд, Label2 для хвилин і Label3 - самі здогадайтеся для чого. Правильно, для годин. Усе.
Змінимо властивості лейблів наступним чином:
Alignment - 2-Центровка (Це щоб цифри були по центру лейблів)
BorderStyle - 1-Фіксована (це щоб розмір форми можна було змінити)
Caption - 00 (на всякий випадок, тобто значення лейблів спочатку буде "00")
Натисни Font і вибери розмір шрифту 14, а накреслення - напівжирне. Після цього підбери відповідний розмір вікон лейбл, щоб цифри в них виглядали симпатично.
Має вийти як на рис.8.

Створимо процедуру Form_Load.
Private Sub Form1_Load ()
З атем в тілі процедури, як у будь-якої пристойної програми, міняємо заголовок форми.
Далі, для того, щоб наш годинник відразу показували поточний час, треба його взяти з комп'ютера. Щоб отримати системний час, є функція Time (Label1.Caption = Time). Але вона дає повне час одним рядком (16:23:42). Нам тоді доведеться вибирати з неї секунди, хвилини та години, щоб розіпхати по свої лейблам. А щоб цього не робити, можна взяти готові функції, які нададуть нам це все по частинах:
Label1.Caption = Second (Time) 'отже секунди
Label2.Caption = Minute (Time) 'ну, хвилини
Label3.Caption = Hour (Time) 'і годинник
Тепер, при запуску того, що ми наваяли, у нас буде показуватися поточний час. Це, звичайно, прогрес, але ось тільки годинник варті. Трясти монітор не варто, вони від цього не підуть, а ось запустити таймер однієї простої рядком ми зможемо:
Ось вона, булева алгебра (ну ще не алгебра, але вже дещо). Тобто Timer1.Enabled може бути або включений (True). або вимкнений (False). На цьому п роцедура Form1_Load () закінчена:
Щоб отримати хоч якісь блага від запущеного таймера і змусити наші годинники ходити, створимо процедуру, яка буде виконуватися при настанні події спрацьовування таймера. Подія це у таймера єдине і називається теж .Timer. Виникає воно в той момент, коли таймер дораховує до межі, встановленої в властивості Interval і відповідно скидається на нуль.
Private SubTimer1_Timer ()
Наші секунди повинні збільшуватися на одну за кожне спрацьовування таймера. Тому пишемо лічильник, який буде збільшувати значення наших секунд на одиницю при кожному спрацьовуванні таймера:
Label1.Caption = Label1.Caption + 1
І ось ми впритул підійшли до проблеми умовного оператора (а краще інструкції) If. без якого - нікуди. Суть цієї інструкції в тому, що він дозволяє при деякому создавшемся умови виробляти зміни в ході програми в залежності від його запровадження.
Етоу інструкцію можна використовувати в блокової формі: повному (розгорнутому) вигляді і неповному (без рядків ElseIf), а також в один рядок.
У повному вигляді в блокової формі синтаксис цієї інструкції буде виглядати наступним чином:
If Условіе1 Then
група операторов1
ElseIf Условіе2 Then
група операторов2
.
ElseIf УсловіеN Then
група операторовN
Else
Остання група операторів
End If
Умова вдає із себе оператор, значення якого може приймати True (Істина) або False (Брехня). Наприклад, якщо Условіе1 вдає із себе вираз X> 1. то воно істинне, якщо X дорівнює 2, то воно помилкове при значенні X дорівнює 1. Якщо Условіе1 істинно, то виконується група операторов1. інші групи операторів не виконуються, якщо навіть в якихось наступних гілках УсловіеN істинно. Якщо Условіе1 помилково, то група операторов1 не виконується, а виробляється перевірка Условіе2 в наступній гілці ElseIf. І знову ж таки, якщо Условіе2 істинно, то виконується група операторов2. наступні групи операторів не виконуються і їх умови не перевіряються. В іншому випадку відбувається перехід до наступної гілці ElseIf. Якщо в жодній гілці немає справжніх операторів, виконується остання група операторів незалежно від будь-яких умов. Логічна схема інструкції If представлена в таблиці:
If Условіе1 Then
ElseIf Условіе2 Then
Найбільш часто інструкція If використовується в блокової формі в неповному (усіченому) вигляді. В цьому випадку рядки ElseIf відсутні:
If Умова Then
група операторов1
Else
група операторов2
End If
В цьому випадку, якщо Умова - істинно, то виконується група операторов1. а якщо немає, то група операторов2.
Також досить часто виникає необхідність в залежності від умови виконати один оператор. Тоді Інструкція If може використовуватися одним рядком, без рядка End If.
If Умова ThenОператор1Else Оператор2
If Умова ThenОператор1
Все дуже просто. Це взагалі мій улюблений оператор (куди зручніше і універсальним, ніж Select. Case).
А тепер застосуємо знання цього оператора на практиці. Щоб у нас свідчення часу в нашій програмі «Годинник» до десятка були з нулями 01, 02, 03, а не 1, 2, 3 ми перевіряємо умову, менше чи двох довжина числа, записаного в лейблі. Якщо так, то додаємо попереду нулик. Для цього використовуємо функцію Len ( "рядок"). яка визначить число символів в рядку. Якщо в рядку, наприклад, 2 символу, то Len дасть число 2. У нас вийде:
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
Аналогічно для Label3. Нам треба, щоб, при значенні годин більше 23 годин, Label3 показував не 24, а нуль:
If Label3.Caption> 23 Then Label3.Caption = "0"
Тепер ставимо ссилочку на нашу процедуру перевірки налякав Zero.
Ось повний лістинг того, що вийшло. Хто хоче, може скачати исходник прикладу вгорі сторінки.
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
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 (). і в ній кнопка блокується. Подальша гра при цьому неможлива.
У цій програмі ми вперше оголошуємо змінні. Нічого в цьому складного немає. Головне, щоб тип змінної приблизно відповідав нашим потребами. Просто подивися, як це виділяється.
Ну ось, практично і все. Решту ти повинен додумати сам. Хай щастить.