问一个有关delphi里面的ascii表的值,很怪的问题。 ( 积分: 10 )

  • 主题发起人 主题发起人 mill666
  • 开始时间 开始时间
M

mill666

Unregistered / Unconfirmed
GUEST, unregistred user!
想让一个edit1控件只能输入实数,就是说只能输入数字和小数点,
程序如下:
uses
ClipBrd;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
Mgs: TMsg;

procedure EatKey;
{ Clear Keyboardbuffer }
begin
PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
end;

begin
{ Check if control pressed }
if (ssCtrl in Shift) then
case key of
{ Ctrl + v }
86:
begin
{ determine if the Clipboard contains a string type }
if Clipboard.HasFormat(CF_TEXT) then
{ Check if text consists of numbers }
{ überprüfen, ob der Text aus Zahlen besteht }
try
StrToInt(Clipboard.AsText);
except
{ If no then don't insert text }
{ Wenn nein, dann ignoriere das Einfügen }
EatKey
end;
end;
{ Ctrl + c }
67: { do nothing / nichts machen }
else
EatKey;
end
{ else check for allowed characters such as BackSpace, RETURN...}

else if not (Char(Key) in [#8, #13, #46, #48..#57,#96..#105]) then EatKey;
end;
如果按照上面写,怎么也没办法输入小数点,可是看程序也都没错,难道是ascii的值不一样码?
可是查了ascii表,小数点的值就是#46,可为什么上面的程序就是不能输入小数点?
后来跟踪了一下,发现delphi把小数点的ascii值当成是#190,所以在最后的那个else if里面,把集合增加一个#190在里面,立马可以输入小数点了。
真的很奇怪,而且如果我用
showmessage(char(#190)),可竟然也不是输出小数点哟。这就更加奇怪了。

这是为什么?
 
想让一个edit1控件只能输入实数,就是说只能输入数字和小数点,
程序如下:
uses
ClipBrd;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
Mgs: TMsg;

procedure EatKey;
{ Clear Keyboardbuffer }
begin
PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
end;

begin
{ Check if control pressed }
if (ssCtrl in Shift) then
case key of
{ Ctrl + v }
86:
begin
{ determine if the Clipboard contains a string type }
if Clipboard.HasFormat(CF_TEXT) then
{ Check if text consists of numbers }
{ überprüfen, ob der Text aus Zahlen besteht }
try
StrToInt(Clipboard.AsText);
except
{ If no then don't insert text }
{ Wenn nein, dann ignoriere das Einfügen }
EatKey
end;
end;
{ Ctrl + c }
67: { do nothing / nichts machen }
else
EatKey;
end
{ else check for allowed characters such as BackSpace, RETURN...}

else if not (Char(Key) in [#8, #13, #46, #48..#57,#96..#105]) then EatKey;
end;
如果按照上面写,怎么也没办法输入小数点,可是看程序也都没错,难道是ascii的值不一样码?
可是查了ascii表,小数点的值就是#46,可为什么上面的程序就是不能输入小数点?
后来跟踪了一下,发现delphi把小数点的ascii值当成是#190,所以在最后的那个else if里面,把集合增加一个#190在里面,立马可以输入小数点了。
真的很奇怪,而且如果我用
showmessage(char(#190)),可竟然也不是输出小数点哟。这就更加奇怪了。

这是为什么?
 
procedure TForm1.edt1KeyPress(Sender: TObject; var Key: Char);
begin
if (not (Key in ['0'..'9', #46, #8])) or ((Key = #46) and (Pos('.', edt1.Text) <> 0)) then
Key := #0;
end;
 
这并非什么怪现象,OnKeyDown 事件里的 Key 值是 Virtual Key Code,是对按键的编码,键盘上的每一个按键都有对应的 Virtual Key Code,而ASCII码是对字符的编码,两者是完全一同的两个概念。

举个例子,拿字符 '1' 来说:

ASCII码 = 49

左边键盘 1 键
Virtual Key Code = 49

小键盘 1 键
Virtual Key Code = 97 (NumLock = True)
Virtual Key Code = 35 (NumLock = False)
 
正如qylin1所说的原因。
ak_2005为俺提供了一个更简便的方法。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
776
import
I
后退
顶部