//包括粘贴也会过滤掉
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编程的.
分不够发了.大家委屈点吧.