请问有没有方法使Tedit不能输入汉字.或者选中该Tedit的时候就filter输入法.
解决方案 »
- 求助:如何监控应用程序启动,并将标题显示出来?
- 请问为何我写的MDI窗体的程序,在Win2000的系统中最大化时正好可以出现在整个屏幕中间,但在XP系统下最大化窗体时总不是能完全布满整个屏幕?
- 复制时出错
- 这个sql语句怎么写
- 大家开发MSSQLSERVER时都是用ADO控件连接的方式还是代码连接的方式啊?
- 如何实现这样的功能?
- 请问在DELPHI7中怎样用DELPHI6的控件?
- 请问那有Installshield Express for Delphi下载!
- 为什么我的ADO不能用ctDynamic类型的CursorType(游标)?
- 我用TQUERY控件ADD SQL语言查询表!假如SQL语言格式错误DELPHI会跳出一个警告窗口,如何屏蔽它,或修改警告窗口里的文字!!
- 小小生日快乐
- datetime中时间增减..
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;
因为工作缘故这几天才学delphie的,以前都是用C.对TEdit(sender)不是很明白.
是暂时产生一个对象吗?>?还是就是被触发事件的Tedit.把S声明为Wstring这样对其操作的函数(如Delete)不用改变成支持Wstring的函数吗?
其实我是这么想的.用C的话.只要Editchange事件触发,判断新加上去的字符是否是一个字节大小就行了,因为数字和字母都是一个字节.(你觉得怎么样)
即:就是被触发事件的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;
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;
但是每字检查ASCII码的范围就可以确切判断是否汉子,但是稍微显得效率不高。
winxkm 中的判断:if length(Str)=2*length(S) then应该不能满足我的要求.至少用粘贴的话不行.
我结贴.
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;
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;
分不够发了.大家委屈点吧.