Реферат: Калькулятор на VB - это легко!

Калькуляторна VB — этолегко!

(автор: Есин  И. В., email: tofriend@list.ru)

 

О чём ...

Статьяимеет две редакции: для начинающих осваивать язык и для тех у кого не толькоаббревиатура VBне вызывает вопросов, но и более-менее владеющихим.

Вданной редакции от читателя требуется знание VBнадостаточно хорошем уровне, что означает владение навыками визуальногопрограммирования, событийно-управляемого программирования и конечно «основных»операторов языка.  Предлагается один изспособов поиска решения подобных задач.

 

Первый шаг или интерфейс пользователя

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

<img src="/cache/referats/16833/image002.jpg" v:shapes="_x0000_i1025">

Инструмент CommandButtonсодержиттакие интересующие нас свойство и событие, которые дают нам полную ясность еговыбора.  Аналогичное можно сказать и проинструмент Label.  Декоративный инструмент Lineнеобязателен.

Для понимания моегопрограммного кода вам надо будет согласиться со следующими именамипредставленных объектов и их свойствами:

·<span Times New Roman"">                   

Форме присвоим имя Calculator.

·<span Times New Roman"">                   

Кнопки с цифрами образуют массив кнопок Knopkiиндексы,которых совпадают с их надписями.

·<span Times New Roman"">                   

Кнопка точка — это объект с именем Tochka, aкнопка изменения знака числа [<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">+/-] — Plusmin.

·<span Times New Roman"">                   

Кнопки арифметических операций имеют общее имя Operacia, нопроиндексированы.  Причём кнопка снадписью <span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language: RU">+имеет индекс 4, кнопка со знаком минус — индекс 2, кнопка«разделить» — 0, а кнопка соответствующая умножению — 5.

·<span Times New Roman"">                   

Кнопка "сброс"[<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">С] — Sbros.

·<span Times New Roman"">                   

Кнопка "очистить"[<span Courier New"; mso-bidi-font-family:«Times New Roman»">CE] — Ochistka.

·<span Times New Roman"">                   

Кнопка "удалить"[<span Courier New"; mso-bidi-font-family:«Times New Roman»"><-]  Udalit.

·<span Times New Roman"">                   

Кнопка "равно" [<span Courier New"; mso-bidi-font-family:«Times New Roman»">=]-Ravno.

·<span Times New Roman"">                   

Единственная метка называется Tablo(идалее — индикатор отображения вычислений будем называть «табло»).

В соответствие с рисункомизмените свойство Captionвсех объектов. Так, например, для объекта Tabloего значением будет <span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">0.

и свойство Font: FontSize= 14.  Длявсех кнопок свойство Styleимеетзначение <span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language: RU">1-<span Courier New";mso-bidi-font-family:«Times New Roman»">Graphical.  Свойство TabStopвсех объектов – <span Courier New"">False.

Свойство формы KeyPreviewобязано иметь значение <span Courier New";mso-bidi-font-family:«Times New Roman»">True

.  Ведь надо же пользователю предоставитьвозможность вычислять с клавиатуры!

А BorderStyle-<span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language: RU">1-

<span Courier New";mso-bidi-font-family:«Times New Roman»">FixedSingle.

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

          Второй шаг или «как заставить этуштуковину работать?!!»

          Преждечем писать обработчики событий для данных элементов управления «возьмём вруки» обычный калькулятор и выясним «механизм» его работы.  И сразу же можем сказать, что у него трисостояния: включён, выключен и первоначальная готовность.  Все эти состояния считайте уже написаны (ониобеспечиваются открытием и закрытием окна приложения и значением свойства Captionметки Tablo)!

          Далее, выясним какие действия может осуществлятьпользователь над кнопками нашей вещицы и что же при этом происходит на табло?

а)  Нажатие на одну из цифр — на табло справа куже имеющемуся числу прибавляется нажатая цифра.  Однако если данное число ноль, его заменяетвведённая цифра.

б)  Нажатие точки — изменений на табло нет.

в)  Нажатие плюс/минус — на табло слева к ужеимеющемуся числу прибавляется минус или убирается.

