![](images/chestnut/misc/left.gif) |
20.02.2011, 03:24
|
#1
|
ПроЭктировщик
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений (для 219 пользователей)
|
cInput, система для ввода текста в режиме Canvas
Это простая система позволяет реализовывать поля ввода текста во время графического режима. То есть вам не понадобится использовать не-очень-игровую стандартную форму ввода, или мучатся над ограничением набора вводимых символов.
В примере система работает аналогично стандартному вводу на телефонах Nokia, c единственной разницей в использовании * для стирания текста.
Кроме непосредственного ввода с выбором нужной буквы в зависимости от клавиши, поддерживается смена языков (как и редактирование набора букв для языка), и есть определенная оптимизация (включая определение надобности перерисовки экрана).
Система + пример реализации:
Скриншот:
![](http://img412.imageshack.us/img412/794/temp4zf.png)
Код (тег OFFTOP потому что spoilerа не вижу :\):
![](images/chestnut/misc/code_php.gif)
program cInput; // Код системы var // переменные системы: en: array[0..11] of string; // англ. расскладка enx: array[0..11] of string; // англ. расскладка (заглавные) ru: array[0..11] of string; // русс. расскладка rux: array[0..11] of string; // русс. расскладка (заглавные) lanname: array[0..3] of string; lan: integer; // текущий язык lanc: integer; // количество языков ke_input: string; // текущий ввод ke_current: integer; // текущая кнопка ke_select: integer; // буква под цифрой ke_time: integer; // время ввода ke_timex: integer; // макс. время ввода // Функции системы: { iostart() - инициализация переменных системы Эту функцию нужно запустить до первого использования большинства других функций системы, иначе может произойти что-то ужасное. } procedure iostart; begin lanc := 0; // Английский en[0] := ' 0'; enx[0] := en[0]; en[1] := '.,?!' + chr(39) + '"1'; enx[1] := en[1]; en[2] := 'abc2'; enx[2] := 'ABC2'; en[3] := 'def3'; enx[3] := 'DEF3'; en[4] := 'ghi4'; enx[4] := 'GHI4'; en[5] := 'jkl5'; enx[5] := 'JKL5'; en[6] := 'mno6'; enx[6] := 'MNO6'; en[7] := 'pqrs7'; enx[7] := 'PQRS7'; en[8] := 'tuv8'; enx[8] := 'TUV8'; en[9] := 'wxyz9'; enx[9] := 'WXYZ9'; lanname[0] := 'en'; lanname[1] := 'EN'; lanc := lanc + 2; {// Русский. Может не работать, поэтому закоментирован. ru[0] := en[0]; rux[0] := ru[0]; ru[1] := en[1]; rux[1] := ru[1]; ru[2] := 'абвг2'; rux[2] := 'АБВГ2'; ru[3] := 'дежз3'; rux[3] := 'ДЕЖЗ3'; ru[4] := 'ийкл4'; rux[4] := 'ИЙКЛ4'; ru[5] := 'мноп5'; rux[5] := 'МНОП5'; ru[6] := 'РСТУ6'; rux[6] := 'РСТУ6'; ru[7] := 'фхцч7'; rux[7] := 'ФХЦЧ7'; ru[8] := 'шщъы8'; rux[8] := 'ШЩЪЫ8'; ru[9] := 'ьэюя9'; rux[9] := 'ЬЭЮЯ9'; lanname[2] := 'ru'; lanname[3] := 'RU'; lanc := lanc + 2;} // Инициализация переменных: lan := 0; ke_timex := 10; ke_input := ''; ke_current := -1; ke_time := 0; end; { keytoint(кнопка):индекс - преобразование индекса кнопки в число Преобразовует код кнопки (константу) в легко отличаемое число Возращает 0..9 для цифр, 10 для *, 11 для #, -1 для прочего }function keytoint(key: integer):integer; begin if (key >= ke_key0) and (key <= ke_key9) then keytoint := key - ke_key0 else if (key = ke_star) then keytoint := 10; else if (key = ke_pound) then keytoint := 11; else keytoint := -1; end; { lanstr(индекс) - возращает строку для кнопки из текущего языка (lan) индекс - индекс кнопки (полученный из keytoint) }function lanstr(key:integer):string; begin if key >= 0 then begin if lan = 0 then lanstr := en[key] else if lan = 1 then lanstr := enx[key] else lanstr := ''; end else lanstr := ''; end; { lanlen(индекс) - возращает длину строки кнопки из текущего языка индекс - индекс кнопки (полученный из keytoint) }function lanlen(key:integer):integer; begin lanlen := length(lanstr(key)) end; { lanchr(индекс,номер) - возращает символ из строки кнопки ... индекс - индекс кнопки (полученный из keytoint) номер - номер символа в строке кнопки, желательно меньше ее длины. }function lanchr(key:integer;ind:integer):char; begin lanchr := getchar(lanstr(key),ind) end; { iohandle - основная функция системы возращает: надобность repaintа (boolean) }function iohandle:boolean; var key:integer; begin key := keytoint(getkeyclicked); // получаем последнюю клацнутую кнопку... iohandle := false; // возращенное по умолчанию значение if key >= 0 then begin // если что-то нажато ke_time := 0; // сброс времени ввода iohandle := true; // перерисовуем. if key < 10 then begin // если нажата цифра if key = ke_current then begin // выбор буквы\символа ke_select := ke_select + 1; if ke_select >= lanlen(ke_current) then ke_select := 0; end else begin // нажата другая кнопка if ke_current >= 0 then ke_input := ke_input + lanchr(ke_current,ke_select); ke_current := key; ke_select := 0; end; end else if key = 10 then begin // звездочка (backspace) if(ke_current >= 10)or(ke_current < 0)then if length(ke_input) > 0 then ke_input := copy(ke_input, 0, length(ke_input)-1); ke_current := -1; ke_select := 0; end else if key = 11 then begin // решетка (смена языка) if ke_current >= 0 then // если начат ввод, ввести в строку ke_input := ke_input + lanchr(ke_current,ke_select); lan := lan + 1; if lan >= lanc then lan := 0; ke_current := -1; ke_select := 0; end; // тут дописывать else if'ы для прочих кнопок // (после того как допишите их в keytoint) end else begin if ke_current >= 0 then begin ke_time := ke_time + 1; if ke_time >= ke_timex then begin ke_time := 0; ke_input := ke_input + lanchr(ke_current,ke_select); ke_current := -1; ke_select := 0; iohandle := true; end; end; end; end; // Ниже идет демка var // переменные для демонстрации s, z: string; // строки для вывода, проверки x: integer; // x-координата y: integer; // y-координата c: command; // кнопка выхода // Основная процедура прорисовки (для теста) procedure maindraw; begin setcolor(239, 235, 231); fillrect(0, 0, getwidth, getheight); setcolor(0, 0, 0); x := 4; y := 4; s := 'Input: ' + ke_input; drawtext(s,x,y); y := y + getstringheight(s); z := lanstr(ke_current); if z <> '' then begin s := '[' + copy(z, 0, ke_select); drawtext(s,x,y); x := x + getstringwidth(s); setcolor(255, 0, 0); s := getchar(z, ke_select); drawtext(s,x,y); x := x + getstringwidth(s); setcolor(0, 0, 0); s := copy(z, ke_select+1, length(z)) + ']'; drawtext(s,x,y); x := 4; y := y + getstringheight(s); end else begin s := '[ ]'; // drawtext(s,x,y); y := y + getstringheight(s); end; s := 'Language: ' + integertostring(lan) + ' ' + lanname[lan]; drawtext(s,x,y); y := y + getstringheight(s); s := '* to erase, # to switch language'; drawtext(s,x,y); y := y + getstringheight(s); repaint; end; // Основная программа begin iostart; ke_input := '?'; // добавляем кнопку выхода: c := createcommand('Exit', cm_exit, 1); addcommand(c); // основной цикл: maindraw; repeat if iohandle then maindraw; delay(100); until getclickedcommand = c; removecommand(c); end.
Удачи в использовании сего в вашних проэктах.
Увидеть текстовую благодарность в мою сторону в About'е вашей программы\игры, использующей сию систему, было бы тоже очень мило.
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо YellowAfterlife за это полезное сообщение:
|
|
20.02.2011, 14:27
|
#2
|
AnyKey`щик
Регистрация: 19.02.2011
Сообщений: 9
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: cInput, система для ввода текста в режиме Canvas
Прекрасно!
Почему не дали ссылку в моём треде?
Мне правда инпуты не нужны, только само декодирование.
|
(Offline)
|
|
20.02.2011, 23:50
|
#3
|
ПроЭктировщик
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений (для 219 пользователей)
|
Ответ: cInput, система для ввода текста в режиме Canvas
Сообщение от nokia_c3
Прекрасно!
Почему не дали ссылку в моём треде?
Мне правда инпуты не нужны, только само декодирование.
|
Мысль написать такую систему пришла ко мне когда в вашей теме было только два или три сообщения. Потом, к моменту окончания написания программы, я обновил страницу, и понял что это не совсем то что нужно, и вам оно врядли будет настолько полезным. Поэтому выложил в отдельную тему. Поскольку под-форум не очень активный, заметить новую тему не сложно, и сообщение на указатель в ее сторону тратить не нужно ![:)](images/smilies/smile.gif)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.03.2011, 20:40
|
#4
|
Оператор ЭВМ
Регистрация: 07.02.2009
Адрес: Чебоксары
Сообщений: 28
Написано одно полезное сообщение
|
Ответ: cInput, система для ввода текста в режиме Canvas
А как - же кверти? у меня нокия c3, там кверти, и было - бы лучше создать мидлет, в котором можно было бы вручную понажымать все кнопки и мидлет запомнил бы код кнопок, потом в меню каждую кнопку сопоставить с буквой и усё)).
|
(Offline)
|
|
01.03.2011, 23:03
|
#5
|
Бывалый
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений (для 215 пользователей)
|
Ответ: cInput, система для ввода текста в режиме Canvas
В идеале было бы 3 варината:
обычный, кверти и сенсор.
|
(Offline)
|
|
18.07.2011, 14:25
|
#6
|
AnyKey`щик
Регистрация: 20.06.2011
Сообщений: 8
Написано одно полезное сообщение
|
Ответ: cInput, система для ввода текста в режиме Canvas
нужно добавить сюда символ перевода на новую строку и сам перевод сделать будет не плохо
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:22.
|