Отображение суммы денег, пересчитанной в другие валюты
Рисунок 21.3. Отображение суммы денег, пересчитанной в другие валюты
Приглашение на выбор вида валюты из приводимого списка
Рисунок 21.1. Приглашение на выбор вида валюты из приводимого списка
Приглашение пользователю на ввод суммы денег в указанной валюте
Рисунок 21.2. Приглашение пользователю на ввод суммы денег в указанной валюте
Рассмотрение файла сценария CurrencyScriptl .wmls
Рассмотрение файла сценария CurrencyScriptl .wmls
Как уже упоминалось ранее, при первоначальном запуске приложения вызывается функция Initialize (Инициализация), находящаяся в файлеCurrencyScriptl.wmls. Позже, когда пользователь выбирает тип валюты, приложение вызывает вторую функцию из WMLScript-файла, которая выводит приглашение пользователю на ввод суммы денег, пересчитываемой затем приложениемв другие валюты. В настоящее время WMLScript-код необходимо размещать в отдельном файле и предварять имя каждой функции ключевым словом extern.Сценарий CurrencyScriptl .wmls реализуется с помощью следующего программного кода:
extern function Initialize()
{
var EuroToDollar = "1.02982"; var PoundToDollar = "1.64649"; var YenToDollar = "0.00947277";
WMLBrowser.setVar("EuroToDollar", EuroToDollar); WMLBrowser.setVar("PoundToDollar", PoundToDollar); WMLBrowser.setVar("YenToDollar", YenToDollar);
var USDollar = 100.00; var Euro = USDollar / Lang.parseFloat(EuroToDollar); var UKPound = USDollar / Lang.parseFloat(PoundToDollar); var JapanYen = USDollar / Lang.parseFloat(YenToDollar);
USDollar = String.format("%3.2f", USDollar); Euro = String.format("%3.2f", Euro); UKPound = String.format("%3.2f", UKPound); JapanYen = String.format("%3.2f", JapanYen);
WMLBrowser.setVar("USDollar", USDollar); WMLBrowser.setVar("Euro", Euro); WMLBrowser.setVar("UKPound", UKPound); WMLBrowser.setVar("JapanYen", JapanYen);
WMLBrowser.refresh();
}
extern function GetUSDollar()
{
var EuroToDollar = WMLBrowser.getVar("EuroToDollar"); var PoundToDollar = WMLBrowser.getVar("PoundToDollar"); var YenToDollar = WMLBrowser.getVar("YenToDollar");
var USDollar = WMLBrowser.getVar("USDollar"); USDollar = Dialogs.prompt("US Dollars", USDollar);
var Euro = Lang.parseFloat(USDollar) / Lang.parseFloat (EuroToDollar); var UKPound = Lang.parseFloat(USDollar) / Lang.parseFloat (PoundToDollar); var JapanYen = Lang.parseFloat(USDollar) / Lang.parseFloat (YenToDollar);
USDollar = String.format("%3.2f", Lang.parseFloat(USDollar)); Euro = String.format("%3.2f", Euro); UKPound = String.format("%3.2f", UKPound); JapanYen = String.format("%3.2f", JapanYen);
WMLBrowser.setVar("USDollar", USDollar); WMLBrowser.setVar("Euro", Euro); WMLBrowser.setVar("UKPound", UKPound); WMLBrowser.setVar("JapanYen", JapanYen);
WMLBrowser.refresh();
}
extern function GetEuro()
{
var EuroToDollar = WMLBrowser.getVar("EuroToDollar"); var PoundToDollar = WMLBrowser.getVar("PoundToDollar"); var YenToDollar = WMLBrowser.getVar("YenToDollar");
var Euro = WMLBrowser.getVar("Euro"); Euro = Dialogs.prompt("Euro", Euro);
var USDollar = Lang.parseFloat(Euro) * Lang.parseFloat (EuroToDollar); var UKPound = USDollar / Lang.parseFloat(PoundToDollar); var JapanYen = USDollar / Lang.parseFloat(YenToDollar);
USDollar = String.format("%3.2f", USDollar); Euro = String.format("%3.2f", Lang.parseFloat(Euro)); UKPound = String.format("%3.2f", UKPound); JapanYen = String.format("%3.2f", JapanYen);
WMLBrowser.setVar("USDollar", USDollar); WMLBrowser.setVar("Euro", Euro); WMLBrowser.setVar("UKPound", UKPound); WMLBrowser.setVar("JapanYen", JapanYen);
WMLBrowser.refresh();
}
Внутри функции Initialize каждому типу валюты присваивается значение коэффициента пересчета. В реальном приложении, сценарий получал бы текущиекурсы валют из базы данных. После того как функция присвоила коэффициентыпересчета своим переменным, программа должна с помощью функцииWMLBrowser. setVar сделать значения переменных видимыми за пределамифункции (другими словами, в результате этой операции значения переменныхстановятся видимыми для программного кода WML-страницы). Затем функцияInitialize форматирует коэффициенты пересчета валют для отображения втаблице, вызывая для этого функцию String.
format.
Как упоминалось ранее, всякий раз, когда пользователь выбирает тип валюты,приложение вызывает соответствующую выбранной валюте функцию, котораявыполняет пересчет в другие валюты. Например, если пользователь выбираетевро (Euro), приложение вызывает функцию GetEuro, которая, в свою очередь,активизирует функцию Dialogs. prompt, чтобы принять вводимые пользователем данные. Затем программа выполняет пересчет, присваивает результаты переменным, которые приложение отображает в таблице. Активизируя функциюWMLBrowser. refresh, приложение отдает браузеру команду обновить информацию на экране сотового телефона.
Как обсуждалось выше, из-за ограничений, накладываемых WML-браузерами наразмер WML-страницы, приложение разбивает сценарий на два файла. Например, сценарий CurrencyScript2.wmls реализуется с помощью следующего программного кода:
extern function GetUKPound()
{
var EuroToDollar = WMLBrowser.getVar("EuroToDollar"); var PoundToDollar = WMLBrowser.getVar("PoundToDollar"); var YenToDollar = WMLBrowser.getVar("YenToDollar");
var UKPound = WMLBrowser.getVar("UKPound"); UKPound = Dialogs.prompt("UK Pounds", UKPound);
var USDollar = Lang.parseFloat(UKPound) * Lang.parseFloat (PoundToDollar); var Euro = USDollar / Lang.parseFloat(EuroToDollar); var JapanYen = USDollar / Lang.parseFloat(YenToDollar);
USDollar = String.format("%3.2f", USDollar); Euro = String.format("%3.2f", Euro); UKPound = String.format("%3.2f", Lang.parseFloat(UKPound)); JapanYen = String.format("%3.2f", JapanYen);
WMLBrowser.setVar("USDollar", USDollar); WMLBrowser.setVar("Euro", Euro); WMLBrowser.setVar("UKPound", UKPound); WMLBrowser.setVar("JapanYen", JapanYen);
WMLBrowser.refresh();
}
extern function GetJapanYen()
{
var EuroToDollar = WMLBrowser.getVar("EuroToDollar"); var PoundToDollar = WMLBrowser.getVar("PoundToDollar"); var YenToDollar = WMLBrowser.getVar("YenToDollar");
var JapanYen = WMLBrowser.getVar("JapanYen"); JapanYen = Dialogs.prompt("Japan Yen", JapanYen);
var USDollar = Lang.parseFloat(JapanYen) * Lang.parseFloat (YenToDollar); var UKPound = USDollar / Lang.parseFloat(PoundToDollar); var Euro = USDollar / Lang.parseFloat(EuroToDollar);
USDollar = String.format("%3.2f", USDollar); Euro = String.format("%3.2f", Euro); UKPound = String.format("%3.2f", UKPound); JapanYen = String.format("%3.2f", Lang.parseFloat(JapanYen));
WMLBrowser.setVar("USDollar", USDollar); WMLBrowser.setVar("Euro", Euro); WMLBrowser.setVar("UKPound", UKPound); WMLBrowser.setVar("JapanYen", JapanYen);
WMLBrowser.refresh();
}
Дополнительную информацию по операторам и функциям WMLScriptможно найти в Приложении С, «Справочник по WMLScript».
Рассмотрение приложения CurrencyScript.wml
Рассмотрение приложения CurrencyScript.wml
При запуске приложения Currency Script браузер загружает WML-страницу, содержащуюся в файле CurrencyScript.wml, которая вначале инициализирует курсы пересчета валют. Если вы просмотрите WML-страницу, то обнаружите, что в нейимеется много ссылок, подобных приводимой ниже. Эта ссылка активизируетфункцию, находящуюся в отдельном WMLScript-файле:
<go href=" CurrencyScriptI.wmls#Initialize()" />
В данном случае элемент отдает браузеру команду выполнить ветвление и перейти к функции Initialize (Инициализация), находящейся в файлеCurrencyScriptI .wmls. После того как функция выполнит обработку, для которойона предназначена, управление возвращается в текущее место программного кода. Как вы увидите, функция Initialize присваивает значения курсов пересчетафунтов, йен и евро в доллары.
По мере знакомства с WML-страницей вы также встретите ряд элементов, примеркоторых приводится ниже. Здесь элемент ссылается на значение хранимое в переменной:
<td<a href="CurrencyScriptl.wmls#GetUSDollar()" title="Edit">US
Dollars :</aX/td>
<td>$USDollar<td>
В данном случае программный код ссылается на переменную USDollar, котораясодержит результат последнего преобразования в доллары США. ПриложениеCurrencyScript.wml реализуется с помощью следующего программного кода:
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
</head>
<card id="CurrencyScript">
<onevent type="onenterforward">
<go href="CurrencyScript1.wmls#Initialize()" />
</onevent>
<p align="center">
Currency Converter
</p>
<p align="left" mode="nowrap">
<table align="left" columns="2">
<tr> <td><a href="CurrencyScript1.wmls #GetUSDollar()" title="Edit">US Dollars:</a></td> <td>$USDollar</td> </tr>
<tr> <td><a href="CurrencyScript1.wmls #GetEuro()" title="Edit">Euro:</a></td> <td>$Euro</td> </tr>
<tr> <td><a href="CurrencyScript2.wmls #GetUKPound()" title="Edit">UK Pounds:</a></td> <td>$UKPound</td> </tr>
<tr> <td><a href="CurrencyScript2.wmls #GetJapanYen()" title="Edit">Japan Yen:</a></td> <td>$JapanYen</td> </tr>
</table>
</p>
</card>
</wml>
Как и во всех WML-страницах, первые два элемента рассматриваемой WML-страницы сообщают WAP-браузерам (а также программистам) версию WAP-спецификации поддерживаемой приложением. В данном случае WML-страницасовместима с XML 1.0 и описанием типа документа (DTD) версии 1.1, разработанным ассоциацией WAP Forum
Любая WML-страница, размещаемая после информации о версии, начинается стега <WML>. В конце каждой WML-страницы должен находиться соответствующийтег </WML>, который завершает элементы WML-страницы, Теги <HEAD> и </HEAD>,располагающиеся после тега <WML>, позволяют указывать данные о WML-странице, включая метаданные и информацию управляющую доступом. Многиепрограммисты рассматривают метаданные как «данные о данных». Другими словами, метаданные в нашем примере, считываемые и обрабатываемые браузером,сообщают браузеру, что надо делать с данными карт.
Элемент <meta> позволяет определять для WML- страницы метаинформацию. Внашем случае параметр http-equiv=Cache-Control сообщает WAP-браузеру, чтоданная часть метаинформации относится к системе кэширования памяти. Аналогично, параметр content=max-age=0 сообщает браузеру, что максимальное время, в течение которого должно выполняться кэширование WML-страницы, равнорулю секунд; то есть, браузер должен не запоминать, а повторно загружать данные с сервера каждый раз, когда поступает запрос. Для данной книги нулевоезначение было выбрано, чтобы помочь читателю в разработке программы. Привыборе нулевого значения каждый раз, когда происходит изменение, это изменение передается на телефон. В реально эксплуатируемом приложении статическое меню, подобное рассматриваемому здесь, по-видимому, должно использовать интервал хранения, установленный по умолчанию, равным 30 дням. Наконец, параметр forua="true" определяет, что данное значение Cache-Controlпредназначено для телефона и не должно удаляться каким-либо промежуточнымагентом.
Затем приложение создает таблицу, элементы которой указывают на функции вWMLScript-файлах. Так как многие WML-браузеры накладывают ограничение намаксимальный размер WML-страницы, приложение размещает функции в двухотдельных файлах. В частности, функции выводят приглашение на ввод суммыденег в долларах, фунтах, йенах или евро. Затем, основываясь на введенныхпользователем данных, WMLScript преобразует указанную сумму денег в другиевалюты и присваивает полученные результаты переменным $USDollar, $Euro,$UKPound и $ JapanYen, которые потом приложение отображает в таблице.