г)  Выбор одной из арифметических операций — возможное вычисление значения предыдущей операции с отображением его на табло.

д)  Вычислить (кнопка равно) — на табло можетотобразиться результат заданной операции.

е)  Удаление «последней» цифры числа — на табло удаляется «последняя» цифра.

ж)  Очистить (кнопка CE) — натабло «исчезает» набранное число и «превращается» в ноль!

з)  Сброс — на табло ноль.

          А связаны ли как-то между собой эти действия или скакими-нибудь состояниями?  И ...  когда возможно данное действие, а когданет?  Ответим в той жепоследовательности.

а)  Если была нажата точка, то набирается дробноечисло.  Очевидно, мы не можем ввестичисло, которое не умещается в табло.  Инам надо учитывать, что число не обязано быть целым (то есть не всегда числооканчивается точкой).

б)  Нет согласованных действий.  Нельзя поставить точку, если число ужедробное.

в)  Нет согласованных действий.  Действие можно выполнить всегда!

г)  Вычисление значения заданной операции.  Действие можно выполнить всегда.

д)  Нет согласованных.  Действие можно выполнить всегда, еслизначение принадлежит области допустимых значений для данной арифметическойоперации

е)  Нет согласованных.  Нельзя выполнить, если на табло ноль.

ж)  Нет согласованных.  Действие выполнимо всегда!

з)  Состояние первоначальной готовности.  Действие выполнимо всегда!

          Заметим также, что включение совпадает с первоначальнымсостоянием нашей счётной машинки.

          Итак ...  определилине только какие действия может выполнить пользователь калькулятора и что приэтом отобразится на табло, но и выявили некоторую взаимосвязь между действиямии даже одним состоянием.  Остаётся«рассказать» про это всё компьютеру. Но каким образом?  В нашемраспоряжении VB!

Третий шаг или приближение к программному коду!

          «Увидим» же программный код!  При определении чего нам надо, будем исходитьтолько из того какие элементы управления у пользователя «в руках»,зачем ему нужен калькулятор и тех выкладок, которые мы с лёгкостью проделали впредыдущем шаге!  А потребуется нам изтого богатого ассортимента возможностей, который предоставляет VBвсего-то несколько операторов, функций, свойств и событий известных объектов дапонять какие управляющие переменные создать, каков их тип.

          Как калькулятор поймет, что его только-чтовключили или был произведён сброс в первоначальное состояние? (з)  И как он узнаеткакое действие ему задал пользователь? (г) Понятно, что без переменной здесь не обойтись!  Поэтому в перменнойmodeтипа String, будем хранить данные режимавычислений.

          А каким образом калькулятор «запомнит» слагаемое,множитель, делимое, вычитаемое (то есть «первое» числооперации)?  Для этого можно объявитьглобальную перменную pervoe.

          На вопрос нужны ли ещё переменные отвечать покавоздержимся.

Вначале была точка.

          Поскольку представление целого числа на табло оканчиваетсяточкой, то будем «её ставить» в процедуре обработке события (далее — процедуре) Changeметки Tablo:

<span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language: RU">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">Private Sub Tablo_Change()

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New";mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">Dim z As Byte, t As Byte

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   z

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> = <span Courier New";mso-bidi-font-family:«Times New Roman»">InStr<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">(1, <span Courier New";mso-bidi-font-family:«Times New Roman»">Tablo<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">.<span Courier New"; mso-bidi-font-family:«Times New Roman»">Caption<span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">,",")  ' если результат — дробное число ищем позицию запятой

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   

<span Courier New";mso-bidi-font-family: «Times New Roman»">t<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> = <span Courier New";mso-bidi-font-family:«Times New Roman»">InStr<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">(1, <span Courier New";mso-bidi-font-family:«Times New Roman»">Tablo<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">.<span Courier New"; mso-bidi-font-family:«Times New Roman»">Caption<span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">,".")  ' определяем позициюточки

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> 

<span Courier New";mso-bidi-font-family: «Times New Roman»">If<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU"> <span Courier New";mso-bidi-font-family:«Times New Roman»">t<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> = 0  <span Courier New";mso-bidi-font-family:«Times New Roman»">Then<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   ' если точка не найдётся, то ставим её в конце:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   

