Февраль 5, 2006
Использование библиотек WMLScript
Так или иначе, если разработчик хочет сделать что-то стоящее в WMLScript , ему прийдётся использовать библиотеки, встроенные в спецификацию WAP 1.1
В WAP 1.1 встроено шесть стандартных библиотек, таких как преобразование булевских, целых и обычных переменных (LANG); операции с плавающей точкой (FLOAT); операции со строками (STRING); манипуляции с абсолютными и относительными URL (URL); взаимодействие с WML броузером (WMLBrowser) и пара основных функций интерфейса пользователя (DIALOGS).
Далее надо уяснить несколько важных концепций на примере игры "magic square" , в которой игрок помещает целые числа в квадратную матрицу, следя за тем, чтобы сумма чисел в столбцах равнялась сумме в строках. Итак, создадим WML документ и назовём его magic.wml. Он будет содержать весь интерфейс пользователя и собственно логику игры. А так же создадим второй файл magic.wmls, в котором будут содержаться все вычисления.
Для начала мы должны описать взаимодействие между основными элементами пользовательского интерфейса и функциями WMLScript. ( ПОМНИТЕ: WML и библиотечные функции WMLScript чувствителены к регистру ). Вызывая функцию скрипта из WML документа, Вы можете влиять на контекст документа прямо из функции посредством стандартных библиотек WML браузера. Давайте создадим дэку (card deck) , которая сперва будет спрашивать у игрока позицию и значение целого числа, которое будет помещено в массив, который будет представлять одну строку игрового поля, а затем будет вызывать функцию, для того, чтобы положить этот элемент в массив. Обратите внимание, что когда игрок нажмёт кнопку "OK", чтобы ввести значение, то наша дэка вызовет функцию FormRow , находящуюся в "./magic.wmls". Пример кода дэки, вызывающей функцию:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN"
"http://www.phone.com/dtd/wml11.dtd" >
<!-- WMLScript / Deck Interaction Example -->
<wml>
<card id="start">
<do type="accept" label="Start">
<go href="#GetPosition">
<setvar name="col" value="" />
<setvar name="value" value="" />
<setvar name="row1" value="1,2,3,4,5" />
<setvar name="disrow1" value="> 0 0 0 0| 0" />
</go>
</do>
<p>
Welcome to the data entry example. Press "start".
</p>
</card>
<card id="GetPosition">
<do type="accept" label="OK">
<go href="#GetValue"/>
</do>
<p>
Column (1 - 4):
<input name="col" format="N"/>
</p>
</card>
<card id="GetValue">
<do type="accept" label="OK">
<go href="./magic.wmls#FormRow()" />
</do>
<p>
Value (1 - 100):
<input name="value" format="*N"/>
</p>
</card>
<card id="DisplayResult">
<do type="accept" label="OK">
<go href="#GetPosition">
<setvar name="row" value="" />
<setvar name="col" value="" />
<setvar name="value" value="" />
</go>
</do>
<p>
$disrow1 <br/>
</p>
</card>
</wml>
Теперь нам нужно создать собственно саму функцию. Файл magic.wmls должен находиться в той же директории, что и основной magic.wml. Объявляем в magic.wmls функцию FormRow типа external. Как раз из этой функции мы и будем взаимодействовать с WML дэкой посредствам библиотеки WMLBrouser. Библиотека позволяет нам получать и устанавливать значения переменных в WML документе прямо из функции.
Следующий модуль объявляет внешнюю функцию, которая получает переменные из дэки (в нашем случае magic.wml), устанавливает переменную для дэки дисплея , указывая на отоброжаемую на дисплее дэку, и затем обновляет дисплей пользователя. Код модуля:
/**************************************************
FormRow
This function takes one new value/coordinate pair and
inserts it in its proper line.
**************************************************/
extern function FormRow () {
var col = WMLBrowser.getVar ("col");
var val = WMLBrowser.getVar ("value");
var row1vals = WMLBrowser.getVar ("row1");
var localdisrow;
var localrowvals;
WMLBrowser.setVar ("disrow1", "You entered col " + col + " and value " + val );
WMLBrowser.go ( "magic.wml#DisplayResult" );
WMLBrowser.refresh();
}
Обратите внимание, что операторы в WML дэке - все в нижнем регистре:
<setvar name="col" value />
Присваивать значение переменной через WMLBrouser нужно следующим образом:
WMLBrowser.setVar("col", "");
Теперь , когда мы увидели основные взаимодействия, давайте добавим к функции манипулирование с строками. Спецификация WMLScript включает библиотеку String которая, среди других особенностей, позволяет Вам обрабатывать переменную как одномерный массив строки. Всё, что Вам надо сделать - это обозначить текстовый разделитель, чтобы выводить строку на дисплей в форматированном виде.
В конечном счёте, нам нужно вставить значение, введённое игроком, в массив, и при том, чтобы в массиве это значение содержалой именно в той позиции, значение которой задал игрок. Следующий кусок кода показывает - как мы будем вычислять индекс в массиве и помещать туда нужное значение. Пока мы пропустим преобразование в колонки, и просто будем вносить значения в массив элементов, начиная с нулевого значения.
/**************************************************
FormRow
This function takes one new value/coordinate pair and
inserts it in its proper line.
**************************************************/
extern function FormRow () {
var col = WMLBrowser.getVar ("col");
var val = WMLBrowser.getVar ("value");
var row1vals = WMLBrowser.getVar ("row1");
var localdisrow;
var localrowvals;
row1vals = String.insertAt(row1vals, val, 0, ",");
WMLBrowser.setVar ("disrow1", row1vals);
WMLBrowser.setVar ("row1", row1vals);
WMLBrowser.go ( "magic.wml#DisplayResult" );
WMLBrowser.refresh();
}
Разместил:
Источник: Kevin Sharp