请问有没有方法使Tedit不能输入汉字.或者选中该Tedit的时候就filter输入法.

解决方案 »

  1.   

    //包括粘贴也会过滤掉
    procedure TForm1.Edit1Change(Sender: TObject);
    var
      S: WideString;
      I, J: Integer;
      vSelStart: Integer;
    begin
      vSelStart := TEdit(Sender).SelStart;
      S := TEdit(Sender).Text;
      J := 0;
      for I := Length(S) downto 1 do
        if Length(string(S[I])) >= 2 then
        begin
          if vSelStart <= Length(string(Copy(S, 1, I))) then Inc(J, 2);
          Delete(S, I, 1);
        end;
      TEdit(Sender).Text := S;
      TEdit(Sender).SelStart := vSelStart - J;
    end;
      

  2.   

    谢谢zswang.
    因为工作缘故这几天才学delphie的,以前都是用C.对TEdit(sender)不是很明白.
    是暂时产生一个对象吗?>?还是就是被触发事件的Tedit.把S声明为Wstring这样对其操作的函数(如Delete)不用改变成支持Wstring的函数吗?
    其实我是这么想的.用C的话.只要Editchange事件触发,判断新加上去的字符是否是一个字节大小就行了,因为数字和字母都是一个字节.(你觉得怎么样)
      

  3.   

    Sender就是事件的触发者
    即:就是被触发事件的TEdit
    TEdit(Sender)相当于C里的(TEdit *)Sender
    其实就是vSelStart := Edit1.SelStart;
    这样做法更通用一些,不受控件名的限制
    Length()、Delete()会判断参数中的字符串类型  for I := Length(S) downto 1 do
        if S[I] > #255 then // 这样判断更简洁一些
        begin
          if vSelStart <= Length(string(Copy(S, 1, I))) then Inc(J, 2);
          Delete(S, I, 1);
        end;
      

  4.   

    太麻烦了,判断你的输入框里是否是汉字,可以利用,字符串类型,string和widestring的占位,1个是1个字节为单位的,1个是2个字节为单位的
    function CheckInputStrIsChinese(Var S:string):boolean;
    var
      Str:Widestring;
    begin
       Str:=S;
       if length(Str)=2*length(S) then
       result:=false  //没有汉字
     else result:=true; //有了! 
    end;
      

  5.   

    用string和widestring获得的length值是否相同可以判断出text中是否有全角字符,并不能保证只要不符就是有汉字(全角的, 。日本字,韩国字)。
    但是每字检查ASCII码的范围就可以确切判断是否汉子,但是稍微显得效率不高。
      

  6.   

    谢谢 zswang ,也谢谢其他几位觉 得zswang 的蛮好的.
     winxkm 中的判断:if length(Str)=2*length(S) then应该不能满足我的要求.至少用粘贴的话不行.
    我结贴.
      

  7.   

    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        OldWndProc: TWndMethod;
        procedure EditWndProc(var Message: TMessage);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.EditWndProc(var Message: TMessage);
    var
      ch: Word;
    begin
      if (Message.Msg = WM_PASTE) or (Message.Msg = WM_CUT)
            or ((Message.Msg = WM_CHAR) and (Message.WParam > 127)) then 
        Exit;
      OldWndProc(Message);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      OldWndProc := Edit1.WindowProc;
      Edit1.WindowProc := EditWndProc;
    end;
      

  8.   

    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        OldWndProc: TWndMethod;
        procedure EditWndProc(var Message: TMessage);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.EditWndProc(var Message: TMessage);
    begin
      if (Message.Msg = WM_PASTE) or (Message.Msg = WM_CUT)
            or ((Message.Msg = WM_CHAR) and (Message.WParam > 127)) then 
        Exit;
      OldWndProc(Message);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      OldWndProc := Edit1.WindowProc;
      Edit1.WindowProc := EditWndProc;
    end;
      

  9.   

    真不错.maozefa(阿发伯)子类化窗口过程,我就是用C做window编程的.
    分不够发了.大家委屈点吧.