<span Courier New"; mso-bidi-font-family:«Times New Roman»">Tablo.Caption<span Courier New";mso-bidi-font-family:«Times New Roman»">= Tablo.Caption & "."

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> ElseIf z <> 0 Then

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">' если событие наступает, в результате«выброса» на табло значения операции, которое является дробнымчислом, то запятую меняем на точку:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   

<span Courier New"; mso-bidi-font-family:«Times New Roman»">Tablo.Caption<span Courier New";mso-bidi-font-family:«Times New Roman»">= Mid(Tablo.Caption, 1, z — 1) & "."& Mid(Tablo.Caption, z + 1, Len(Tablo.Caption) — z — 1)

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">End

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> <span Courier New"; mso-bidi-font-family:«Times New Roman»">If<span Arial",«sans-serif»; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">

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

Учимся писать ...   числа.

Теперь наступило время«набрать» нашему пользователю число! Позволим ему сделать это ...   нопока с помощью мыши.  При этомпредусмотрим следующее:  1) он вводит цифру,когда на табло ноль.

2) он не знает (или можетзабыть) сколько цифр может поместиться в табло.

3) он вводит «второе»число операции, либо число после нажатия кнопки равно.  4) он вводит цифру, после того как щёлкнул по«точке».

Рассмотрение первой и второйособенности не представляет особого интереса, поскольку это нетрудно проверяется,сравнивая значение табло  с«нулём» и количеством допустимых символов соответственно.

Второечисло вводится после указания желаемой арифметической операции, где всоответствующей процедуре укажем значение «внутренней» переменной Tagкнопки Ravnoзначение «второе».  И кактолько введена первая цифра «второго» числа, данная переменнаястановится пустым символом.

Для реализации режима вводадробного числа воспользуемся также свойством Tag, ноуже объекта Tablo, такчто если его значение равно «не целое», то слева от введённой цифрыбудет ноль.

Данные выкладки можнореализовать в виде такого программного кода:

<span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language: RU">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">Private Sub knopka_Click(IndexAs Integer)

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> 

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">' если были выбраны равно или операция — ввод новогочисла:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> 

<span Courier New";mso-bidi-font-family: «Times New Roman»">If Ravno.Tag = "<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">второе<span Courier New"; mso-bidi-font-family:«Times New Roman»">" Then Tablo.Caption= «0»: Ravno.Tag = ""

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> 

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">If<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Len(Tablo.Caption)< 16 Then

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   ' если длина не превышает допустимой длины числа:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   

<span Courier New";mso-bidi-font-family: «Times New Roman»">If Tablo.Caption = «0.»And Tablo.Tag = "" Then

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">'  если на таблоноль и нет режима начала ввода дробного числа — заменяем цифрой c точкой:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">     

<span Courier New"; mso-bidi-font-family:«Times New Roman»">Tablo.Caption<span Courier New";mso-bidi-font-family:«Times New Roman»">= Index & "."

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   Else

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     If Mid(Tablo.Caption, Len(Tablo.Caption),1) = "." And Tablo.Tag <> "

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">не<span Courier New"; mso-bidi-font-family:«Times New Roman»"> <span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">целое<span Courier New";mso-bidi-font-family:«Times New Roman»">"Then

<span Courier New"; mso-bidi-font-family:«Times New Roman»">       

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">' на табло целое число и нет режима ввода дробного числа- добавляем цифру и ставим точку в конце:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">       

<span Courier New"; mso-bidi-font-family:«Times New Roman»">Tablo.Caption<span Courier New";mso-bidi-font-family:«Times New Roman»">= Mid(Tablo.Caption, 1, Len(Tablo.Caption)- 1) & Index

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">Else<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">       '  на табло дробное число илирежим ввода дробного числа — добавляем цифру надписи табло

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">       

