最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。
【 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 }
  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.
来源:http://www.tulaoshi.com/n/20160219/1611970.html
看过《模拟Nokia手机输入的编辑框》的人还看了以下文章 更多>>