Калькулятор на VB - це легко! p>
(автор: Єсін І. В., email: [email protected]) p>
Про що ... p>
Стаття має дві редакції: для початківців освоювати мова та для тих укого не тільки абревіатура VB не викликає питань, а й більш-меншволодіють ім. p>
У даній редакції від читача потрібне знання VB на доситьхорошому рівні, що означає володіння навичками візуальногопрограмування, подієво-керованого програмування і звичайно
«Основних» операторів мови. Пропонується один із способів пошуку рішенняподібних завдань. p>
Перший крок або інтерфейс користувача p>
Тут особливо нічого фантазувати не треба, а просто згадати, яквиглядає звичайний калькулятор, які кнопки у нього і яке їхнє призначення.
У мене вийшло так: p>
p>
Інструмент CommandButton містить такі питання, що цікавлять нас властивість іподія, які дають нам повну ясність його вибору. Аналогічне можнасказати і про інструмент Label. Декоративний інструмент Line необов'язковий. P>
Для розуміння мого програмного коду вам треба буде погодитися знаступними іменами представлених об'єктів і їх властивостями: p>
0. Форме привласнимо ім'я Calculator. P>
1. Кнопки з цифрами утворюють масив кнопок Knopki індекси, які збігаються з їх написами. P>
2. Кнопка точка - це об'єкт з ім'ям Tochka, a кнопка зміни знаку числа [+/-] - Plusmin. P>
3. Кнопки арифметичних операцій мають загальне ім'я Operacia, але проіндексовані. Причому кнопка з написом + має індекс 4, кнопка зі знаком мінус - індекс 2, кнопка "розділити" - 0, а кнопка відповідна множенню - 5. P>
4. Кнопка "скидання" [С] - Sbros. P>
5. Кнопка "очистити" [CE] - Ochistka. P>
6. Кнопка "видалити" [0 p>
Tablo.Caption = "-" & Tablo.Caption p>
End Select p>
End Sub p>
Інша - можливість введення дрібного числа: p>
Private Sub Tochka_Click ()
'якщо число ціле, то дозволяємо ввести дробове число:
If Fix (Val (Tablo.Caption)) = Val (Tablo. Caption) Or Ravno.Tag = "друга"
Then Tablo.Tag = "не ціле"
'до того ж ... якщо вводити дробове число після вказівки операції, тоціла його частина - нуль:
If Ravno.Tag = "друга" Then Tablo.Caption = "0" p>
End Sub p>
Виправлення помилок ... p>
Дозволимо також прати набране число і видаляти останню цифру числа натабло, що забезпечить наступний фрагмент програмного коду: p>
Private Sub ochistka_Click ()
'отримаєте по кнопці CE "перетворює" число на табло в нуль:
Tablo.Caption = "0"
Tablo.Tag = "" 'вводимо ціле число p>
End Sub p>
Private Sub udalit_Click () p>
umnaya.SetFocus p>
' чи є число цілим? p>
If Fix (Val (Tablo.Caption)) = Val (Tablo.Caption) Then p>
'якщо ціле - видалимо останню цифру p>
Tablo.Caption = Mid (Tablo.Caption, 1, Len (Tablo.Caption) - 2) p>
'а якщо число було нулем - то так і залишимо - "нуль": p> < p> If Tablo.Caption = "." Then Tablo.Caption = "0" p>
Else p>
'якщо на табло число не ціле, то просто вилучимо останню цифрунаписи p>
Tablo.Caption = Mid (Tablo.Caption, 1, Len (Tablo.Caption) - 1) p>
End If p>
End Sub p >
Рахувати, рахувати й ще раз рахувати! p>
Далі користувач, швидше за все, захоче вказати одне з арифметичнихдій: скласти, відняти, помножити, поділити задане число з якимсьіншим. Надамо йому таку можливість!
Тут необхідно передбачити наступне: 1) користувач може змінитиобрану операцію (не змінивши до цього числа на табло), 2) якщокористувач уже обирав до цього якусь операцію, не знаходив їїзначення за допомогою клавіші одно або не ставив стан первісноїготовності, то обчислюється результат цієї операції. p>
Легко зрозуміти, що ці особливості взаємопов'язані між собою: другаможлива тільки тоді, коду користувач не змінює вибір операції.
Перша особливість вибору арифметичної дії частково розглянута.
Згадаймо, що за умов згадування користувачем операції програма запише взмінну Ravno.Tag значення "друга". Таким чином, при входженні впроцедуру обробки події клацання миші по одній з кнопок Operaciaумовний оператор програмного коду за допомогою цієї змінної перевірить:
"А чи не змінює користувач обрану операцію?!". При негативномувідповіді за допомогою змінної deystvie буде вирішувати чи треба передаватиуправління процедурою обчислення значення резултата Rezultat (). У будь-якихвипадках, мінлива deystvie набуде значення відповідне вибраномуарифметичного дії. При цьому вже знайома нам мінлива pervoeнабуде значення числа табло, а Ravno.Tag буде повідомляти процедурі введеннячисла, що вводиться нове число і надавати можливість змінитиоперацію. Все це знаходимо в наступній процедурі: p>
Private Sub Operacia_Click (Index As Integer) p>
If Ravno.Tag = "" Then 'немає зміни вибору операції? P>
'якщо операція була задана - обчислюємо її значення: p>
If deystvie "ні" Then vtoroe = Val (Tablo.Caption): rezultat p>
End If p>
Select Case Index 'запишемо обрану дію p>
Case 0 deystvie = "розділити" p>
Case 2 deystvie = "відняти" p>
Case 4 deystvie = "скласти" p>
Case 5 deystvie = "помножити" p>
End Select p>
pervoe = Val (Tablo.Caption) 'перше число операції - те що натабло при виборі операції p>
Ravno.Tag = "друга" 'режим введення другого числа p>
End Sub p>
Нескладно здогадатися, що процедура обчислення результату буде викликатисятакож з процедури обробки натиснення кнопки "дорівнює". І перш ніжрозглядати першим, напишемо програмний код для другого.
Зробимо так, що якщо: 1) друге число не введено і кнопка "одно"натискається один раз, то значення не обчислюється, 2) якщо кнопка натискаєтьсядва рази поспіль, то в якості другого числа операції вибирається поточнечисло табло і результат обчислюється. p>
У всіх випадках нам сприятиме мінлива Ravno.Tag. Якщо вонадорівнює "друга", то це задовольняє першу умові. Однак, щобреалізувати другий призначимо даної змінної порожній символ. І вже тутвнаслідок умови покладемо значення змінної vtoroe число, "яке натабло "і запустимо процедуру Rezultat (), потім поставимо калькулятору подобупочаткового стану (без відображення на табло нуля). Можна написати так: p>
Private Sub Ravno_Click () p>
If Ravno.Tag "друга" Then p>
vtoroe = Val (Tablo.Caption) p>
Call rezultat p>
Ravno.Tag = "другого" 'режим введення "друга" числа p>
Tablo.Tag = ""' дві змінні ука-deystvie = "ні" ' викликають початковий стан p>
Else p>
Ravno.Tag = "" 'можемо в "наступного разу" вважати першимчислом поточне число табло p>
End If p>
End Sub p>
«Нуль», «не можна» і «ділити» p>
А ось і процедура обробки результату (розуміння якої у вас, я думаю,не важко): p>
Private Sub rezultat () p>
Select Case deystvie p>
Case "скласти" p>
Tablo.Caption = pervoe + vtoroe p>
Case "відняти" p>
Tablo.Caption = pervoe - vtoroe p>
Case "розділити" p>
If vtoroe 0 Then
Tablo.Caption = pervoe/vtoroe p>
Else 'на нуль справді не можна ділити! p>
Tablo.Caption = "на нуль не ділять!" p>
End If p>
Case "помножити" p>
Tablo.Caption = pervoe * vtoroe p>
End Select p>
End Sub p>
У ній, як бачите, результат відразу "викидається" на табло. p>
Про користь клавіатури. p>
І перед тим, як підготуватися до останнього бажанням користувача - матиможливість проводити обчислення з клавіатури, додамо до вже наявноїчастини програмного коду процедуру обробки натиснення кнопки [С] (скидання впервісну) готовність: p>
Private Sub Sbros_Click () p>
deystvie = "ні" 'стираємо, можливо, ця дія p>
Tablo.Caption = "0"' на табло - нуль
Tablo.Tag = "" 'за замовчуванням - вводиться ціле число p>
End Sub p>
Користувач буде вводити число з клавіатури використовуючи клавіші з цифрами,клавіші з крапкою, а для зміни знаку числа клавішу +/=. Редагуватичисло з допомогою клавіш Backspace і Пробіл. Дані дії оперделім вкоді процедури Form_KeyPress (), використовуючи чудовий аргумент цієїпроцедури - KeyAscii.
Тому якщо знати (або дізнатися) Ascii-коди клавіш, то розуміння цієїпроцедури не займе багато часу: p>
Private Sub Form_KeyPress (KeyAscii As Integer) p>
Select Case KeyAscii p>
Case 8 udalit_Click p>
Case 42 , 43, 45, 47 'тепер стало ясним чому індекси p>
Operacia_Click (47 - KeyAscii)' йдуть не по порядку? p>
Case 61 'міняємо знак p>
Plusmin_Click p>
Case Is> 47 'вводимо цифри p>
If KeyAscii <58 Then knopka_Click (KeyAscii - 48) p>
Case 32' а тут пробілом "чистим" табло ochistka_Click p>
End Select p>
End Sub p>
Дана процедура не дозволяє відловлювати натискання «точки», тому що Ascii -коди «точки» на малій цифровій клавіатурі відмінні при різних розкладках.
Напишемо відповідний код у наступній процедурі. P>
Результат буде! P>
Однак ми досі не вказали замінники кнопок "скидання в первіснийстан "і" рівно ". Для першого випадку складність полягає ввигадуванні клавіші, а для іншого - способу "відлову" натисканняклавіші (я думаю ні в кого не виникне сумніву в тому, що натискання клавіші
Enter відповідатиме клацання по кнопці одно). P>
скидає в початковий стан клавішею Delete: p>
Private Sub Form_KeyDown (KeyCode As Integer, Shift As Integer) p>
If KeyCode = 46 Then sbros_Click
'оскільки значення "точки" малої цифрової клавіатури у KeyAscii НЕоднакові
'при різних розкладках, то "ловимо" її за допомогою KeyCode
If KeyCode = 110 Then tochka_Click p>
End Sub p>
Спіймати натискання клавіші Enter на кнопці можна в такий чином. Для цьогоспочатку кинемо на форму текстбокс. І сховаємо його під кордон майбутнього вікнадодатки (спочатку збільшимо висоту, потім помістимо "туди" текстбокс ізадамо висоту форми до її зміни). Змінимо лише властивості TabIndex на 1та Name на Umno. Як ви вже здогадалися натискання швидше за все з цьогооб'єкту буде виявляти натискання клавіші Enter. Тому маємо такупроцедуру: p>
Private Sub Umno_KeyPress (KeyAscii As Integer) p>
If KeyAscii = 13 Then Ravno_Click p>
End Sub p>
Однак, це спрацює тоді, коли об'єкт Umno має фокус. А що, якщоклацнути по якийсь із кнопок? Тоді фокус переходить цій кнопці. Ізначить, нам треба спочатку всіх процедур обробки клацань кнопок написати: p>
Umno.SetFocus p>
і тоді фокус буде завжди повертатися на потрібне нам місце! p>
І, нарешті , завершимо наш проект, повернувшись майже до самого початку ...
"Пофарбувати" елементи управління!
Для цього процедуру Form_Load можна написати так: p>
Private Sub Form_Load () p>
Me.BackColor = RGB (50, 150, 250)
Sbros.BackColor = RGB (250, 50, 0)
Ochistka.BackColor = RGB (250, 75, 0)
Udalit.BackColor = RGB (250, 100, 0)
Ravno.BackColor = RGB (250, 125, 0)
Operacia (4). BackColor = RGB (150, 250, 250)
Operacia (2). BackColor = RGB (150, 250, 250)
Operacia (0). BackColor = RGB (150, 250, 250)
Operacia (5). BackColor = RGB (150, 250, 250) p>
End Sub p>
Четвертий крок чи "справі час, а потісі - час! » p>
F5 - для перевірки! p>