M I D l e t P a s c a l
О MIDletPascal

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

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

MIDletPascal поставляется с удобной графической IDE (Интегрированная Среда Разработки) для Windows95/2000/XP. IDE имеет встроенный компилятор, верификатор Java байткода, JAR запаковщик и генератор JAD файлов, так что вам больше практически не понадобятся другие инструменты для создания готового приложения.

Так как MIDletPascal генерирует низкоуровневый Java™ байткод, получаемые программы занимают мало места и работают очень быстро. Другие же программы, которые вы можете найти в сети Интернет, генерируют интерпретируемый код и пакуют его вместе с программой-интерпретатором в JAR файл - это порождает очень большой размер получившегося JAR файла и крайне медленное выполнение программы. Компилятор MIDletPascal прямо и очень быстро генерирует Java байткод, так что вам даже не понадобится иметь у себя Java компилятор, например, идущий в пакете Java Developer Kit (JDK) или других пакетах.


Лицензия

MIDletPascal End-User License
Copyright 2004, 2005 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 Non-commercial License Terms and Conditions. Use of this Software for non-commercial use (including, but not limited to personal, educational and research use) does not require purchase of a full license. Development of a commercial product using this Software terminates the Non-commercial License and you are required to obtain a Full Commercial License.

2.3 Full Commercial 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 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.4 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.5 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 БЕСПЛАТНА для частного использования. Это означает, что вы можете использовать её сколь угодно долго для создания некоммерческих программ.

