WEB开发网
开发学院软件开发Delphi 模拟Nokia手机输入的编辑框 阅读

模拟Nokia手机输入的编辑框

 2006-02-04 13:56:01 来源:WEB开发网   
核心提示: {功能:模拟Nokia手机的输入法控件,继承自TCustomEdit作者:CoolSlob支持:CoolSlob # 163.com 最后更新:2004/12/11}unit NokiaEdit;interfaceuses SysUtils, Classes, Controls, StdCtrls, ExtCtrl
 

{
功能:模拟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.

Tags:模拟 Nokia 手机

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接