<span Courier New"; mso-bidi-font-family:«Times New Roman»">Tablo.Caption<span Courier New";mso-bidi-font-family:«Times New Roman»">= Tablo.Caption & Index

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> 

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     End If

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   End If

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> End If

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> Tablo.Tag = ""    '

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">возможен<span Courier New";mso-bidi-font-family:«Times New Roman»">(...) <span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">ввод<span Courier New"; mso-bidi-font-family:«Times New Roman»"> <span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">дробного<span Courier New";mso-bidi-font-family:«Times New Roman»"> <span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">числа<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">End Sub

<span Arial",«sans-serif»;mso-bidi-font-family:«Times New Roman»">

<span Arial",«sans-serif»; mso-bidi-font-family:«Times New Roman»">

Однако этого кода достаточночтобы обеспечить ввод целых положительных чисел.  Добавим ещё две относительно простые попониманию процедуры.  Первая — изменениезнака числа:

<span Courier New"; mso-bidi-font-family:«Times New Roman»">Private Sub Plusmin_Click()

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> Select Case Val(Tablo.Caption)

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">' меньше нуля — «удаляем» минус:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   

<span Courier New";mso-bidi-font-family: «Times New Roman»">Case Is < 0

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     Tablo.Caption = Mid(Tablo.Caption,2, Len(Tablo.Caption))

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">' больше нуля — «прибавляем» минус:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   

<span Courier New";mso-bidi-font-family: «Times New Roman»">Case Is > 0

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     Tablo.Caption = "-" & Tablo.Caption

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> 

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">End<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Select

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">End

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Sub<span Arial",«sans-serif»;mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">

<span Arial",«sans-serif»;mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

Другая — возможность ввода дробного числа:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">Private

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Sub Tochka_Click()

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> ' если число целое, то разрешаем ввести дробное число:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> 

<span Courier New";mso-bidi-font-family: «Times New Roman»">If Fix(Val(Tablo.Caption)) = Val(Tablo.Caption) Or Ravno.Tag ="<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">второе<span Courier New"; mso-bidi-font-family:«Times New Roman»">" Then Tablo.Tag= "<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">не<span Courier New"; mso-bidi-font-family:«Times New Roman»"> <span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">целое<span Courier New";mso-bidi-font-family:«Times New Roman»">"

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> 

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">' к тому же… если вводить дробное число после указанияоперации, то целая его часть — ноль:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> 

<span Courier New";mso-bidi-font-family: «Times New Roman»">If Ravno.Tag = "<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">второе<span Courier New"; mso-bidi-font-family:«Times New Roman»">" Then Tablo.Caption= «0»

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">End

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Sub<span Arial",«sans-serif»; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">

<span Arial",«sans-serif»;mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">

Исправление ошибок ...<span Arial",«sans-serif»;mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">

<span Arial",«sans-serif»;mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">

Позволим также стиратьнабранное число и удалять последнюю цифру числа на табло, что обеспечитследующий фрагмент программного кода:

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">Private

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Sub ochistka_Click()

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> ' щелчёк по кнопке

<span Courier New";mso-bidi-font-family:«Times New Roman»">CE<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> «превращает» число на табло в ноль:

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> Tablo.Caption = «0»

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> Tablo.Tag = ""     ' вводим целое число

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">End Sub

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"">PrivateSub udalit_Click()

<span Courier New"">

<span Courier New"">    umnaya.SetFocus

<span Courier New"">

<span Courier New"">   

<span Courier New"; mso-ansi-language:RU">' является ли число целым?

<span Courier New";mso-ansi-language: RU">   

<span Courier New"">If Fix(Val(Tablo.Caption))= Val(Tablo.Caption) Then

<span Courier New"">     

<span Courier New"; mso-ansi-language:RU">' если целое — удалим последнюю цифру

<span Courier New";mso-ansi-language: RU">     

<span Courier New"">Tablo.Caption<span Courier New""> = Mid(Tablo.Caption,1, Len(Tablo.Caption) — 2)

<span Courier New"">     

<span Courier New"; mso-ansi-language:RU">' а если число было нулём — то так и оставим — «ноль»:

<span Courier New";mso-ansi-language: RU">     

<span Courier New"">If Tablo.Caption ="." Then Tablo.Caption = «0»

