模拟Nokia手机输入的编辑框

2016-02-19 16:24 8 1 收藏

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

【 tulaoshi.com - 编程语言 】

 

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

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

  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;

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

  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.

来源:http://www.tulaoshi.com/n/20160219/1611970.html

延伸阅读
标签: Web开发
1.打开页面,输入框自动获得焦点 2.用户输入关键词,如果是第一次输入,则自动清空默认Value值 Code:关于搜索输入框 .firstInp {color:#999;} .doInp {color:#f60;}
标签: Web开发
div.IPDiv{background:#ffffff;width:120;font-size:9pt;text-align:center;border:2 ridge threedshadow;border-right:inset threedhighlight;border-bottom:inset threedhighlight; } input.IPInput{width:24;font-size:9pt;text-align:center;border-width:0; }
标签: Web开发
//* *// [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
celluloid如何编辑文本框的样式   填充颜色:选中文本框,可以在 属性 填充 填充方式 中选择色彩填充。 填充渐变色:选中文本框,可以在 属性 填充 填充方式 中选择渐变填充 。 外扩效果:文字紧贴文本框边缘,若要制作文本框填充范围向外扩展且不影响内部文字的效果,首先选中文本框,再依次执行 属性 填充...
鬼畜输入法怎么编辑   鬼畜输入法是什么? 一款搞怪整蛊的二次元娱乐编辑应用,鬼畜输入法app能制作简单有趣的短视频。 鬼畜输入法怎么玩? 只要你输入台词,它会根据你输入的文字内容,逐字或逐句使用影视作品中演员们说过的镜头,拼起来就是鬼蓄了。最后还支持将小视频分享到 QQ、朋友圈。 按照要求,输入...

经验教程

121

收藏

34
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部