程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 模擬Nokia手機輸入的編輯框

模擬Nokia手機輸入的編輯框

編輯:Delphi
{
  功能:模擬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.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved