End Sub
Исправление ошибок ...
Позволим также стирать набранное число и удалять последнюю цифру числа на табло, что обеспечит следующий фрагмент программного кода:
Private Sub ochistka_Click()
' щелчёк по кнопке CE "превращает" число на табло в ноль:
Tablo.Caption = "0"
Tablo.Tag = "" ' вводим целое число
End Sub
Private Sub udalit_Click()
umnaya.SetFocus
' является ли число целым?
If Fix(Val(Tablo.Caption)) = Val(Tablo.Caption) Then
' если целое - удалим последнюю цифру
Tablo.Caption = Mid(Tablo.Caption, 1, Len(Tablo.Caption) - 2)
' а если число было нулём - то так и оставим - "ноль":
If Tablo.Caption = "." Then Tablo.Caption = "0"
Else
' если на табло число не целое, то просто удалим последнюю цифру надписи
Tablo.Caption = Mid(Tablo.Caption, 1, Len(Tablo.Caption) - 1)
EndIf
EndSub
Считать, считать и ещё раз считать!
Далее пользователь, скорее всего, захочет указать одно из арифметических действий: сложить, вычесть, умножить, разделить заданное число с каким-то другим. Предоставим ему такую возможность!
Здесь необходимо предусмотреть следующее: 1) пользователь может изменить выбранную операцию (не изменив до этого числа на табло), 2) если пользователь уже выбирал до этого какую-то операцию, не вычислял её значение с помощью клавиши равно или не задавал состояние первоначальной готовности, то вычисляется результат этой операции.
Легко понять, что эти особенности взаимосвязаны между собой: вторая возможна только тогда, кода пользователь не изменяет выбор операции.
Первая особенность выбора арифметического действия частично рассмотрена. Вспомним, что при указании пользователем операции программа запишет в переменную Ravno.Tagзначение "второе". Таким образом, при вхождении в процедуру обработки события щелчка мыши по одной из кнопок Operaciaусловный оператор программного кода с помощью данной переменной проверит: "А не изменяет ли пользователь выбранную операцию?!". При отрицательном ответе с помощью переменной deystvieбудет решать надо ли передавать управление процедуре вычисления значения резултата Rezultat(). В любых случаях, переменная deystvieпримет значение соответствующее выбранному арифметическому действию. При этом уже знакомая нам переменная pervoe примет значение числа табло, а Ravno.Tagбудет сообщать процедуре ввода числа, что вводится новое число и предоставлять возможность изменить операцию. Всё это находим в следующей процедуре:
Private Sub Operacia_Click(Index As Integer)
If Ravno.Tag = "" Then ' нет изменения выбора операции?
' если операция была задана - вычисляем её значение:
If deystvie <> "нет" Then vtoroe = Val(Tablo.Caption): rezultat
End If
Select Case Index ' запишемвыбранноедействие
Case 0
deystvie = "разделить"
Case 2
deystvie = "вычесть"
Case 4
deystvie = "сложить"
Case 5
deystvie = "умножить"
End Select
pervoe = Val(Tablo.Caption) ' первое число операции - то что на табло при выборе операции
Ravno.Tag = "второе" ' режим ввода второго числа
End Sub
Несложно догадаться, что процедура вычисления результата будет вызываться также из процедуры обработки нажатия кнопки "равно". И прежде чем рассматривать первую, напишем программный код для второй.
Сделаем так, что если: 1) второе число не введено и кнопка "равно" нажимается один раз, то значение не вычисляется, 2) если кнопка нажимается два раза подряд, то в качестве второго числа операции выбирается текущее число табло и результат вычисляется.
Во всех случаях нам будет способствовать переменная Ravno.Tag. Если она равна "второе", то это удовлетворяет первому условию. Однако чтобы реализовать второе назначим данной переменной пустой символ. И уже здесь вследствие условия положим значение переменной vtoroeчисло, "которое на табло" и запустим процедуру Rezultat(), затем зададим калькулятору подобие начального состояния (без отображения на табло нуля). Можно написать так:
Private Sub Ravno_Click()
If Ravno.Tag <> "второе" Then
vtoroe = Val(Tablo.Caption)
Call rezultat
Ravno.Tag = "второе" ' режим ввода "второго" числа
Tablo.Tag = "" ' две переменные ука-
deystvie = "нет" ' зывают начальное состояние
Else
Ravno.Tag = "" ' можем в "следующий раз" считать первым числом текущее число табло
End If
End Sub
«Ноль», «нельзя» и «делить»
А вот и процедура обработки результата (понимание которой у вас, я думаю, не составит труда):
Private Sub rezultat()
Select Case deystvie
Case "сложить"
Tablo.Caption = pervoe + vtoroe
Case "вычесть"
Tablo.Caption = pervoe - vtoroe
Case "разделить"
If vtoroe <> 0 Then
Tablo.Caption = pervoe / vtoroe
Else ' на ноль действительно нельзя делить!
Tablo.Caption = "на ноль не делят!"
End If
Case "умножить"
Tablo.Caption = pervoe * vtoroe
End Select
End Sub
В ней, как видите, результат сразу "выбрасывается" на табло.
О пользе клавиатуры.
И прежде чем подготовиться к последнему желанию пользователя - иметь возможность производить вычисления с клавиатуры, добавим к уже имеющейся части программного кода процедуру обработки нажатия кнопки [С] (сброс в первоначальную) готовность:
Private Sub Sbros_Click()
deystvie = "нет" ' стираем, возможно, указанное действие
Tablo.Caption = "0" ' на табло - ноль
Tablo.Tag = "" ' по умолчанию - вводится целое число
End Sub
Пользователь будет вводить число с клавиатуры используя клавиши с цифрами, клавиши с точкой, а для перемены знака числа клавишу +/=. Редактировать число с помощью клавиш Backspaceи Пробел. Данные действия оперделим в коде процедуры Form_KeyPress(), используя замечательный аргумент этой процедуры - KeyAscii.
Поэтому если знать (или узнать) Ascii-коды клавиш, то понимание этой процедуры не займёт много времени:
Private Sub Form_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 8
udalit_Click
Case 42, 43, 45, 47 ' теперь стало ясным почему индексы
Operacia_Click (47 - KeyAscii) ' следуют не по порядку?
Case 61 ' меняем знак
Plusmin_Click
Case Is > 47 ' вводим цифры
If KeyAscii < 58 Then knopka_Click (KeyAscii - 48)
Case 32 ' а здесь пробелом "чистим" табло
ochistka_Click
End Select
End Sub
Данная процедура не позволяет отлавливать нажатие «точки», так как Ascii-коды «точки» на малой цифровой клавиатуре отличны при разных раскладках. Напишем соответствующий код в следующей процедуре.
Исход будет!
Однако мы до сих пор не указали заменители кнопок "сброса в первоначальное состояние" и "равно". Для первого случая сложность заключается в придумывании клавиши, а для другого - способа "отлавливания" нажатия клавиши (я думаю ни у кого не возникнет сомнения в том, что нажатие клавиши Enterбудет соответствовать щелчку по кнопке равно).
Сбрасываем в начальное состояние клавишей Delete:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
IfKeyCode = 46 Thensbros_Click
' поскольку значения "точки" малой цифровой клавиатуры у KeyAscii не одинаковые
' при различных раскладках, то "ловим" её с помощью KeyCode
If KeyCode = 110 Then tochka_Click
End Sub
Поймать нажатие клавиши Enterна кнопке можно следующим образом. Для этого вначале бросим на форму текстбокс. И спрячем его под границу будущего окна приложения (вначале увеличим высоту, затем поместим "туда" текстбокс и зададим высоту формы до её изменения). Изменим лишь свойства TabIndexна 1 и Nameна Umno. Как вы уже скорее всего догадались нажатие по этому объекту будет выявлять нажатие клавиши Enter. Поэтомуимеемтакуюпроцедуру:
Private Sub Umno_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then Ravno_Click
End Sub
Однако, это сработает тогда, когда объект Umnoимеет фокус. А что, если щёлкнуть по какой-то из кнопок? Тогда фокус переходит этой кнопке. И значит, нам надо вначале всех процедур обработки щелчков кнопок написать:
Umno.SetFocus
и тогда фокус будет всегда возвращаться на нужное нам место!
И, наконец, завершим наш проект, возвратясь почти к самому началу ...
"Покрасим" элементы управления!
Для этого процедуру Form_Loadможно написать так:
Private Sub Form_Load()
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)
End Sub
Четвёртый шаг или "делу время, а потехе – час!»
F5 - для проверки!