MIDletPascal: курс молодого программиста

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


Графический дисплей (Canvas)

Сейчас рассмотрим самые интересные функции рисования. Для начала это будут функции получения информации о самом устройстве: IsColorDisplay - возвращает "true", если используется цветной дисплей, или, в противном случае, "false"; GetWidth и GetHeight - эти функции возвращают ширину и высоту дисплея в пикселах, тип получаемого результата "integer"; GetColorNum - эта функция возвращает количество цветов, которое может отображать устройство. Следует сказать, что отсчёт системы координат при рисовании начинается с левого верхнего угла дисплея - там координаты "0,0".

В прошлой части мы уже познакомились с функцией вывода текста "DrawText". Но при выводе текста можно изменить шрифт, например, сделать курсивным, или размер. Для этого есть процедура SetFont(Face, Style, Size). Face - это сам тип шрифта, который может принимать значения: FONT_FACE_SYSTEM (системный), FONT_FACE_MONOSPACE (моноширинный), FONT_FACE_PROPORTIONAL (пропорциональный). Style - это стиль шрифта: FONT_STYLE_BOLD (полужирный), FONT_STYLE_ITALIC (курсив), FONT_STYLE_UNDERLINE (подчёркнутый). Size - размер шрифта: FONT_SIZE_SMALL (маленький), FONT_SIZE_MEDIUM (средний), FONT_SIZE_LARGE (большой).

Теперь поговорим о рисовании в классическом понимании. Самая простая процедура - это "plot(x,y)", она ставит точку в координатах x и y. DrawLine(x1, y1, x2, y2) - процедура рисует линию от точки с координатами x1, y1 до точки x2, y2. Процедуры DrawEllipse(x, y, width, height) и FillEllipse(x, y, width, height) рисуют эллипс (в первом случае контур, а во втором - закрашенный элипс) в прямоугольник с координатами x и y, и шириной и высотой - width, height. А процедуры DrawRect и FillRect рисуют контур прямоугольника и закрашенный прямоугольник, соответственно, от координаты х и у, и шириной и высотой - width, height.

 

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


Форма (Form)

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

program SampleProgram;
 Var Ok,Exit,Click:Command;
  Gauge,Field,Age:Integer;
  Name:String;
begin
 Ok:=CreateCommand('OK',CM_SCREEN,1);
 SetTicker('Введите информацию');
 Field:=FormAddTextField('Ваше имя','безымянный', 10,TF_ANY);
 Gauge:=FormAddGauge('Ваш возраст',True,100,0);
 ShowForm;
 AddCommand(Ok);
 Repaint;
 Repeat
  Delay(100);
  Click:=GetClickedCommand;
 Until (Click=Ok);
 Name:=FormGetText(Field);
 Age:=FormGetValue(Gauge);
 ClearForm;
 ShowCanvas;
 Exit:=CreateCommand('Выход',CM_SCREEN,1);
 SetColor(255,0,0);
 SetFont(FONT_FACE_SYSTEM,FONT_STYLE_BOLD,FONT_SIZE_MEDIUM);
 DrawText('Ваше имя:',0,0);
 DrawText(Name,0,20);
 DrawText('Ваш возраст:',0,40);
 DrawText(IntegerToString(Age),0,60);
 AddCommand(Exit);
 Repaint;
 Repeat
  Delay(100);
  Click:=GetClickedCommand;
 Until (Click=Exit);
 RemoveCommand(Exit); 
end.

Для начала в разделе "var" мы описали три переменные типа Command (это, как вы уже знаете из предыдущей статьи, тип софт-клавиш). Ok и Exit нужны для создания и использования самих команд, а Click - для хранения нажатой команды. Gauge и Field нужны для "градусника" и текстового поля, а Age и Name - для хранения введённой пользователем информации.

Первой строкой мы создаём команду функцией CreateCommand. В первом параметре указывается заголовок (он должен быть максимально коротким), в третьем - её приоритет (меньшее значение подразумевает высший приоритет). Во втором параметре указывается тип команды, который служит для указания её назначения. Например, если у команды тип CM_BACK, а устройство имеет специальную кнопку для этого, то команда будет отображена так, как это предполагает дизайн устройства (как кнопка "назад" у телефонов марки Sony Ericsson). Типы можно указать следующие: CM_SCREEN (команда любого типа), CM_OK, CM_CANCEL, CM_BACK, CM_HELP, CM_STOP, CM_EXIT, CM_ITEM

После создания команды вызывается процедура SetTicker. Это бегущая строка с указанным в скобках текстом. Далее я создаю текстовое поле и "градусник". Первый параметр в этих функциях - надпись, которая подсказывает, что надо сделать. В текстовом поле второй параметр - текст, который появляется в поле изначально, третий - максимальное допустимое количество введённых символов. Четвертый параметр - это тип поля, который может принимать одно из следующих значений:

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

В "градуснике" второй параметр влияет на его доступность: True - можно изменять значение, False - нельзя. Третий и четвёртый - это максимальное и начальное значение "градусника".

После добавления нужных элементов формы отображаем её - ShowForm (изначально используется графический дисплей). Далее я вставляю на форму уже созданную команду и перерисовываю экран уже известной нам процедурой Repaint. Надо заметить, что некоторые устройства (такие, как сотовые телефоны Motorola) не отображают команду до тех пор, пока не будет вызвана процедура Repaint. Так что после вызова АddCommand желательно делать вызов Repaint.

После идёт цикл, в котором выполняется задержка в 100 миллисекунд и присваивание переменной Click последней нажатой команды с помощью функции GetClickedCommand. Если последняя нажатая команда это OK, то программа выходит из цикла. После цикла переменным Name и Age через функции FormGetText и FormGetValue присваиваются введённые данные из текстового поля и "градусника", соответственно (переменные поля и "градусника" указаны в параметрах функций). Далее мы очищаем форму от всех элементов (процедура ClearForm) и показываем графический экран, на котором рисуем полученные через форму данные рассмотренными чуть ранее процедурами и функциями. До рисования мы создали ещё одну команду Exit, которою используем для выхода из программы. Предпоследней строкой я удалил эту команду функцией RemoveCommand, в параметре которой указывается элемент, который надо удалить. Т.е. если ClearForm очищает форму от всех элементов, то RemoveCommand - только от указанной команды. Для удаления с формы элемента, кроме команды, можно воспользоваться процедурой FormRemove, в единственном параметре которой надо указать элемент. При рисовании текста была использована функция перевода числа в строку IntegerToString, обратная функция - StringToInteger.

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

Резидент Николай,
rezidentnik@gmail.com

Версия для печатиВерсия для печати

Номер: 

35 за 2009 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!