О MIDletPascal

MIDletPascal - паскалеподобный язык программирования, предназначенный для разработки мобильных приложений. Компилятор MIDletPascal транслирует исходный текст на Паскале в байт-код Java™ micro edition (J2ME). Программы, созданные в MIDletPascal, могут исполняться любым мобильным устройством (таким, как мобильный телефон), поддерживающим платформы MIDP 1.0 и CLDC 1.0.

Разработка мобильных приложений с использованием MIDletPascal - простой и быстрый процесс. Если вы уже знакомы с Паскалем, Delphi или Kylix, вы можете начать разработку собственного мобильного приложения в считанные минуты.

MIDletPascal поставляется с собственной, дружественной к пользователю средой разработки (IDE) для ОС Windows (98/2000/XP). Среда имеет встроенный компилятор, инспектор байт-кода Java и обеспечивает построение архива JAR, так что компиляция и компоновка мидлетов проста, как нажатие на кнопку.

Поскольку MIDletPascal создаёт непосредственно низкоуровневой байт-код Java, полученные мидлеты имеют небольшой размер и эффективное время исполнения. Аналогичные средства, которые можно найти в Internet, создают промежуточный код и компонуют его в архив JAR вместе с интерпретатором; при подобном подходе получаются большие и медленно исполняющиеся JAR-файлы. MIDletPascal создаёт непосредственно байт-код Java, так что вам не нужно иметь установленный на вашем компьютере компилятор Java, а компиляция с помощью MIDletPascal происходит очень быстро.


Введение в язык MIDletPascal

Написание программ в MIDletPascal - очень простое дело. Всё что вам нужно знать - это немного Паскаля и способ, которым MIDletPascal рисует на экране.

MIDletPascal имеет различные функции и процедуры для рисования на экране устройства (также называемом 'canvas'), такие как drawText, drawLine, fillRect и т.д. Важно понимать,что все эти процедуры фактически не рисуют на экране устройства; вместо этого, отрисовка происходит в буфер, расположенный в памяти устройства. Так что, если у вас есть программа:

begin
  drawText('Hello world', 0, 0);
end.

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

begin
  drawText('Hello world', 0, 0);
  repaint;
end.

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

Неправильно
Правильно

begin
drawLine(0, 0, 25, 25);
repaint;
drawLine(0, 25, 0, 25);
repaint;
end.

begin
drawLine(0, 0, 25, 25);
drawLine(0, 25, 0, 25);
repaint;
end.

Если вы введете любой из примеров выше в MIDletPascal, откомпилируете и запустите на своём мобильном устройстве, вам может показаться, что программы не запускались. Причина проста - программы закончили работу почти в тот же момент, когда были запущены. Если вы хотите написать программу, которая будет ждать две секунды после окончания отрисовки, используйте функцию delay:

begin
  drawText('Hello world', 0, 0);
  repaint;
  delay(2000); { 2000 ms = 2 sec }
end.

Вы также можете захотеть, чтобы программа ждала, пока пользователь нажмёт кнопку:

begin
  drawText('Hello world', 0, 0);
  repaint;

  { ждём нажатия клавиши }
  while getKeyClicked = KE_NONE do
  begin end;
end.

Для получения дополнительной информации используйте описания функций getKeyClicked, getKeyPressed и keyToAction.

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

Теперь вы готовы начать писать свои собственные мидлеты. Мы рекомендуем вам прочесть последующие главы данного руководства. Также, хорошей идеей будет посетить страницу http://www.midletpascal.com/midlets.php и загрузить оттуда исходный код и скомпилированные версии мидлетов-примеров.


Создание пользовательского интерфейса

Графический дисплей (canvas) является хорошим средством, если вам необходимо отображать графику или анимацию на экране устройства. Но иногда, мидлет должен попросить пользователя ввести какие-либо данные (имя, любимое животное и т.д.). Подобного тяжело добиться, рисуя на графическом экране и ожидая нажатий на клавиатуру. Для построения пользовательского интерфейса мидлет может использовать следующие элементы: форма (form), текстовое поле (textbox), предупреждение (alert) и меню (menu).

Форма, в противовес canvas может содержать такие элементы, как текстовое поле, группу выбора (choice group) или "градусник" (gauge). Чтобы переключиться с графического дисплея (canvas), используемого по умолчанию, в режим отображения форм, используйте процедуру showForm. Для обратного переключения, используйте showCanvas. Для отображения предупреждения (или сообщения) в отдельном окне, используйте процедуру showAlert. С помощью процедуры showTextBox можно отобразить большое поле для ввода текста, на весь экран устройства. Меню (showMenu), также занимающее весь экран, позволяет пользователю выбрать какое-либо значение из списка. Команды (Commands) используются для обработки нажатий на функциональные клавиши (push-buttons). Команды (Commands) могут быть добавлены к графическому дисплею, форме, текстовому полю, предупреждению или меню.

Дисплей (Canvas) | Форма с элементами
Меню (с командой) | Текстовое окно (Textbox) (с командой)
Предупреждение (Alert) (с командой) |

Взглянём на следующий пример:

  { Программа запрашивает имя пользователя и отображает его красным цветом }
  var okCommand:command;
      nameField:integer;
      userName:string;
  begin
    { Создание формы на экране }
    okCommand := createCommand('OK', CM_OK, 1);
    showForm;
    addCommand(okCommand);
    nameField := formAddTextField('Введите ваше имя', '', 20, TF_ANY);

    { ожидание, пока пользователь нажмёт кнопку OK }
    while (getClickedCommand <> okCommand) do
      delay(100);

    userName := formGetText(nameField);

    { отображение имени пользователя на дисплее красным цветом }
    showCanvas;
    setColor(255, 0, 0);
    drawText(userName, 5, 5);
    repaint;
    delay(2000);
  end.


Типы данных

Типы данных MIDletPascal можно разделить на две категории: простые и комплексные типы данных.

Простые (примитивные) типы:

· boolean
· char
· integer
· real
· string
· image
· command
· recordStore
· http
· resource

Комплексные типы:

· record
· array


Тип boolean

Логический тип (boolean) может принимать два значения: true (правда) или false (ложь). Следующие операторы могут быть использованы с переменными данного типа:

· Операторы сравнения: =, <>
· Логические операторы: or, xor
· Логический оператор and
· Логический оператор not

Оператор not имеет наивысший приоритет, операторы =, < и > - наинизший.

К примеру, следующее выражение равно true:

((true and false) = false)


Тип char

Символьный тип char представляет единичный символ. Следующие операторы могут быть использованы с переменными данного типа:

· Операторы сравнения: =, <>, <, >, <=, >= позволяют сравнивать значения ASCII двух символов
· Оператор конкатенации (сложения): + добавляет второй символ к первому символу и возвращает их в виде строки.

Например, следующее выражение вернёт результат false:

('a' = 'A')

Чтобы получить код ASCII символа, используйте функцию ord. Чтобы получить символ по его коду ASCII, используйте функцию chr.


Тип integer

Целочисленный тип (integer) представляет любое целое число между -2,147,483,647 и 2,147,483,647. Следующие операторы применимы с целочисленным типом:

· Операторы сравнения: =, <>, <, >, <=, >=
· Операторы сложения/вычитания: +, -
· Операторы умножения/деления: *, /, div, mod. Нет никакой разницы между "/" и div. mod возвращает остаток от целочисленного деления.


Тип real

Вещественный тип (real) представляет нецелые числа (десятичные дроби). Мобильные устройства не имеют аппаратной поддержки операций с реальными числами, потому MIDletPascal реализует программную эмуляцию. В силу этого, операции с реальными числами очень медленны - вы должны понимать, что приложения со сложной математикой могут исполняться очень долго. Использование реальных чисел также увеличивает результирующий размер мидлета: он может "подрасти" до 5 килобайт дополнительно.

Следующие операторы могут использоваться реальными числами:

· Операторы сравнения: =, <>, <, >, <=, >=
· Операторы сложения/вычитания: +, -
· Операторы умножения/деления: *, /

Также MIDletPascal предоставляет около 20 функций для работы с реальными числами и предопределенную константу 'pi'.


Тип string

Строковый тип (string) используется для представления текста и содержит последовательности символов. В отличии от строк в других диалектах Паскаля, строки в MIDletPascal не являются массивами символов. MIDletPascal имеет несколько процедур и функций для работы со строками. Следующие операторы применимы к данному типу:

· Операторы сравнения: =, <> (сравнение строк, чувствительное к регистру)
· Оператор сложения: + (вторым операндом может быть строка, целое число, символ или логический тип)

Взглянём на пример:

  var text: string;
  begin
    text := 'It is now ' + getHour(getCurrentTime) + ' o''clock ';
    drawText(text, 0, 0);
    repaint;
    delay(2000);
  end.

