如何屏蔽汉字输入

fang_jeffrey 2006-12-23 05:55:11
请问有没有方法使Tedit不能输入汉字.或者选中该Tedit的时候就filter输入法.
...全文
221 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fang_jeffrey 2006-12-25
  • 打赏
  • 举报
回复
真不错.maozefa(阿发伯)子类化窗口过程,我就是用C做window编程的.
分不够发了.大家委屈点吧.
阿发伯 2006-12-24
  • 打赏
  • 举报
回复
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;
阿发伯 2006-12-24
  • 打赏
  • 举报
回复
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;
fang_jeffrey 2006-12-24
  • 打赏
  • 举报
回复
如果明天大家都没有什么新的想法,我就结贴了!谢谢
fang_jeffrey 2006-12-24
  • 打赏
  • 举报
回复
谢谢 zswang ,也谢谢其他几位觉 得zswang 的蛮好的.
winxkm 中的判断:if length(Str)=2*length(S) then应该不能满足我的要求.至少用粘贴的话不行.
我结贴.
dovelee 2006-12-24
  • 打赏
  • 举报
回复
mark
何鲁青 2006-12-24
  • 打赏
  • 举报
回复
用string和widestring获得的length值是否相同可以判断出text中是否有全角字符,并不能保证只要不符就是有汉字(全角的, 。日本字,韩国字)。
但是每字检查ASCII码的范围就可以确切判断是否汉子,但是稍微显得效率不高。
winxkm 2006-12-24
  • 打赏
  • 举报
回复
太麻烦了,判断你的输入框里是否是汉字,可以利用,字符串类型,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;
王集鹄 2006-12-23
  • 打赏
  • 举报
回复
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;
fang_jeffrey 2006-12-23
  • 打赏
  • 举报
回复
谢谢zswang.
因为工作缘故这几天才学delphie的,以前都是用C.对TEdit(sender)不是很明白.
是暂时产生一个对象吗?>?还是就是被触发事件的Tedit.把S声明为Wstring这样对其操作的函数(如Delete)不用改变成支持Wstring的函数吗?
其实我是这么想的.用C的话.只要Editchange事件触发,判断新加上去的字符是否是一个字节大小就行了,因为数字和字母都是一个字节.(你觉得怎么样)
王集鹄 2006-12-23
  • 打赏
  • 举报
回复
//包括粘贴也会过滤掉
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;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