如何屏蔽汉字输入

如何屏蔽汉字输入 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061223175511162.html
请问有没有方法使Tedit不能输入汉字.或者选中该Tedit的时候就filter输入法.

//包括粘贴也会过滤掉  
  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;

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

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;  
 

太麻烦了,判断你的输入框里是否是汉字,可以利用,字符串类型,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;

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

mark

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

如果明天大家都没有什么新的想法,我就结贴了!谢谢

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;  
 

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;  
 

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

你可能感兴趣的:(汉字)