Приветствуем всех на территории Flash/Flex. Основной задачей данного выпуска является "добивание" программы-калькулятора, кою мы начали в прошлом выпуске. Раз уж начали тему, то ее стоит и завершить.
На самом деле, программируя такие несложные вещи, как калькулятор, мы учимся понимать флэш. Например, при обсуждении событий указателя мыши для кнопок образуемого интерфейса мы не упомянули о том, что среди всего арсенала отсутствует такая очевидная (для обычных средств разработки) вещь, как реакция на doubleclick. Почему? Дело в том, что сам флэш-плеер очень сильно увязан с веб-приложениями, в которых также нет реакции на двойной щелчок. То есть, тут следует отметить, что сама технология флэш - вебовая, несмотря на то, что в ее рамках достаточно удобно создавать локальные приложения. Именно в рамках локальных приложений можно сказать, что разница между тем, соберете ли вы, например, наш калькулятор в Delphi (C++ Builder) либо во Flash, не велика. Но данное утверждение будет не совсем верным - Flash c ActionScript гораздо эффективнее по скорости создания приложений плюс обладает уникальными возможностями для рисования графических оболочек.
Отойдем от темы
Недавно я имел беседу с одним московским товарищем, являющимся тим-лидером группы программистов, работающих с флексом. Заказов на самом деле масса, и, например, его команда загружена на два года вперед. На технологию есть очевидный спрос, хотя стоит отметить, что СНГ-вский интернет пока не готов к ее приходу по разным причинам, поэтому пока работа идет на зарубежных "дядек", что, в принципе, не плохо. Мы поговорили о различных реализациях архитектур сложных комплексов, вариантах VMC (Viewer-Model-Controller) и о других интересных вкусностях. Он мне показал несколько готовых работ, которые являлись не чем иным, как коммерческими интернет-каталогами нового поколения, где есть очень много динамики, анимации, видео. Например, мне очень понравился сделанный ими ресурс по ландшафтному дизайну, в рамках которого можно было быстро и понятно перейти от непосредственно самих ландшафтных решений, которые можно было "покрутить" и т.п., к красиво оформленным описаниям растений, материалов, ценовым и сравнительным таблицам, автоматически сгенерировать смету, посчитать все для различных вариантов, сравнить все в виде диаграмм и графиков. Красиво, что тут скрывать. Удобно... Знаете, такой уровень редко встретишь даже в обычных программных приложениях, мультимедийных энциклопедиях, а тут буквально интернет-сайт. За этим будущее.
И тут я вспомнил, что в рамках территории мы еще топчемся в самих основах, так что наступил момент форсирования ситуации. То есть, сегодня добьем основную часть нашего калькулятора, в следующем выпуске подробно рассмотрим мувиклипы, перейдем к классам, потом следует поговорить о XML и вообще вариантах чтения данных из внешних файлов, а после уже перейдем на более сложные вещи, для чего нам понадобится второй Flex. Вот такая небольшая программа действий.
Калькулятор
Итак, я надеюсь, что все успешно создали интерфейс из 13 кнопок ("0-9", ".", "+/-") и текстового табло. Также я попросил сделать так, чтобы все работало как в обычном калькуляторе, то есть цифры на табло появлялись друг за другом в моменты нажатия соответствующих кнопок и т.п. Если данный вопрос вызвал трудности, то опишу решение, что называется, на пальцах.
Допустим, введем переменную под именем tablo. Она хранит в себе строку, которая отображается на реальном табло калькулятора и перезаписывается в момент добавления нового символа. При старте программы, сбросе и т.п., tablo = "0", соответственно, 0 и отображается. Далее по нажатию на какую-нибудь цифру нужно на табло добавить символ, что делается с помощью специально написанной и не сложной, по сути, функции, в которую передается непосредственно сама нажатая цифра. В общем, все будет выглядеть примерно так:
function AddSym(var1) { if (tablo == "0") { dig = var1; return dig;} else { dig = tablo+var1; count++; return dig;} }
Переменная count - это текущее количество символов на табло, а dig - это непосредственно само число, на данном этапе представленное в виде строки. Соответственно, примерно таким же образом вы можете вносить точку, при этом предусмотрев, чтобы она могла вводиться только один раз (стандартная логика), и добавлять или убирать "-". То есть в данном случае мы работаем только со строкой.
Если же вы захотите вводить число пи или е, как это делается в калькуляторе, то достаточно просто предусмотреть соответствующие кнопки, по нажатию на которые переменная tablo сначала обнуляется, а потом на экран выводится само число с помощью этой же функции из представленного листинга. Это же касается тех случаев, когда, например, вы хотите использовать константы, взятые извне. Например, в рамках своей программы я из интернета (XML-файла) считываю курсы валют, и они автоматически у меня становятся константами, которые я могу вызывать по мере надобности.
Математические операции
Простейшие математические операции (+, -, /, *) делаются достаточно тривиально. То есть, по нажатию на соответствующие кнопки отображаемое в тот момент на табло число запоминается как промежуточная переменная, потом вводится новая и происходит сама операция. Тривиально-то оно чисто внешне, потому как больше вы повозитесь с логикой, а именно: вам нужно исключить варианты, когда вычисления начинаются после того, как вы два раза нажмете знак "умножить", либо "умножить", а потом сразу "разделить". Второй случай сложнее, поскольку должно использоваться последнее действие из выбранных. То есть, вам понадобится четыре логических указателя, которые указывают на текущий статус вызова одной из четырех операций. Соответственно, по нажатию любой другой кнопки они (эти указатели) обнуляются. Все это сделать не трудно, нужно просто немного повозиться. Постарайтесь сделать все как можно оптимальнее.
После работы с четырьмя знаками простейших математических операций вам будет совсем не трудно реализовать кнопку "=".
Единственный подводный камень, с которым вы можете столкнуться в рамках кода, это необходимость преобразования типа данных переменных при сложении. В остальных случаях строчные автоматически становятся числовыми, а при сумме необходимо использовать оператор преобразования типа Number (), потому как без этого произойдет конкатенация (сложение символов). На самом деле для строгости кода можно было бы потребовать, чтобы вы преобразовывали в числовой тип при вычислениях абсолютно все. Но раз уж самими разработчиками языка предусмотрена возможность это не использовать, то тут нам проще. Работает? Ну и ладно.
Математические функции
Как уже было сказано ранее, все математические функции для ActionScript находятся в объекте Math и вызываются через него. Отдельно стоит сказать о тригонометрических функциях, поскольку они требуют указания углов в радианах, а не градусах. Посему, сразу убивая двух зайцев, даю несколько строк кода, правда, предупрежу, что все математические операции своего калькулятора я для удобства вынес в рамки одной функции, это ее фрагмент:
function FunCalc(A) { if (A == "sin") { D2 = Math.sin(Number(D2)/180*Math.PI); } ... tablo = D2; }
То есть, в саму функцию я сообщаю условное название математической, а после все и расшифровываю. Думаю, что и вы поступите так же:).
Транслятор ошибок
На самом деле для того, чтобы сделать интерфейс дружественным пользователю, необходимо написать небольшой программный модуль, который послужит некоторым переводчиком. Лучше я это покажу кодом, так проще и понятнее:
function ErrorMess() { if (isNaN(D2)) { tablo = "Не определен"; } if (D2 == Number.NEGATIVE_INFINITY) { tablo = "Минус бесконечность"; } if (D2 == Number.POSITIVE_INFINITY) { tablo = "Плюс бесконечность"; } }
Думаю, что объяснять тут особо и нечего.
В завершение
В принципе, писать калькулятор на ActionScript, по сравнению со стандартными языками и средами, гораздо проще, программирование больше напоминает решение головоломки. И, конечно, меньше всего думаешь о том, что нужно будет открывать книги, искать описания специфики работы с определенными типами и т.п. Даже сам факт того, что числовой тип в ActionScript является единственным, не разделенным на real, integer и т.п., говорит о простоте языка. Поэтому я и рекомендую учиться современному программированию на его базе.
В любом случае этот язык и сама архитектура флэша уже позволяет больше думать о форме, логике и структуре самого приложения и его отдельных крупных элементов, поскольку практическая реализация задуманного делается достаточно быстро. Вот, например, в прошлом выпуске мы рассмотрели пример с двумя Listbox'ами, создаваемыми по разным методикам. Что интересно, практическое воплощение уже готовых решений делается буквально за полчаса-час. The Fat of The Land.
Задание №2
Прошлый выпуск заканчивался заданием №1, второе уже не будет касаться нашего калькулятора, а попрошу я вас сделать вот что (думается, что калькулятор вы все-таки завершите самостоятельно). Напишите игру пятнашки, используя 15 кнопок, созданных самостоятельным образом.
Кристофер,
christopher@tut.by
Горячие темы