模拟Nokia手机输入的编辑框

2______女人

2______女人

2016-02-19 16:24

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。
 

  {
  功能:模拟Nokia手机的输入法控件,继承自TCustomEdit
  作者:CoolSlob
  支持:CoolSlob # 163.com 
  最后更新:2004/12/11
  }
  unit NokiaEdit;

  interface

  uses
    SysUtils, Classes, Controls, StdCtrls, ExtCtrls, Dialogs;

  type
    KeysetInt = -1..9; //-1表示发生错误

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

    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;

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  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.

展开更多 50%)
分享

猜你喜欢

模拟Nokia手机输入的编辑框

编程语言 网络编程
模拟Nokia手机输入的编辑框

编辑框和位图按钮的特殊结合

编程语言 网络编程
编辑框和位图按钮的特殊结合

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

如何在编辑框中使用IAutoComplete接口

C语言教程 C语言函数
如何在编辑框中使用IAutoComplete接口

JS+CSS模拟IP输入框

Web开发
JS+CSS模拟IP输入框

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

VC编辑框(EDIT)的自动换行、自动滚屏 、到指定行数自动清空

编程语言 网络编程
VC编辑框(EDIT)的自动换行、自动滚屏 、到指定行数自动清空

Nokia XL手机评测

智能手机
Nokia XL手机评测

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如果忘记Windows XP系统密码 找回方法

如果忘记Windows XP系统密码 找回方法

Observer模式深度探索

Observer模式深度探索
下拉加载更多内容 ↓