作者:董维春 网名:ch_builder
(版权要求:请务必尊重知识产权,未经授权不要转载、摘录)
25)问:控件是怎样处理拖曳的呢?
答:当控件接受被拖曳的对象后会产生OnDragDrop事件,我们需要对这个事件进行响应,在对象观察器中双击控件的OnDragDrop事件域,生成它的处理模板。
加入这样一段代码,
第二条语句判断被拖拽的对象是不是自己,否则不接受拖拽
第三条语句计算被拖拽的是哪一个标签
第四条语句计算被拖拽到哪一个标签
第五条语句的作用是如果被拖拽到的标签是有效标签并且和被拖拽的标签不是同一个标签的时候移动标签。
26)问:控件是怎样结束拖曳的呢?
答:当你释放鼠标时,被拖曳的对象将会产生OnEndDrag事件,响应该事件的事件处理过程有一个Target参数,如果这个参数是nil表示这个对象未被接受,否则该参数就是接受这个对象的控件。在这个例子中被拖曳的对象就是标签组件
加入这样一段代码,它根据Target的值判断是否拖拽成功,并加以提示。
27)问:C++Builder提供了哪些方法来处理键盘方法?
答:C++Builder提供了三种键盘事件:OnKeyDown,OnKeyPress和OnKeyUp。这三种事件均可以获得用户的击键。
要注意的是,如果用户按下的是快捷键或者热键,那么你并不需要编写事件处理过程,例如你按下了Alt+F激活了File菜单,这个操作由系统完成,你不需要参与。
28)问:C++Builder提供的这三种键盘事件之间有什么区别?
答:按下任何键都会产生OnKeyDown和OnKeyUp事件,而OnKeyPress事件是由单个的字符键产生的。也就是说一些没有对应ASCII字符的键,例如Ctrl, Shift, Alt, F1等功能键不会产生OnKeyPress事件。
OnKeyDown和OnKeyUp事件的事件处理过程中包含了最近一次击键发生时,控制键Alt,Shift或者Ctrl是否按下的信息,而OnKeyPress事件只返回键的ASCII字符。
假设用户按下了Shift+P键,那么这三种键盘事件产生的顺序如下所示:
(1)按下Shift键时将产生OnKeyDown事件。
(2)保持Shift键再按下P时将产生OnKeyDown事件。
(3)由于按下了P键,所以产生了OnKeyPress事件。
(4)释放Shift键和P键,将产生OnKeyUp事件。
OnKeyDown和OnKeyUp事件的事件处理过程有三个参数,除了我们大家熟悉的参数Sender外,还有一个变量参数Key和控制键参数Shift。变量参数Key是一个字符类型的变量,它保存着用户按下的字符键。例如,要判断用户是否按下了字符键H,可以这样编写代码:
if (Key==’P’){…}
注意,这里如果是判断一个字母,那么需要小心字母的大小写。
要判断是否按下了控制键,可以用方法Contains
来判断用户是否按下了Shift键。
与前面两个事件相比,OnKeyPress事件的事件处理过程没有控制参数Shift,只有当你按下了单个字符键(例如字母键、数字键、空格键等)时,这个事件才会产生,变量参数Key中才会包含这个字符。
29)问:学习事件及事件响应应该注意什么?
答:在学习事件时要抓住两个关键点:一是事件产生的条件,二是事件处理过程所使用的参数。前者使你能够正确地判断该事件是否能够产生,后者使你能够正确地处理事件。
另外,还要理解多个同类事件的细微区别,就像三种键盘事件在相似的外表下,有着不同产生条件。
(未完待续)