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

(Продолжение. Начало в №33)

В этой части курса рассмотрим ещё несколько важных элементов формы и поговорим о сохранении информации.


Ещё о форме

Кроме рассмотренных "градусника" (Gauge), бегущей строки (Ticker) и текстового поля (TextField), есть ещё и другие, не менее нужные элементы - меню (Menu), группа выбора (Choice) и текстовое окно (TextBox). Работу с этими элементами мы рассмотрим на примере, в котором создадим меню, в первом пункте создадим что-то типа выбора, во втором покажем, что выбрали, а через третий пункт меню выйдем из приложения.

program Sample;
var click,ok,back:command;
 m1,m2,m3,c1,c2,c3,c:integer;
 str:string;
begin
 ok:=CreateCommand('ОК',CM_OK,1);
 back:=CreateCommand('Назад',CM_BACK,1);
 str:='выбора не было';
 repeat
  ShowMenu('Выберите действие',CH_IMPLICIT);
  m1:=MenuAppendString('Выбор');
  m2:=MenuAppendString('Показать');
  m3:=MenuAppendString('Выход');
  AddCommand(ok);
  repeat
   delay(100);
   click:=GetClickedCommand;
  until click=ok;
  if MenuIsSelected(0) then begin
   ShowForm;
   ClearForm;
   c:=FormAddChoice('Выберите номер',CH_EXCLUSIVE);
   c1:=ChoiceAppendString(c,'номер 1');
   c2:=ChoiceAppendString(c,'номер 2');
   c3:=ChoiceAppendString(c,'номер 3');
   Repaint;
   AddCommand(back);
   repeat
    delay(100);
    click:=GetClickedCommand;
   until click=back;
   RemoveCommand(back);
   if ChoiceIsSelected(c,c1) then str:='1';
   if ChoiceGetSelectedIndex(c)=c2 then str:='2';
   if ChoiceIsSelected(c,c3) then str:='3';
  end;
  if MenuIsSelected(1) then begin
   RemoveCommand(ok);
   ShowTextBox('Вы выбрали номер',str,10,TF_ANY);
   AddCommand(back);
   repeat
    delay(100);
    click:=GetClickedCommand;
   until click=back;
   RemoveCommand(back);
  end;
  if MenuGetSelectedIndex=m3 then halt;
 until 1>2;
end.

Переменные типа Command нужны для кнопок, типа Integer - хранят в себе пункты меню и пункты группы выбора, переменная "Str" - нужна для хранения и отображения выбора. Новой для вас процедурой здесь будет ShowMenu. Она отображает меню на экране дисплея, и в это время никакие другие элементы, кроме команд, не могут быть на экране. Первый параметр этой процедуры - заголовок, а второй - тип. Типов всего три: CH_IMPLICIT (можно выбрать только один элемент меню), CH_EXCLUSIVE (то же самое, только после каждого пункта отображается маленькая радиокнопка), CH_MULTIPLE (можно выбирать несколько пунктов). Далее создаём пункты меню с помощью функции Menu-AppendString, в которой единственным параметром является заголовок пункта. Мы создали 3 пункта меню и ожидаем нажатие кнопки "ОК". Когда кнопка будет нажата, мы проверим, какой из пунктов был выбран в то время, и выполним соответствующее действие. Для проверки есть две функции - MenuIsSelected и MenuGetSelectedIndex. Первая функция возвращает "true", если выделена запись с указанным индексом (они нумеруются с нуля), т.е. MenuIsSelected(0) вернёт "true", если выделен первый пункт, а вторая функция возвращает индекс выделенной записи, т.е. выражение MenuGetSelectedIndex=m3 будет истинно, если выделен пункт, хранящийся в переменной "m3". Какую функцию использовать - дело вашего вкуса.

