ИЗУЧАЕМ СКРИПТЫ Урок 2. Числовые переменные и вычисления Автор - as-master Как уже говорилось, с числовыми переменными можно производить простейшие математические расчеты: сложение, вычитание, умножение и деление. Если для первых двух действий используются знаки "плюс" и "минус", то для умножение используется знак * (звёздочка), а для деления - знак / (прямой слэш). Давайте сделаем для начала простейший калькулятор. Создадим два эдитбокса, тип переменной выберем "Плавающее" - это числовая переменная с возможностью ввода чисел с запятой (не забывайте, что в Америке и западных странах вместо запятой используется точка!). В поле "К переменной" нужно указать имя получаемой из эдитбокса переменной. В верхнем окне указывается имя строковой переменной, а в нижнем - числовой. Нас интересует нижнее поле, где мы введем имя x1. Во втором эдитбоксе укажем имя x2. Это будут два числа, которые нужно будет складывать, вычитать и т.д. Ещё создадим простой текстовый объект и дадим ему имя "Результат". В этот текстовый объект будем выводить результаты вычислений. Под все три созданных текстовых объекта подложим прямоугольники с утопленной границей. Теперь сделаем четыре длинные кнопки с названиями "Сложить", "Вычесть", "Умножить" и "Разделить". Начнем с кнопки "Сложить". Первое, что мы должны сделать - сложить x1 и x2 и записать это в переменную, например, y. То есть просто написать строку: y=x1 + x2 Теперь нужно вывести полученное значение в текстовый объект "Результат" с помощью команды LoadText(). Однако эта команда "понимает" только строковые переменные, а у нас имеется числовая. Для перевода числовой переменной в строковую в программе есть функция CHAR(). А для обратного преобразования - функция VAL(). В итоге скрипт для кнопки "Сложить" получится таким: y=x1 + x2 y$=CHAR(y) LoadText("Результат","y$") Для остальных трех кнопок скрипты будут отличаться только знаком математического действия в первой строке скрипта. Так что можно его скопировать и вставить, с небольшим исправлением, в другие кнопки. Осталось сделать только кнопку "Сброс". В её скрипте нужно создать пустую строковую переменную и командой LoadText() загрузить её во все три текстовых объекта. Сделайте это сами. Теперь насладитесь работой калькулятора! Запустите и проверьте его работу (для тех, кто ничего не понял :-( - есть возможность взять
готовый проект). * * * Владимир Степанов из Красноярска спрашивал, как сделать, чтобы запущенный проект работал определенное время, например 5 минут, а потом закрывался. Средствами ММВ сделать это очень даже просто. Причем есть по крайней мере два пути: первый - использовать системное время компьютера, и второй - создать собственный счетчик в программе. Второй путь гораздо проще. 5 минут - это 300 секунд. Значит, нам нужно создать счетчик, задав его начальное значение, равное 300, и каждую секунду уменьшать это значение на единицу. И всё время сравнивать его значение с нулем. Когда оно станет равно нулю, дать команду Exit(). Создаем строковую переменную i и задаем её значение в старте первой страницы проекта: i=300 Там же, в скрипте первой страницы, нужно сразу запустить скрипт, который будет отсчитывать и контролировать время: RunScript("Timer") А вот и сам скрипт Timer: i=i - 1 If (i=0) Then Exit() End ScriptTimer("Script","1000") Поскольку значение ScriptTimer выбрано равным 1000, то значение i будет уменьшаться на единицу один раз в секунду. Это уже будет работать. Но давайте представим, что мы хотим уведомлять пользователя, сколько времени осталось до конца работы программы. И выводить ему это время в минутах и секундах. Значит, нам придется преобразовать общее время, заданное в секундах, в минуты и секунды. Для этого введем две числовых переменных - min и sec. Число минут можно узнать, если общее число секунд разделить на 60: min=i/60 Однако это число будет содержать целую и дробную части. Нас же интересует только целое число минут. И в ММВ есть такая функция, позволяющая выделить из числа только целую часть. Это функция INT(). Поэтому далее пишем: min=INT(min) А теперь можно рассчитать и секунды. Для этого из общего количества секунд надо вычесть число минут, умноженное на 60: sec=i - min*60 Теперь надо получить две строковые переменные, которые можно будет выводить для отображения в программе: min$=CHAR(min) sec$=CHAR(sec) Впоследствие вы заметите, что когда число секунд станет меньше 10, оно будет выводиться как 9, 8, 7 и т.д. А хотелось бы, чтобы это значение выводилось как 09, 08, 07 и т.д. Это нетрудно сделать. Введем в скрипт следующее условие: If (sec$='9') Then sec$='09' End И точно такие же для всех однозначных чисел. Теперь осталось только вывести переменные min$ и sec$ в какой-нибудь текстовый объект. Можно сделать для этих значений пару окошек в программе, а можно и просто вывести на экран всю информацию одной строкой. Так и поступим. Создадим переменную text$ и запишем ее значение: text$='До завершения работы программы осталось ' + min$ + ' мин ' + sec$ + ' сек.' И дадим команду вывода ее куда-нибудь на окно приложения (в текстовый объект Text): LoadText("Text","text$") Поскольку в конце скрипта у нас имеется запись ScriptTimer("Script","1000"), содержание текстового объекта Text будет обновляться каждую секунду. Что нам и требуется. Ну и в конце скрипта ставим условие, что если i=0, то программа завершает работу. Можно еще вывести сообщение об этом. А целиком скрипт Timer будет выглядеть так: i=i - 1 min=i/60 min=INT(min) sec=i - min*60 min$=CHAR(min) sec$=CHAR(sec) If (sec$='0') Then sec$='00' End If (sec$='1') Then sec$='01' End If (sec$='2) Then sec$='02' End If (sec$='3') Then sec$='03' End If (sec$='4') Then sec$='04' End If (sec$='5') Then sec$='05' End If (sec$='6') Then sec$='06' End If (sec$='7') Then sec$='07' End If (sec$='8') Then sec$='08' End If (sec$='9') Then sec$='09' End text$='До завершения работы программы осталось ' + min$ + ' мин ' + sec$ + ' сек.' LoadText("Text","text$") If (i=0) Then Message("Всё, до свидания!","") Exit() End ScriptTimer("Script","1000") Проект с этим примером можно взять в готовом виде
отсюда. * * * Например, вы делаете прайс-лист для вашей фирмы (эко на что замахнулся! взял бы Excel, что ли... А то на ММВ). С картинками, ценами, может быть даже с поиском, всё так красиво. И хотите сделать страничку "Расчет цены", где учитывались бы скидки, рассчитывался бы процент по кредиту, первоначальный взнос, ежемесячные выплаты. И всё автоматически. Удобно? Бесспорно. Трудно? Вряд ли. Давайте попробуем. Очевидно, что мы должны создать пять объектов вводимого текста. В первый пользователь будет вводить цену, во второй - скидку, в третий - кредитную ставку, в четвертый - количество месяцев кредита, и в пятый - первоначальный взнос (это разумно, ведь покупатель может заплатить сразу и 10 процентов стоимости, и 50). Создадим четыре эдитбокса, а получаемые из них числовые переменные назовём соответственно "цена", "скидка", "ставка", "месяцы" и "аванс". Да, да, вот так прямо по-русски, чтобы нам не запутаться и чтобы понятнее было. Всё будет работать, но в своих проектах старайтесь все-таки давать все имена по-английски. Кстати, там же задайте и имена строковых переменных, получаемых из этих эдитбоксов - такие же, только со знаком $ в конце. Они нам потом пригодятся. Не забудьте подложить под эдитбоксы утопленные прямоугольники, для красоты. Ниже давайте нарисуем еще пять утопленных прямоугольников - это будут окошки для вывода рассчитанной информации. Почему пять, ведь достаточно только знать сумму ежемесячного платежа? Нет, клиенту любопытно знать всё - и какая цена будет со скидкой, и процент, который ему придется выплатить по кредиту, и итоговую цену. Так что не будем лишать клиента этого удовольствия, тем более что все эти результаты нам все равно придется вычислять. Итак, глаза боятся - руки делают. Для вывода результатов нам эдитбоксы не нужны - достаточно простых текстовых объектов. Сделаем их в каждом окне, всего пять штук. Я назвал эти объекты так: "цена2" - для вывода цены с учетом скидки, "накрутка" - процент по кредиту в рублях, "итого" - общая цена с учетом кредитной накрутки, "осталось" - сумма, которую клиенту осталось выплатить после внесения первоначального взноса, и "платеж" - размер ежемесячных выплат. Уф-ф... Еще две кнопки нужны. Внизу. Одна - "Вычислить", и вторая "Сброс". Давайте создадим две простые кнопки и сразу нарисуем в проекте два скрипта (пока пустых) с названиями Calculate и Reset. А кнопкам назначим выполнение этих скриптов. Которой какой скрипт, и так ясно. Вот, всё готово для работы :))) Теперь начинаем написание скрипта Calculate. Рассчитываем величины, которые будут выводиться в нижние пять окон: цена2=цена - (цена*скидка)/100 накрутка=(цена2*ставка)/100 итого=цена2 + накрутка осталось=итого - аванс платеж=осталось/месяцы Эта часть скрипта пояснения не требует. Далее из числовых переменных создаем строковые (выводить ведь можно только их): цена2$=CHAR(цена2) накрутка$=CHAR(накрутка) итого$=CHAR(итого) осталось$=CHAR(осталось) платеж$=CHAR(платеж) И выводим эти значения: LoadText("цена2","цена2$") LoadText("накрутка","накрутка$") LoadText("итого","итого$") LoadText("осталось","осталось$") LoadText("платеж","платеж$") В принципе это всё. Уже можно считать. Но желательно предусмотреть еще некоторые мелочи. Например, если скидки на товар нет, то в это окно могут не ввести значение. Поэтому в начале скрипта лучше добавить вот что: If (скидка$='') Then скидка=0 скидка$=CHAR(скидка) End LoadText("скидка","скидка$") И тогда в этом случае в поле будет автоматически подставляться ноль, он же будет учитываться и в расчетах. То же самое можно сделать и для поля кредитной ставки (если будет беспроцентный кредит и цифру в поле не введут): If (ставка$='') Then ставка=0 ставка$=CHAR(ставка) End LoadText("ставка","ставка$") Если пользователь, специально или случайно, введет в какое-нибудь поле отрицательное число, расчеты естественно будут неверными. Значит, надо запретить ему вводить отрицательные числа. Давайте сделаем так. В свойствах всех пяти эдитбоксов в поле "При замене текста выполнять следующий скрипт" напишем имя скрипта - "Нельзя". А теперь сделаем это скрипт "Нельзя". Вот условие для переменной цена$ (ведь при вводе в это окно мы получаем сразу две переменных - числовую "цена" и строковую "цена$"): If (цена$='-') Then Message("Нельзя!","") цена$='' LoadText("цена","цена$") End То есть если будет введен минус, сразу выскочит сообщение "Нельзя!", и окно эдитбокса очистится. Точно так же напишите еще четыре условия для остальных четырех переменных. Строго говоря, пользователь сможет сначала вписать число, а затем приписать ему минус в начале, и наш скрипт не сможет ему это запретить. Но и это можно обойти, если немного подумать (предоставляю сделать это вам самим). Вы можете предусмотреть еще кучу маленьких, но приятных мелочей - например, при вводе суммы первого взноса, превышающей итоговую цену товара, выводить сообщение "Вы что, собираетесь заплатить чаевые?" И даже указать эту сумму. А что, неплохая идея! Я так увлекся, что решил помочь вам написать такой сценарий. Его надо поместить в скрипт Calculate перед последними пятью строками вывода текстовых объектов. Вот этот сценарий: If (аванс > итого) Then чаевые=аванс - итого чаевые$=CHAR(чаевые) ошибка$='Похоже, вы собираетесь заплатить ' + чаевые$ +' рублей чаевых!' Message("ошибка$","") Return() End Словом, простор для творчества! Больше идей и подсказок давать не буду. Осталось лишь написать сценарий для кнопки "Сброс". Он очень простой и никаких пояснений не требует: цена=0 скидка=0 ставка=0 месяцы=0 аванс=0 цена2=0 накрутка=0 итого=0 осталось=0 платеж=0 цена$='' скидка$='' ставка$='' месяцы$='' аванс$='' цена2$='' накрутка$='' итого$='' осталось$='' платеж$='' LoadText("цена","цена$") LoadText("скидка","скидка$") LoadText("ставка","ставка$") LoadText("месяцы","месяцы$") LoadText("аванс","аванс$") LoadText("цена2","цена2$") LoadText("накрутка","накрутка$") LoadText("итого","итого$") LoadText("осталось","осталось$") LoadText("платеж","платеж$") Готовый, так сказать, к употреблению файл проекта можно, в принципе, и
скачать. Берите люди, пользуйтесь, но учитесь всё делать сами. Для этого мы здесь и стараемся. Продолжение следует.
Написать отзыв |