Чтобы добавить в строку символ "кавычки" ('), вводите его в строке два раза подряд и в этом случае MIDletPascal не проинтерпретирует его как признак окончания строки.


Тип image

Графические изображения представлены типом image. Функция loadImage загружает изображение из файла-ресурса в переменную данного типа.


Тип command

Мидлеты J2ME не имеют кнопок в привычном виде как, например, приложения Windows. Вместо этого, пользователь может воспользоваться так называемыми "командами" (commands) для обеспечения "кнопочного" функционала.

Команды могут быть добавлены на форму или графический экран. Когда форма отображается на экране устройства (вызовом процедуры showForm), добавленные команды будут вставлены в форму. Если экран переключён в графическое представление (showCanvas), команды, связанные с формой будут убраны с экрана, вместо них появятся команды, ассоциированные с графическим дисплеем. Посмотрим на следующий пример:

  var formCommand, canvasCommand: command;
  begin
    formCommand := createCommand('Show canvas', CM_SCREEN, 1);
    canvasCommand := createCommand('Show form', CM_SCREEN, 1);

    { add the canvas form onto the canvas (the canvas is displayed by default) }
    addCommand(canvasCommand);

    { switch to form display }
    showForm;

    { add the form command to the form display }
    addCommand(formCommand);

    { forever switch between the canvas and the form display }
    while true do
    begin
      if getClickedCommand = formCommand then
        showCanvas;
      if getClickedCommand = canvasCommand then
        showForm;
    end;
  end.

Устройства, не имеющие больших дисплеев, не все команды будут отображены на экране. Устройство само решает, какие (если есть) команды отобразить. Другие команды (с меньшим приоритетом) будут сгруппированы посредством своего рода выпадающего меню, которое доступно после нажатия соответствующих кнопок на клавиатуре устройства.

Некоторые устройства (например, мобильные телефоны Motorola) не отображают команду сразу после вызова addCommand; они будут "дожидаться" вызова процедуры repaint.


Тип recordStore

Хранилище на мобильных телефонах аналогично файлам на компьютерах: приложения могут сохранять некие данные в хранилище и впоследствии получать обратно сохранённые данные. Как и файлы, хранилища идентифицируются по имени. Их нельзя группировать внутри каталогово и каждый установленный мидлет имеет доступ только к своим собственным хранилищам. В отличии от файлов, где данные сохраняются последовательно, хранилище больше напоминает массив, где каждая запись имеет свой собственный индекс.

  var rs: recordStore;
      index: integer;
      name: string;
  begin
    // Записываем некие данные в хранилище
    rs := openRecordStore('names');
    index := addRecordStoreEntry(rs, 'John Smith');
    closeRecordStore(rs);

    // Считываем данные
    rs := openRecordStore('names');
    name := readRecordStoreEntry(rs, index);
    closeRecordStore(rs);
  end.

См. также: openRecordStore, closeRecordStore, deleteRecordStore, addRecordStoreEntry, readRecordStoreEntry, deleteRecordStoreEntry, getRecordStoreSize


Тип http

MIDletPascal предоставляет базовые вазможности для работы с HTTP. Соединения HTTP идентифицируются переменными соответствующего типа, 'http'. У HTTP следующий жизненный цикл:

· открытие подключения к удалённому web-серверу
· установка метода запроса http
· добавление полей-заголовков запроса (необязательно)
· добавление данных в тело запроса (только в случае, если запрос имеет тип POST)
· отправка запроса и ожидание ответа от сервера
· получение желаемых полей-заголовков из ответа
· получение данных ответа
· закрытие соединения

Следующий пример демонстрирует возможности соединения по HTTP:

  var conn: http;
      htmlBody: string;
      contentType: string;
  begin
    if not openHttp(conn, 'http://www.google.com') then halt;
    setHttpMethod(conn, GET);
    addHttpHeader(conn, 'User-agent', 'MIDletPascal browser');
    if sendHttpMessage(conn) <> 200 then halt;
    htmlBody := getHttpResponse(conn);
    contentType := getHttpHeader(conn, 'Content-type');
    closeHttp(conn);
  end.

Встроенный эмулятор не поддерживает соединения по HTTP. Для тестирования HTTP без телефона рекомендуется использовать эмулятор Wireless Toolkit от Sun.


Тип resource

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

· openResource
· resourceAvailable
· closeResource
· readByte
· readLine

Пример:

  var res   : resource;
      byte  : integer;
      line  : string;
      index : integer;
  begin
      res := openResource('/data.txt');

      if (resourceAvailable(res)) then
      begin
          byte := readByte(res);
     line := readLine(res);

          closeResource(res);
      end;

      showForm;
      index := formAddString('Byte is: ' + chr(byte));
      index := formAddString('Line is: ' + line);
      delay(1000);
  end.


Комбинированный тип (record)

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

  type heroType = record
     positionX, positionY: integer;
     health: integer;
  end;

Чтобы создать переменную свежезаданного типа, используйте обычную формулировку в секции 'var':

  var hero: heroType;

Также вы можете использовать созданный тип в качестве параметра, при описании процедур и функций:

  function isHeroDead(hero: heroType): boolean;
  begin
  if (hero.health <= 0) then
      isHeroDead := true;
    else
      isHeroDead := false;
  end;

Новый тип может быть определен непосредственно в секции 'var':

  var hero: record
              positionX, positionY: integer;
              health: integer;
            end;

Чтобы получить доступ к отдельным элементам комбинированного типа, используйте оператор "." (точка):

  ...
  { передвигаем персонажа вправо }
  hero.positionX := hero.positionX + 1;
  ...

Нельзя копировать впрямую из переменной в переменную данного типа:

  var
    a, b: record
           x: integer;
    end;
  begin
    ...
    a := b; { это - неправильно }
    ...
    a.x := b.x; { нужно копировать каждый элемент комбинированного типа }
  end.


Массивы (arrays)

Массивы определяются следующим образом:

  type chessFieldType = array[1..8, 1..8] of integer;

Этим выражением был задан новый тип - массив, размером 8 х 8 полей целочисленного типа. Можно задавать массивы в секции 'var':

  type
    chessFieldType = array[1..8, 1..8] of integer;
  var
    chessField: chessFieldType;

то же самое, что:

  var
    chessField: array[1..8, 1..8] of integer;

Следующий пример считает количество пустых клеток на шахматной доске:

  type chessFieldType = array[1..8, 1..8] of integer;
  var chessField: chessFieldType;
     i, j, count: integer;
  begin
    ...
    { Инициализация шахматной доски: заполнение некоторых клеток фигурами }
    ...
    count := 0;
    for i:=1 to 8 do
      for j:=1 to 8 do
        if chessField[i, j] = 0 then count := count + 1;
  end.

MIDletPascal поддерживает массивы любой размерности. Вы можете использовать 1-, 2-х, или даже 10-размерные массивы (которые, правда, потребляют очень много памяти и нет уверенности в том, что они реально полезны).

При использовании массивов необходимо остерегаться попыток доступа к запредельным элементам массива. Например, следующий код вызовет падение мидлета:

  var a:array[1..5] of integer;
  begin
    a[7] := 10; { a[7] не существует и здесь мидлет упадёт }
  end.


Структура программы

Структура программы в общем представлена здесь:

program programName;
Объявления констант;
Объявления типов;
Объявления переменных;
Объявления процедур и функций;
begin
Операторы;
end.

MIDletPascal не чувствителен к регистру и не имеет большого значения, напишете ли вы BEGIN или BeGiN. Комментарии можно оставлять, обрамляя их символами '{' и '}', например:

  { это комментарий }

или между '(*' и '*)':

  (* это тоже комментарий *)

Если комментарий имеет незначительную длину и умещается в одну строку, вы можете использовать двойной символ "/", предваряющий комментарий:

  ...
  var
    bullets: integer; // Количество патронов
  begin
  // Начало игры


Объявления констант

Константа определяет значение, закреплённое за именем. Посмотрим на пример:

  program constantDeclaration;
  const
    minutesInHour = 60;
    hoursInDay = 24;
    famousQuote = 'Быть или не быть';
  begin
  end.


Объявления типов

Вы можете объявлять собственные типы данных. Чтобы делать это, используйте ключевое слово type:

  program myOwnTypes;
  type
    number = integer;
    chessFieldType = array[1..8, 1..8] of integer;
    chessElementType = record
      positionRow, positionCol: integer;
      elementType: integer;
    end;
  var
    element: chessElementType;
    field: chessFieldType;
    numberOfPlayers: number;
  begin
  end.


Объявления переменных

Чтобы объявить переменную, используйте ключевое слово var:

  program variableDeclarations;
  var
    index: integer;
    field: array[1..15] of integer;
  begin
    for index := 1 to 15 do
      field[index] := 10;
  end.


Объявления процедур и функций

Функции, это подпрограммы, возвращающие какое-либо значение. Процедуры, это подпрограммы, которые ничего не возвращают.

Следующие примеры показывают объявление двух процедур; одна из них не имеет аргументов, а другая процедура получает 2 аргумента:

  program procedureSample;
  var n: integer; { эта переменная видима в главном
                    блоке программы и во всех
                    процедурах и функциях }

  procedure noArgs;
  begin
    n := 5;
  end;

  procedure twoArgs(a: integer; b: string);
  var len: integer; { эта переменная доступна только
                      внутри процедуры и она
                      переинициализируется при каждом
                      вызове процедуры }
  begin
    len := length(b);
    n := a + len;
  end;

  begin
    noArgs; { вызываем первую процедуру }
    twoArgs(n, 'Some string'); { вызываем вторую процедуру }
  end.

Функции во всём идентичны процедурам, за исключением того, что они могут возвращать значения. Следующий пример иллюстрирует использование функций в MIDletPascal:

  program functionSample;
  var
    result: integer;

  { эта простая функция всегда возвращает "5" }
  function returnFive: integer;
  begin
    returnFive := 5;
  end;

  function multiply(a, b: integer): integer;
  begin
    multiply := a * b;
  end;

  begin
    result := multiply(2, returnFive); { вызываем функцию multiply
                                         и в качестве второго параметра
                                         используем другую функцию }
  end.

Также позволительна рекурсия:

  program recursionSample;
  var
    factorielOfFive: integer;

  function factoriel(n: integer): integer;
  begin
    if n = 1 then
      factoriel := 1;
    else
      factoriel := n * factoriel(n-1);
  end;

  begin
    factorielOfFive := factoriel(5);
  end.

Отличия от стандартного Паскаля:

· процедуры и функции не могут быть вложенными, т.е. одна функция не может быть объявлена внутри другой функции
· не поддерживаются объявления параметров var

MIDletPascal позволяет использовать опережающие объявления (forward declarations). Рассмотрим пример:

  procedure a (x: integer);
  begin
    ...
    b(x);
    ...
  end;

  procedure b(y: integer);
  begin
  ...
    a(y);
  ...
  end;

  begin
    a(5);
  end.

Процедура 'a' вызывает процедуру 'b', а процедура 'b' вызывает процедуру 'a'. Когда процедура 'b' вызывает процедуру 'a', всё в порядке, потому что процедура 'a' объявлена до процедуры 'b'. Но компилятор выдаст сообщение об ошибке в процедуре 'a', потому что она вызывает ещё не объявленную процедуру. Чтобы решить данную проблему, необходимо объявить процедуру 'b' следующим образом:

  procedure b(y:integer); forward; { опережающее объявление показывает
                                     компилятору, что процедура 'b' будет
                                     описана где-то в коде программы }

  procedure a (x: integer);
  begin
    ...
    b(x);
    ...
  end;

  procedure b(y: integer);
  begin
    ...
    a(y);
    ...
  end;

  begin
    a(5);
  end.


Операторы

Оператор MIDletPascal может быть следующим:

· цикл for
· цикл while
· цикл repeat .. until
· оператор break
· оператор if .. then .. else
· оператор присваивания
· вызов процедуры/функции

Цикл for

Цикл for имеет следующий синтаксис:

for loopIndex := НачальноеЗначение to КонечноеЗначение do
begin
  Операторы;
end;

Для того, чтобы создать цикл с обратным (уменьшающимся) отсчётом, необходимо вместо to использовать downto.

Следующий пример вычисляет сумму всех цифр от 1 до 10:

  ...
  for i:= 1 to 10 do
  begin
    sum := sum + i;
  end;
  ...

Если внутри цикла только один оператор, ключевые слова begin и end можно опустить.

Цикл while

Цикл while имеет следующий синтаксис:

  while Условие do
  begin
    Операторы;
  end;

Например, чтобы подождать нажатия кнопки пользователем, мы можем написать:

  ...
  while (getKeyClicked = KE_NONE) do
  begin
    delay(100);
  end;
  ...

Если внутри цикла только один оператор, ключевые слова begin и end можно опустить.

Цикл repeat .. until

Цикл repeat .. until имеет следующий синтаксис:

repeat
  Операторы;
until УсловиеОкончания;

Чтобы подождать нажатия кнопки пользователем, мы можем написать:

  ...
  repeat
    delay(100);
  until (getKeyClicked <> KE_NONE);
  ...

Оператор break

Оператор break используется для прерывания циклов for, while и repeat.

  ...
  repeat
    for i := 1 to 10 do
    begin
      if doSomething(i) = -1 then break; // выходим из цикла for
    end;

  until getClickedCommand <> emptyCommand;
  ...

Оператор if .. then .. else.

Оператор if .. then .. else имеет следующий синтаксис:

if Условие then
begin
  Операторы; { выполняется, если Условие истинно }
end
[
else
begin
  Операторы; { выполняется, если Условие ложно }
end;
]

ветвь else может быть опущена. Если внутри ветви используется один оператор, ключевые слова begin и end могут быть опущены.

Оператор присваивания

Оператор присваивания используется для присваивания значений переменным и имеет следующий синтаксис:

  переменная := значение;

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


drawArc

procedure drawArc(x, y, width, height, startAngle, arcAngle: integer);

Процедура отрисовывает дугу, вписанную в указанный прямоугольник. Дуга начинается с градуса, указанного в параметре 'startAngle' и имеет длительность 'arcAngle' градусов. Угол 0 градусов равен 3-м часам на циферблате. Угол 90 градусов - 12 часов на циферблате.

  begin
    drawArc(0, 0, getWidth, getHeight, 0, 90);
    repaint;
    delay(1000);
  end.

См. также: getWidth, getHeight, repaint


drawEllipse

procedure drawEllipse(x, y, width, height: integer);

Рисует эллипс, вписанный в указанный прямоугольник.

  begin
    drawEllipse(0, 0, getWidth, getHeight);
    repaint;
    delay(1000);
  end.

См. также: fillEllipse, getWidth, getHeight, setColor, repaint


drawImage

procedure drawImage(img: image; x, y: integer);

Рисует изображение в буфер экрана. 'X' и 'Y' являются координатами верхнего левого угла изображения.

  begin
    drawImage(loadImage('/logo.png'), 0, 0);
    repaint;
    delay(1000);
  end.

См. также: loadImage, repaint


drawLine

procedure drawLine(x1, y1, x2, y2: integer);

Рисует линию от точки ('x1', 'y1') до точки ('x2', 'y2').

  begin
    drawLine(10, 15, 25, 35);
    repaint;
    delay(1000);
  end.

См. также: setColor, repaint


drawRect

procedure drawRect(x, y, width, height: integer);

Рисует контур прямоугольника заданного положения и размера.

  begin
    drawRect(5, 5, 20, 20);
    repaint;
    delay(1000);
  end.

См. также: fillRect, setColor, repaint


drawRoundRect

procedure drawRoundRect(x, y, width, height, arcWidth, arcHeight: integer);

Рисует контур прямоугольника со скруглёнными краями заданного положения и размера.

  begin
    drawRoundRect(5, 5, 20, 20, 2, 2);
    repaint;
    delay(1000);
  end.

См. также: fillRoundRect, setColor, repaint


drawText

procedure drawText(text: string, xPos, yPos: integer);

Отображает текст 'text' в буфер экрана. 'xPos' и 'yPos' являются координатами верхнего левого угла прямоугольника, в который вписан текст.

  begin
    setColor(255, 0, 0);
    drawText('Hello world', 0, 0);
    repaint;
    delay(1000);
  end.

См. также: getStringWidth, getStringHeight, setFont, setDefaultFont, setColor, repaint


fillEllipse

procedure fillEllipse(x, y, width, height: integer);

Рисует закрашенный эллипс, вписанный в указанный прямоугольник.

  begin
    fillEllipse(0, 0, getWidth, getHeight);
    repaint;
    delay(1000);
  end.

См. также: drawEllipse, getWidth, getHeight, setColor, repaint


fillRect

procedure fillRect(x, y, width, height: integer);

Рисует закрашенный треугольник.

  begin
    fillRect(5, 5, 20, 20);
    repaint;
    delay(1000);
  end.

См. также: drawRect, setColor, repaint


fillRoundRect

procedure fillRoundRect(x, y, width, height, arcWidth, arcHeight: integer);

Рисует закрашенный прямоугольник со скруглёнными углами.

  begin
    fillRoundRect(5, 5, 20, 20, 2, 2);
    repaint;
    delay(1000);
  end.

См. также: drawRoundRect, setColor, repaint


getColorBlue

function getColorBlue: integer;

Функция возвращает значение голубого компонента текущего цвета.

  begin
    setColor(0, 0, 127);
    if getColorBlue <> 127 then
    begin
      drawText('This should never happen', 0, 0);
      repaint;
    end;
    delay(1000);
  end.

См. также: setColor, getColorRed, getColorGreen


getColorGreen

function getColorGreen: integer;

Функция возвращает значение зелёного компонента текущего цвета.

  begin
    setColor(0, 127, 0);
    if getColorGreen <> 0 then
    begin
      drawText('This should never happen', 0, 0);
      repaint;
    end;
    delay(1000);
  end.

См. также: setColor, getColorRed, getColorBlue


getColorRed

function getColorRed: integer;

Функция возвращает значение красного компонента текущего цвета.

  begin
    setColor(127, 0, 0);
    if getColorRed <> 127 then
    begin
      drawText('This should never happen', 0, 0);
      repaint;
    end;
    delay(1000);
  end.

См. также: setColor, getColorGreen, getColorBlue


getColorsNum

function getColorsNum:integer;

Возвращает количество цветов, которые может отображать устройство.

См. также: isColorDisplay


getHeight

function getHeight: integer;

Возвращает высоту графического экрана (в пикселях).

  begin
    drawEllipse(0, 0, getWidth, getHeight);
    repaint;
    delay(1000);
  end.

См. также: getWidth


getImageHeight

function getImageHeight(img: image): integer;

Возвращает высоту указанного изображения в пикселях.

См. также: loadImage, getImageWidth, drawImage


getImageWidth

function getImageWidth(img: image): integer;

Возвращает ширину указанного изображения в пикселях.

См. также: loadImage, getImageHeight, drawImage


getStringHeight

function getStringHeight(text: string): integer;

Возвращает высоту (в пикселях) отображаемого текущим шрифтом текста 'text'.

  var text: string;
    height: integer;
  begin
    text   := 'Text to display';
    height := getStringHeight(text);
    drawText(text, 0, (getHeight - height)/2);
    repaint;
    delay(1000);
  end.

См. также: getStringWidth, getWidth, getHeight, repaint


getStringWidth

function getStringWidth(text: string): integer;

Возвращает ширину (в пикселях) отображаемого текущим шрифтом текста 'text'.

  var text: string;
     width: integer;
  begin
    text  := 'Text to display';
    width := getStringWidth(text);
    drawText(text, (getWidth - width)/2, 0);
    repaint;
    delay(1000);
  end.

См. также: getStringHeight, getWidth, getHeight, repaint


getWidth

function getWidth: integer;

Возвращает ширину графического экрана (в пикселях).

  begin
    drawEllipse(0, 0, getWidth, getHeight);
    repaint;
    delay(1000);
  end.

См. также: getHeight


isColorDisplay

function isColorDisplay:boolean;

Возвращает true в случае, если устройство имеет цветной дисплей. В противном случае, возвращает false.

См. также: getColorsNum


loadImage

function loadImage(resource: string): image;

Загружает изображение из ресурса и возвращает объект типа 'image'. Для доступа к файлу внутри JAR-архива, значение параметра 'resource' должно начинаться с символа "/". Если указанное значение некорректно, мидлет даст сбой.

Файлы добавляются как ресурсы к проекту MIDletPascal.

  begin
    drawImage(loadImage('/icon.png'), 0, 0);
    repaint;
    delay(1000); { подождать 1 секунду, прежде чем мидлет завершит работу }
  end.

См. также: drawImage, getImageWidth, getImageHeight


plot

procedure plot(x, y:integer);

Ставит точку текущего цвета по заданным координатам.

  begin
    setColor(255, 0, 0);
    plot(5, 10);
    repaint;
    delay(1000);
  end.

См. также: setColor, repaint


repaint

procedure repaint;

Перемещает содержимое экранного буфера в памяти на дисплей. Все функции рисования (такие как drawLine, drawText, fillRect и др.) не рисуют непосредственно на дисплей устройства, а используют невидимый буфер, который копируется на видимый экран процедурой repaint. Перерисовка экрана - достаточно ёмкий по времени процесс, потому рекомендуется использовать эту процедуру настолько редко, насколько это возможно.

  begin
    drawText('Hello world', 0, 0);
    repaint;
    delay(1000);
  end.


setClip

procedure setClip(int x, int y, int width, int height);

Устанавливает регион, на который в дальнейшем влияют процедуры рисования.

  begin
    // Рисуем эллипс.
    setColor(0, 0, 0);
    fillEllipse(0, 0, getWidth, getHeight);
    repaint;
    delay(2000);

    // Рисуем эллипс, но перед этим вызываем setClip
    setClip(10, 10, 15, 25);
    fillEllipse(0, 0, getWidth, getHeight);
    repaint;
    delay(2000);
  end.


setColor

procedure setColor(red, green, blue:integer);

Устанавливает текущий цвет, которым в дальнейшем пользуются все процедуры рисования. Параметры 'red', 'green' и 'blue' могут принимать значения от 0 до 255. Например, чёрный цвет представляется как (0, 0, 0), ярко-красный - (255, 0, 0) и белый - (255, 255, 255).

  begin
    setColor(0, 0, 255); { устанавливаем ярко-голубой цвет }
    drawText('Hello world', 0, 0);
    repaint;
    delay(1000);
  end.

См. также: getColorRed, getColorGreen, getColorBlue


setDefaultFont

procedure setDefaultFont;

Устанавливает текущим шрифтом шрифт, по умолчанию используемый в устройстве. Важно заметить, что некоторые устройства используют только один шрифт и вызов setDefaultFont не оказывает никакого влияния на отображение строк в подобных устройствах.

См. также: setFont


setFont

procedure setFont(fontFace, fontStyle, fontSize);

Устанавливает шрифт, используемый для отображения строк.

'fontFace' может принимать следующие значения:

· FONT_FACE_SYSTEM
· FONT_FACE_MONOSPACE
· FONT_FACE_PROPORTIONAL

'fontStyle' может принимать следующие значения:

· FONT_STYLE_PLAIN
· FONT_STYLE_BOLD
· FONT_STYLE_ITALIC
· FONT_STYLE_UNDERLINE

Стили можно комбинировать, используя логический оператор or. Например, чтобы создать толстый подчёркнутый шрифт, используйте (FONT_STYLE_BOLD or FONT_STYLE_UNDERLINE) в качестве значения для стиля шрифта.

Размер шрифта может быть определен с помощью следующих констант:

· FONT_SIZE_SMALL
· FONT_SIZE_MEDIUM
· FONT_SIZE_LARGE

Некоторые устройства используют только один шрифт и вызов setFont не оказывает никакого влияния на отображение строк в подобных устройствах.

  begin
    setFont(FONT_FACE_SYSTEM, FONT_STYLE_BOLD or FONT_STYLE_UNDERLINE, FONT_SIZE_LARGE);
    drawText('Hello world', 0, 0);
    repaint;
    delay(1000);
  end.

См. также: setDefaultFont, setColor, repaint


getKeyClicked

function getKeyClicked: integer;

Возвращает код последней нажатой клавиши или KE_NONE, если нажатий не было. Для стандартных клавиш существуют следующие константы:

· KE_KEY0
· KE_KEY1
· KE_KEY2
· KE_KEY3
· KE_KEY4
· KE_KEY5
· KE_KEY6
· KE_KEY7
· KE_KEY8
· KE_KEY9
· KE_STAR
· KE_POUND

  begin
    while getKeyClicked <> KE_STAR do
    begin
      delay(100);
    end;
  end.

См. также: getKeyPressed, keyToAction


getKeyPressed

function getKeyPressed: integer;

Возвращает код нажатой в данный момент клавиши или KE_NONE, если ни одна клавиша не нажата. Для стандартных клавиш существуют следующие константы:

· KE_KEY0
· KE_KEY1
· KE_KEY2
· KE_KEY3
· KE_KEY4
· KE_KEY5
· KE_KEY6
· KE_KEY7
· KE_KEY8
· KE_KEY9
· KE_STAR
· KE_POUND

  begin
  while getKeyPressed <> KE_STAR do
    begin
      delay(100);
    end;
  end.

См. также: getKeyClicked, keyToAction


keyToAction

function keyToAction(keyCode: integer): integer;

Функции getKeyClicked и getKeyPressed возвращают код нажатой клавиши. Но коды клавиш могут различаться для разных устройств. Например, одно устройство может возвращать для кнопки FIRE код 100, а другое - 120. Чтобы обойти данные разногласия, вы можете использовать функцию keyToAction, которая переводит код клавиши в условный код игрового действия. keyToAction может вернуть значения из следующего списка:

· GA_NONE
· GA_UP
· GA_DOWN
· GA_LEFT
· GA_RIGHT
· GA_FIRE
· GA_GAMEA
· GA_GAMEB
· GA_GAMEC
· GA_GAMED

  begin
  while keyToAction(getKeyClicked) <> GA_FIRE do
    begin
      delay(100);
    end;
  end.

См. также: getKeyPressed, getKeyClicked


delay

procedure delay(millis: integer);

Приостанавливает исполнение программы на указанное количество миллисекунд.

Чтобы отобразить сообщение на экране, подождать 2 секунды, а затем закрыть мидлет, используйте следующий код:

  begin
    drawText('Hello world', 0, 0);
    repaint;
    delay(2000);
  end.


getCurrentTime

function getCurrentTime: integer;

Возвращает количество секунд, прошедших с 1 января 1970 года до текущего момента. Возвращённое значение можно использовать в качестве аргумента для таких функций, как getMonth, getHour и прочих.

  var
    time: integer;
    text: string;
  begin
    time := getCurrentTime;
    text := 'Current time is ' + getHour(time);
    text := text + ':'+ getMinute(time);
    text := text + ':' + getSecond(time);
    drawText(text, 0, 0);
    repaint;
    delay(1000); { подождать 1 секунду перед завершением программы }
  end.

См. также: getYear, getMonth, getDay, getHour, getMinute, getSecond, getWeekDay, getYearDay


getDay

function getDay(time: integer): integer;

Возвращает номер дня в месяце для данного времени time (представленного в количестве секунд, прошедших с 1 января 1970 г. и получаемого с помощью функции getCurrentTime). Возвращаемое значение может быть между 1 и 31.

См. также: getCurrentTime, getYear, getMonth, getWeekDay, getYearDay


getHour

function getHour(time: integer): integer;

Возвращает номер часа в дне для данного времени time (представленного в количестве секунд, прошедших с 1 января 1970 г. и получаемого с помощью функции getCurrentTime). Возвращаемое значение может быть между 0 и 23.

  var
    time: integer;
    text: string;
  begin
    time := getCurrentTime;
    text := 'Current time is ' + getHour(time);
    text := text + ':' + getMinute(time);
    text := text + ':' + getSecond(time);
    drawText(text, 0, 0);
    repaint;
    delay(1000); { wait 1 second before MIDlet terminates }
  end.

См. также: getCurrentTime, getMinute, getSecond


getMinute

function getMinute(time: integer): integer;

Возвращает номер минуты в часе для данного времени time (представленного в количестве секунд, прошедших с 1 января 1970 г. и получаемого с помощью функции getCurrentTime). Возвращаемое значение может быть между 0 и 59.

  var
    time: integer;
    text: string;
  begin
    time := getCurrentTime;
    text := 'Current time is ' + getHour(time);
    text := text + ':' + getMinute(time);
    text := text + ':' + getSecond(time);
    drawText(text, 0, 0);
    repaint;
    delay(1000); { wait 1 second before MIDlet terminates }
  end.

См. также: getCurrentTime, getHour, getSecond


getMonth

function getMonth(time: integer): integer;

Возвращает номер месяца в году для данного времени time (представленного в количестве секунд, прошедших с 1 января 1970 г. и получаемого с помощью функции getCurrentTime). Возвращаемое значение может быть между 1 и 12.

См. также: getCurrentTime, getYear, getDay


getRelativeTimeMs

function getRelativeTimeMs: integer;

Возвращает текущее время в миллисекундах. Возвращаемое значение имеет тип integer 32-bit и может представлять только 2^32 миллисекунды, что чуть больше 48 дней. Так что, каждые 48 дней это значение сбрасывается и отсчёт начинается с нуля. Не стоит использовать эту функцию для определения текущей даты, но вполне можно создавать на её основе разного рода таймеры.

Представим себе простейшую игру (ну, Тетрис, например), где необходимо передвигать блок вниз каждую секунду. Ещё игра должна двигать блок в разные стороны, когда пользователь нажимает кнопки "влево" и "вправо" на клавиатуре. Основной цикл может быть похожим на следующий пример:

  ...
  lastSavedTime := getRelativeTimeMs; { initialize the timer }
  repeat
    { read and process the keypad input }
    key := getKeyClicked;
    if keyToAction(key) = GA_LEFT then moveLeft;
    if keyToAction(key) = GA_RIGHT then moveRight;

    { check if 1 second has passed }
    if ((getRelativeTimeMs - lastSavedTime) > 1000)
    or (getRelativeTimeMs < lastSavedTime)  { check if the timer is reset after 48 days }
      then
      begin
        lastSavedTime := getRelativeTimeMs;
        moveDown;
      end;
  until gameOver;
  ...


getSecond

function getSecond(time: integer): integer;

Возвращает номер секунды в минуте для данного времени time (представленного в количестве секунд, прошедших с 1 января 1970 г. и получаемого с помощью функции getCurrentTime). Возвращаемое значение может быть между 0 и 59.

  var time: integer;
      text: string;
  begin
    time := getCurrentTime;
    text := 'Current time is ' + getHour(time);
    text := text + ':' + getMinute(time);
    text := text + ':' + getSecond(time);
    drawText(text, 0, 0);
    repaint;
    delay(1000); { wait 1 second before MIDlet terminates }
  end.

См. также: getCurrentTime, getHour, getMinute


getWeekDay

function getWeekDay(time: integer): integer;

Возвращает номер дня в неделе для данного времени time (представленного в количестве секунд, прошедших с 1 января 1970 г. и получаемого с помощью функции getCurrentTime). Возвращаемое значение будет 1 для воскресенья, 2 для понедельника и так далее (7 - суббота).

См. также: getCurrentTime, getYear, getMonth, getDay, getYearDay


getYear

function getYear(time: integer): integer;

Возвращает год для данного времени time (представленного в количестве секунд, прошедших с 1 января 1970 г. и получаемого с помощью функции getCurrentTime).

См. также: getCurrentTime, getMonth, getDay


getYearDay

function getYearDay(time: integer): integer;

Возвращает номер дня в году для данного времени time (представленного в количестве секунд, прошедших с 1 января 1970 г. и получаемого с помощью функции getCurrentTime). Возвращаемое значение может быть между 1 и 366.

См. также: getCurrentTime, getYear, getMonth, getDay, getWeekDay


abs

function abs(n: integer): integer;

Возвращает абсолютное значение заданного числа.


acos

function acos(num: real):real;

Возвращает арккосинус заданного числа, в диапазоне от 0 до pi (в радианах).


asin

function asin(num: real):real;

Возвращает арксинус данного числа, в диапазоне от -pi/2 до pi/2 (в радианах).


atan

function atan(num: real):real;

Возвращает арктангенс данного числа, в диапазоне от -pi/2 до pi/2 (в радианах).


atan2

function atan2(y,x: real):real;

Переводит прямоугольные координаты (x, y) в полярные координаты (r, theta). Данный метод вычисляет фазу theta посредством вычисления арктангенса y/x в диапазоне от -pi до pi.


cos

function cos(num: real):real;

Возвращает косинус данного числа, представленный в радианах.


exp

function exp(num: real):real;

Возвращает экспоненту заданного числа.


frac

function frac(num: real):real;

Возвращает дробную часть нецелого числа (Дробная часть числа 1.234 будет 0.234).


log

function log(num: real):real;

Возвращает натуральный логарифм данного числа.


log10

function log10(num: real):real;

Возвращает десятичный логарифм от данного числа.


pow

function pow(a, b: real):real;

Возвращает значение 'a' в степени 'b'.


rabs

function rabs(num:real):real;

Возвращает абсолютное значение от данного натурального числа.


sin

function sin(num: real):real;

Возвращает синус данного числа, представленный в радианах.


sqr

function sqr(n: integer): integer;

Возвращает площадь данного числа. (n * n)


sqrt

function sqrt(num: real):real;

Возвращает квадратный корень данного числа.


tan

function tan(num: real):real;

Возвращает тангенс данного угла, представленный в радианах.


toDegrees

function toDegrees(num: real):real;

Преобразует заданный угол из радиан в градусы.


toRadians

function toRadians(num: real):real;

Преобразует данный угол из градусов в радианы.


trunc

function trunc(num: real):integer;

Возвращает целую часть данного числа.


copy

function copy(str1: string; begin, end: integer): string;

Возвращает подстроку данной строки, начиная с позиции 'begin' и заканчивая позицией 'end'-1. Например, copy('MIDletPascal', 2, 5) возвратит 'Dle'. Следует заметить, что данная функция отличается от классической функции Паскаля copy.

Строки в MIDletPascal немного другие, нежели в обычном Паскале: первый символ строки имеет индекс 0.

См. также: length, pos


getChar

function getChar(str: string; pos:integer): char;

Возвращает символ с указанным индексом внутри строки. Первый символ имеет индекс 0. Если аргумент 'pos' имеет значение, большее, чем длина строки, будет возвращён символ с кодом ASCII '0'.

См. также: setChar


integerToString

function integerToString(val: integer): string;

Переводит целое число в строковое представление.

  var i: integer;
  s: string;
  begin
    i := 15;
    s := integerToString(i);
    s := '' + i; // данное действие имеет эффект, аналогичный предыдущему.
  end.


length

function length(str: string): integer;

Возвращает длину данной строки. Строки в MIDletPascal немного другие, нежели в обычном Паскале: первый символ строки имеет индекс 0.

См. также: copy, pos


locase

function locase(str: string): string;

Возвращает строку 'str' в нижнем регистре.

См. также: upcase, copy


pos

function pos(str1, str2: string): integer;

Возвращает позицию первого совпадения 'str2' с фрагментом из 'str1' или -1, если 'str1' не содержит 'str2'. Сравнение чувствительно к регистру.

См. также: copy, length


setChar

function setChar(str: string; c: char; pos:integer): string;

Возвращает строку 'str', с подставленным в неё символом 'c' в позиции 'pos'. Начальный индекс для 'pos' - 0. Если 'pos' больше, чем длина строки 'str', будет возвращена копия 'str' без изменений.

См. также: getChar


stringToInteger

function stringToInteger(s:string):integer;

Преобразует строку в целое число. Если предлагаемая строка содержит некорректное число, будет возвращено значение 0. Строка может содержать только цифры и знаки '+' или '-' вначале.


stringToReal

function stringToReal(str:string; base:integer):real;

Преобразует строку в натуральное число. Второй параметр является базой для преобразования.


upcase

function upcase(str: string): string;

Возвращает строку 'str' в верхнем регистре.

См. также: locase, copy


addCommand

procedure addCommand(cmd: command);

Вставляет команду на экран устройства. Некоторые устройства (такие как сотовые телефоны Motorola) не отображают команду до тех пор, пока не будет вызвана процедура repaint. Так что, после вызова 'addCommand' желательно делать вызов repaint.

См. также: createCommand, getClickedCommand, removeCommand, emptyCommand


choiceAppendString

function choiceAppendString(choiceID: integer; itemText:string):integer;

Добавляет элемент к группе выбора с идентификатором choiceID. Функция возвращает внутригрупповой индекс добавленного элемента.

  var
    choiceGroupID: integer;
    NY, LA: integer;
  begin
    showForm;
    choiceGroupID := formAddChoice('Where do you live?', CF_EXCLUSIVE);
    NY := choiceAppendString(choiceGroupID, 'New York');
    LA := choiceAppendString(choiceGroupID, 'Los Angeles');
  end.

См. также: formAddChoice, choiceAppendStringImage, choiceIsSelected, choiceGetSelectedIndex


choiceAppendStringImage

function choiceAppendStringImage(choiceID: integer; itemText:string; img:image):integer;

Добавляет элемент и изображение к группе выбора с идентификатором choiceID. Функция возвращает внутригрупповой индекс добавленного элемента

  var
    choiceGroupID: integer;
    NY, LA: integer;
  begin
    showForm;
    choiceGroupID := formAddChoice('Where do you live?', CF_EXCLUSIVE);
    NY := choiceAppendStringImage(choiceGroupID, 'New York', loadImage('/NY.png'));
    LA := choiceAppendStringImage(choiceGroupID, 'Los Angeles', loadImage('/LA.png'));
  end.

См. также: formAddChoice, choiceAppendString, choiceIsSelected, choiceGetSelectedIndex


choiceGetSelectedIndex

function choiceGetSelectedIndex(choiceID: integer):integer;

Возвращает индекс выбранного элемента группы или -1, если ни один элемент не выбран. Для групп выбора CH_MULTIPLE в любом случае возвращается -1, вместо данной функции необходимо вызывать choiceIsSelected.

См. также: formAddChoice, choiceIsSelected


choiceIsSelected

function choiceIsSeected(choiceID: integer; itemIndex:integer):boolean;

Возвращает true если в группе 'choiceID' выбран элемент с индексом 'itemIndex'.

  var
    choiceGroupID: integer;
    NY, LA: integer;
  begin
    showForm;
    choiceGroupID := formAddChoice('Where do you live?', CF_EXCLUSIVE);
    NY := choiceAppendStringImage(choiceGroupID, 'New York', loadImage('/NY.png'));
    LA := choiceAppendStringImage(choiceGroupID, 'Los Angeles', loadImage('/LA.png'));
    if choiceIsSelected(choiceGroupID, NY) then
      formAddString('New York');
    else
      formAddString('Los Angeles');
  end.

См. также: formAddChoice


clearForm

procedure clearForm;

Удаляет все элементы и команды с формы.

  var
    label_id, textField_id: integer;
  begin
    label_id := formAddString('Hello world');
    textField_id := formAddTextField('Enter your name', 'Mr.Smith', 20, TF_ANY);
    showForm;
    delay(2000);
    clearForm;
    delay(2000);
  end.

См. также: showForm


createCommand

function createCommand(label:string; commandType:integer; priority:integer): command;

Создаёт команду с заголовком переданным в параметре label. Заголовок должен быть максимально коротким. Приоритет команды задаётся посредством параметра 'priority', меньшие значения подразумевают высший приоритет. Параметр 'commandType' служит для указания назначения команды. Например, если приложение указывает, что команда будет иметь тип CM_BACK, а устройство предполагает определенное место для операции "отката" (на одной из софт-клавиш, к примеру), команда будет отражена так, как это предполагает дизайн устройства. 'commandType' может принимать следующие значения:

· CM_SCREEN - команда любого типа
· CM_BACK
· CM_CANCEL
· CM_OK
· CM_HELP
· CM_STOP
· CM_EXIT
· CM_ITEM

  var
    exitCmd, pauseCmd: command;
  begin
    exitCmd := createCommand('Exit', CM_EXIT, 1);
    pauseCmd := createCommand('Pause', CM_SCREEN, 1);
    addCommand(exitCmd);
    addCommand(pauseCmd);
  end.

См. также: getClickedCommand, addCommand, removeCommand


emptyCommand

function emptyCommand:command;

Возвращает команду, означающую отсутствие нажатий со стороны пользователя. Возвращаемую команду НЕЛЬЗЯ добавлять на форму или экран (в противном случае мидлет упадёт), её можно использовать только для сравнения и установления факта нажатия на что-либо.

  var
    ok, clicked:command;
  begin
    ok := createCommand('OK', CM_OK, 1);
    addCommand(ok);
    repeat
      clicked := getClickedCommand;
    until clicked <> emptyCommand;
    if clicked = ok then halt else doSomething...
  end.

См. также: createCommand, getClickedCommand, addCommand, removeCommand


formAddChoice

function formAddChoice(label:string; choiceType:integer):integer;

Добавляет на форму группу выбора. Функция возвращает ID созданного элемента. 'choiceType' может быть одним из следующих:

· CH_EXCLUSIVE - может быть выбран только один элемент
· CH_MULTIPLE - может быть выбрано произвольное количество элементов

См. также: choiceAppendString, choiceAppendStringImage, choiceIsSelected, choiceGetSelectedIndex, formRemove


formAddGauge

function formAddGauge(label:string; isInteractive:boolean; maxValue, initialValue:integer):integer;

Вставляет управляющий элемент "градусник" на форму. Функция возвращает ID созданного элемента. Если 'isInteractive' установлено в 'false', пользователь не может изменять значение "градусника".

  var gauge_id: integer;
  begin
    gauge_id := formAddGauge('Choose your age', true, 100, 18);
    showForm;
    delay(2000);
  end.

См. также: showForm, formSetValue, formGetValue, formRemove


formAddImage

function formAddImage(i:image):integer;

Вставляет изображение на форму. Функция возвращает ID вставленного изображения.

  var
    image_id: integer;
  begin
    image_id := formAddImage(loadImage('/logo.png'));
    showForm;
    delay(2000);
  end.

См. также: showForm, formRemove


formAddSpace

function formAddSpace:integer;

Вставляет пропуск на форму. Пропуск нужен для разделения групп элементов. Функция возвращает ID добавленного элемента.

  var
    label_id, space_id, textField_id: integer;
  begin
    label_id := formAddString('Hello world');
    space_id := formAddSpace();
    textField_id := formAddTextField('Enter your name', 'Mr.Smith', 20, TF_ANY);
    showForm;
    delay(2000);
  end.

См. также: showForm, formRemove


formAddString

function formAddString(s:string):integer;

Добавляет нередактируемую строку (подпись) на форму. Функция возвращает ID созданного элемента.

  var
    label_id: integer;
  begin
    label_id := formAddString('Hello world');
    showForm;
    delay(2000);
  end.

См. также: showForm, formRemove


formAddTextField

function formAddTextField(prompt, defaultValue: string; maxSize: integer; constraints:integer):integer;

Вставляет текстовое поле на форму. Функция возвращает ID созданного текстового поля. Посредством параметра 'prompt' передаётся строка, отображаемая после текстового поля, 'defaultValue' - текст, появляющийся в поле ввода изначально, 'maxSize' - максимальное количество введённых символов, допустимое в поле ввода. 'constraints' может быть одним из следующих:

· TF_ANY - Поле ввода принимает любые символы
· TF_EMAIL - В поле ввода можно вводить только адрес электронной почты
· TF_NUMERIC - В поле ввода можно вводить только числа
· TF_PHONENUMBER - В поле ввода можно вводить только телефонный номер
· TF_URL - В поле ввода можно вводить только адрес в Интернет (URL)

  var
    textField_id: integer;
  begin
    textField_id := formAddTextField('Enter your name', 'Mr.Smith', 20, TF_ANY);
    showForm;
    delay(2000);
  end.

См. также: showForm, formSetText, formGetText, formRemove


formGetText

function formGetText(textFieldID:integer):string;

Возвращает текст, содержащийся текстовым полем с идентификатором 'textFieldID'. Если 'textFieldID' указывает не на текстовый элемент, либо ни на что не указывает - будет возвращена пустая строка.

См. также: formAddTextField


formGetValue

function formGetValue(gaugeID:integer):integer;

Возвращает значение "градусника" с идентификатором 'gaugeID'. Если "градусника" с подобным идентификатором нет, будет возвращено -1.

  var
    gauge_id, value: integer;
  begin
    gauge_id := formAddGauge('Choose your age', true, 100, 18);
    showForm;
    value := formGetValue(gauge_id);
    delay(2000);
  end.

См. также: formAddGauge


formRemove

procedure formRemove(item:integer);

Удаляет элемент с формы.

  var
    textField:integer;
  begin
    showForm;
    textField := formAddTextField('Name', '', 20, TF_ANY);
    delay(1000);
    formRemove(textField);
  end.


formSetText

procedure formSetText(textFieldID:integer; text:string);

Изменяет значение текстового поля поля с идентификатором 'textFieldID'.

См. также: formAddTextField


formSetValue

procedure formSetValue(gaugeID:integer; value:integer);

Изменяет значение "градусника" с идентификатором 'gaugeID'.

См. также: formAddGauge


getClickedCommand

function getClickedCommand: command;

Возвращает последнюю выбранную пользователем команду.

  var
    exitCmd, clicked: command;
  begin
    exitCmd := createCommand('Exit', CM_EXIT, 1);
    addCommand(exitCmd);
    repeat
      clicked := getClickedCommand;
    until clicked <> emptyCommand;
  end.

См. также: createCommand, addCommand, removeCommand, emptyCommand


getTextBoxString

function getTextBoxString:string;

Возвращает текст, содержащийся в текстовом окне (TextBox).

  var
    cont : command;
    quote : string;
  begin
    showTextBox('Enter your favorite quote', 'To be or not to be', 200, TF_ANY);
    cont := createCommand('Continue', CM_SCREEN, 1);
    addCommand(cont);

    repeat
      delay(100);
    until getClickedCommand <> emptyCommand;

    quote := getTextBoxString;

    ...
  end.

См. также: showTextBox


menuAppendString

function menuAppendString(text: string): integer;

Добавляет строку к текущему меню. Функция возвращает индекс добавленной записи в меню.

  var
    tetris, minesweeper, snake : integer;
    play, clicked : command;
  begin
    showMenu('Select a game', CH_IMPLICIT);

    tetris := menuAppendString('Tetris');
    minesweeper := menuAppendString('Minesweeper');
    snake := menuAppendString('Snake');

    play := createCommand('Play', CM_SCREEN, 1);
    addCommand(play);

    repeat
      delay(100);
      clicked := getClickedCommand;
    until clicked = play;

    showCanvas; // Показываем графический экран и убираем меню.

    if menuGetSelectedIndex = tetris then playTetris;
    if menuGetSelectedIndex = minesweeper then playMinesweeper;
    if menuGetSelectedIndex = snake then playSnake;
    ...
  end.

См. также: showMenu, menuAppendStringImage, menuIsSelected, menuGetSelectedIndex


menuAppendStringImage

function menuAppendStringImage(text: string; img:image): integer;

Добавляет строку с изображением к текущему меню. Функция возвращает индекс добавленной записи в меню.

  var
    tetris, minesweeper, snake : integer;
    play, clicked : command;
  begin
    showMenu('Select a game', CH_IMPLICIT);

    tetris := menuAppendStringImage('Tetris', loadImage('/tetris.png'));
    minesweeper := menuAppendStringImage('Minesweeper', loadImage('/mine.png'));
    snake := menuAppendStringImage('Snake', loadImage('/snake.png'));

    play := createCommand('Play', CM_SCREEN, 1);
    addCommand(play);

    repeat
      delay(100);
      clicked := getClickedCommand;
    until clicked = play;

    showCanvas; // Показываем графический экран и убираем меню.

    if menuGetSelectedIndex = tetris then playTetris;
    if menuGetSelectedIndex = minesweeper then playMinesweeper;
    if menuGetSelectedIndex = snake then playSnake;
    ...
  end.

См. также: showMenu, menuAppendString, menuIsSelected, menuGetSelectedIndex


menuGetSelectedIndex

function menuGetSelectedIndex: integer;

Возвращает индекс выделенной записи меню. Если ни одна запись не выделена, возвращается -1.

  var
    tetris, minesweeper, snake : integer;
    play, clicked : command;
  begin
    showMenu('Select a game', CH_IMPLICIT);

    tetris := menuAppendStringImage('Tetris', loadImage('/tetris.png'));
    minesweeper := menuAppendStringImage('Minesweeper', loadImage('/mine.png'));
    snake := menuAppendStringImage('Snake', loadImage('/snake.png'));

    play := createCommand('Play', CM_SCREEN, 1);
    addCommand(play);

    repeat
      delay(100);
      clicked := getClickedCommand;
    until clicked = play;

    showCanvas; // Показываем графический экран и убираем меню.

    if menuGetSelectedIndex = tetris then playTetris;
    if menuGetSelectedIndex = minesweeper then playMinesweeper;
    if menuGetSelectedIndex = snake then playSnake;
    ...
  end.

См. также: showMenu, menuAppendString, menuAppendStringImage, menuIsSelected


menuIsSelected

function menuIsSelected(index: integer): boolean;

Возвращает 'true', если выделена запись с указанным индексом.

  var
    tetris, minesweeper, snake : integer;
    play, clicked : command;
  begin
    showMenu('Select a game', CH_IMPLICIT);

    tetris := menuAppendStringImage('Tetris', loadImage('/tetris.png'));
    minesweeper := menuAppendStringImage('Minesweeper', loadImage('/mine.png'));
    snake := menuAppendStringImage('Snake', loadImage('/snake.png'));

    play := createCommand('Play', CM_SCREEN, 1);
    addCommand(play);

    repeat
      delay(100);
      clicked := getClickedCommand;
    until clicked = play;

    showCanvas; // Показываем графический экран и убираем меню.

    if menuIsSelected(tetris) then playTetris;
    if menuIsSelected(minesweeper) then playMinesweeper;
    if menuIsSelected(snake) then playSnake;
    ...
  end.

См. также: showMenu, menuAppendString, menuAppendStringImage, menuGetSelectedIndex


playAlertSound

procedure playAlertSound;

Проигрывает звук, ассоциированный с текущим предупреждением (Alert).

  var
    cm : command;
  begin
    showAlert('Message', 'New message arrived', loadImage('/img1.png'), ALERT_INFO);
    playAlertSound;

    cm := createCommand('OK', CM_OK, 1);
    addCommand(cm);

    repeat
      delay(100);
    until getClickedCommand <> emptyCommand;

    showForm; // Убираем предупреждение с экрана.
    ...
  end.

См. также: showAlert


removeCommand

procedure removeCommand(cmd: command);

Убирает команду с экрана устройства.

См. также: createCommand, getClickedCommand, addCommand, emptyCommand


setTicker

procedure setTicker(s:string);

Добавляет на форму элемент "бегущая строка".

  begin
    showForm;
    setTicker('MIDlet created with MIDletPascal');
    delay(5000);
  end.


showAlert

procedure showAlert(title: string; message:string; img:image; alertType:alert);

Отображает предупреждение на экране устройства. Во время отображения предупреждения ни один другой элемент (исключая команды) не может находиться на экране. Предупреждение может издавать звуковой сигнал во время отображения. Сигнал может быть следующих типов:

· ALERT_INFO
· ALERT_WARNING
· ALERT_ERROR
· ALERT_ALARM
· ALERT_CONFIRMATION

  var
    cm : command;
  begin
    showAlert('New message', 'You have just received a message from MrSmith', loadImage('/img1.png'),
      ALERT_INFO);
    playAlertSound;

    cm := createCommand('Read', CM_OK, 1);
    addCommand(cm);

    repeat
      delay(100);
    until getClickedCommand <> emptyCommand;

    showForm; // Убираем предупреждение с экрана
    ...
  end.

См. также: Создание пользовательского интерфейса, playAlertSound


showCanvas

procedure showCanvas;

Отображает графический экран (canvas) на дисплее устройства. Дисплей может отображать форму или графический экран. Форма может содержать текстовые подписи (labels), изображения, текстовые поля и другие элементы пользовательского интерфейса. Графический экран, напротив, не содержит элементы пользовательского интерфейса; это зона, на которой программа может рисовать. При запуске мидлета по умолчанию отображается графический экран.

  var
    label_id, textField_id: integer;
  begin
    label_id := formAddString('Hello world');
    textField_id := formAddTextField('Enter your name', 'Mr.Smith', 20, TF_ANY);
    showForm;
    delay(2000);
    showCanvas;
    drawText('Hello world', 0, 0);
    repaint;
    delay(2000);
  end.

См. также: showForm


showForm

procedure showForm;

Отображает форму на дисплее устройства. Дисплей может отображать форму или графический экран. Форма может содержать текстовые подписи (labels), изображения, текстовые поля и другие элементы пользовательского интерфейса. Графический экран, напротив, не содержит элементы пользовательского интерфейса; это зона, на которой программа может рисовать. При запуске мидлета по умолчанию отображается графический экран.

  var
    label_id, textField_id: integer;
  begin
    label_id := formAddString('Hello world');
    textField_id := formAddTextField('Enter your name', 'Mr.Smith', 20, TF_ANY);
    showForm;
    delay(2000);
  end.

См. также: showCanvas, clearForm


showMenu

procedure showMenu(title:string; menuType:integer);

Отображает меню на дисплее устройства. Никакие другие элементы (исключая команды) не могут в это время присутствовать на дисплее. 'menuType' может иметь следующие значения:

· CH_IMPLICIT - можно выбрать один элемент меню
· CH_EXCLUSIVE - маленькая радио-кнопка изображается после каждого пункта меню
· CH_MULTIPLE - можно выбрать несколько пунктов меню

  var
    tetris, minesweeper, snake : integer;
    play, clicked : command;
  begin
    showMenu('Select a game', CH_IMPLICIT);

    tetris := menuAppendString('Tetris');
    minesweeper := menuAppendString('Minesweeper');
    snake := menuAppendString('Snake');

    play := createCommand('Play', CM_SCREEN, 1);
    addCommand(play);

    repeat
      delay(100);
      clicked := getClickedCommand;
    until clicked = play;

    showCanvas; // Показываем графический экран и убираем меню с дисплея.

    if menuGetSelectedIndex = tetris then playTetris;
    if menuGetSelectedIndex = minesweeper then playMinesweeper;
    if menuGetSelectedIndex = snake then playSnake;
    ...
  end.

См. также: Создание пользовательского интерфейса, menuAppendString, menuAppendStringImage, menuIsSelected, menuGetSelectedIndex


showTextBox

procedure showTextBox(title: string; initialContents: string; maxSize: integer; constraints: integer);

Отображает текстовое окно (TextBox) на дисплее. Окно полностью занимает дисплей устройства и никакие другие элементы пользовательского интерфейса (исключая команды) не могут быть использованы в этот момент. 'constraints' может иметь следующие значения:

· TF_ANY - Поле ввода принимает любые символы
· TF_EMAIL - В поле ввода можно вводить только адрес электронной почты
· TF_NUMERIC - В поле ввода можно вводить только числа
· TF_PHONENUMBER - В поле ввода можно вводить только телефонный номер
· TF_URL - В поле ввода можно вводить только адрес в Интернет (URL)

  var
    cont : command;
    quote : string;
  begin
    showTextBox('Enter message, '', 200, TF_ANY);
    cont := createCommand('Send', CM_SCREEN, 1);
    addCommand(cont);

    repeat
      delay(100);
    until getClickedCommand <> emptyCommand;

    quote := getTextBoxString;

    ...
  end.

См. также: Создание пользовательского интерфейса, getTextBoxString


addRecordStoreEntry

function addRecordStoreEntry(rs: recordStore; data: string): integer;

Функция добавляет данные 'data' в хранилище 'rs' и возвращает индекс записи внутри хранилища или -1, если произошла ошибка.

См. также: Хранилища данных


closeRecordStore

procedure closeRecordStore(rs: recordStore);

Closes an open record store.

См. также: Хранилища данных


deleteRecordStore

procedure deleteRecordStore(name: string);

Удаляет хранилище с именем 'name'. Все данные внутри указанного хранилища будут потеряны. Если хранилище с указанным именем не существует, не будет предпринято никаких действий.

См. также: Хранилища данных


deleteRecordStoreEntry

procedure deleteRecordStoreEntry(rs: recordStore; index: integer);

Удаляет запись с указанным индексом в хранилище 'rs'. Если записи с подобным индексом нет, никаких действий производиться не будет.

См. также: Хранилища данных


getRecordStoreSize

function getRecordStoreSize(rs: recordStore): integer;

Возвращает количество записей в хранилище.

См. также: Хранилища данных


openRecordStore

function openRecordStore(name: string): recordStore;

Открывает хранилище с указанным именем. Если указанного хранилища не существует, будет заведено новое хранилище с этим именем.

См. также: Хранилища данных


readRecordStoreEntry

function readRecordStoreEntry(rs: recordStore; index: integer): string;

Возвращает данные с указанным индексом из хранилища 'rs' или пустую строку, если не существует записи с подобным индексом.

См. также: Хранилища данных


addHttpBody

procedure addHttpBody(httpConn: http; data: string);

Добавляет строку 'data' к телу запроса http. Непустое тело может содержать только запрос типа POST.

См. также: HTTP: Связь


addHttpHeader

procedure addHttpHeader(httpConn: http; name, value:string);

Вставляет заголовок в запрос http. Например, чтобы добавить заголовок "Accept-encoding: gzip, none", вызовите функцию со значением "Accept-encoding" у параметра 'name' и значением "gzip, none" у параметра 'value'.

См. также: HTTP: Связь


closeHttp

procedure closeHttp(httpConn: http);

Закрывает открытое соединение http.

См. также: HTTP: Связь


getHttpHeader

function getHttpHeader(httpConn: http; name: string): string;

Возвращает значение заголовка 'name' запроса http. Например, если запрос содержит заголовок "Content-type: text/plain", вызвав функцию со значением "Content-type" параметра 'name', мы получим "text/plain".

См. также: HTTP: Связь


getHttpResponse

function getHttpResponse(httpConn: http):string;

Возвращает данные, посланные сервером в ответ на запрос http.

См. также: HTTP: Связь


isHttpOpen

function isHttpOpen(httpConn: http):boolean;

Возвращает 'true' если соединение 'httpConn' открыто.

См. также: HTTP: Связь


openHttp

function openHttp(httpConn: http; url: string):boolean;

Подключает соединение 'httpConn' к адресу 'url'. Адрес должен быть представлен в форме: "http://servername[:port][/file]". Возвращает 'true' в случае успешного подключения или 'false' в случае неудачи.

См. также: HTTP: Связь


sendHttpMessage

function sendHttpMessage(httpConn: http): integer;

Эта функция посылает запрос http, ждёт ответа и возвращает код ответа или -1 в случае ошибки. Со списком возвращаемых кодов можно ознакомиться здесь (обычно, 200 означает что всё нормально).

См. также: HTTP: Связь


setHttpMethod

procedure setHttpMethod(httpConn: http; method:string);

Устанавливает один из следующих типов запроса http:

· GET
· POST
· HEAD

См. также: HTTP: Связь


Отправка SMS сообщений

function smsStartSend(destination: string; message:string): boolean;

Вызов этой функции инициирует отправку SMS сообщения. Функция возвращает 'true', если сообщение было успешно передано подсистеме SMS и если подсистема SMS не занята в данный момент отправкой другого сообщения. Параметр 'destination' имеет следующий вид: sms://<номер телефона>

Отправка сообщений в J2ME поддерживается не всеми устройствами. MIDletPascal пытается отправить сообщение используя Wireless Messaging API и Siemens API.

Следующий пример показывает, как можно отправить сообщение:

  begin
    if not smsStartSend('sms://+5550000', 'Hello!') then halt;

    while smsIsSending do // ждём, пока сообщение не будет отправлено
      delay(100);

    if not smsWasSuccessfull then halt; // проверяем, успешно ли было отправлено сообщение
  end.

См. также: smsIsSending, smsWasSuccessfull


smsIsSending

function smsIsSending: boolean;

Возвращает 'true', если подсистема SMS занята отправкой сообщения или 'false' в противном случае.

См. также: smsStartSend, smsWasSuccessfull


smsWasSuccessfull

function smsWasSuccessfull: boolean;

Возвращает 'true' если последнее сообщение было успешно отправлено. Возвращённый результат 'false' может означать следующее:

· мобильный телефон не поддерживает отправку SMS сообщений посредством J2ME
· указан некорректный номер телефона
· оператор сотовой связи отказался доставлять сообщение

См. также: smsStartSend, smsIsSending


Звуки и музыка

function openPlayer(resource:string; mimetype:string):boolean;

Открывает указанный ресурсный файл аудиоплеером. Ресурс не начинает проигрываться непосредственно после запуска функции. Функция возвращает 'false', если не удалось открыть указанный ресурс. Параметр 'mimetype' может принимать следующие значения:

· файлы wave: audio/x-wav
· файлы au: audio/basic
· файлы MP3: audio/mpeg
· файлы MIDI: audio/midi

Обычно устройства не поддерживают все вышеперечисленные форматы сразу.

Совместимость: музыкальные функции будут работать только на сотовых телефонах, совместимых с MIDP-2.0. Мидлеты с поддержкой звука не будут работать на телефонах с MIDP-1.0.

  begin
    if not openPlayer('/explosion.mid', 'audio/midi') then halt;
    if not setPlayerCount(-1) then halt;
    if not startPlayer then halt;
    delay(5000);
  end.


getPlayerDuration

function getPlayerDuration:integer;

Возвращает общую длительность (в миллисекундах) загруженной в плеер мелодии.

См. также: openPlayer


setPlayerCount

function setPlayerCount(loopCount:integer):boolean;

Устанавливает количество циклов для плеера. 'loopCount' - это количество раз мелодия будет проиграна. Функцию необходимо вызывать после вызова openPlayer и до вызова startPlayer. Если 'loopCount' установлен в -1, мелодия будет проигрываться бесконечно.

См. также: openPlayer


startPlayer

function startPlayer:boolean;

Начинает проигрывать мелодию, предварительно загруженную с помощью функции openPlayer. Возвращает 'false', если плеер не может быть запущен.

  begin
    if not openPlayer('/explosion.mid', 'audio/midi') then  halt;
    if not setPlayerCount(-1) then halt;
    if not startPlayer then halt;
    delay(5000);
  end.

См. также: openPlayer


stopPlayer

procedure stopPlayer;

Останавливает воспроизведение проигрываемой мелодии.

См. также: openPlayer, startPlayer


closeResource

procedure closeResource(res: resource);

Закрывает указанный ресурс.

См. также: openResource, resourceAvailable, readByte, readLine


openResource

function openResource(name: string):resource;

Открывает ресурсный файл, расположенный внутри JAR-архива мидлета. Чтобы добавить ресурсный файл к JAR-архиву, используйте функцию "Проект -> Вставить ресурс".

  var
    res   : resource;
    byte  : integer;
    line  : string;
    index : integer;
  begin
      res := openResource('/data.txt');

      if (resourceAvailable(res)) then
      begin
          byte := readByte(res);
     line := readLine(res);

          closeResource(res);
      end;

      showForm;
      index := formAddString('Byte is: ' + chr(byte));
      index := formAddString('Line is: ' + line);
      delay(1000);
  end.

См. также: resourceAvailable, closeResource, readByte, readLine


readByte

function readByte(res: resource):integer;

Считывает следующий байт из указанного ресурса или возвращает EOF, если больше нечего читать или произошла ошибка чтения из ресурса.

См. также: openResource, resourceAvailable, closeResource, readLine


readLine

function readLine(res: resource):string;

Считывает следующую строку из указанного ресурса и возвращает её. В случае, если больше нечего читать или произошла ошибка чтения, будет возвращена пустая строка. Если в ресурсе будут встречены пустые строки, они будут пропущены.

См. также: openResource, resourceAvailable, closeResource, readByte


resourceAvailable

function resourceAvailable(res: resource):boolean;

Возвращает 'true', если указанный ресурс доступен (т.е. открыт корректно).

См. также: openResource, closeResource, readByte, readLine


assert

procedure assert(cond: boolean);

Проверяет, истинно ли данное условие. Если условие ложно (не истинно), утверждающее сообщение будет записано в стандартный отладочный поток. В описании процедуры debug можно найти более развёрнутую аннотацию отладочного потока. Утверждающее сообщение может выглядеть так:

Assertion failed at: Tetris.mpsrc:162

См. также: debug


chr

function chr(n: integer): char;

Возвращает символ указанного кода ASCII. Поведение функции не определено, если параметр имеет значение, большее 127.

См. также: ord


debug

procedure debug(s: string);

Выводит данную строку, используя стандартный отладочный поток эмулятора. На мобильном устройстве эта функция никак себя не проявляет (разве что, мидлет будет иметь немного больший размер). Если вы используете встроенный эмулятор, запускаемый через браузер, отладочный поток будет в окне консоли Java. Чтобы увидеть окно консоли Java, в Проводнике необходимо выбрать пункт меню "Сервис -> Sun Java Console" ("Tools -> Sun Java Console"). В случае использования прочих эмуляторов, отладочный поток будет передаваться в окно консоли DOS, открывающееся вместе с запуском эмулятора.

См. также: assert


getProperty

function getProperty(propertyName: string): string;

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

  begin
    debug(getProperty('microedition.locale'));
  end.

См. также: debug, getWidth, getHeight


halt

procedure halt;

Прерывает выполнение мидлета.

См. также: isMidletPaused


isMidletPaused

function isMidletPaused: boolean;

Возвращает 'true', если мидлет находится в состоянии паузы или 'false' в другом случае.

После запуска, мидлет находится в активном состоянии. Мидлет может войти в состояние паузы когда, например, поступает входящий звонок. Мидлет входит в состояние паузы, вы отвечаете на звонок и после этого можете продолжить работу мидлета. После того, как вы продолжили работу мидлета, он выходит из состояния паузы.

Определение состояния мидлета может быть полезным в различных приложениях. Возьмём, к примеру, игру, которая должна быть приостановлена, когда мидлет вошёл в состояние паузы. Провернуть такое поможет следующий код:

  ...
  repeat
    { обрабатываем клавиатурный ввод и читаем таймер }

    { если мидлет в состоянии паузы, ждём, пока он будет возвращён в активное состояние }

    while isMidletPaused do
    begin
      delay(100);
    end;

  until gameOver;
  ...

См. также: getKeyClicked, getKeyPressed, getRelativeTimeMs, halt


odd

function odd(n: integer): boolean;

Возвращает 'true', если указанное число нечётное или 'false' в другом случае.


ord

function ord(c: char): integer;

Возвращает код ASCII для указанного символа.

См. также: chr


random

function random(n: integer): integer;

Возвращает псевдослучайное число между 0 и (n-1).

Следующая функция возвращает случайное значение типа boolean; возможность того, что возвращаемое значение будет равно 'true' равна 75%:

  function randomBoolean: boolean;
  begin
    if random(4) = 3 then
      randomBoolean := false;
    else
      randomBoolean := true;
  end;

См. также: randomize


randomize

procedure randomize;

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

См. также: random


Создание нового проекта

Чтобы создать новый проект, выберите "Файл -> Новый проект" (File -> New Project) в меню редактора. На экране появится диалоговое окно:

Укажите наименование проекта и каталог, где он должен быть размещён. После нажатия кнопки "Создать" (Create), новый проект будет создан.


Компиляция и запуск проекта

Чтобы скомпилировать проект, выберите "Проект -> Компиляция" (Project -> Build) в меню редактора. Если компиляция произведена, вы увидите следующее сообщение:

Если компиляция по каким-либо причинам невозможна, появится следующее сообщение:

Список ошибок можно найти на панели вывода редактора. Вы можете дважды кликнуть на сообщении об ошибке и редактор установит указатель на ошибочную строку.

Если проект был успешно скомпилирован, вы можете запустить его, выбрав в меню "Проект -> Запуск" (Project -> Run). По умолчанию, MIDletPascal запустить ваш мидлет с помощью эмулятора, ассоциированного с файлами JAD на вашем компьютере. Для запуска мидлетов необходимо, чтобы в системе был установлен хотя бы один эмулятор. Мы рекомендуем вам установить J2ME Wireless Toolkit, который можно найти на java.sun.com.


Изменение установок

Чтобы отобразить диалоговое окно с установками, выберите "Конфигурация -> Установки" (Configure -> Options) в меню редактора. Установки поделены на следующие группы:

· Редактор
· Текст
· Вывод компиляции
· Эмулятор

Редактор

Данное диалоговое окно содержит настройки, влияющие на поведение и внешний вид редактора кода.

Настройки табуляции в данной версии работают не совсем корректно.

Текст

Следующее диалоговое окно используется для изменения параметров подсветки кода.

Вывод компиляции

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

Эмулятор

Это окно предоставляет возможность настроить эмулятор для запуска скомпилированного проекта.

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

Строка запуска является командой, запускающей эмулятор. Используйте макрос %JAD% для подстановки имени созданого файла *.JAD и/или макрос %JAR% для подстановки имени JAR-файла. Подстановка имён производится с указанием полного пути к файлу.


Лицензия

MIDletPascal End-User License
Copyright 2004 Mobile Experts Group
All Rights Reserved.

Usage of this software requires compliance with this license. If you do not agree to the following terms, please do not use, install, or distribute this software.

1.0 Definitions.

1.1 For the purpose of this Agreement, "Software" shall mean the software identified above, including but not limited to any updates, modifications, revisions, copies, and associated documentation provided by Mobile Experts Group and its licensors.

2.0 Grant of License.

2.1 Evaluation Terms and Conditions. You may use this Software solely for evaluation purposes without charge for an unlimited period of time. You are free to distribute exact copies of the Software to anyone. You are prohibited from selling, or requesting donations, for any copies of the Software you distribute. You must include a copy of this license with any copy of the Software. You may not remove or alter any identification, proprietary notice, label, or trademarks which appear on or in the Software.

2.2 Full License Terms and Conditions. Use of the Software for non-personal use requires purchase of a full license. If you have not paid the registration fee, you may do so by visiting http://www.midletpascal.com on the Internet. After you have registered, you may personally use the Software on one or more computers, or allow multiple persons to non-simultaneously use the Software on a single computer, but not both. This is not a concurrent use license. If the Software is installed on a network server and accessed by multiple workstations, you must purchase a license for each computer on which the Software is used. You may not provide third parties access to the Software in connection with a service bureau, application service provider, or similar business, or use the Software in a business to provide file compression, decompression, or conversion services to third parties.

2.3 The Software includes the ability to create MIDlet applications. These applications archives may be freely distributed, without royalty, to anyone, as long as they have been created with registered version of MIDletPascal. Section 6 applies both to the Software and to generated MIDlet applications.

2.4 All rights of any kind in the Software which are not expressly granted in this license are entirely and exclusively reserved to and by Mobile Experts Group and its licensors.

3.0 Restrictions.

3.1 The information contained in the Software is confidential and proprietary to Mobile Experts Group and its licensors, and Mobile Experts Group and its licensors retain title to all copyright, patent, trademark, trade secrets, and other proprietary rights embodied in or related to the Software.

3.2 THE SOFTWARE CANNOT BE MODIFIED. YOU MAY NOT DECOMPILE, DISASSEMBLE OR OTHERWISE ATTEMPT TO ACCESS THE SOURCE CODE OF THE SOFTWARE; EXCEPT AND ONLY TO THE EXTENT PERMITTED APPLICABLE LAW NOTWITHSTANDING THIS LIMITATION.

4.0 Term.

4.1 This license is effective until terminated. Failure to comply with any provision provided in this Agreement or the use of the Software in a way not authorized or permitted under this Agreement will result in an automatic termination of this license. You agree upon such termination to destroy or dispose of the Software.

4.2 Paragraph 2.4 and Sections 3.0, 5.0, 6.0, and 7.0, including all paragraphs therein, shall survive termination this Agreement. All other rights and obligations of the Parties shall cease upon termination.

5.0 Upgrades, Maintenance and Support.

5.1 During the term of this Agreement, Mobile Experts Group is under no obligation to provide upgrades, maintenance, or installation for the Software. Mobile Experts Group may provide support for the Software as governed by the documentation, and other materials related to and included with the Software. Mobile Experts Group reserves the right to revoke or modify support provided for the Software at any time, for any or no reason.

6.0 Limited Warranty and Remedies.

6.1 THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY WARRANTY OF QUALITY, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. MOBILE EXPERTS GROUP DOES NOT WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT IT WILL OPERATE UNINTERRUPTED OR ERROR-FREE.

6.2 NOTHING IN THIS AGREEMENT SHALL BE CONSTRUED AS A WARRANTY OR A REPRESENTATION BY MOBILE EXPERTS GROUP THAT THE SOFTWARE WILL BE FREE FROM INFRINGEMENT OF THE INTELLECTUAL PROPERTY RIGHTS OF A THIRD PARTY. MOBILE EXPERTS GROUP HEREBY EXPRESSLY DISCLAIMS AND SHALL NOT BE RESPONSIBLE FOR ANY LIABILITY ARISING AS A RESULT OF OR IN CONNECTION WITH ANY CLAIM OR SUIT ALLEGING THAT THE DISTRIBUTION OR USE OF THE SOFTWARE INFRINGES THE RIGHT OF ANY THIRD PARTY.

6.3 IN NO EVENT WILL MOBILE EXPERTS GROUP, OR ITS LICENSORS BE LIABLE FOR LOSS OF DATA, COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES OR ANY SPECIAL, CONSEQUENTIAL OR INCIDENTAL DAMAGES, UNDER ANY CAUSE OF ACTION AND REGARDLESS OF WHETHER OR NOT MOBILE EXPERTS GROUP, OR ITS LICENSORS, HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THIS LIMITATION WILL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED REMEDY PROVIDED HEREIN. IN ANY EVENT, MOBILE EXPERTS GROUP'S, OR ITS LICENSORS' LIABILITY ARISING OUT OF THIS AGREEMENT, THE TERMINATION THEREOF, AND/OR THE PROVISION OF GOODS OR SERVICES HEREUNDER WILL BE LIMITED TO THE GREATER OF U.S. $1.00 OR THE AMOUNT PAID BY YOU FOR THE LICENSED SOFTWARE.

6.4 Some states do not allow the limitation or exclusion of incidental or consequential damages, so the above limitations or exclusions may not apply to you.

6.5 This warranty gives you specific legal rights, and you may also have other rights which vary from state to state.

7.0 General.

7.1 You agree to obtain any necessary export license or other documentation prior to exportation of the Software and you shall not export the Software or the direct product thereof in violation of the U.S. or other countries' export control laws.

7.2 The prevailing party in any legal action arising out of this Agreement shall be entitled to reimbursement for its expenses, including court costs and reasonable attorneys' fees, in addition to any other rights and remedies such party may have.

7.4 BY USING THE SOFTWARE YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, UNDERSTAND IT, AND AGREE TO BE BOUND BY ITS TERMS AND CONDITIONS; YOU FURTHER AGREE THAT IT IS THE COMPLETE AND EXCLUSIVE STATEMENT OF THE AGREEMENT RELATED TO THE SUBJECT MATTER HEREOF, SUPERSEDING ANY PROPOSAL OR PRIOR AGREEMENT, ORAL OR WRITTEN, AND ANY OTHER COMMUNICATIONS BETWEEN YOU AND MOBILE EXPERTS GROUP RELATING TO THE SUBJECT MATTER OF THIS AGREEMENT.


Отчёты об ошибках

Если вы встретили ошибку в программе, пожалуйста, уведомите нас о ней, с тем чтобы мы сделали MIDletPascal ещё лучше. Пожалуйста, посылайте письма с описанием ошибок по адресу bugs@midletpascal.com Если проблема касается проекта, над которым вы работаете, пожалуйста, вместе с письмом отправляйте архив ZIP, содержащий все файлы проекта, для того чтобы мы смогли выяснить, причину возникновения проблемы. Не забывайте указывать используемую вами версию MIDletPascal.


Регистрация

MIDletPascal распространяется на условиях shareware. Это означает, что вы можете загрузить и опробовать его бесплатно. Когда вы убедитесь, что данная среда удовлетворяет вашим требованиям, вам необходимо приобрести лицензию (дополнительную информацию можно получить на сайте http://www.midletpascal.com ).

Незарегистрированная версия не имеет ограничений по времени; однако, мидлеты, созданные с помощью незарегистрированной версии, отображают сообщение о том, что они созданы в незарегистрированной версии среды. Также, эти мидлеты имеют больший размер и работают медленнее. Вы можете использовать незарегистрированную версию MIDletPascal только в личных целях.

Приобретая у нас лицензию, вы получаете регистрационный номер для MIDletPascal. Регистрация пригодна для любой версии MIDletPascal, созданной в течение года с момента регистрации.