Если был выбран первый пункт меню, то мы отображаем и очищаем форму, на которой создаём группу выбора функцией FormAddChoice. Эта функция возвращает индекс созданной группы и имеет два параметра - заголовок и тип. Типов два - CH_EXCLUSIVE и CH_MULTIPLE. При первом можно выбрать только один элемент, а при втором - несколько. Далее добавляем пункты, которые можно выбрать, с помощью функции ChoiceAppendString, у которой два параметра. Первый - это индекс группы выбора, в который нужны добавить пункт, второй - текст пункта. Далее ожидаем нажатие команды, которое вернёт нас к меню. После нажатия команды проверяем, какой пункт был выбран, для этого используем две функции - ChoiceIsSelected и ChoiceGetSelectIndex. Первая возвращает "true", если в группе выбора, указанном в первом параметре, выбран элемент с индексом, указанным во втором параметре. Вторая возвращает индекс выбранного элемента группы, указанной в единственном параметре, т.е. условие ChoiceGetSelectedIndex(c)=c2 истинно, если выбран второй элемент. Вы заметили сходство с функциями меню?

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

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

При отображении текстового окна вторым параметром служит переменная "str", в которой хранится номер элемента, который можно было выбрать в первом пункте меню, или "выбора не было", если пользователь ничего не выбирал. Если был выбран третий пункт меню, то программа заканчивает работу (функция "halt").

Стоит немного рассмотреть логику программы. Вначале мы создали две команды (но отображали по ходу программы там, где они были нужны) и присвоили переменной "str" нужное значение. Далее начинается цикл с условием прекращения, когда один станет больше двух (1>2), т.е. бесконечный цикл. Нам нужен именно бесконечный, т.к. после выхода из какого-либо пункта меню его, меню, нужно отобразить заново.

Кроме использованных функций, для работы с рассмотренными элементами есть ещё несколько. Это ChoiceAppendStringImage и MenuAppendStringImage. Это функции добавления пункта в группу выбора и меню, соответственно, но у них не два параметра, а три. Последний параметр - это переменная типа "image", картинка, которая будет отображена рядом с пунктом (работа с ресурсами, в том числе с картинками, будет рассмотрена в следующей статье). Для получения текста, который был введён в текстовое окно, есть функция GetTextBoxString.


Хранилища данных

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

program SampleProgram;
var rs:RecordStore;
 c,s1,s2:integer;
 str1,str2:string;
begin
 rs:=OpenRecordStore('New');
 c:=GetRecordStoreNextId(rs);
 if c=1 then begin
  s1:=AddRecordStoreEntry(rs,'String1');
  s2:=AddRecordStoreEntry(rs,'String2');
 end;
 DeleteRecordStoreEntry(rs,1);
 ModifyRecordStoreEntry(rs,'String3',2);
 str1:=ReadRecordStoreEntry(rs,1);
 str2:=ReadRecordStoreEntry(rs,2);
 DrawText(str1,10,10);
 DrawText(str2,10,30);
 CloseRecordStore(rs);
 DeleteRecordStore('New');
 repaint;
 delay(1000);
end.

Переменная "rs" типа RecordStore будет использоваться для работы с самим хранилищем, т.е. служить указателем на него. Первой строкой программы мы открываем хранилище с именем New, если такого хранилища нет, то оно будет создано. Дальше мы переменной "с" присваиваем номер следующей не занятой записи с помощью функции GetRecordStoreNextId, в параметре которой надо передать нужное хранилище. Если это первая запись, то добавляем две записи функцией AddRecordStoreEntry. Первый параметр функции - это хранилище, а второй - строка, которую нужно добавить. Далее я удаляю первую запись из хранилища "rs" (DeleteRecordStoreEntry(rs,1)). После, с помощью функции ModifyRecordStoreEntry, изменяю запись, хранящуюся под номером 2, из хранилища "rs" на String3. Потом читаем данные из хранилища - переменная "str1" хранит 1 прочтённую запись (если такой записи нет, а мы её удалили, то будет передана пустая строка), а "str2" присваиваем информацию, хранящуюся во второй записи. После рисуем текст, хранящийся в переменных "str1" и "str2". Будет нарисовано "String3", т.к. первую запись мы удалили, а вторую изменили с "String2" на "String3". Далее я закрываю хранилище (CloseRecordStore) и удаляю его (DeleteRecordStore).

Как видите, работа с хранилищами - очень простое дело.

(Окончание следует)

Резидент Николай

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

Номер: 

37 за 2009 год

Рубрика: 

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