模拟Nokia手机输入的编辑框
2006-02-04 13:56:01 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閹冣挃闁硅櫕鎹囬垾鏃堝礃椤忎礁浜鹃柨婵嗙凹缁ㄧ粯銇勯幒瀣仾闁靛洤瀚伴獮鍥敍濮f寧鎹囬弻鐔哥瑹閸喖顬堝銈庡亝缁挸鐣烽崡鐐嶆棃鍩€椤掑嫮宓佸┑鐘插绾句粙鏌涚仦鎹愬闁逞屽墰閹虫捇锝炲┑瀣╅柍杞拌兌閻ゅ懐绱撴担鍓插剱妞ゆ垶鐟╁畷銉р偓锝庡枟閻撴洘銇勯幇闈涗簼缂佽埖姘ㄧ槐鎾诲礃閳哄倻顦板┑顔硷工椤嘲鐣烽幒鎴旀瀻闁规惌鍘借ⅵ濠电姷鏁告慨顓㈠磻閹剧粯鈷戞い鎺嗗亾缂佸鏁婚獮鍡涙倷閸濆嫮顔愬┑鐑囩秵閸撴瑦淇婇懖鈺冪<闁归偊鍙庡▓婊堟煛鐏炵硶鍋撻幇浣告倯闁硅偐琛ラ埀顒冨皺閺佹牕鈹戦悙鏉戠仸闁圭ǹ鎽滅划鏃堟偨缁嬭锕傛煕閺囥劌鐏犻柛鎰ㄥ亾婵$偑鍊栭崝锕€顭块埀顒佺箾瀹€濠侀偗婵﹨娅g槐鎺懳熺拠鑼舵暱闂備胶枪濞寸兘寮拠宸殨濠电姵纰嶉弲鎻掝熆鐠虹尨宸ョ€规挸妫濆铏圭磼濡搫顫嶇紓浣风劍閹稿啿鐣烽幋锕€绠婚悹鍥у级瀹撳秴顪冮妶鍡樺鞍缂佸鍨剁粋宥夋倷椤掍礁寮垮┑鈽嗗灣閸樠勭妤e啯鍊垫慨妯煎亾鐎氾拷

{
功能:模拟Nokia手机的输入法控件,继承自TCustomEdit
作者:CoolSlob
支持:CoolSlob # 163.com
最后更新:2004/12/11
}
unit NokiaEdit;
interface
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;
{ Private declarations }
protected
{ Protected declarations }
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
{ Public declarations }
constructor Create(AOwner: TComponent);override;
destructor Destroy;override;
property TextLength: Integer read GetTextLength;
published
{ Published declarations }
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
RegisterComponents('CoolSlob', [TNokiaEdit]);
end;
{ TNokiaEdit }
constructor TNokiaEdit.Create(AOwner: TComponent);
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);
var
CurIndex, 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);
end
else
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;
var
S: string;
begin
Result := #0;
S := FKeyset.Strings[Index];
if S <> '' then Result := S[1];
end;
function TNokiaEdit.SearchNextChar(const Index: KeysetInt;
Key: Char): Char;
var
I: 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.
更多精彩
赞助商链接