О 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-файла. Подстановка имён производится с указанием полного пути к файлу.