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...