KeyDown的疑问,知道的请进来,拜托了 我在过滤窗口键盘输入时遇到一个问题:我打开KeyPreView后,在KeyPress里面做处理,不需要的字符只要Key:=#0就可以了,但是在Keydown这个事件里面做类似的操作就不行,有谁知道其中的原有吗?Key都是Var的,小弟就不懂了,等待中 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Keydown这个事件里的Key值都是键盘输入的ASCII值肯定不行了。 keypress事件中的key是char型的,而keydown事件中的key是word型的,有区分的,如keypress中:key:=#13 在keydown事件中:key:=VK_Return KeyPress主要用来接收字母、数字等ANSI字符,而 KeyDown 事件过程可以处理任何不被 KeyPress 识别的击键,诸如:功能键(F1-F12)、编辑键、定位键以及任何这些键和键盘换档键的组合等。与 KeyDown 事件不同的是,KeyPress 不显示键盘的物理状态(SHIFT键),而只是传递一个字符。KeyPress 将每个字符的大、小写形式作为不同的键代码解释,即作为两种不同的字符。 几种key事件里,key类型并不一样,你再看看个时间里参数中key的类型,像keypress里和keydown就不一样的。 但是,我做了以下的测试:在KeyDown设断点,按个'w'什么的,记住这个Key的值,然后再按个'q'什么的,在处理过程中给那个Key赋先前记住的那个值,但是出来的结果仍旧是'w',也就是说这个赋值语句就是没起作用,why? 没有人能回答我的问题吗?我就想实现类似在KeyPress事件里面过滤按键的功能,类似 key:=#0 。 KeyPress主要用来接收字母、数字等ANSI字符,而 KeyDown 事件过程可以处理任何不被 KeyPress 识别的击键 ...........kSHAPEG已经说清楚了哦。 KeyPress是由WMChar消息触发,先于KeyDown,KeyPress后Edit.Text已经赋值了。KeyDown由WMKeyDown触发,你在KeyDown中改的值也只在该过程有效。你可以试试,在KeyDown中改值,到KeyUp中值又变成触发KeyUp消息的那个按键了。过滤按键还是在KeyPress里写吧。 ssq237712(流亡帅哥) :当一个键按下,事件触发的顺序应该是:KeyDown->KeyPress->KeyUp如果按下的是Ctrl、Alt、Shift之类的控制键,则KeyPress不会被触发。 DDGG(叮叮当当),你可以试一下到底是先KeyDown还是KeyPress,不要想当然。当然,功能键不能触发KeyPress的。 To ssq237712:我再重申一次:KeyDown当然是产生在KeyPress之前的。不信你自己做个试验,在Form1上放置一个TEdit,然后这样处理事件:procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);begin Form1.Color := clRed;end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin Form1.Color := clBlue;end;看看在Edit1里按过键之后窗体的颜色是红的还是蓝的吧!是红的你对,是蓝的我对。 控制键不算,因为那将不触发Edit1KeyPress。 呵呵,是我错了。不过有意思的是:procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);begin ShowMessage('D');end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin ShowMessage('P');end;将发现先显示P,再显示D,其实明明断点先到keydown。 To: ssq237712(流亡帅哥) 呵呵,是的,我已经猜到你是这样测试的了。因为Delphi的事件是可以重入的,其实显示P和显示D的对话框都弹出了,只不过后弹出的把前面的覆盖了而已。就像下面这个例子,前一个ShowMessage窗口并不能阻止后面的ShowMessage窗口弹出。procedure TForm1.Timer1Timer(Sender: TObject);const{$J+} i: Integer = 0;{$J-}begin Inc(i); ShowMessage('Hello ' + IntToStr(i));end; 类型不相同啊.在keyPress中的赋值方式是 Key:=#0在KeyDown中的赋值方式是 Key :=0;还有一种解决方法就是在窗体创建时,通过系统一定的方法通知系统自动将所有的按键都触发KeyPress事件,我看到过这种方法,但不记得代码是怎么写的了,它是通过发一个windows的消息来实现的. 请各位高手进来探索下D7如何应用.Net组件 搞过短信猫的达人请进. 全中国的Delphi程序员都来看看,D2009竟然变成D7,谁能解释一下! 如何创建一个新的excel工作薄? 500分求解窗口句柄的获得方法 急,向大家征求一个上大学的意见,希望大家给些意见 那位老大帮忙看看这段代码有什么问题? 怎样在DBgrid增加一列,显示行号??? stringgrid要怎么连接数椐? combobox 头都大了,DBExpress的事务问题! 难题!如何控制文件夹窗口的“向上”和“后退”的操作?解决即给100分。
keypress中:key:=#13 在keydown事件中:key:=VK_Return
你再看看个时间里参数中key的类型,
像keypress里和keydown就不一样的。
KeyDown由WMKeyDown触发,你在KeyDown中改的值也只在该过程有效。你可以试试,在KeyDown中改值,到KeyUp中值又变成触发KeyUp消息的那个按键了。过滤按键还是在KeyPress里写吧。
当一个键按下,事件触发的顺序应该是:KeyDown->KeyPress->KeyUp
如果按下的是Ctrl、Alt、Shift之类的控制键,则KeyPress不会被触发。
当然,功能键不能触发KeyPress的。
我再重申一次:KeyDown当然是产生在KeyPress之前的。
不信你自己做个试验,在Form1上放置一个TEdit,然后这样处理事件:procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Form1.Color := clRed;
end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
Form1.Color := clBlue;
end;看看在Edit1里按过键之后窗体的颜色是红的还是蓝的吧!
是红的你对,是蓝的我对。
不过有意思的是:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
ShowMessage('D');
end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
ShowMessage('P');
end;将发现先显示P,再显示D,其实明明断点先到keydown。
呵呵,是的,我已经猜到你是这样测试的了。
因为Delphi的事件是可以重入的,其实显示P和显示D的对话框都弹出了,只不过后弹出的把前面的覆盖了而已。
就像下面这个例子,前一个ShowMessage窗口并不能阻止后面的ShowMessage窗口弹出。
procedure TForm1.Timer1Timer(Sender: TObject);
const
{$J+}
i: Integer = 0;
{$J-}
begin
Inc(i);
ShowMessage('Hello ' + IntToStr(i));
end;
在keyPress中的赋值方式是 Key:=#0
在KeyDown中的赋值方式是 Key :=0;
还有一种解决方法就是在窗体创建时,通过系统一定的方法通知系统自动将所有的按键都触发KeyPress事件,我看到过这种方法,但不记得代码是怎么写的了,它是通过发一个windows的消息来实现的.