Если вы хотите использовать MIDlet Pascal для написания коммерческих программ, вы должны получить на это лицензию (для более детальной информации перейдите по ссылке http://www.midletpascal.com/purchase.php ). Получив лицензию, вы получаете техническую поддержку, чего нет при бесплатном использовании программы.

Когда вы получите лицензию, мы вышлем вам регистрационный код программы. Регистрационный код подходит для всех версий MIDlet Pascal, вышедших в год получения лицензии.


Сообщения об ошибках

Если вы обнаружили ошибку в работе нашей программы, найдите время для сообщения об этой ошибке нам для того чтобы мы её исправили и сделали MIDlet Pascal лучше. Пожалуйста, обратитесь по ссылке http://www.midletpascal.com/support.php. Если проблема возникает в проекте, с которым вы работаете, то приложите ZIP архив с вашим проектом. Не забывайте также указывать версию MIDlet Pascal, в которой возникает данная ошибка.


Контакты

Если у Вас появились дополнительные вопросы, проблемы при создании собственного проекта, или Вы хотите пообщаться и поделиться своими знаниями с другими программистами на MIDlet Pascal, то добро пожаловать на форум http://forum.boolean.name/ (раздел MIDlet Pascal). Регистрируйтесь на форуме и вливайтесь в круги сцены MIDlet Pascal!

Над данным хелпом работали:

  • odd (он же автор руссифицированной версии MP)


Краткий туториал по языку MIDlet Pascal

Данный туториал поможет Вам начать программировать на MIDlet Pascal: покажет основы работы в среде разработки (IDE) и обучит основам написания программ для мобильных телефонов. Подразумевается, что Вы уже писали ранее программы на Паскале и имеете понятие об основах его синтаксиса.

Туториал содержит следующие главы:

1. Работа с интегрированной средой разработки (IDE) ...
Создание нового проекта, компиляция, тестирование программы с использованием различных эмуляторов, добавление ресурсов в проект...

2. Первая программа на MIDlet Pascal ...
Постигаем азы программирования на MP: учимся выводить текст на экран, опрашивать клавиатуру, рисовать картинки, использовать модули...

3. Пользовательский интерфейс ...
Используем встроенные в телефон формы для создания пользовательского интерфейса, использование команд, создание меню, всплывающих окон и т.п.

4. Хранилище записей ...
Использование хранилища записей для хранения информации...

5. Связь ...
Http соединение, отправка SMS

6. Советы для продвинутых пользователей ...
Написание и добавление собственных библиотек, конфигурации сборки, отладка, ресурсы...

7. Советы по улучшению производительности ...


Работа с IDE (интегрированной средой разработки)

В этой главе Вы узнаете как создавать новый проект, компилировать и запускать его в эмуляторе. Вы также узнаете добавлять другие эмуляторы и переключаться между ними. Вы узнаете как заливать ваше приложение в реальный телефон или WAP сайт. Под конец, Вы узнаете как добавлять в ваше приложение другие ресурсы, такие как картинки, мелодии и проч more resources into the project.

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

При запуске, главное окно MIDlet Pascal выглядит примерно так:

Для создания нового проекта, выберите пункт меню Файл --> Новый проект. На экране появится диалоговое окно:

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

После того как вы кликните кнопку Создать, MIDlet Pascal создаст папку с заданным именем и поместит туда все необходимые на первое время файлы. Если все операции прошли успешно, главное окно программы будет выглядеть примерно так:

Вы только что создали свой первый проект на MIDlet Pascal! Поздравляем!

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

Для компиляции вашего проекта выберите пункт меню Проект -> Компилировать или просто нажмите клавишу F7. MIDlet Pascal начнет компилировать ваш проект и вы увидите примерно такие строки в окне компиляции внизу экрана:

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

Если компиляция прошла успешно, MIDlet Pascal создаст два файла (их можно найти в папочке bin вашего проекта): JAD файл (Java Application Descriptor - Описание Java приложения) и JAR файл (Java Archive - Java архив с исполнимыми файлами и ресурсами). Оба файла необходимы для установки приложения на телефон (хотя многие продвинутые модели телефонов при отсутствии JAD файла могут генерировать его и самостоятельно). Обычно когда пользователь скачивает приложение из Интернета, он первым делом скачивает JAD файл, в котором содержится название, длина и адрес JAR файла в сети (URL). Если пользователь выбирает установку приложения, телефон самостоятельно скачает JAR файл с заданного адреса и произведет установку приложения.

Для тестирования вашего приложения на компьютере вам необходимо скачать и установить один либо несколько эмуляторов мобильного телефона. Самым мощным и универсальным эмулятором является эмулятор из пакета Wireless Toolkit корпорации Sun (его можно бесплатно скачать на сайте sun.com). Также Вы можете установить эмуляторы от производителей мобильных телефонов, таких как Nokia, Motorola, Samsung, Siemens или Sony Ericsson. Как установить несколько эмуляторов в MIDlet Pascal мы объясним ниже. По умолчанию, MIDlet Pascal считает, что у вас уже установлен пакет Wireless Toolkit и будет стараться использовать его.

Итак, для запуска вашего приложения выберите пункт меню Проект -> Запустить или просто нажмите F5. Если у вас уже установлен пакет WTK, то вы увидите примерно такое окно эмулятора телефона:

Теперь просто воспользуйтесь функциями вашего эмулятора для тестирования вашего приложения.

Использование нескольких эмуляторов

Как говорилось выше, Вы можете использовать более чем один эмулятор. В теории любой Java мидлет (включая те, что были написаны на MIDlet Pascal) должны работать на любом устройстве с поддержкой Java, но на практике такого часто не происходит. Во первых, старые телефоны поддерживают профиль MIDP1.0, а более новые - профиль MIDP2.0. Поэтому у Вас не получится запустить приложение, написанное под MIDP2.0 на телефоне с поддержкой MIDP1.0. Другая немаловажная проблема - это размер экрана: если Ваше приложение хорошо смотрится на экране 128x160 точек, то на экране 128x128 точек пользоваться им будет совершенно невозможно.

При профессиональной разработке приложений Вам нужно быть уверенным, что данный мидлет будет корректно работать на всех требуемых устройствах, поэтому для продвинутых пользователей даже рекомендуется использовать более чем один эмулятор. Давайте покажем как добавлять в MIDlet Pascal дополнительные эмуляторы и как переключаться между ними при тестировании мидлета.

Выберите меню Опции -> Настройки программы. На экране появится диалог покказанный ниже. Кликните по иконке Эмулятор слева и на экране отобразится диалог свойств эмуляторов:

Now you want to add the Nokia emulator. Select Add… button, and the following window will appear on the screen:

Enter the name of the emulator in the Emulator description field, such as Nokia 3650. Enter the path to the emulator executable file in the Run command field. The emulator executable usually takes a command-line argument that tells it which MIDlet to run. The command line argument may be the path to the JAD file or to the JAR file. If it is the path to the JAD file, enter %JAD%, or, similarly, if it is the path to the JAR file, enter %JAR%. In case of the Nokia 3650 emulator, the Run command is:

C:\Nokia\Devices\Nokia_3510i_MIDP_SDK_v1_0\bin\3510i.exe %JAD%

Click the Add button and you will see that Nokia 3650 appears in the list below the Default emulator. Then add the Motorola emulator just like you added the Nokia emulator. MIDletPascal supports up to 128 different emulators.

When you want to change the currently used emulator, click on the down arrow next to the Run MIDlet icon on the toolbar, and select the emulator that you want to use.

Installing application on the mobile phone

There are two ways of installing your MIDlet application on the mobile phone: you can connect your phone to the computer, or you can connect your phone to the Internet and download the MIDlet.

The mobile phone can connect to the computer using IrDA, Bluetooth or data cable. Phone manufacturers provide software for transferring data to the phone. Refer to your phone manufacturer's manuals for detailed instructions on transferring data onto your mobile phone. You should copy two application files on the phone, the JAD and JAR file. These files can be found in the \bin subdirectory of your project's directory.

When distributing your application, you will most probably use the Internet. You will need to upload both the JAD and JAR file to a web or wap server. Anyone who wants to download the MIDlet application should download the JAD file (so all links to your application should point to the JAD file), and the mobile phone will automatically download the corresponding JAR file. However, before uploading, you should change the JAD file so that it contains the proper URL of the JAR file.

For example, let's say that you will upload your application's JAD and JAR files to http://www.myserver.com/midlets/ location. If the application name is Test, you will have Test.jar and Test.jad files inside \Test\bin directory. Open the Test.jad file with Wordpad text editor (do not use Notepad for this!), and locate the line:
MIDlet-Jar-URL: Test.jar
Change it to contain the full URL:
MIDlet-Jar-URL: http://www.myserver.com/midlets/Test.jar
Save the changed JAD file and upload it to the server.

Adding resources to the project

When you create the new MIDletPascal project, it will contain a single resource file that is used as an application icon. You may want to add more resource files such as images (in PNG file format) or sound files.

To import an existing file from your local disk into the MIDletPascal project, select Project -> Import resource file… menu. You will be asked to locate the file, which will be copied into the \res subdirectory in your project's directory. When the file is imported into the project, you should see it in the Files list on the left side of the MIDletPascal window.

You can also insert a new image file into the project. New image file can be created by selecting Project -> New image resource… menu. You will be asked for the image name and the image dimensions. Mobile Java only supports PNG images.

MIDletPascal contains a simple image editor that can be used for editing image resources. When you want to edit the image resource, double-click the resource in the Files list, and MIDletPascal will open the image editor:


First MIDletPascal program

After reading the first chapter you should know how to work with MIDletPascal environment. This chapter will show you how to write simple applications that draw on the device display, read keyboard input and use units to separate the program source code into multiple files.

Hello world

If you have already programmed in Pascal, you would write Hello world program like this:

program HelloWorld;

begin
  Writeln('Hello world'); // this will not work in MIDletPascal !!!
end.

However, the procedure Writeln writes the text to standard output – that is the MS-DOS console window. Mobile phones don't have MS-DOS nor they have console window. Writing text on the mobile device display is more like 'drawing' that 'outputting'. To draw the text on device display, use procedure DrawText which takes 3 arguments: the string to write, and screen coordinates of the upper-left corner of the text bounding rectangle. Since all drawing operations are done on the memory buffer, you must call Repaint when you want to update the device display:

program HelloWorld;

begin
  DrawText('Hello world', 0, 0);
  Repaint;
end.

If you compile this program and try to run it, you will get the impression that the program does not get executed. In fact, the program starts, draws the text and terminates almost instantly. To see the result of the drawing operation, call procedure Delay which suspends the execution of the application for the given number of milliseconds:

program HelloWorld;

begin
  DrawText('Hello world', 0, 0);
  Repaint;
  Delay(2000);
end.

Procedure Repaint slow compared to drawing procedures such as DrawText. That is why Repaint should be called only when needed. The following example illustrates bad use of Repaint:

begin
  DrawText('Hello world', 0, 0);
  Repaint;
  DrawText('Other text', 0, 20);
  Repaint;
end.

The same program can be rewritten to improve performance:

begin
  DrawText('Hello world', 0, 0);
  DrawText('Other text', 0, 20);
  Repaint;
end.

Reading from the keypad

MIDletPascal provides two functions for reading from the device keypad: GetKeyPressed and GetKeyClicked. GetKeyPressed returns the key code of the key that is currently pressed. GetKeyClicked returns the key code of the last clicked key.

MIDletPascal has following key code constants predefined: KE_NONE, KE_KEY0, KE_KEY1, KE_KEY2, KE_KEY3, KE_KEY4, KE_KEY5, KE_KEY6, KE_KEY7, KE_KEY8, KE_KEY9, KE_STAR and KE_POUND. These keys have the same standard key codes on all mobile phones. Unfortunately, arrow keys and other special keys have key codes that differ from one mobile phone model to the other. To get around this problem, MIDletPascal offers a function which translates the key code into an action code. The function is KeyToAction; it takes a key code as the only parameter and returns one of the following predefined constant values: GA_NONE, GA_UP, GA_DOWN, GA_LEFT, GA_RIGHT, GA_FIRE, GA_GAMEA, GA_GAMEB, GA_GAMEC, GA_GAMED.

The following example allows the user to move the text on the screen using the arrow keys. The program terminates when the user presses the fire or zero key.

program MoveText;

var x, y: integer;
    keyCode: integer;

begin
  repeat
    keyCode := GetKeyPressed; // retrieve the currently pressed key

    if  KeyToAction(keyCode) = GA_UP    then y := y - 1;
    if  KeyToAction(keyCode) = GA_DOWN  then y := y + 1;
    if  KeyToAction(keyCode) = GA_LEFT  then x := x - 1;
    if  KeyToAction(keyCode) = GA_RIGHT then x := x + 1;

    SetColor(255, 255, 255); // set the drawing color to white
    FillRect(0, 0, GetWidth, GetHeight);  // erase the screen by drawing a
                                          // rectangle as big as display

    SetColor(0, 0, 0); // set the drawing color to black
    DrawText('Hello world', x, y); // draw the text to the given position

    Repaint;
    Delay(100);

  until (keyCode = KE_KEY0) or (KeyToAction(keyCode) = GA_FIRE);

end.

Sometimes you might want the user to input some text. Using GetKeyPressed and GetKeyClicked for this purpose is almost impossible. User input is handled by forms, which are described in the next chapter.

Drawing images

In the next example we will implement a simple screen-saver. The screen saver will bounce the MIDlet icon:

program ScreenSaver;

const up    = 1; // these constants define the direction
      down  = 0; // in which the icon moves
      left  = 1;
      right = 0;

var x, y      : integer; // the current icon's left upper corner position
    img       : image;   // handle of the image object
    direction_x,
    direction_y  : integer; // the movement direction

begin
  img := loadImage('/icon.png');

  repeat
    // move the icon according to the current direction
    if  direction_y = up    then y := y - 1;
    if  direction_y = down  then y := y + 1;
    if  direction_x = left  then x := x - 1;
    if  direction_x = right then x := x + 1;

    // check if the icon hit the display border
    if  x = 0 then direction_x := right;
    if  x = (GetWidth – GetImageWidth(img)) then direction_x := left;
    if  y = 0 then direction_y := down;
    if  y = (GetHeight – GetImageHeight(img)) then direction_y := up;

    SetColor(255, 255, 255);
    FillRect(0, 0, GetWidth, GetHeight);
    DrawImage(img, x, y);
    Repaint;
    Delay(50);
  until GetKeyPressed <> KE_NONE;
end.

Using units

When developing large programs, having only one source file is a major drawback. You cannot get around in hundreds of functions and procedures, and all the functions, procedures and global variables that you use are not grouped by their functionality. To solve this problem, you can use units just like in any standard Pascal.

There are few minor differences between MIDletPascal units and regular Pascal units. In regular Pascal, you can have as many units in a source file as you want. In MIDletPascal, you can have only one unit per file, and the file name must correspond to the unit name. MIDletPascal does not support finalization block that regular Pascal units can have. And finally, in MIDletPascal, units are tied to the project – if you want to use a unit from one project in another, you must create the unit in the other project, and copy the source code.

To illustrate how the units can be used in MIDletPascal, we will write a simple application that uses units.

First, create a new MIDletPascal project; let's name it TestUnits. Then select Project -> New source file…menu, and enter Complex as unit's name.

Enter the following code in the file Complex.mpsrc:

unit Complex;

interface

  type complex = record
    real_part, imag_part: real;
  end;

  function Add(a, b: complex): complex;
  function Sub(a, b: complex): complex;
  function MakeString(a: complex): string;

implementation

  function Add(a, b: complex): complex;
  begin
    add.real_part := a.real_part + b.real_part;
    add.imag_part := a.imag_part + b.imag_part;
  end;

  function Sub(a, b: complex): complex;
  begin
    sub.real_part := a.real_part - b.real_part;
    sub.imag_part := a.imag_part - b.imag_part;
  end;

  function MakeString(a: complex): string;
  begin
    MakeString := '' + a.real_part + ' + ' + a.imag_part + 'j';
  end;

end.

Enter the following code in file TestUnits.mpsrc:

program TestUnits;

uses Complex;

var x, y: Complex.complex;

begin
  x.real_part := 2; x.imag_part := 3; // x := 2 + 3j
  y.real_part := 0; y.imag_part := 1; // y := j

  x := Complex.Add(x, y);

  DrawText(MakeString(x), 0, 0);
  // if more units define identifier MakeString, then write:
  // DrawText(Complex.MakeString(x), 0, 0);

  Repaint;
  Delay(2000);
end.

Units may use one another – if you want to use one unit from within the other, write
uses UnitName;
right after the implementation keyword. However, units may not be used circularly, that is, unit A cannot use unit B if unit B already uses unit A.
The units may contain initialization code. This is the code that is guaranteed to execute before any function, procedure or variable from the unit is accessed. The initialization code should be written after the initialization keyword, like in the following example:

unit Unit_X;

interface
  var x:integer;

implementation
 // nothing to be implemented here

initialization
  x := 17;

end.


User interfaces

If you want to create a simple program that asks the user to enter his/hers name, and then displays that name on the display, you need something more powerful than GetKeyClicked or GetKeyPressed functions. The more powerful mechanism is called forms and you can create complex user interfaces using forms. Forms are very similar to dialog boxes in windows.

A simple form application

We'll just start by creating a simple program that uses a form to retrieve the user's name, and then writes 'Hello, <entered name>' on the screen. Here is the code for that program:

program HelloForm;

var itemId : integer;
     cmdNext : command;
     cmdQuit : command;
     name : string;

begin
  // switch to form mode from default canvas mode
  ShowForm;

  // add a text field to the form
  itemId := FormAddTextField('Enter your name', '', 20, TF_ANY);

  // create a command (button)
  cmdNext := CreateCommand('Go!', CM_OK, 1);
  AddCommand(cmdNext);

  // wait until the user clickes on Go! command
  repeat until GetClickedCommand = cmdNext;

  // retrieve the entered name
  name := FormGetText(itemId);

  // switch back to canvas mode and draw the text
  ShowCanvas;

  DrawText('Hello, ' + name + '!', 0, 0);
  Repaint;

  // create a quit command
  cmdQuit := CreateCommand('Quit', CM_EXIT, 1);
  AddCommand(cmdQuit);
  repeat until GetClickedCommand = cmdQuit;
end.

The program produces the following form:

form1-1
form1-2

There are few things to be noticed. First is, you must call ShowForm to switch to form mode before inserting elements to form. FormAddTextField creates a text field and returns its identifier. The same identifier is used later to retrieve the text from the text field.

Commands are interesting because they can be used both in form mode and in canvas mode. Exception to this are canvases while using full screen mode (more on fullscreen mode in chapter 6).

The forms can contain a title. To set the form title, use SetFormTitle procedure.

More form elements

In previous example we saw how to create a simple form. Now we will illustrate how to create a more complex form:

program HelloForm;

var
  stringID, textID, passID,
  imgID, gaugeID, choiceID,
  maleID, femaleID: integer;

  cmdQuit, cmdResetName, clicked : command;

begin
  ShowForm;

  SetTicker('This is a ticker control');

    // add some elements
    stringID := FormAddString('Just some title');
    textID := FormAddTextField('Enter name', 'Mr. Smith', 20, TF_ANY);
    passID := FormAddTextField('Enter password', '', 20, TF_PASSWORD);
    imgID := FormAddImage(LoadImage('/icon.png'));
    gaugeID := FormAddGauge('Choose your age', true, 100, 18);
    choiceID := FormAddChoice('Select your gender', CH_EXCLUSIVE );

    // set up the choice control
    maleID := ChoiceAppendString(choiceId, 'Male');
    femaleID := ChoiceAppendString(choiceId, 'Female');

    // create commands
    cmdQuit := CreateCommand('Quit', CM_EXIT, 1);
    AddCommand(cmdQuit);
    cmdResetName := CreateCommand('Reset', CM_SCREEN, 1);
    AddCommand(cmdResetName);

    repeat
      clicked := GetClickedCommand;
      if clicked = cmdResetName then FormSetText(textID, '');
    until clicked = cmdQuit;

end.

form2-1
form2-2

To retrieve the data from the text field, use FormGetText function; to retrieve the value from the gauge control, use FormGetValue function. ChoiceIsSelected and ChoiceGetSelectedIndex functions are useful to find selected elements inside a choice list.

For more detailed information about forms, see Forms section in Procedure and function reference part of this manual.

Menus

Beside canvas and form mode, MIDletPascal supports few more modes. One of these modes is menu mode. The following code illustrates use of menu mode:

program Menu;

var tetris, minesweeper, snake : integer;
    play, clicked : command;

begin
  ShowMenu('Select a game', CH_IMPLICIT);

  tetris := MenuAppendString('Tetris');
  minesweeper := MenuAppendString('Minesweeper');
  snake := MenuAppendStringImage('Snake', LoadImage('/icon.png'));

  play := CreateCommand('Play', CM_SCREEN, 1);
  AddCommand(play);

  repeat Delay(100); until GetClickedCommand = play;

  {
    do something like this:
    if menuGetSelectedIndex = tetris then playTetris;
    if menuGetSelectedIndex = minesweeper then playMinesweeper;
    if menuGetSelectedIndex = snake then playSnake;
    ...
  }
end.

Alerts

Another mode is alert mode. Alerts are simple message boxes, as illustrated in the following example program:

program Alert;

begin
  ShowAlert('New message',
            'You have just received a message from MrSmith',
            LoadImage('/icon.png'),
            ALERT_INFO
           );
  PlayAlertSound;

  Delay(2500);
end.

Fullscreen text box

The final display mode is full screen text box. Unlike text field that is single-line, text box can contain multiple lines of text. Text box is useful when the user needs to enter large quantities of text, such as message text. The following example shows how to use full screen text box from within your application:

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.

In this chapter full of examples you learned how to use form, alert, menu and textbox display modes to create rich user interfaces. For more detailed information on specific controls, refer to Procedure and function reference part of this manual. The next chapter will teach you how to store persistent data on the mobile device.


Хранилище записей

Очень часто в приложении или игре возникает необходимость сохранить какую-либо информацию. К примеру, для игры это может быть таблица рекордов или текущий уровень, чтобы при последующем запуске игры, пользователь мог продолжить играть с прошлого достигнутого уровня; для приложения - это могут быть какие-то настройки и т.п. На компьютере в этих целях обычно пользуются записью в файл или в реестр. В мобильном телефоне нет реестра, да и доступа к файловой системе тоже во многих случаях нет, по-этому эти способы нам не подходят. Специально для этих целей в телефоне предусмотрена область памяти на флеш карте, названная Хранилищем Записей (Record Store или просто RMS).

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

Итак, вы усвоили, что каждое мобильное приложение имеет своё отдельное Хранилище Записей. Давайте разберемся подробнее, как же именно хранится там информация. Каждое Хранилище Записей состоит из одного или множества разделов, которые различаются по именам. То есть, к примеру, игра может иметь 2 раздела: records (в котором хранится таблица рекордов) и level (где хранится текущий уровень игры). Как вы понимаете, все названия разделов должны быть уникальными и состоять только из латинских букв или цифр. Максимальная длина имени раздела - 32 символа. Для того чтобы открыть раздел Хранилища служит функция OpenRecordStore. Эта функция принимает всего один аргумент - название раздела, и возвращает объект типа RecordStore. Если при попытке открытия раздела окажется, что раздела с таким именем нет, то ничего страшного не произойдет. Просто создастся новый пустой раздел с данным именем. Чтобы закрыть раздел Хранилища записей нужно вызвать процедуру CloseRecordStore. Чтобы удалить раздел в Хранилище Записей (и всю информацию в нем), используйте процедуру DeleteRecordStore.

Итак, движемся дальше. Каждый раздел в Хранилище Записей имеет собственно записи, которые выглядят в виде обычных текстовых строк. Каждая такая строка имеет свой номер. Это напоминает хранение строк в массиве. Тут тоже наблюдается отличие от компьютера, где программа может хранить информацию в бинарном или текстовом формате, тут же используется только текст. Вы можете узнать количество записей в вашем хранилище, воспользовавшись функцией GetRecordStoreSize. Для чтения записи из хранилища, используется функция ReadRecordStoreEntry, которая принимает 2 аргумента: объект типа RecordStore и номер записи, а возвращает строку текста, которая хранится под данным номером. Чтобы добавить новую запись в раздел хранилища, используют функцию AddRecordStoreEntry, которая возвращает номер, под которым была сохранена данная запись. Функция GetRecordStoreNextId возвращает следующий незанятый номер записи, который будет использован в случае добавления записи функцией AddRecordStoreEntry. Чтобы изменить строку, хранящуюся в разделе, используйте процедуру ModifyRecordStoreEntry. Ну и наконец, чтобы удалить запись из раздела нужно вызвать процедуру DeleteRecordStoreEntry.

Пример: Первая запись в хранилище всегда имеет номер 1. Вызов функции AddRecordStoreEntry добавит запись и присвоит ей номер 2. Следующей записи присвоится номер 3, и т.п. Если вы удалите запись под номером 1, и после этого добавите запись функцией AddRecordStoreEntry, новая запись будет сохранена под номером 4, а запись под номером 1 так и останется пустой (то есть, другими словами, дефрагментация записей в хранилище не делается). Вызов функции GetRecordStoreNextId вернет 5 (номер следующей незанятой записи), и GetRecordStoreSize вернет 3 (общее количество записей), потому что после удаления первой записи, в разделе осталось всего 3 из 4 записей.

Приведенный ниже пример кода подсчитывает и сохраняет в Хранилище Записей количество запусков программы (что может быть использовано, например, для ограничения количества запусков в демонстрационных версиях приложения):

var rs : RecordStore;
countStr : string;
countInt : integer;
index : integer;
nextId : integer;
begin

// открываем раздел хранилища записей
rs := OpenRecordStore('Count');

nextId := GetRecordStoreNextId(rs);

// если это первый запуск программы - добавляем запись в хранилище
if nextId = 1 then
index := AddRecordStoreEntry(rs, '0'); // устанавливаем счетчик в 0

// читаем содержимое счетчика
countStr := ReadRecordStoreEntry(rs, 1);

// увеличиваем значение счетчика на 1
countInt := StringToInteger(countStr) + 1;
countStr := IntegerToString(countInt);

// записываем измененное значение счетчика назад в хранилище
ModifyRecordStoreEntry(rs, countStr, 1);

// закрываем раздел хранилища записей
CloseRecordStore(rs);

// отображаем значение счетчика
ShowForm;
index := FormAddString('Ты уже запускал эту программу ' + countStr + ' раз.');

AddCommand(CreateCommand('Выход', CM_EXIT, 1));
repeat Delay(100) until GetClickedCommand <> EmptyCommand;

end.

ПРИМЕЧАНИЕ: MIDlet Pascal не умеет корректно сохранять записи на русском языке. По-этому для хранения таких записей нужно воспользоваться специальной библиотекой или перекодировать строки текста в формат Win-1251, а после чтения их, перекодировать строки обратно в формат UTF-8. Также следует помнить, что операции с флеш памятью довольно медленные, что может привести к заметным задержкам в приложении при чтении/записи больших объемов информации.


Connectivity

Http connectivity

A mobile phone can be connected to the Internet using a WAP connection. MIDlet application can initiate the connection and then send or retrieve some data on the Internet. When connecting to the Internet from your MIDlet application, be aware that mobile network operators charge Internet access and the fees are high in some countries.

All mobile phones that can connect to the Internet must support the HTTP protocol, so MIDletPascal defines functions for using HTTP protocol. Some (high-end) phones also support other protocols (such as UDP, for example). If you want to use other protocols from your MIDlet application, you will have to create your own library unit (this is explained in the next chapter).

MIDletPascal defines a type HttpConn that is used as a HTTP connection identifier. The following example retrieves a web page:

var conn : http;
htmlBody : string;
contentType : string;

begin
// try to open a HTTP connection to www.google.com
if not OpenHttp(conn, 'http://www.google.com') then Halt;

// set the HTTP method (other supported methods are HEAD and POST)
SetHttpMethod(conn, GET);

// insert a User-agent header field
AddHttpHeader(conn, 'User-agent', 'MIDletPascal browser');

// send HTTP request and check if the reply code is 200 (200 = OK)
if SendHttpMessage(conn) <> 200 then Halt;

// read the HTTP response body
htmlBody := GetHttpResponse(conn);

// read Content-type response header field
contentType := GetHttpHeader(conn, 'Content-type');

// close the open connection
CloseHttp(conn);
end.

SMS messaging

MIDlet applications can send SMS messages automatically. MIDletPascal provides functions for sending SMS messages. The functions are: SmsStartSend, SmsIsSending and SmsWasSuccessfull. The following example sends an SMS to another phone:

begin
  // start sending SMS to phone number +5550000
  if not SmsStartSend('sms://+5550000', 'Hello!') then Halt;

  // wait until the message is sent
  while SmsIsSending do
    Delay(100);

  // check if the message was sent successfully
  if not SmsWasSuccessfull then Halt;
end.


Advanced features

Custom library units

MIDletPascal does not provide functions that access the complete MIDP API. However, if you need to call a MIDP API function that is not supported by MIDletPascal, you don't need to wait for the next version of MIDletPascal. You can extend the MIDletPascal functionality on your own by creating a library unit.

A library unit is used from your MIDletPascal program just like any other unit. To use the unit, write

uses unit_name;

at the beginning of your program. To call a function or procedure that is located inside the unit, write

procedure_name(parameters...)

If more units define the same procedure_name, use the following syntax to resolve ambiguity:

unit_name.procedure_name(parameters...)

The differences between library units and regular units are the following:

· library units are written in Java, not MIDletPascal
· library units reside in {app_install_path}\Libs directory, not your project's directory
· library units can only contain functions and procedures, not types or variables
· functions and procedures that reside in library units can only work with the following data types: integer, string, image, recordStore and command

So let's write a simple library unit. You must have Sun Java Development Kit and Sun Wireless Toolkit installed on your computer to be able to compile the library units (both can be freely downloaded from java.sun.com). Let JDK register environment variables during the install process. In the following code we will assume that Wireless Toolkit is installed in c:\wtk21\ directory.

Create the directory for your library unit, c:\MyLib. In this directory, create three subdirectories: src\, tmpclasses\ and classes\. In subdirectory src\ create the file Lib_mylib.java with the following contents (Java is case-sensitive unlike Pascal!):

// library unit class MUST NOT be contained in any package!!!

// class name must be prefixed with Lib_ and all letters except
// the starting L must be lowercase
public class Lib_mylib
{
  // all functions must be static, and all letters in the
  // function name must be lowercase
  public static int square(int val)
  {
    return val * val;
  }

  public static int count_numbers(String text)
  {
    int count = 0;
    int i;
    for(i = 0; i < text.length(); i++)
    {
      if ((text.charAt(i) >= '0') && (text.charAt(i) <= '9'))
        count ++;
    }
    return count;
  }
}

To compile the file, open command prompt window, enter the directory c:\MyLib\src, and type (in a single line):

C:\MyLib\src>javac -g:none -classpath
c:\MyLib\tmpclasses;c:\WTK21\lib\midpapi20.jar;c:\WTK21\lib\cldcapi10.jar
-d c:\MyLib\tmpclasses Lib_mylib.java

The position to c:\MyLib directory and enter the following command:

C:\MyLib>c:\WTK21\bin\preverify.exe -classpath          c:\MyLib\tmpclasses;c:\WTK21\lib\midpapi20.jar;c:\WTK21\lib\cldcapi11.jar
-d c:\MyLib\classes Lib_mylib

The file Lib_mylib.class found in c:\MyLib\classes directory is a library unit file that will be used by MIDletPascal. Copy in to c:\Program Files\MIDletPascal2\Libs\ directory.

Now you can use the library unit in your MIDletPascal project:

uses MyLib;

var idx : integer;
begin
  ShowForm;

  idx := FormAddString('5 squared is: ' + MyLib.square(5));

  idx := FormAddString('There are ' +
                       MyLib.count_numbers('a0b2c') +
                       ' numbers in ''a0b2c'' ');
  Delay(5000);
end.

Let's say that you want to create a library unit with the functions vibrate and flash_backlight. MIDP API functions for vibrating and flashing are called on the MIDlet's Display object. To retrieve the Display object from your library unit, use a little trick: create another file in c:\MyLib\src directory, name it FW.java, and enter the following code into the new file:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class FW extends MIDlet
{
  public static FW fw; // the active MIDlet object
  public Display display; // the current display object
  public static Displayable CD; // the current Displayable object

  public void startApp()
  {}

  public void pauseApp()
  {}

  public void destroyApp(boolean unconditional)
  {}
}

Then add the two functions into Lib_mylib.java:

public static void vibrate(int duration)
{
  FW.fw.display.vibrate(duration);
}

public static void flash_backlight(int duration)
{
  FW.fw.display.flashBacklight(duration);
}

Compile the two files:

C:\MyLib\src>javac -g:none -classpath
c:\MyLib\tmpclasses;c:\WTK21\lib\midpapi20.jar;c:\WTK21\lib\cldcapi10.jar
-d c:\MyLib\tmpclasses FW.java

C:\MyLib\src>javac -g:none -classpath
c:\MyLib\tmpclasses;c:\WTK21\lib\midpapi20.jar;c:\WTK21\lib\cldcapi10.jar
-d c:\MyLib\tmpclasses Lib_mylib.java

And preverify the library unit file:

C:\MyLib>c:\WTK21\bin\preverify.exe -classpath          c:\MyLib\tmpclasses;c:\WTK21\lib\midpapi20.jar;c:\WTK21\lib\cldcapi11.jar
-d c:\MyLib\classes Lib_mylib

Once again, copy the Lib_mylib.class from c:\MyLib\classes\ directory into
c:\Program Files\MIDletPascal2\Libs directory.

Now you are ready to use the new functions in your MIDletPascal program:

uses MyLib;

var idx : integer;
begin
  MyLib.vibrate(1000);
  MyLib.flash_backlight(1000);
  Delay(5000);
end.

Final note: functions vibrate and flashBacklight are MIDP2.0 compatible. Older phones that support MIDP1.0 will crash if you try to execute the sample program. To avoid the possible crash, add exception handler to your library unit functions:

public static void vibrate(int duration)
{
  try
  {
    FW.fw.display.vibrate(duration);
  } catch (Exception e) { }
}

public static void flash_backlight(int duration)
{
  try
  {
    FW.fw.display.flashBacklight(duration);
  } catch (Exception e) { }
}

Build configurations

Imagine that you are developing a professional MIDlet game and two mobile operators buy that game from you. Each of the operators wants that his logo is displayed when the game starts. The obvious solution is to develop a game, and, when a game is finished, create a new MIDletPascal project, copy the code from the original project and only change the logo image.

However, it is possible that a mobile operator tests your game and finds a bug. Now you have two projects where you have to fix the bug (you may fix the bug in one project, and then copy-paste the changes, but this copy-paste process may generate more bugs if you don't do it carefully).

Another similar situation may occur if your MIDlet must be optimised both for devices with 128x128 display and 220x160 display. You would create two projects, one for devices with smaller, and the other for devices with larger display. Both MIDlets would only differ in image resources and a bit of drawing code.

To avoid creating multiple projects, MIDletPascal offers build configurations. You can define multiple build configurations in your MIDletPascal project. When you build your MIDlet, you select which build configuration should be used. You can specify which resources will be included in which configurations and some parts of the source code can be compiled only for specific build configurations.

Use of build configurations will be described in a simple MIDlet application. We want to create a MIDlet that will display an image in the center of the screen. We want to have two version of a MIDlet. The first version will display black & white image, while the other version will display a color image on a MIDP2.0 full-screen canvas.

Using build configurations you can also specify which kind of rela number support you need in your application. Fixed-point arithmetic is fast, doesn't take up a lot of JAR space, but its precision is very low. Floating-point arithmetic is slower than fixed point, takes much more JAR space, but is very precise.

Let's start by creating a new project, Configs. After the project has been created, select Project -> New image resource… and add a new image called bw_img.png (make the size of the image 50x50). Draw something on the image (using black color), and save the image. Then add the new image, color_img.png, and draw something on it using more colors. Save that image.

After we have created required images, we are ready to set up the build configurations. Select Properties tab located at the bottom of the left sidebar. One build configuration already exists, and it is called Default. Rename that build configuration to be called BlackWhite. Leave all other properties untouched. Now press the New button located at the bottom of the sidebar. A new build configuration will appear in the list. Change its name to Color, its MIDlet type to MIDP2.0 Fullscreen and its MIDP version to MIDP2.0. Save all changes to your project.#bc

Finally you are ready to edit the source code. First write the code that will display black & white image:

var img: image;
begin
    img := LoadImage('/bw_img.png');
    DrawImage(img,
             (GetWidth – GetImageWidth(img))/2,
             (GetHeight – GetImageHeight(img))/2
             );
    Repaint;
    Delay(5000);
end.

The line with the call to LoadImage should be different for the second build configuration. MIDletPascal uses preprocessor statements to define which parts of code should be compiled for a given build configuration. The preprocessor statements available are:
· {$ifdef build_configuration_name}
· {$ifndef build_configuration_name}
· {$else}
· {$endif}

The modified code that works with both build configurations looks like this:

var img: image;
begin
    {$ifdef BlackWhite}
    img := LoadImage('/bw_img.png');
    {$else}
    img := LoadImage('/color_img.png');
    {$endif}

    DrawImage(img,
             (GetWidth – GetImageWidth(img))/2,
             (GetHeight – GetImageHeight(img))/2
             );
    Repaint;
    Delay(5000);
end.

To determine which configuration will be built, use the drop-down menu next to the build button:

Finally, we don't want to have bw_img.png in Color build configuration and vice-versa. Select back the Files tab, and in the files list, select the bw_img.png. A list with all available build configurations appears. Uncheck the Color checkbox:

Then select the color_img.png and uncheck the BlackWhite configuration.

Debugging

MIDletPascal IDE currently does not support standard debugging. MIDletPascal, however, provides two procedures that can help in debugging your program. Both of these procedures write some text to the standard output. The standard output is availabe only when the application is run in the emulator; when the application is run on the device, there is no output.

You must set up your emulator to display the standard output. If you have installed Wireless Toolkit, do this as follows: open Configure -> Program options… menu, then select Emulator menu entry, click on Add… button and enter Debug emulator as emulator name and
C:\WTK21\bin\emulator.exe -Xdescriptor %JAD%
as the command string.

The first procedure is Debug; it takes one string parameter. This procedure simply writes the given string to the standard output.
The second procedure is Assert and it takes a boolean value as the parameter. If that value is false, the procedure will write something like this to the standard output:

Assertion failed at: Tetris.mpsrc:162

Take a look at a simple program that uses these two procedures:

begin
  Debug('Some text');
  Assert(false);
end.

When you want to run your MIDlet application in debug mode, select Debug emulator as current emulator and run the application. A console window with the standard output will appear together with the emulator window:

Resources

Resources are files that are included in your applications JAR file together with the executable code. Resources are usually images or music files. Sometimes it is useful to include a custom resource file into your project – for example, if you develop a dictionary application, you don't want your program to be full of if-then statements:

  if englishWord = 'fish' then italianWord := 'pesce';
  if englishWord = 'dog' then italianWord := 'cane';

This is a very bad aproach for two reasons: the size of your application will be very large, and the size of your application will be very large (this is not a typo; I want to underline that the applications size will be large).

Instead, you can create a file, dictionary.txt, which will contain one word per line like this:

…
fish
pesce
dog
cane
…

and add this file as a resource into your project. The function that translates the word would be coded like this:

function EnglishToItalian(englishWord: string): string;
var italianWord : string;
    res         : resource;
    line        : string;
    pos         : integer;
begin
  res := OpenResource('/dictionary.txt'); // the name is case-sensitive!

  if (ResourceAvailable(res)) then
  begin
    repeat
      line := ReadLine(res);

      if line = englishWord then
      begin
        italianWord := ReadLine(res);
        break;
      end;
      else
        line := ReadLine(res); // skip over italian word

    until length(line) = 0;
  end;

  englishToItalian := italianWord;
end;


Performance notes

When developing MIDlet applications be aware that processors used in mobile phones are tipically 20-40 times slower than processor found in desktop computers. You should test your application on real devices (not only emulators) during development cycle to ensure that all modules execute fast enough. This short chapter lists all operations that are very slow, and gives you tips on how to make them faster.

Large data types

Working with large data types is slow. Large data types include: arrays, records, Image, Command, RecordStore, Http and Resource. To improve performance, you should reduce the number of variables of these types to minimum. If possible, use global variables of these types instead of local variables. The two following programs are identical; however, the second runs faster:

program prog1;

procedure menu;
var cmdQuit : command;
begin
  cmdQuit :=  CreateCommand('Quit', CM_EXIT, 1);
  AddCommand(cmdQuit);

  repeat Delay(100); until GetClickedCommand() != EmptyCommand;
end;

begin
  menu;
end.

program prog2;
var cmdQuit : command;

procedure menu;
begin
  cmdQuit :=  CreateCommand('Quit', CM_EXIT, 1);
  AddCommand(cmdQuit);

  repeat Delay(100); until GetClickedCommand() != EmptyCommand;
end;

begin
  menu;
end.

Using two-dimensional (or higher) arrays is also slow, so use them only when they are really necessary. If you really need two-dimensional arrays, make them global (instead of local) to improve performance.

Drawing

Drawing operations that draw into memory, such as DrawEllipse or DrawText are not slow. The operation that draws directly on to the device display, Repaint, is very slow operation. Be carefull to call Repaint only when you really need to update the device display.

Real numbers

Real number operations are slow because processors used in mobile phones do not have floating-point unit. Instead, MIDlets use software emulation which is slow. MIDletPascal offers two types of real number implementations: fixed-point and floating-point. Fixed-point arithemtic is faster than floating-point and requires less space in JAR file. Floating-point arithmetic is slower, takes more space in generated JAR file, but has better precision than fixed-point arithmetic. You can select the type of arithmetic in Build configurations dialog.

Accessing flash file system

The flash memory used in mobile phones is slow, so all operations that read or write from/to the flash memory suffer from it. Operations that access the flash file system are the record store operations and the resource operations. It is recommended that application reads all needeed data from the flash at startup, and saves its state on exit; while the application is running, it should not access the flash file system.


DrawArc

Рисует арку (часть эллипса), вписанную в условный прямоугольник (x, y - координаты верхнего левого угла прямоугольника, width и height - ширина и высота прямоугольника). Арка начинается с угла startAngle и равна по длине углу arcAngle в градусах. Угол 0° соответствует 3-м часам на стрелочных часах, угол 90° соответствует 12 часам (то есть отсчет идет против часовой стрелки).

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

Пример

begin
   DrawArc(0, 0, GetWidth, GetHeight, 0, 90);
   Repaint;
   Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetWidth, GetHeight, Repaint


DrawEllipse

Рисует эллипс, вписанный в условный прямоугольник. Координаты (x, y) - координаты левого верхнего угла прямоугольника, width и height - ширина и высота прямоугольника. Если ширина и высота равны, то рисоваться будет круг. Операция проходит в буфере экрана.

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

Пример

begin
   DrawEllipse(0, 0, GetWidth, GetHeight);
   Repaint;
   Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FillEllipse, GetWidth, GetHeight, SetColor, Repaint


DrawImage

Выводит картинку в буфер экрана. Координаты x и y описывают в какой точке должен будет находиться левый верхний угол картинки (отсчет ведется тоже от левого верхнего угла экрана).

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

Пример

begin
   DrawImage(LoadImage('/logo.png'), 0, 0);
   Repaint;
   Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

LoadImage, Repaint


DrawLine

Рисует прямую линию между точками с координатами (x1, y1) и (x2, y2). Операция проходит в буфере экрана.

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

Пример

begin
    DrawLine(10, 15, 25, 35);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

SetColor, Repaint


DrawRect

Рисует прямоугольник. Координаты (x, y) - это координаты левого верхнего угла прямоугольника, width и height - соответственно ширина и высота прямоугольника. Операция проходит в буфере экрана.

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

Пример

begin
    DrawRect(5, 5, 20, 20);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FillRect, SetColor, Repaint


DrawRoundRect

Рисует прямоугольник с закругленными углами. Координаты (x, y) - координаты верхнего левого угла прямоугольника, width и height - ширина и высота прямоугольника, arcWidth и arcHeight - соответственно ширина и высота закругления. Операция проходит в буфере экрана.

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

Пример

begin
    DrawRoundRect(5, 5, 20, 20, 2, 2);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FillRoundRect, SetColor, Repaint


DrawText

Рисует строку текста text. Координаты (x, y) - координаты левого верхнего угла прямоугольника, описывающего данный текст. Если текст шире, чем ширина экрана, то эта его выступающая часть рисоваться не будет, иными словами функции переноса теста на следующую строку нет. Операция проходит в буфере экрана.

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

Пример

begin
    SetColor(255, 0, 0);
    DrawText('Hello world', 0, 0);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetStringWidth, GetStringHeight, SetFont, SetDefaultFont, SetColor, Repaint


FillEllipse

Рисует закрашенный эллипс, вписанный в условный прямоугольник. Координаты (x, y) - это координаты левого верхнего угла прямоугольника, width и height - соответственно ширина и высота прямоугольника. Операция проходит в буфере экрана.

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

Пример

begin
    FillEllipse(0, 0, GetWidth, GetHeight);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

DrawEllipse, GetWidth, GetHeight, SetColor, Repaint


FillRect

Рисует закрашенный прямоугольник. Координаты (x, y) - это координаты левого верхнего угла прямоугольника, width и height - соответственно ширина и высота прямоугольника. Операция проходит в буфере экрана.

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

Пример

begin
    FillRect(5, 5, 20, 20);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

DrawRect, SetColor, Repaint


FillRoundRect

Рисует закрашенный прямоугольник с закругленными углами. Координаты (x, y) - это координаты левого верхнего угла прямоугольника, width и height - соответственно ширина и высота прямоугольника, arcWidth и arcHeight - ширина и высота закругления. Операция проходит в буфере экрана.

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

Пример

begin
    FillRoundRect(5, 5, 20, 20, 2, 2);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

DrawRoundRect, SetColor, Repaint


GetColorBlue

Возвращает синий компонент (число от 0 до 255) текущего установленного цвета.

function GetColorBlue: integer;

Пример

begin
    SetColor(0, 0, 127);
    if GetColorBlue <> 127 then
    begin
      DrawText('Этого никогда не произойдет', 0, 0);
      Repaint;
    end;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

SetColor, GetColorRed, GetColorGreen


GetColorGreen

Возвращает зеленый компонент (число от 0 до 255) текущего установленного цвета.

function GetColorGreen: integer;

Пример

begin
    SetColor(0, 127, 0);
    if GetColorGreen <> 127 then
    begin
      DrawText('Этого никогда не произойдет', 0, 0);
      Repaint;
    end;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

SetColor, GetColorRed, GetColorBlue


GetColorRed

Возвращает красный компонент (число от 0 до 255) текущего установленного цвета.

function GetColorRed: integer;

Пример

begin
    SetColor(127, 0, 0);
    if GetColorRed <> 127 then
    begin
      DrawText('Этого никогда не произойдет', 0, 0);
      Repaint;
    end;
    Delay(1000);
  end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

SetColor, GetColorGreen, GetColorBlue


GetColorsNum

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

function GetColorsNum:integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

IsColorDisplay


GetHeight

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

function GetHeight: integer;

Пример

begin
    DrawEllipse(0, 0, GetWidth, GetHeight);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetWidth


GetImageHeight

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

function GetImageHeight(img: image): integer;

Пример

var
   i: integer;
begin
   i:=GetImageHeight(LoadImage('/icon.png'));
   DrawText('Высота иконки: ' + i, 5, 5);
   Repaint;
   Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

LoadImage, GetImageWidth, DrawImage


GetImageWidth

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

function getImageWidth(img: image): integer;

Пример

var
   i: integer;
begin
   i:=GetImageWidth(LoadImage('/icon.png'));
   DrawText('Ширина иконки: ' + i, 5, 5);
   Repaint;
   Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

LoadImage, GetImageHeight, DrawImage


GetStringHeight

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

function GetStringHeight(text: string): integer;

Пример

var text: string;
    height: integer;
begin
    text   := 'Середина экрана ------------------------------';
    height := GetStringHeight(text);
    DrawText(text, 0, (GetHeight - height)/2);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetStringWidth, GetWidth, GetHeight, Repaint


GetStringWidth

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

function GetStringWidth(text: string): integer;

Пример

var text: string;
     width, height: integer;
begin
    text  := 'Середина экрана!';
    width := GetStringWidth(text);
    height := GetStringHeight(text);
    DrawText(text, (GetWidth - width)/2, (GetHeight - height)/2);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetStringHeight, GetWidth, GetHeight, Repaint


GetWidth

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

function GetWidth: integer;

Пример

begin
    DrawEllipse(0, 0, GetWidth, GetHeight);
    Repaint;
    Delay(1000);
  end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetHeight


ImageFromCanvas

Создает картинку путем копирования прямоугольной области с текущего изображения на экране. Координаты (x, y) - это координаты левого верхнего угла прямоугольника, width и height - соответственно ширина и высота прямоугольника.

function ImageFromCanvas(x: integer;
y: integer;
width: integer;
height: integer
): image ;

Пример

var
    im: image;
begin
    DrawRect(5, 5, 20, 20); // Рисуем что-нибудь
    Repaint;
    Delay(1000); // Ждем 1 секунду

    // Делаем "снимок" всего экрана
    im:=ImageFromCanvas(0, 0, GetWidth, GetHeight);

    SetColor(255, 255, 255);
    FillRect(0, 0, GetWidth, GetHeight); // Стираем всё с экрана
    Repaint; Delay(1000);

    DrawImage(im, 0, 0); // Восстанавливаем всё ранее нарисованное
    Repaint; Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

DrawImage, ImageFromImage, LoadImage, GetImageWidth, GetImageHeight


ImageFromImage

Создает картинку путем копирования прямоугольной области, взятой из другой картинки. Координаты (x, y) - это координаты левого верхнего угла прямоугольника (считая от левого верхнего угла картинки), width и height - соответственно ширина и высота прямоугольника.

function ImageFromImage(sourceImg: image;
x: integer;
y: integer;
width: integer;
height: integer
): image ;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

DrawImage, ImageFromCanvas, LoadImage, GetImageWidth, GetImageHeight


IsColorDisplay

Функция возвращает true (истина) если дисплей данного устройства цветной, иначе если дисплей черно/белый или монохромный, то возвращается false.

function IsColorDisplay:boolean;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetColorsNum


LoadImage

Возвращает картинку, которую загружает из файла с именем filename. Чтобы загрузить картинку, находящуюся внутри вашего JAR архива (перед компиляцией нужно предварительно добавить картинку в ваш проект как ресурс), нужно перед именем файла обязательно писать символ "/". Если вы неправильно укажете имя файла или забудете добавить символ "/", то ваше приложение зависнет.

function LoadImage(filename: string): image

Пример

begin
    DrawImage(LoadImage('/icon.png'), 0, 0); // Рисуем иконку
    Repaint;
    Delay(1000); // Ждем 1 секунду перед закрытием приложения
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

DrawImage, ImageFromImage, ImageFromCanvas, GetImageWidth, GetImageHeight


Plot

Рисует одну точку с координатами (x, y), считая от левого верхнего угла дисплея. Операция проходит в буфере экрана.

procedure Plot(x, y:integer);

Пример

begin
    SetColor(255, 0, 0); // Ставим красный цвет
    Plot(5, 10); // Рисуем точку
    Repaint;
    Delay(1000); // Ждем 1 секунду
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

SetColor, Repaint


Repaint

Делает перерисовку экрана. При данной операции всё, что содержится в буфере экрана будет отрисовано на дисплее данного устройства. Дело в том, что все функции рисованиия (например, DrawText, FillRect или Plot) рисуют не на экране, а в буфере экрана, по-этому результат их действия на дисплее не отобразится пока не будет вызвана процедура Repaint, которая просто копирует содержимое буфера экрана на текущий дисплей устройства. Помните, что операция Repaint занимает довольно много времени, по-этому вызывайте её как можно реже.

procedure Repaint;

Примеры

begin
    DrawText('ВЫШЛИ ДЕНЕГ!', 5, 5);
    Repaint;
    DrawText('Здравствуй, мама.', 5, 25);
    Repaint;
    Delay(10000); // Пример НЕПРАВИЛЬНОГО использования Repaint
end.

begin
    DrawText('Здравствуй, сын.', 0, 0);
    DrawText('Письмо, где ты', 0, 15);
    DrawText('просишь выслать денег', 0, 30);
    DrawText('я не получала.', 0, 45);
    Repaint;
    Delay(10000); // Вот так правильно
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также


SetClip

Задает условный прямоугольник на экране, в котором будут выполняться все графические функции. Всё, что выходит за границы данного прямоугольника, рисоваться не будет (будет игнорироваться). Координаты (x, y) - это координаты левого верхнего угла прямоугольника, width и height - соответственно ширина и высота прямоугольника.

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

Пример

begin
    // Закрашиваем экран черным цветом
    SetColor(0, 0, 0);
    FillRect(0, 0, GetWidth, GetHeight);
    Repaint;
    Delay(2000);

    // Всё стираем
    SetColor(255, 255, 255); FillRect(0, 0, GetWidth, GetHeight);

    // Закрашиваем весь экран черным опять, но уже с указание области
    SetColor(0, 0, 0);
    SetClip(10, 10, 35, 35);
    FillRect(0, 0, GetWidth, GetHeight);
    Repaint;
    Delay(2000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FillEllipse, GetWidth, GetHeight, SetColor, Repaint


SetColor

Устанавливает цвет, который будет использоваться при рисовании текста и графических примитивов. Процедура принимает 3 значения: red - красный компонент цвета, green - зеленый компонент, blue - синий. Каждый из этих компонентов может принимать значения от 0 до 255. Путем смешивания значений этих компонентов можно получить любой цвет. К примеру, черный цвет имеет код (0, 0, 0), красный (255, 0, 0), серый - (127, 127, 127), а белый будет (255, 255, 255) и т.п.

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

Пример

begin
    SetColor(0, 0, 255); // Устанавливаем синий цвет
    DrawText('Всем привет!', 5, 5); // Рисуем текст
    Repaint;
    Delay(1000); // Ждем 1 секунду
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetColorRed, GetColorGreen, GetColorBlue


SetDefaultFont

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

procedure SetDefaultFont;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

SetFont


SetFont

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

Параметр fontFace описыват тип шрифта и может принимать такие значения:

· FONT_FACE_SYSTEM - Системный шрифт
· FONT_FACE_MONOSPACE - Моноширный шрифт (все буквы имеют одинаковую ширину)
· FONT_FACE_PROPORTIONAL - Пропорциональный шрифт (самый красивый)

Параметр fontStyle описывает стиль шрифта и может принимать такие значения:
· FONT_STYLE_PLAIN - Обычный шрифт
· FONT_STYLE_BOLD - Жирный шрифт
· FONT_STYLE_ITALIC - Курсив (под наклоном)
· FONT_STYLE_UNDERLINED - Подчеркнутый

Эти стили можно применять вместе одновременно, используя оператор + или логическое OR. К примеру, жирный и подчеркнутый шрифт, можно задать так: FONT_STYLE_BOLD or FONT_STYLE_UNDERLINED.

Параметр fontSize описывает размер шрифта и может принимать такие значения:
· FONT_SIZE_SMALL - Маленький
· FONT_SIZE_MEDIUM - Средний
· FONT_SIZE_LARGE - Большой

Помните, что некоторые устройства имеют всего 1 шрифт, по-этому вызов SetFont на этих устройствах ни к чему не приведет. Также бывают случаи, что телефон не поддерживает некоторые стили для некоторых шрифтов (к примеру, нет наклонного системного шрифта, есть только без наклона), так что устанавливая стиль для шрифта нужно учитывать эти особенности.

procedure SetFont(fontFace, fontStyle, fontSize);

Пример

begin
    SetFont(FONT_FACE_SYSTEM,
            FONT_STYLE_BOLD + FONT_STYLE_UNDERLINED,
            FONT_SIZE_LARGE);
    DrawText('Привет, чайник!', 5, 5);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

SetDefaultFont, SetColor, Repaint


GetKeyClicked

Возвращает код последней кликнутой (т.е. нажатой и отпущеной) клавиши или KE_NONE если ничего нажато не было. Стандартные коды клавиш представлены в списке констант:

· KE_KEY0 // Клавиша 0
· KE_KEY1 // Клавиша 1
· KE_KEY2 // Клавиша 2
· KE_KEY3 // Клавиша 3
· KE_KEY4 // Клавиша 4
· KE_KEY5 // Клавиша 5
· KE_KEY6 // Клавиша 6
· KE_KEY7 // Клавиша 7
· KE_KEY8 // Клавиша 8
· KE_KEY9 // Клавиша 9
· KE_STAR // Клавиша *
· KE_POUND // Клавиша #

function GetKeyClicked: integer;

Пример

begin
    while GetKeyClicked <> KE_STAR do // Ждем пока не нажмут клавишу *
    begin
      Delay(100);
    end;
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetKeyPressed, KeyToAction


GetKeyPressed

Возвращает код нажатой в данный момент клавиши или KE_NONE если ничего не нажато. Стандартные коды клавиш описаны в списке констант:

· KE_KEY0 // Клавиша 0
· KE_KEY1 // Клавиша 1
· KE_KEY2 // Клавиша 2
· KE_KEY3 // Клавиша 3
· KE_KEY4 // Клавиша 4
· KE_KEY5 // Клавиша 5
· KE_KEY6 // Клавиша 6
· KE_KEY7 // Клавиша 7
· KE_KEY8 // Клавиша 8
· KE_KEY9 // Клавиша 9
· KE_STAR // Клавиша *
· KE_POUND // Клавиша #

function GetKeyPressed: integer;

Пример

begin
  while GetKeyPressed <> KE_STAR do Ждем нажатия на клавишу *
    begin
      Delay(100);
    end;
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetKeyClicked, KeyToAction


KeyToAction

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

· GA_NONE - Ничего не нажато
· GA_UP - Вверх
· GA_DOWN - Вниз
· GA_LEFT - Влево
· GA_RIGHT - Вправо
· GA_FIRE - Огонь
· GA_GAMEA - Дополнительная клавиша джойстика A
· GA_GAMEB - Дополнительная клавиша джойстика B
· GA_GAMEC - Дополнительная клавиша джойстика C
· GA_GAMED - Дополнительная клавиша джойстика D

ПРИМЕЧАНИЕ: К сожалению, данная функция не умеет обрабатывать одновременное нажатие нескольких клавиш джойстика (а в играх это используется сплошь и рядом). В этом случае воспользуйтесь дополнительной библиотекой Lib_game (все подробности указаны в документации к библиотеке).

function KeyToAction(keyCode: integer): integer;

Пример

begin
  while KeyToAction(GetKeyPressed) <> GA_FIRE do // Ждем нажатия на ОГОНЬ
    begin
      Delay(100);
    end;
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetKeyPressed, GetKeyClicked


Delay

Прекращает выполнение программы на указанное количество миллисекунд (1 секунда = 1000 миллисекунд).
Не стоит пренебрегать этой командой, так как во многих современных телефонах имеется многозадачность и нужно выделять немного процессорного времени для выполнения каких-то системных процессов или других приложений. С другой стороны, если вы в своей программе выполняете какие-то очень сложные и долгие вычисления в цикле, то, если не помещать в этом цикле команд паузы, ваш цикл будет выполняться с максимально возможной скоростью. Таким образом, оперируя командой Delay, можно управлять приоритетом выполнения задач.

procedure Delay(millis: integer);

Пример

begin
    DrawText('Привет всем!', 5, 5);
    Repaint;
    Delay(2000); // Ждем 2 секунды
end.

Совместимость


GetCurrentTime

Возвращает текущее время в секундах, считая с полуночи 1 января 1970 года. Данное значение (количество секунд) можно подставлять в качестве аргумента для вызова функций GetMonth или GetHour и т.п.

function GetCurrentTime: integer;

Пример

var
    time: integer;
    text: string;
begin
    time := GetCurrentTime;
    text := 'Текущее время: ' + GetHour(time);
    text := text + ':'+ GetMinute(time);
    text := text + ':' + GetSecond(time);
    DrawText(text, 5, 5);
    Repaint;
    Delay(1000); // Ждем 1 секунду
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetYear, GetMonth, GetDay, GetHour, GetMinute, GetSecond, GetWeekDay, GetYearDay


GetDay

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

function GetDay(time: integer): integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetCurrentTime, GetYear, GetMonth, GetWeekDay, GetYearDay


GetHour

Возвращает значение часов от данного времени в секундах time (например, полученного с помощью функции GetCurrentTime).
Функция возвращает число от 0 до 23.

function GetHour(time: integer): integer;

Пример

var time: integer;
    text: string;
begin
    time := GetCurrentTime;
    text := 'Текущее время: ' + GetHour(time);
    text := text + ':' + GetMinute(time);
    text := text + ':' + GetSecond(time);
    DrawText(text, 0, 0);
    Repaint;
    Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetCurrentTime, GetMinute, GetSecond


GetMinute

Возвращает значение минут от данного времени в секундах time (например, полученного с помощью функции GetCurrentTime).
Функция возвращает число от 0 до 59.

function GetMinute(time: integer): integer;

Пример

var time: integer;
    text: string;
begin
    time := GetCurrentTime;
    text := 'Текущее время: ' + GetHour(time);
    text := text + ':' + GetMinute(time);
    text := text + ':' + GetSecond(time);
    DrawText(text, 0, 0);
    Repaint; Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetCurrentTime, GetHour, GetSecond


GetMonth

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

function GetMonth(time: integer): integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetCurrentTime, GetYear, GetDay


GetRelativeTimeMs

Возвращает текущее время в миллисекундах (1 секунда = 1000 миллисекунд). Помните, что возвращаемое значение не может быть больше 4294967296 (что соответствует приблизительно 48 суткам). По-этому каждые 48 суток отсчет будет начинаться с 0. По этой причине данная функция не годится для определения времени, прошедшему между двумя датами, но широко используется для различных таймеров в играх или приложениях.

К примеру, ситуация из жизни: Вы пишите простую игру типа Тетриса и вам нужно чтобы фигура двигалась вниз со скоростью 1 клетка в секунду. При этом ещё нужно отлавливать нажатия клавиш влево/вправо/огонь, а это значит, что функция Delay вам не подойдет. В этом случае главный цикл опроса клавиатуры можно оформить как приведенный ниже:

function GetRelativeTimeMs: integer;

Пример

...
  lastSavedTime := GetRelativeTimeMs; // Инициализация таймера
  repeat
    // Считываем текущую нажатую клавишу
    key := GetKeyClicked;
    if KeyToAction(key) = GA_LEFT then moveLeft;
    if KeyToAction(key) = GA_RIGHT then moveRight;

    // Проверяем прошла ли 1 секунда
    if ((GetRelativeTimeMs - lastSavedTime) > 1000)
      or (GetRelativeTimeMs < lastSavedTime)
      then
      begin
        lastSavedTime := GetRelativeTimeMs;
        moveDown; // Двигаем блок вниз
      end;
  until gameOver;
...

Совместимость


GetSecond

Возвращает значение секунд от данного времени в секундах time (например, полученного с помощью функции GetCurrentTime).
Функция возвращает число от 0 до 59.

function GetSecond(time: integer): integer;

Example

var time: integer;
    text: string;
begin
    time := GetCurrentTime;
    text := 'Текущее время: ' + GetHour(time);
    text := text + ':' + GetMinute(time);
    text := text + ':' + GetSecond(time);
    DrawText(text, 0, 0);
    Repaint; Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetCurrentTime, GetHour, GetMinute


GetWeekDay

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

function GetWeekDay(time: integer): integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetCurrentTime, GetYear, GetMonth, GetDay, GetYearDay


GetYear

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

function GetYear(time: integer): integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetCurrentTime, GetMonth, GetDay


GetYearDay

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

function GetYearDay(time: integer): integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetCurrentTime, GetYear, GetMonth, GetDay, GetWeekDay


Abs

Возвращает абсолютное значение числа. То есть вычисляет его математический модуль.

function Abs(n: integer): integer;

Совместимость


Acos

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

function Acos(num: real):real;

Совместимость


Asin

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

function Asin(num: real):real;

Совместимость


Atan

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

function Atan(num: real):real;

Совместимость


Atan2

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

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

Совместимость


Cos

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

function Cos(num: real):real;

Совместимость


Exp

Вычисляет экспоненту числа (возвращает значение числа Эйлера е в степени num).

function Exp(num: real):real;

Совместимость


Frac

Возвращает дробную часть числа (к примеру, для числа 1.234 вернется 0.234).

function Frac(num: real):real;

Совместимость


Log

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

function Log(num: real):real;

Совместимость


Log10

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

function Log10(num: real):real;

Совместимость


Pow

Возвращает значение числа a, возведенное в степень b.

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

Совместимость


Rabs

Возвращает абсолютное значение (модуль) от числа. Функция действует так же как и Abs, но для вещественных чисел.

function Rabs(num:real):real;

Совместимость


Sin

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

function Sin(num: real):real;

Совместимость


Sqr

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

function Sqr(n: integer): integer;

Совместимость


Sqrt

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

function Sqrt(num: real):real;

Совместимость


Tan

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

function Tan(num: real):real;

Совместимость


ToDegrees

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

function ToDegrees(num: real):real;

Совместимость


ToRadians

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

function ToRadians(num: real):real;

Совместимость


Trunc

Отбрасывает десятичную часть числа (все цифры после запятой) и возвращает только его целую часть.

ПРИМЕЧАНИЕ: Нa самом деле функция работет немного неправильно если в настройках вашего проекта стоит максимальная погрешность до 0.0001 (fixed). К примеру, для числа 5.1 результатом округления будет 6, для числа -7.1 результатом будет -9. При режиме погрешности 0.000001 (floating) таких ошибок не возникает. Помните это.

function Trunc(num: real):integer;

Совместимость


Copy

Функция возвращает подстроку, извлеченную из заданной строки str1, которая начинается с символа под номером begin и заканчивается символом с номером end-1. К примеру, команда Сopy ('MIDletPascal', 2, 5) вернет 'Dle'. Учтите, что эта функция работает не так как в классическом Паскале.

Строки в MIDletPascal немного отличаются от строк в обычном Паскале: номер первого символа в строке 0, в обычном же Паскале это 1.

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

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

Length, Pos


GetChar

Возвращает символ, стоящий в строке str под номером pos. Самая первая буква имеет номер 0. Если значение pos превышает длину строки, то вернется символ с кодом 0 (по таблице ASCII).

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

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

SetChar


IntegerToString

Возвращает целое число val в виде строки текста с тем же значением.

function IntegerToString(val: integer): string;

Пример

var i: integer;
    s: string;
begin
    i := 15;
    s := IntegerToString(i);
    s := '' + i; // Это дает тот же эффект , что и в предидущей строке
end.

Совместимость


Length

Возвращает количество символов в строке str.

function Length(str: string): integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

Copy, Pos


Locase

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

function Locase(str: string): string;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

Upcase, Copy


Pos

Функция ищет подстроку str2 в строке str1 и возвращает первый номер символа, в котором стоит данная подстрока. Если подстрока не найдена, то возвращается -1. Функция чувствительна к регистру букв.

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

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

Copy, Length


SetChar

Возвращает строку str. При этом символ, стоящий под номером pos заменяется на символ с. Первый символ в строке имеет номер 0. Если число pos больше, чем длина строки str, то строка не изменится.

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

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetChar


StringToInteger

Извлекает целое число из числа записанного в виде строки текста. Если строка s имеет неверный формат, то вернется 0. Строка s может содержать только цифры (исключение только для первого символа, который може указывать на знак числа + или -).

function StringToInteger(s:string):integer;

Совместимость


StringToReal

Извлекает вещественное число из строки текста s. Параметр base указывает на разрядность полученного числа (10 для десятичных чисел).

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

Совместимость


Upcase

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

function Upcase(str: string): string;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

Locase, Copy


AddCommand

Вставляет команду на экран устройства. Некоторые устройства (например, мобильники Motorola) не будут выводить команду на экран пока не будет вызван метод Repaint. Так что после добавления команд AddCommand  желательно вызывать Repaint .

procedure AddCommand(cmd: command);

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

CreateCommand, GetClickedCommand, RemoveCommand, EmptyCommand


ChoiceAppendString

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

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

Пример

var choiceGroupID: integer;
    YA, DA: integer;
begin
    ShowForm;
    choiceGroupID := FormAddChoice('Довольны ли вы зарплатой?', CH_EXCLUSIVE);
    YA := ChoiceAppendString(choiceGroupID, 'Да');
    DA := ChoiceAppendString(choiceGroupID, 'Конечно да');
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FormAddChoice, ChoiceAppendStringImage, ChoiceIsSelected, ChoiceGetSelectedIndex


ChoiceAppendStringImage

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

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

Пример

var choiceGroupID: integer;
    PT, MS: integer;
begin
    ShowForm;
    choiceGroupID := FormAddChoice('Ты откуда?',  CH_EXCLUSIVE);
    PT := ChoiceAppendStringImage(choiceGroupID,
                                   'Из Питера',
                                   LoadImage('/PT.png'));
    MS := ChoiceAppendStringImage(choiceGroupID,
                                   'Из Москвы',
                                   LoadImage('/MS.png'));
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FormAddChoice, ChoiceAppendString, ChioceIsSelected, ChoiceGetSelectedIndex


ChoiceGetSelectedIndex

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

function ChoiceGetSelectedIndex(choiceID: integer):integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FormAddChoice, ChoiceIsSelected


ChoiceIsSelected

Функция возвращает true (истина) если выбран элемент с номером itemIndex в группе выбора с номером choiceID.

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

Пример

var choiceGroupID: integer;
    MALE, FEMALE: integer;
begin
    ShowForm;
    choiceGroupID := FormAddChoice('Ваш пол?', CH_EXCLUSIVE);
    MALE := ChoiceAppendStringImage(choiceGroupID,
                                   'Мужской',
                                   LoadImage('/boy.png'));
    FEMALE := ChoiceAppendStringImage(choiceGroupID,
                                   'Женский',
                                   LoadImage('/girl.png'));

    if choiceIsSelected(choiceGroupID, MALE) then
      FormAddString('Привет, братан!');
    else
      FormAddString('Здоров, сестричка!');
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FormAddChoice


ClearForm

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

procedure ClearForm;

Пример

var label_id, textField_id: integer;
begin
    label_id := FormAddString('Привет!');
    textField_id := FormAddTextField('Твое имя: ', 'Вася Пупкин', 30, TF_ANY);
    ShowForm;
    Delay(2000);
    ClearForm;
    Delay(2000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowForm


CreateCommand

Создает команду с текстовой меткой label. Текст метки нужно делать как можно короче. Приоритет команды выставляется с помощью параметра priority; чем меньше это значение тем выше приоритет. Параметр commandType служит для описания назначения данной команды. К примеру, если вы зададите команде назначение CM_BACK, а устройство имеет стандартное место (к примеру, на экране слева и внизу) для расположения команды "back" (назад), то и ваша кнопка будет отображена в данном месте; таким образом, указывая назначение команд, можно поддерживать общий стиль телефона. Параметр commandType может принимать одно из следующих прописанных значений:

· CM_SCREEN - для любого типа команд
· CM_BACK - для команды типа НАЗАД
· CM_CANCEL - команда ОТМЕНА
· CM_OK - команда ОК
· CM_HELP - команда ПОМОЩЬ
· CM_STOP - команда СТОП
· CM_EXIT - команда ВЫХОД
· CM_ITEM - команда выбора элемента из списка

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

Пример

var exitCmd, pauseCmd: command;
begin
    exitCmd := CreateCommand('Выход', CM_EXIT, 1);
    pauseCmd := CreateCommand('Пауза', CM_SCREEN, 2);
    AddCommand(exitCmd);
    AddCommand(pauseCmd);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetClickedCommand, AddCommand, RemoveCommand


EmptyCommand

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

function EmptyCommand:command;

Пример

var exit, clicked:command;
begin
    ShowForm;
    exit := CreateCommand('Выход', CM_EXIT, 1);
    AddCommand(exit); // Добавляем команду на экран
    repeat
      clicked := GetClickedCommand; // Считываем текущую нажатую команду
    until clicked <> EmptyCommand; // Ждем пока не будет нажата хоть какая-то команда
    if clicked = exit then Halt;
    // Далее идет еще какой-то код...
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

CreateCommand, GetClickedCommand, AddCommand, RemoveCommand


FormAddChoice

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

· CH_EXCLUSIVE - только один элемент из группы может быть выбран (аналог Radio Button)
· CH_MULTIPLE - можно выбирать сразу несколько элементов (аналог Check Box)

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

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ChoiceAppendString, ChoiceAppendStringImage, ChoiceIsSelected, ChoiceGetSelectedIndex, FormRemove


FormAddDateField

Добавляет на форму элемент для ввода даты. Параметр label - это текстовая метка для элемента, параметр type описывает тип ожидаемой введенной информации и может принимать такие значения:

· DF_DATE - элемент содержит только поле для ввода даты
· DF_TIME - элемент содержит только поле для ввода времени
· DF_DATE_TIME - элемент содержит поля для ввода даты и времени

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

function FormAddDateField(label: string, type:integer): integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FormSetDate, FormGetDate


FormAddGauge

Добавляет на форму элемент типа полоски-индикатора. Функция возвращает идентификатор ID нового созданного элемента. Параметр isInteractive определяет возвожность изменения полоски пользователем (true - может изменять, false - не может). Параметр maxValue - максимальное значение, принимаемое полоской, initialValue - текущая заполненность полоски (это число не должно быть выше чем maxValue).

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

Пример

var gauge_id: integer;
begin
    gauge_id := FormAddGauge('Загрузка: 43% ...', false, 100, 43);
    ShowForm;
    Delay(2000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowForm, FormSetValue, FormGetValue, FormRemove


FormAddImage

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

function FormAddImage(i:image):integer;

Пример

var image_id: integer;
begin
    image_id := FormAddImage(LoadImage('/icon.png'));
    ShowForm;
    Delay(2000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowForm, FormRemove


FormAddSpace

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

function FormAddSpace:integer;

Пример

var label_id, space_id, textField_id: integer;
begin
    label_id := FormAddString('Привет, чайник.');
    space_id := FormAddSpace();
    textField_id := FormAddTextField('Введи свое имя',
                                     'Вася Пупкин', 50, TF_ANY);
    ShowForm;
    Delay(2000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowForm, FormRemove


FormAddString

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

function FormAddString(s:string):integer;

Пример

var label_id: integer;
begin
    label_id := FormAddString('MIDlet Pascal');
    ShowForm;
    Delay(2000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowForm, FormRemove


FormAddTextField

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

· TF_ANY - Можно вводить любой текст
· TF_EMAIL - Можно вводить только адрес EMAIL
· TF_NUMERIC - Можно вводить только цифры
· TF_PHONENUMBER - Можно вводить только номер телефона
· TF_URL - Можно вводить только адрес URL в Интернете
· TF_PASSWORD - Поле для ввода пароля. Все символы будут отображаться в виде *.

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

Пример

var textField_id: integer;
begin
    textField_id := FormAddTextField('Введите свое имя', 'Вася Пупкин',  50, TF_ANY);
    ShowForm;
    Delay(2000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowForm, FormSetText, FormGetText, FormRemove


FormGetDate

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

function FormGetDate(index: integer): integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FormSetDate, FormAddDateField


FormGetText

функция читает введенный пользователем текст из элемента типа текстовое поле с идентификатором ID. Если ID не указывает на текстовое поле, то вернется пустая строка.

function FormGetText(textFieldID:integer):string;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FormAddText


FormGetValue

Функция возвращает значение состояния полоски-индикатора с идентификатором ID. Если ID не ссылается на полоску-индикатор, то вернется -1.

function FormGetValue(gaugeID:integer):integer;

Пример

var gauge_id, value: integer;
begin
    gauge_id := FormAddGauge('Тебе сколько налить?', true, 500, 150);
    ShowForm;
    value := FormGetValue(gauge_id);
    Delay(2000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FormAddGauge


FormRemove

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

procedure FormRemove(ID:integer);

Пример

var textField:integer;
begin
    showForm;
    textField := FormAddTextField('Имя', '', 20, TF_ANY);
    Delay(1000);
    FormRemove(textField);
    Delay(1000);
end.

Совместимость


FormSetDate

Устанавливает время и дату в элементе ввода даты и времени с идентификатором ID. Если поле ввода имеет тип DF_TIME, то значение дней в параметре dateTime должно равняться 0.

procedure FormSetDate(ID: integer; dateTime: integer);

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FormGetDate, FormAddDateField


FormSetText

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

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

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FormAddTextField


FormSetValue

Устанавливает значение заполненности в элементе типа полоски-индикатора с идентификатором ID.

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

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

FormAddGauge


GetClickedCommand

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

function GetClickedCommand: command;

Пример

var exitCmd, clicked: command;
begin
    exitCmd := CreateCommand('Выход', CM_EXIT, 1);
    AddCommand(exitCmd);
    repeat
      clicked := GetClickedCommand;
    until clicked <> EmptyCommand;
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

CreateCommand, AddCommand, RemoveCommand, EmptyCommand


GetFormTitle

Функция возвращает текущий заголовок формы.

function GetFormTitle: string;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

SetFormTitle, RemoveFormTitle


GetTextBoxString

Функция возвращает текст, введенный пользователем в поле ввода типа TextBox.

function GetTextBoxString:string;

Пример

var cont : command;
    quote : string;
begin
    ShowTextBox('Введи свою любимую поговорку', 'Быть или не быть? Не быть.', 200, TF_ANY);
    cont := CreateCommand('Дальше', CM_SCREEN, 1);
    AddCommand(cont);

    repeat
      delay(100);
    until GetClickedCommand <> EmptyCommand;

    quote := GetTextBoxString;

    ...
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowTextBox


MenuAppendString

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

function MenuAppendString(text: string): integer;

Пример

var tetris, minesweeper, snake : integer;
      play, clicked : command;
begin
    ShowMenu('Выберите игру', CH_IMPLICIT);

    tetris      := MenuAppendString('Тетрис');
    minesweeper := MenuAppendString('Минер');
    snake       := MenuAppendString('Змейка');

    play := CreateCommand('Играть', 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.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowMenu, MenuAppendStringImage, MenuIsSelected, MenuGetSelectedIndex


MenuAppendStringImage

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

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

Пример

var tetris, minesweeper, snake : integer;
      play, clicked : command;
begin
    ShowMenu('Выбери игру', CH_IMPLICIT);

    tetris      := MenuAppendStringImage('Тетрис', LoadImage('/tetris.png'));
    minesweeper := MenuAppendStringImage('Минер', LoadImage('/mine.png'));
    snake       := MenuAppendStringImage('Змейка', LoadImage('/snake.png'));

    play := CreateCommand('Играть', 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.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowMenu, MenuAppendString, MenuIsSelected, MenuGetSelectedIndex


MenuGetSelectedIndex

Возвращает идентификатор ID выбранного пункта в меню или -1 если этот пункт ещё не выбран.

function MenuGetSelectedIndex: integer;

Пример

var tetris, minesweeper, snake : integer;
      play, clicked : command;
begin
    ShowMenu('Выберите игру', CH_IMPLICIT);

    tetris      := MenuAppendStringImage('Тетрис', LoadImage('/tetris.png'));
    minesweeper := MenuAppendStringImage('Минер', LoadImage('/mine.png'));
    snake       := MenuAppendStringImage('Змейка', LoadImage('/snake.png'));

    play := CreateCommand('Играть', 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.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowMenu, MenuAppendString, MenuAppendStringImage, MenuIsSelected


MenuIsSelected

Функция возвращает true (истина) если пункт в меню с идентификатором index выбран.

function MenuIsSelected(index: integer): boolean;

Пример

var tetris, minesweeper, snake : integer;
      play, clicked : command;
begin
    ShowMenu('Выберите игру', CH_IMPLICIT);

    tetris      := MenuAppendStringImage('Тетрис', LoadImage('/tetris.png'));
    minesweeper := MenuAppendStringImage('Сапер', LoadImage('/mine.png'));
    snake       := MenuAppendStringImage('Змейка', LoadImage('/snake.png'));

    play := CreateCommand('Играть', 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.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowMenu, MenuAppendString, MenuAppendStringImage, MenuIsSelected


PlayAlertSound

Воспроизводит звук (который записан в телефоне), служащй для обозначния данного всплывающего окна. К примеру, при ошибке будет воспроизводиться тревожный звук, при обычном информационном окне - более приятный звук и т.п. Данный звук зависит от телефона.

procedure PlayAlertSound;

Example

var cm : command;

begin
    ShowAlert('Сообщение',
              'Получено новое сообщение',
              LoadImage('/img1.png'),
              ALERT_INFO);

    PlayAlertSound;

    cm := CreateCommand('OK', CM_OK, 1);
    AddCommand(cm);

    repeat
      Delay(100);
    until GetClickedCommand <> EmptyCommand;

    ShowForm; // Это удалит окно с экрана
    ...
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowAlert


RemoveCommand

Удаляет команду с дисплея устройства.

procedure RemoveCommand(cmd: command);

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

CreateCommand, GetClickedCommand, AddCommand, EmptyCommand


RemoveFormTitle

Удаляет текущий заголовок у формы.

procedure RemoveFormTitle;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetFormTitle, SetFormTitle


SetFormTitle

Устанавливает заголовок формы.

procedure SetFormTitle(title: string);

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetFormTitle, RemoveFormTitle


SetTicker

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

procedure SetTicker(s:string);

Пример

begin
    ShowForm;
    SetTicker('Этот мидлет написан на MIDlet Pascal');
    Delay(5000);
end.

Совместимость


ShowAlert

Выводит на экран всплывающее окно. Экран не отображает другие элементы формы (кроме команд) когда на экране появляется всплывающее окно. Устройство может также воспроизводить звук при появлении данного окна. Параметр title - это заголовок окна, message - текст сообщения в окне. Тип окна alertType может быть следующим:

· ALERT_INFO - Информационное окно (содержит какую-то информацию)
· ALERT_WARNING - Предупреждение
· ALERT_ERROR - Ошибка
· ALERT_ALARM - Тревога!
· ALERT_CONFIRMATION - Подтверждение чего-либо

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

Пример

var cm : command;
begin
    showAlert('Новое сообщение',
              'Тебе пришло новое сообщение от Васи',
              loadImage('/img1.png'),
              ALERT_INFO);
    playAlertSound;
    cm := createCommand('Читать', CM_OK, 1);
    addCommand(cm);
    repeat
        delay(100);
    until getClickedCommand <> emptyCommand;
    showForm; // Это удалит окно
    ...
end.

Совместимость


ShowCanvas

Переводит дисплей устройства в режим холста (canvas). Дисплей телефона может работать в двух режимах: формы и холста. Форма может иметь кнопки, элементы ввода, картинки и т.п. В режиме холста на дисплей можно выводить точки, линии, надписи, картинки. Если в режиме форм телефон сам делает переносы строк, сам следит за удобным размещением различныхэлементов на экране, то в режиме холста это нужно делать самому, точно указывая координаты всех элементов. С другой стороны, режим формы выглядит крайне убого, в то время как в режиме холста можно создавать воистину графические шедевры. Когда мидлет запускается, по умолчанию включается режим холста.

procedure ShowCanvas;

Пример

var label_id, textField_id: integer;
begin
    label_id := FormAddString('Здравствуйте!');
    textField_id := FormAddTextField('Введите свое имя', 'Петя', 20, TF_ANY);
    ShowForm;
    Delay(2000);
    ShowCanvas;
    DrawText('И снова здравствуйте!', 0, 0);
    Repaint;
    Delay(2000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ShowForm, Drawing on the screen


ShowForm

Переводит дисплей устройства в режим формы (form). Дисплей телефона может работать в двух режимах: формы и холста. Форма может иметь кнопки, элементы ввода, картинки и т.п. В режиме холста на дисплей можно выводить точки, линии, надписи, картинки. Если в режиме форм телефон сам делает переносы строк, сам следит за удобным размещением различныхэлементов на экране, то в режиме холста это нужно делать самому, точно указывая координаты всех элементов. С другой стороны, режим формы выглядит крайне убого, в то время как в режиме холста можно создавать воистину графические шедевры. Когда мидлет запускается, по умолчанию включается режим холста.

procedure ShowForm;

Пример

var label_id, textField_id: integer;
begin
    label_id := formAddString('Проверка');
    textField_id := formAddTextField('Введите пароль',
                                     '', 20, TF_PASWORD);
    showForm;
    delay(2000);
end.

Совместимость


ShowMenu

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

· CH_IMPLICIT - То, что вам нужно в большинстве случаев
· CH_EXCLUSIVE - Можно выбирать только 1 элемент из списка (аналог Radio Button)
· CH_MULTIPLE - Можно выбирать несколько строк меню (аналог Check Box)

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

Пример

var tetris, minesweeper, snake : integer;
    play, clicked : command;

begin
    showMenu('Выберите игру', CH_IMPLICIT);

    tetris := menuAppendString('Тетрис');
    minesweeper := menuAppendString('Минер');
    snake := menuAppendString('Змейка');

    play := createCommand('Играть', 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.

Совместимость


ShowTextBox

Показывает на экране поле ввода текста типа Text Box. Поле ввода при этом занимает весь дисплей устройства и другие элементы формы при этом не будут отображаться (кроме команд). Параметр constraints описывает тип вводимой информации и может принимать такие значения:

· TF_ANY - Можно вводить любой текст
· TF_EMAIL - Только EMAIL адрес
· TF_NUMERIC - Только цифры
· TF_PHONENUMBER - Только номер телефона
· TF_URL - Только адрес странички в Интернете

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

Пример

var cont : command;
      quote : string;
begin
    showTextBox('Введите сообщение', '', 200, TF_ANY);
    cont := createCommand('Отправить', CM_SCREEN, 1);
    addCommand(cont);

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

    quote := getTextBoxString;

    ...
end.

Совместимость


AddRecordStoreEntry

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

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

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

DeleteRecordStoreEntry


CloseRecordStore

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

procedure CloseRecordStore(rs: recordStore);

Совместимость


CloseRSEnumeration

Прекратить энумерацию (перечисление) в хранилище данных, вызванную внутренним вызовом функции EnumerateRecords. Эту процедуру НУЖНО вызывать тогда, когда энумерация записей в хранилище больше не требуется; иначе говоря, после выполнения данной команды все ресурсы телефона будут зарезервированы и хранилище записей не сможет больше делать энумерацию записей.

procedure CloseRSEnumeration(rsEnumIdx: integer);

Совместимость

MIDP1.0

Требуемый модуль

RSEnum

Смотри также

EnumerateRecords


DeleteRecordStore

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

procedure DeleteRecordStore(name: string);

Совместимость


DeleteRecordStoreEntry

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

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

Совместимость


EnumerateRecords

Функция включает режим энумерации (пересчета) всех непустых записей в хранилище записей, таким образом удаляется эффект "фрагментации" хранимых строк. Функция возвращает номер первой записи в хранилище или -1 если произошла какая-то ошибка.

function EnumerateRecords(rs: recordStore): integer;

Пример

uses RSEnum;

var rs: recordStore;
    entryIdx: integer;
    rsEnumIdx: integer;
    data: string;
begin
  rs := OpenRecordStore('Test record store');
  entryIdx := AddRecordStoreEntry(rs, '11111');
  entryIdx := AddRecordStoreEntry(rs, '22222');
  entryIdx := AddRecordStoreEntry(rs, '33333'); // Добавляем 3 записи в хранилище

  rsEnumIdx := EnumerateRecords(rs); // Включаем режим энумерации

  repeat
    data := NextRecord(rsEnumIdx);
    debug(data);
  until data = '';

  DeleteRecordStoreEntry(rs, 2); // Удаляем вторую запись

  UpdateRSEnumeration(rsEnumIdx); // Обновляем номера строк

  repeat
    data := NextRecord(rsEnumIdx);
    debug(data);
  until data = '';

  CloseRSEnumeration(rsEnumIdx); // Отключаем режим энумерации

end.

Совместимость

MIDP1.0

Требуемый модуль

RSEnum


GetRecordStoreNextId

Возвращает следующий незанятый номер записи в хранилище, который будет присвоен записи при добавлении её с помощью функции AddRecordStoreEntry.

function GetRecordStoreNextId(rs: recordStore): integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

AddRecordStoreEntry


GetRecordStoreSize

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

function GetRecordStoreSize(rs: recordStore): integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetRecordStoreNextId


ModifyRecordStoreEntry

Изменяет существующую запись под номером index в хранилище rs на строку newData.

procedure ModifyRecordStoreEntry(rs: recordStore;
newData: string;
index: integer);

Совместимость


NextRecord

Возвращает значение следующей записи в пронумерованном хранилище rsEnumIndex. Если записей больше нет, то возвращается пустая строка.

function NextRecord(rsEnumIdx: integer): string;

Совместимость

MIDP1.0

Требуемый модуль

RSEnum

Смотри также

EnumerateRecords


OpenRecordStore

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

function OpenRecordStore(name: string): recordStore;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

CloseRecordStore


ReadRecordStoreEntry

Возвращает информацию, которая хранится в записи под номером index внутри хранилища записей rs. Если такой записи нет, то возвращается пустая строка.

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

Совместимость


UpdateRSEumeration

Обновляет энумерацию записей в хранилище.

procedure UpdateRSEnumeration(rsEnumIdx: integer);

Совместимость

MIDP1.0

Требуемый модуль

RSEnum

Смотри также

EnumerateRecords


AddHttpBody

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

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

Совместимость


AddHttpHeader

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

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

Совместимость


CloseHttp

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

procedure CloseHttp(httpConn: http);

Совместимость


GetHttpHeader

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

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

Совместимость


GetHttpResponse

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

function GetHttpResponse(httpConn: http):string;

Совместимость


IsHttpOpen

Возвращает true (истина) если данное HTTP соединение открыто, в противном случае возвращает false.

function IsHttpOpen(httpConn: http):boolean;

Совместимость


OpenHttp

Открывает HTTP соединение с сервером по адресу url. Адрес url должен быть описан в такой форме: 'http://servername[:port][/filename.ext]', где srvername - адрес сервера, port - номер порта (0 - 65535, обычно HTTP порт это 80 или 8080), filename - имя запрашиваемого файла (если хотите открыть главную страничку какого-либо сайта, то запрашивайте index.html или default.html). Функция возвращает true (истина) если соединение удалось или false если произошла какая-то ошибка.

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

Совместимость


SendHttpMessage

Эта функция отправляет HTTP запрос удаленному серверу, ждет ответа и возвращает вам код ответа сервера или -1 если произошла внутренняя ошибка. Полный список кодов HTTP ответов вы можете найти в Приложениях к данной справке или в сети Интернет (короче говоря, 200 обозначает OK, коды от 400 до 499 описывают ошибки на стороне клиента, коды с 500 по 599 описывают ошибки на стороне сервера и т.п.).

function SendHttpMessage(httpConn: http): integer;

Совместимость


SendHttpMethod

Устанавливает метод HTTP запроса. Метод может быть один из приведенных ниже:

· GET
· POST
· HEAD

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

Совместимость


SmsIsSending

Функция возвращает true (истина) если телефон в данный момент передает SMS сообщение, в других случаях возвращается false.

function SmsIsSending: boolean;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

SmsStartSend, SmsWasSuccessfull


SmsStartSend

Начинает отправку SMS сообщения на заданный номер. Функция возвращает true (истина) если телефон принял вашу команду и он не отсылает в данный момент какое-то другое сообщение, в противном случае функция возратит false. Параметр destination задает номер получателя сообщения и должен обязательно начинаться текстом 'sms://'. В параметре message задаем текст сообщения.

Помните, что функция отправки SMS доступна не на всех мобильных телефонах. MIDletPascal пытается отправить сообщение, используя одно из данных API: Wireless Messaging API или Siemens API.

Приведенный ниже текст показывает пример простейшей отправки SMS сообщения:

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

Пример

begin
  if not SmsStartSend('sms://+911', 'ПОМОГИТЕ!!!') then Halt;

    while SmsIsSending do // Ждем пока отправится...
      Delay(100);

      if not SmsWasSuccessfull then Halt; // Проверка отправки сообщения

end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

SmsIsSending, SmsWasSuccessfull


SmsWasSuccessfull

Возвращает true (истина) если отправка последнего SMS сообщения была осуществлена успешно. Если функция вернула false, то SMS не была отправлена или была отправлена не полностью, что могло произойти по одной из следующих причин:

  • Мобильный телефон не поддерживает отправку SMS из Java приложений (или такая возможность была отключена в настройках безопасности)
  • Сбой связи при передаче
  • Неправильный номер получателя
  • Неожиданно закончились деньги на счету

function SmsWasSuccessfull: boolean;

Совместимость


GetPlayerDuration

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

ПРИМЕЧАНИЕ: Продолжительность некоторых MP3 мелодий может определяться неправильно из-за особенностей сжатия файла. Часто продолжительность MIDI мелодии не удаётся определить вообще.

function GetPlayerDuration:integer;

Совместимость

MMAPI или MIDP2.0

Требуемый модуль

Не требуется

Смотри также

OpenPlayer


OpenPlayer

Загрузить данный аудио-файл из ресурсов (из вашего JAR архива) в плеер. Обратите внимание, что перед имененм файла нужно обязательно писать символ "/". Воспроизведение не будет начато пока вы не вызовите функцию StartPlayer. Функция возвращает false если произошла ошибка чтения файла или какая-либо другая ошибка. Параметр mimetype описывает тип загружаемого файла и может принимать одно из следующих значений:

  • audio/x-wav - WAV файл
  • audio/basic - AU файл
  • audio/mpeg - MP3 файл
  • audio/midi - MIDI файл

Помните, что не все устройства поддерживают MP3 и WAV форматы файлов.

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

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

Пример

begin

    if not OpenPlayer('/explosion.mid', 'audio/midi') then Halt;
    if not SetPlayerCount(-1) then Halt;
    if not StartPlayer then Halt;

    Delay(5000);
end.

Совместимость

MMAPI или MIDP2.0


SetPlayerCount

Устанавливает количество повторов данной мелодии при воспроизведении. В параметре loopCount нужно указать количество повторов мелодии. Эту функцию нужно вызывать после вызова OpenPlayer и до вызова StartPlayer. Если loopCount равен 1, то мелодия будет играть 1 раз, если же loopCount равен -1, то мелодия будет играть до бесконечности. Функция возвращает true (истина) если команда принята и будет исполнена или false если возникла какая-то ошибка.

function SetPlayerCount(loopCount:integer):boolean;

Совместимость

MMAPI or MIDP2.0

Требуемый модуль

Не требуется

Смотри также

OpenPlayer


StartPlayer

Начинает проигрывание мелодии, которая до этого была загружена с помощью функции OpenPlayer. Функция возвращает false если воспроизведение не может быть начато (например, данный телефон не умеет работать с этим форматом звукового файла).

function StartPlayer:boolean;

Пример

begin

    if not OpenPlayer('/explosion.mid', 'audio/midi') then Halt;
    if not SetPlayerCount(-1) then Halt;
    if not StartPlayer then Halt;

    Delay(5000);   // Мелодия будет играть 5 секунд
end.

Совместимость

MMAPI или MIDP2.0

Требуемый модуль

Не требуется

Смотри также

OpenPlayer


StopPlayer

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

procedure StopPlayer;

Совместимость

MMAPI или MIDP2.0

Требуемый модуль

Не требуется

Смотри также

OpenPlayer, StartPlayer


CloseResource

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

procedure CloseResource(res: resource);

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

OpenResource, ResourceAvailable, ReadByte, ReadLine


OpenResource

Функция открывает файл ресурсов, расположенный внутри вашего JAR архива (данный файл нужно было перед компиляцией добавить в ваш проект). Обратите особое внимание, что перед именем файла обязательно должен стоять символ "/".

function OpenResource(name: string):resource;

Пример

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('Прочтенный байт: ' + chr(byte));
      index := FormAddString('Прочтенная строка: ' + line);
      Delay(1000);
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

ResourceAvailable, CloseResource, ReadByte, ReadLine


ReadByte

Читает следующий байт из указанного ресурса res или возвращает EOF если уже нечего читать (или произошла какая-то ошибка).

function ReadByte(res: resource):integer;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

OpenResource, ResourceAvailable, CloseResource, ReadLine


ReadLine

Читает следующую строку текста из файла ресурсов res (признаком конца строки служит символ с кодом 10 или 13) или возвращает пустую строку если больше читать нечего (или произошла ошибка чтения). Если в файле ресурсов есть пустые строки, то они будут пропущены.

ПРИМЕЧАНИЕ: На самом деле функция не умееет определять конец файла (определяет его некорректно). Для корректного чтения всего файла добавьте в конец файла какую-нибудь строку, которая будет служить меткой конца файла (например, '###') и читайте файл ресурсов с помощью алгоритма, показанного ниже.

function ReadLine(res: resource):string;

Пример

var
    s, text: string;
begin
    repeat
        s := ReadLine(res); // Читаем строку из файла
        if s='###' then break; // Если конец файла, то прекращаем чтение
        text := text + s; // Что-то делаем co строкой
    until false;
end.

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

OpenResource, ResourceAvailable, CloseResource, ReadByte


ResourceAvailable

Функция возвращает true (истина) если указанный ресурс есть в наличии (другими словами он был успешно открыт функцией OpenResource), иначе возвращает false.

function ResourceAvailable(res: resource):boolean;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

OpenResource, CloseResource, ReadByte, ReadLine


Assert

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

Assertion failed at:  Tetris.mpsrc:162

procedure Assert(cond: boolean);

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

Debug


Chr

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

function Chr(n: integer): char;

Совместимость


Debug

Процедура выводит указанную строку текста в поток вывода эмулятора телефона. В реальном мобильном телефоне ничего отображаться не будет (хотя при компиляции данная команда будет учитываться и соответственно размер вышего мидлета немного возрастет). Процедура применяется ТОЛЬКО для тестирования работы приложения и поиска и устранения ошибок в коде. Поток вывода имеют далеко не все эмуляторы, а в основном только эмуляторы, идущие в пакете WTK или аналогичных специальных пакетах программ для разработчиков мобильных приложений.

procedure Debug(s: string);

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

Assert


GetProperty

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

function GetProperty(propertyName: string): string;

Список основных допустимых параметров с краткими комментариями приведен ниже (в скобках указаны примеры возвращаемых значений):

  • microedition.platform - модель телефона (CX65)
  • microedition.encoding - кодировка (ISO8859_1)
  • microedition.configuration - конфигурация (CLDC 1.1)
  • microedition.profiles - версия Java (MIDP-2.0)
  • microedition.locale - локализация (en) (ru)
  • microedition.io.file.FileConnection.version - версия файловой системы (1.0)
  • microedition.pim.version - Версия PIM (1.0)
  • microedition.commports - Номера доступных COM портов (0,1)
  • wireless.messaging.sms.smsc - Номер телефона SMS центра
  • wireless.messaging.mms.mmsc - Номер телефона MMS центра

    Пример

    begin
        Debug(GetProperty('microedition.locale'));
    end.

    Совместимость

    MIDP1.0

    Требуемый модуль

    Не требуется

    Смотри также

    Debug, GetWidth, GetHeight

    •


Halt

Полностью прекращает дальнейшее выполнение программы (закрывает приложение).

procedure Halt;

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

IsMidletPaused


IsMidletPaused

Возвращает true (истина) если приложение находится в режиме паузы или false если нет.

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

ПРИМЕЧАНИЕ: Так было на старых однозадачных телефонах. В большинстве современных же существует многозадачность, по-этому там хоть телефонные конференции устраивай и при этом ваше приложение может вообще никогда не войти в режим паузы.

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

function IsMidletPaused: boolean;

Пример

...
  repeat
    // Какая-то работа. Например, опрос клавиатуры

    // Если мидлет в режиме паузы, то ожидаем
    while IsMidletPaused do
    begin
      Delay(100);
    end;

  until gameOver;
...

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

GetKeyCode, GetRelativeTimeMs, Halt


Odd

Функция возвращает true (истина) если данное число n является нечетным, в остальных случаях вернется false.

function Odd(n: integer): boolean;

Совместимость


Ord

Возвращает код из ASCII таблицы символов, соответствующий указанному символу. Функция обратна функции Chr.

function Ord(c: char): integer;

Совместимость


Random

Функция возвращает псевдослучайное число в диапазоне от 0 до n-1.
Приведенная в примере функция возвращает случайное булевое значение; теоретически, вероятность того, что вернется true (истина) примерно 75 %.

function Random(n: integer): integer;

Пример

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

Совместимость

MIDP1.0

Требуемый модуль

Не требуется

Смотри также

Randomize


Randomize

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

procedure Randomize;

Совместимость


Таблица ASCII кодов

Код | Символ | Код | Символ | Код | Символ | Код | Символ
0 |  | 32 | пробел | 64 | @ | 96 | `
1 |  | 33 | ! | 65 | A | 97 | a
2 |  | 34 | " | 66 | B | 98 | b
3 |  | 35 | # | 67 | C | 99 | c
4 |  | 36 | $ | 68 | D | 100 | d
5 |  | 37 | % | 69 | E | 101 | e
6 |  | 38 | & | 70 | F | 102 | f
7 |  | 39 | ' | 71 | G | 103 | g
8 |  | 40 | ( | 72 | H | 104 | h
9 |  | 41 | ) | 73 | I | 105 | i
10 | LF | 42 | * | 74 | J | 106 | j
11 |  | 43 | + | 75 | K | 107 | k
12 |  | 44 | , | 76 | L | 108 | l
13 | CR | 45 | - | 77 | M | 109 | m
14 |  | 46 | . | 78 | N | 110 | n
15 |  | 47 | / | 79 | O | 111 | o
16 |  | 48 | 0 | 80 | P | 112 | p
17 |  | 49 | 1 | 81 | Q | 113 | q
18 |  | 50 | 2 | 82 | R | 114 | r
19 |  | 51 | 3 | 83 | S | 115 | s
20 |  | 52 | 4 | 84 | T | 116 | t
21 |  | 53 | 5 | 85 | U | 117 | u
22 |  | 54 | 6 | 86 | V | 118 | v
23 |  | 55 | 7 | 87 | W | 119 | w
24 |  | 56 | 8 | 88 | X | 120 | x
25 |  | 57 | 9 | 89 | Y | 121 | y
26 |  | 58 | : | 90 | Z | 122 | z
27 |  | 59 | ; | 91 | [ | 123 | {
28 |  | 60 | < | 92 | \ | 124 | |
29 |  | 61 | = | 93 | ] | 125 | }
30 |  | 62 | > | 94 | ^ | 126 | ~
31 |  | 63 | ? | 95 | _ | 127 |


Таблица скан-кодов клавиш телефона

Клавиша | Siemens | Sony Ericsson | Nokia | Motorola
0 | 48 | 48 | 48 | 48
1 | 49 | 49 | 49 | 49
2 | 50 | 50 | 50 | 50
3 | 51 | 51 | 51 | 51
4 | 52 | 52 | 52 | 52
5 | 53 | 53 | 53 | 53
6 | 54 | 54 | 54 | 54
7 | 55 | 55 | 55 | 55
8 | 56 | 56 | 56 | 56
9 | 57 | 57 | 57 | 57
* | 42 | 42 | 42 | 42
# | 35 | 35 | 35 | 35
Вверх | - 59 | - 1 | - 1 | 1 (- 1)
Вниз | - 60 | - 2 | - 2 | 6 (- 2)
Влево | - 61 | - 3 | - 3 | 2 (- 3)
Вправо | - 62 | - 4 | - 4 | 5 (- 4)
Огонь | - 26 | - 5 | - 5 | 20 (- 5)
Взять трубку | - 11 |  |  | - 10
Положить трубку | - 12 |  |  |
Левая софтклавиша | - 1 | - 6 |  | 21
Правая софтклавиша | - 4 | - 7 |  | 22
Меню |  |  |  | 23
Стереть |  | - 8 | - 8 | 0
Назад |  | - 11 |  | 0
Громкость + |  |  |  | - 1 (- 100)
Громкость - |  |  |  | - 2 (- 101)


Коды HTTP ответов

Код | Условное обозначение | Значение
100 | Continue | Клиент должен продолжить свой запрос
101 | Switching Protocols | Сервер переключает протокол по требованию клиента, указанному в поле Upgrade.
200 | OK | Запрос был успешно выполнен, возвращаемая информация зависит от метода указанного клиентом.
201 | Created | Запрос был выполнен, в результате чего был создан новый ресурс. Его расположение возвращается в поле Location.
202 | Accepted | Запрос принят, но его обработка не закончена. Фактически запрос может и не выполниться.
203 | Non-Authoritative Information | Возвращаемая в заголовке информация не оригинал, а взята у третьей стороны.
204 | No Content | Сервер выполнил запрос, но из-за отсутствия информации возвращает лишь код статуса и заголовок.
205 | Reset Content | Запрос выполнен и клиентская программа (браузер) должна очистить документ (форму) инициирующую запрос.
206 | Partial Content | Сервер возвращает лишь часть документа затребованного объема.
300 | Multiple Choices | Запрошенный URL имеет несколько представлений. В качестве такого множества может выступать разбиение по языкам. В заголовке возвращаемого ответа сервером может содержаться информация, конкретизирующая запрос.
301 | Moved Permanently | Запрошенный ресурс перенесен на другой постоянный URI, указанный в поле Location.
302 | Moved Temporarily | Документ, указанный в запросе временно перенесен на другой URI, указанный в поле Location.
303 | See Other | Запрашиваемый URL может быть найден под другим адресом, его следует запрашивать методом GET.
304 | Not Modified | Это ответ сервера на условный запрос с полем If-Modified-Since, означающий, документ не изменялся и клиент должен использовать локальную версию документа.
305 | Use Proxy | Обращение к запрошенному ресурсу должно производиться через прокси-сервер, указанный в поле Location.
400 | Bad Request | Запрос содержит синтаксическую ошибку. Клиенту следует исправить запрос.
401 | Unauthorized | Запрос подразумевает подтверждение подлинности клиента. Требуется повторить запрос с полем Authorization.
402 | Payment Required | Зарезервированный, еще не используемый в HTTP код.
403 | Forbidden | Сервер принял запрос, но отказывается на него отвечать. Возможно, имеется нарушение прав доступа.
404 | Not Found | Документ по данному URL не найден.
405 | Method Not Allowed | Метод для данного запрашиваемого ресурса не дозволен. Сервером также возвращается список разрешенных методов в поле Allow.
406 | Not Acceptable | Документ по данному адресу существует, однако формат ресурса не соответствует запрашиваемому клиентом.
407 | Proxy Authentication Required | Указывает на то, что пользователь должен сначала подтвердить свою подлинность прокси-серверу.
408 | Request Time-out | Истекло время ожидания сервера, при котором клиент мог завершить запрос. Требуется снова произвести подключение.
409 | Conflict | Запрос не может быть выполнен вследствие конфликта с текущим состоянием документа. Сервер также в заголовке возвращает информацию о причине конфликтной ситуации.
410 | Gone | Требуемый ресурс удален с сервера и не может быть предоставлен.
411 | Length Required | Сервер отказал в обработке ресурса из-за отсутствия в заголовке запроса поля Content-Length определяющее длину документа.
412 | Precondition Failed | Условия, указанные клиентом в заголовке запроса, оказались ложными.
413 | Request Entity Too Large | Причина отказа сервера в данном случае - достаточно большой объект запроса. Если это положение временно, то в заголовки ответа включается поле Retry-After.
414 | Request-URL Too Long | Сервер выдает отказ вследствие большой длины в адресе указанного ресурса.
415 | Unsupported Media Type | Сервер отказывается обработать запрос из-за формата объекта запроса, тип которого не поддерживается ресурсом для запрашиваемого метода.
500 | Internal Server Error | На сервере возникла внутренняя ошибка, не позволяющая ему выполнить запрос.
501 | Not Implemented | Методы, указанные клиентом, не поддерживаются сервером для любого ресурса.
502 | Bad Gateway | Сервер получил недопустимые сведения от другого сервера, при попытке осуществить запрос клиента.
503 | Service Unavailable | Временно нет возможности обработать запрос, при этом в заголовке возможно указание времени возобновления функционирования сервера.
504 | Gateway Time-out | Сервер не дождался ответа от другого сервера при попытке обеспечить выполнения запроса.
505 | HTTP Version not supported | Не поддерживается версия протокола HTTP, указанная в запросе клиента.