模擬Nokia手機輸入的編輯框

2021-03-31 08:56:58 字數 4556 閱讀 1630

inte***ce

uses

sysutils, classes, controls, stdctrls, extctrls, dialogs;

type

keysetint = -1..9; //-1表示發生錯誤

tnokiaedit = class(tcustomedit)

private

finterval: integer;

fkeyset: tstrings;

procedure setkeyset(const value: tstrings);

function gettimerenabled: boolean;

procedure settimerenabled(const value: boolean);

function gettextlength: integer;

protected

ftimer: ttimer;

procedure ontimer(sender: tobject);virtual;

property timerenabled: boolean read gettimerenabled write settimerenabled;

procedure keypress(var key: char); override;

function indexbychar(const key: char): keysetint;

function searchnextchar(const index: keysetint; key: char): char;

function searchfirstchar(const index: keysetint): char;

function endofchar(const value: string): char;

public

constructor create(aowner: t***ponent);override;

destructor destroy;override;

property textlength: integer read gettextlength;

published

property maxlength default 1;

property interval: integer read finterval write finterval;

property keyset: tstrings read fkeyset write setkeyset;

property font;

end;

procedure register;

implementation

procedure register;

begin

register***ponents('coolslob', [tnokiaedit]);

end;

constructor tnokiaedit.create(aowner: t***ponent);

begin

inherited;

fkeyset := tstringlist.create;

ftimer := ttimer.create(self);

ftimer.ontimer := ontimer;

end;

destructor tnokiaedit.destroy;

begin

fkeyset.free;

fkeyset := nil;

inherited;

end;

function tnokiaedit.endofchar(const value: string): char;

begin

if value = '' then result := #0

else result := value[length(value)];

end;

function tnokiaedit.gettextlength: integer;

begin

result := length(trim(text));

end;

function tnokiaedit.gettimerenabled: boolean;

begin

result := ftimer.enabled;

end;

function tnokiaedit.indexbychar(const key: char): keysetint;

//var

i: integer;

begin

result := -1;

if not assigned(fkeyset) then exit;

for i := 0 to fkeyset.count - 1 do

begin

if pos(key, fkeyset.strings[i]) > 0 then

begin

result := i;

break;

end;

end;

end;

procedure tnokiaedit.keypress(var key: char);

varcurindex, newindex: keysetint;

s: string;

curchar: char;

selected: boolean;

begin

inherited;

if key in ['0'..'9'] then

begin

ftimer.enabled := false; 

if textlength = 0 then curindex := -1

else curindex := indexbychar(text[length(text)]);

newindex := ord(key) - 48;

if curindex = newindex then

begin

curchar := endofchar(text);

s := text;

selected := wordbool(sellength);

delete(s, selstart + 1, sellength);

text := s;

if (not selected)or(curchar='') then text := text + searchfirstchar(curindex)

else text := text + searchnextchar(curindex, curchar);

endelse

text := text + searchfirstchar(newindex);

selstart := length(text) - 1;

sellength := 1;

ftimer.enabled := true;

key := #0;

end;

end;

procedure tnokiaedit.ontimer(sender: tobject);

begin

sellength := 0;

selstart := length(text);

ftimer.enabled := false;

end;

function tnokiaedit.searchfirstchar(const index: keysetint): char;

vars: string;

begin

result := #0;

s := fkeyset.strings[index];

if s <> '' then result := s[1];

end;

function tnokiaedit.searchnextchar(const index: keysetint;

key: char): char;

vari: integer;

s: string;

begin

s := fkeyset.strings[index];

i := pos(key, s);

if i = length(s) then i := 1

else i := i + 1;

result := s[i];

end;

procedure tnokiaedit.setkeyset(const value: tstrings);

begin

if assigned(fkeyset) then fkeyset.assign(value)

else fkeyset := value;

end;

procedure tnokiaedit.settimerenabled(const value: boolean);

begin

if ftimer.enabled <> value then

ftimer.enabled := value;        

end;

end.

基於Nokia手機的移動遊戲開發步步通(一)

一 遊戲開發策略 1 遊戲動作 action 的使用 midp的canvas類讓程式設計師處理某些按鍵事件,要麼作為特定的低階鍵控 事件要麼作為抽象的遊戲動作。fullcanvas是nokia的全屏畫布 fullcanvas 類,它是從canvas類繼承而來的。在回合制遊戲或者不需要超過四個方向鍵 ...

基於Nokia手機的移動遊戲開發步步通(三)

二 實現遊戲的步驟 下圖顯示的是一個遊戲midlet在成功安裝和執行之後使用者介面狀態的典型的變化流程。我們想通過一個遊戲者的視角來闡述開發移動遊戲的過程。圖3 使用者介面狀態圖表 1 開始遊戲 在使用者啟動midlet之後,將顯示遊戲特定的閃動螢幕。閃動螢幕是fullcanvas的一個例項。它可用...

基於Nokia手機的移動遊戲開發步步通(三)

二 實現遊戲的步驟 下圖顯示的是一個遊戲midlet在成功安裝和執行之後使用者介面狀態的典型的變化流程。我們想通過一個遊戲者的視角來闡述開發移動遊戲的過程。圖3 使用者介面狀態圖表 1 開始遊戲 在使用者啟動midlet之後,將顯示遊戲特定的閃動螢幕。閃動螢幕是fullcanvas的一個例項。它可用...

用Flex模擬智慧手機表單輸入的自動放大功能

用iphone或itouch登入過微薄的同學們想必都會發現 登入一些手機版 比如微薄時 表單中的輸入框會自動放大,以方便使用者輸入,等輸入完成後,頁面會再次縮小到正常狀態。下面是演示 當username與password文字框獲得焦點時,表單 其實就是panel 會自動放大,並重新定位,最終將獲得焦...

上拉輸入 下拉輸入 浮空輸入 模擬輸入的區別

以及上拉輸入 下拉輸入 浮空輸入 模擬輸入的區別 最近在看資料手冊的時候,發現在cortex m3裡,對於gpio的配置種類有8種之多 1 gpio mode ain 模擬輸入 2 gpio mode in floating 浮空輸入 3 gpio mode ipd 下拉輸入 4 gpio mode...