<span Courier New"">

<span Courier New"">    Else

<span Courier New"; mso-ansi-language:RU">

<span Courier New";mso-ansi-language: RU">      ' если на табло число не целое,то просто удалим последнюю

<span Courier New"">цифру<span Courier New""> надписи

<span Courier New"">      Tablo.Caption =Mid(Tablo.Caption, 1, Len(Tablo.Caption)- 1)

<span Courier New"">

<span Courier New"">    End

<span Courier New";mso-ansi-language:RU"> <span Courier New"">If<span Courier New";mso-ansi-language:RU">

<span Courier New";mso-ansi-language: RU">

<span Courier New"">End

<span Courier New";mso-ansi-language:RU"> <span Courier New"">Sub<span Courier New";mso-ansi-language:RU">

Считать, считать и ещё раз считать!

Далее пользователь, скореевсего, захочет указать одно из арифметических действий: сложить, вычесть,умножить, разделить заданное число с каким-то другим.  Предоставим ему такую возможность!

Здесь необходимо предусмотретьследующее: 1) пользователь может изменить выбранную операцию (не изменив доэтого числа на табло),  2) еслипользователь уже выбирал до этого какую-то операцию, не вычислял её значение спомощью клавиши равно или не задавал состояние первоначальной готовности, товычисляется результат этой операции.

Легко понять, что этиособенности взаимосвязаны между собой: вторая возможна только тогда, кодапользователь не изменяет выбор операции.

Первая особенность выбораарифметического действия частично рассмотрена. Вспомним, что при указании пользователем операции программа запишет впеременную Ravno.Tagзначение«второе».  Таким образом, привхождении в процедуру обработки события щелчка мыши по одной из кнопок Operaciaусловный оператор программного кода с помощью данной переменной проверит:«А не изменяет ли пользователь выбранную операцию?!».  При отрицательном ответе с помощью переменнойdeystvieбудетрешать надо ли передавать управление процедуре вычисления значения резултата Rezultat().  В любых случаях, переменная deystvieприметзначение соответствующее выбранному арифметическому действию.  При этом уже знакомая нам переменная pervoeприметзначение числа табло, а  Ravno.Tagбудетсообщать процедуре ввода числа, что вводится новое число и предоставлятьвозможность изменить операцию.  Всё этонаходим в следующей процедуре:

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">Private

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Sub Operacia_Click(Index As Integer)

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> If Ravno.Tag ="" Then ' нет изменения выбора операции?

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   '  если операция была задана — вычисляем её значение:

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   If deystvie <> "

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">нет<span Courier New"; mso-bidi-font-family:«Times New Roman»">" Then vtoroe= Val(Tablo.Caption): rezultat

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> End If

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> Select Case Index  '

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">запишем<span Courier New"; mso-bidi-font-family:«Times New Roman»"> <span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">выбранное<span Courier New";mso-bidi-font-family:«Times New Roman»"> <span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">действие<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   Case 0

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     deystvie = "

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">разделить<span Courier New"; mso-bidi-font-family:«Times New Roman»">"

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   Case 2

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     deystvie = "

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">вычесть<span Courier New"; mso-bidi-font-family:«Times New Roman»">"

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   Case 4

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     deystvie = "

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">сложить<span Courier New"; mso-bidi-font-family:«Times New Roman»">"

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   Case 5

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     deystvie = "

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">умножить<span Courier New"; mso-bidi-font-family:«Times New Roman»">"

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> 

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">End<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Select

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   pervoe = Val(Tablo.Caption)     'первое число операции — то что на табло при выборе операции

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   Ravno.Tag = «второе»            ' режим ввода второго числа

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">End

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Sub<span Arial",«sans-serif»;mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU">

<span Arial",«sans-serif»;mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

Несложно догадаться, чтопроцедура вычисления результата будет вызываться также из процедуры обработкинажатия кнопки «равно».  Ипрежде чем рассматривать первую, напишем программный код для второй.

Сделаем так, что если: 1) второечисло не введено и кнопка «равно» нажимается один раз, то значение невычисляется, 2) если кнопка нажимается два раза подряд, то в качестве второгочисла операции выбирается текущее число табло и результат вычисляется.

Во всех случаях нам будетспособствовать переменная Ravno.Tag.  Если она равна «второе», то этоудовлетворяет первому условию.  Однакочтобы реализовать второе назначим данной переменной пустой символ.  И уже здесь вследствие условия положимзначение переменной vtoroeчисло,«которое на табло» и запустим процедуру Rezultat(), затем зададим калькулятору подобие начального состояния(без отображения на табло нуля).  Можнонаписать так:

<span Arial",«sans-serif»;mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">Private

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Sub Ravno_Click()

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> If Ravno.Tag<> «второе» Then

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   

<span Courier New"; mso-bidi-font-family:«Times New Roman»">vtoroe<span Courier New";mso-bidi-font-family:«Times New Roman»"> =Val(Tablo.Caption)

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> Call rezultat

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">Ravno.Tag<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> = «второе»           ' режим ввода «второго»числа

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   Tablo.Tag = ""                 ' две переменные ука-

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   deystvie = «нет»               ' зываютначальное состояние

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> Else

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> 

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   Ravno.Tag = ""                 ' можем в «следующийраз» считать первым числом текущее число табло

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> End If

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">End

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Sub<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">

«Ноль», «нельзя» и «делить»

А вот и процедура обработкирезультата (понимание которой у вас, я думаю, не составит труда):

<span Courier New"; mso-bidi-font-family:«Times New Roman»">Private Sub rezultat()

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> Select Case deystvie

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   Case "

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">сложить<span Courier New";mso-bidi-font-family:«Times New Roman»">"

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     Tablo.Caption = pervoe+ vtoroe

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   Case "

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">вычесть<span Courier New";mso-bidi-font-family:«Times New Roman»">"

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     Tablo.Caption = pervoe — vtoroe

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   Case "

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">разделить<span Courier New";mso-bidi-font-family:«Times New Roman»">"

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     If vtoroe <> 0 Then

<span Courier New"; mso-bidi-font-family:«Times New Roman»">       Tablo.Caption = pervoe/ vtoroe

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">Else<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> ' на ноль действительно нельзя делить!

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">       Tablo.Caption = «на ноль не делят!»

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">     

<span Courier New";mso-bidi-font-family: «Times New Roman»">End If

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»">   Case "

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">умножить<span Courier New";mso-bidi-font-family:«Times New Roman»">"

<span Courier New"; mso-bidi-font-family:«Times New Roman»">     Tablo.Caption = pervoe* vtoroe

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> 

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">End<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Select

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">End

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Sub

В ней, как видите, результат сразу «выбрасывается»на табло.

О пользе клавиатуры.

И прежде чем подготовиться кпоследнему желанию пользователя — иметь возможность производить вычисления склавиатуры, добавим к уже имеющейся части программного кода процедуру обработкинажатия кнопки [С] (сброс в первоначальную) готовность:

<span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language: RU">

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">Private

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Sub Sbros_Click()

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">   deystvie = «нет»    ' стираем, возможно, указанное действие

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> Tablo.Caption = «0»   ' на табло — ноль

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU"> Tablo.Tag = ""        ' по умолчанию — вводится целое число

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:RU">

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:RU">End

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:RU"> Sub

Пользователь будет вводитьчисло с клавиатуры используя клавиши с цифрами, клавиши с точкой, а дляперемены знака числа клавишу +/=. Редактировать число с помощью клавиш Backspaceи Пробел.  Данные действия оперделим в коде процедуры Form_KeyPress(), используя замечательный аргумент этой процедуры — KeyAscii.

Поэтому если знать (или узнать)Ascii-коды клавиш, то понимание этой процедуры незаймёт много времени:

<span Courier New"; mso-bidi-font-family:«Times New Roman»">Private Sub Form_KeyPress(KeyAscii As Integer)

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<span Courier New"; mso-bidi-font-family:«Times New Roman»"> Select Case KeyAscii

<span Courier New"; mso-bidi-font-family:«Times New Roman»">

<p
еще рефераты
Еще работы по программированию, базе данных