版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、键盘和鼠标编程 事件可分为用户事件和系统事件两类。用户事件比较好理解,它用于响应应用程序的用户的动作。单击鼠标,就会调用一个OnMouseDown事件。移动鼠标,就会响应一个OnMouseMove事件。敲击键盘,会响应一个OnKeyDown事件。系统事件是由操作系统产生的。典型的系统事件是定时器的OnTimer事件。不管事件以何种方式调用,Delphi总是先看事件处理器是否添加了代码,如果有代码,代码将被执行,否则什么也不发生。 在事件驱动编程中,Delphi处理事件的顺序非常重要。用户仅仅只发出一个请求就可能触发许多事件,因此弄清楚事件发生的顺序非常重要。清楚了事件发生的顺序后可以避免出现一
2、些竟想不到的结果。例如,单击按钮,首先响应的是OnEnter事件,然后响应OnMouseDown事件,最后触发的是Onclick事件。 键盘事件处理 键盘事件 1OnKeyDown 当按下键盘上的任一个键,如字母键、数字键、功能键(F1F12)、Ctrl键、Shift键或Alt键等,都将产生一个OnKeyDown事件。 下面的一段代码说明了OnKeyDown事件的用法:当打印的时候在窗体中按下Esc键后,取消打印作业。 procedureTForm1.FormKeyDown(Sender:TObject;varKey:Word;Shift:TShiftState); begin if(Key=
3、VK_ESCAPE)andPrinter.Printingthen begin Printer.Abort;/中止打印 M e s s a g e D l g ( 打 印 中 止 。,mtInformation,mbOK,0); End; End; 2OnKeyPress 当按下键盘上的一个字符键,如字母键、数字键等会产生一个OnKeyPress事件,但是单独按下功能键(F1F12)、Ctrl键、Shift键或Alt键等,不会产生OnKeyPress事件。 下面的一段代码说明了OnKeyPress事件的用法: procedureTForm1.FormKeyPress(Sender:TObjec
4、t;varKey:Char); begin /显示按下的键 M e s s a g e D l g ( 你 按 下 了 + K e y + 键 。,mtInformation,mbOK,0); End; 3OnKeyUp 当按下键盘上的任一个键后松开时,都会产生一个OnKeyUp事件。对于功能键(F1F12)、Ctrl键、Shift键或Alt键等,也会产生一个OnKeyUp事件。 下面的一段代码说明了OnKeyDown事件和OnKeyUp事件的用法:varFormColor:TColor;/用来保存窗体原来的颜色procedureTForm1.FormKeyDown(Sender:TObjec
5、t;varKey:Word;Shift:TShiftState);begin/当键按下时先保存窗体的颜色然后再改变窗体的颜色FormColor:=Form1.Color;Form1.Color:=clAqua;end;procedureTForm1.FormKeyUp(Sender:TObject;varKey:Word;Shift:TShiftState);begin/当键弹起时恢复窗体的颜色Form1.Color:=FormColor;end;程序运行后,在窗体中按下某个键然后松开,窗体的颜色会随之改变。 模拟按下键盘上的某个键模拟按下键盘上的某个键 有时在一些应用程序中,也需要模拟在键盘
6、上按下某个键的过程,这可以通过向特定对象发送按键事件来实现。 例4-1 模拟按下键盘上的某个键(1)创建一个新的工程,在窗体中添加一个Edit组件、一个Button组件和一个定时器组件(位于System标签页)。(2)并添加Button组件的OnClick事件、Timer组件的OnTimer事件的处理过程如下:procedureTForm1.Button1Click(Sender:TObject);/模拟在Edit1组件中按下了字母a键beginPostMessage(Edit1.Handle,WM_KEYDOWN,65,0);end;procedureTForm1.Timer1Timer(S
7、ender:TObject);/模拟在窗体Form1中按下了Tab键beginPostMessage(Form1.Handle,WM_KEYDOWN,VK_TAB,0);end;(3)运行程序,可以看到窗体的输入焦点在不断地变化,尽管并没有在键盘上按下Tab键。如果按下Button1按钮,则Edit1组件中的字符串会自动增加一个字母a。 检测功能键 在 组 件 的 O n K e y D o w n 、 O n K e y U p 、OnMouseDown和OnMouseUp等事件的处理过程中,有一个TShiftState类型的变量Shift,TShiftState类型定义如下: typeTS
8、hiftState=setof(ssShift,ssAlt,ssCtrl,ssLeft,ssRight,ssMiddle,ssDouble); 所以根据Shift的值就可以判断当键盘上的键按下时Shift、Alt和Ctrl键的状态,或者按下鼠标左键、中键时的状态或者是否双击了按键。当然,如果有OnMouseDown事件发生了,而又不是按下左键和中键,则按下的一定是右键 例4-2 检测Shift、Alt和Ctrl键是否按下。 procedureTForm1.FormKeyDown(Sender:TObject;varKey:Word; Shift:TShiftState); begin if S
9、hift=ssShiftthen caption:=你按下了Shift键; if Shift=ssAltthen caption:=你按下了Alt键; if Shift=ssCtrlthen caption:=你按下了Ctrl键; end; procedureTForm1.FormMouseDown(Sender:TObject;Button:TMouseButton; Shift:TShiftState;X,Y:Integer); begin if Shift=ssLeftthen caption:=你单击鼠标左键; if Shift=ssMiddlethen caption:=你单击鼠标中
10、键; if Shift=ssDoublethen caption:=你双击了鼠标; if ssRightinShiftthen caption:=你单击鼠标右键; end; 鼠标事件处理 常用鼠标事件 1OnMouseDown 当 按 下 鼠 标 上 的 任 一 个 键 , 会 产 生 一 个OnMouseDown事件。 2OnMouseMove 当 鼠 标 的 位 置 发 生 了 改 变 后 会 产 生 一 个OnMouseMove事件。 3OnMouseUp 当鼠标的某个按键按下,然后松开后会产生一个OnMouseUp事件。 拖放编程 常用的拖放事件有: 1OnDragDrop 在拖曳事件
11、开始时会产生一个OnDragDrop事件。 2OnDragOver 当 拖 曳 对 象 跨 过 一 个 组 件 时 会 产 生 一 个OnDragOver事件。 3OnEndDrag 当拖曳事件结束后会产生一个OnEndDrag事件。具体过程如下:(1) 拖曳操作开始大多数的组件具有DragMode属性,表示开始拖曳操作的方式。DragMode属性的缺省值为dmManual,也就是要在被拖动组件的OnMouseDown事件的处理过程中调用BeginDrag过程才开始拖曳操作。如果将DragMode属性设置为dmAutomation,则鼠标左键在被拖动组件上按下后就自动开始拖曳操作。(2) 接受
12、拖曳操作当拖动一个组件经过第二个组件的时候,第二个组件会产生一个OnDragOver事件。在该事件的处理过程中有一个布尔类型的参数,该参数的设置直接影响是否产生OnDragDrop事件。一般情况下,在OnDragOver事件的处理过程中,根据参数Source判断拖曳操作的源。如果是可以接受的源,则将Accept参数设置为True;否则,将其设置为False。(3) 处理拖曳操作在第二个组件的OnDragDrop事件的处理过程中,根据拖曳操作的源做一些相应的处理。(4) 拖曳操作结束拖曳操作完成后释放鼠标左键,会在第一个组件中产生一个OnEndDrag事件,可以根据参数Target的数值进行相应
13、的处理。如果参数Target的值为nil,则表示拖曳操作没有被接受;如果Target的值不为nil,则Target的值就是接受拖曳操作的组件。 例4-3 该例程说明了拖动操作的实现过程。程序运行结果界面如图4-1所示,上面有一个Edit组件,下面是一个Memo组件。程序运行后,可以在Edit组件中输入一些文字,然后将鼠标移动到Edit组件上并按下左键,拖动到Memo组件并松开左键,则Edit组件中的文字就被添加到Memo组件中了。 (3)选中Edit组件并在对象编辑器中为其添加OnMouseDown事件的处理过程如下: procedureTForm1.Edit1MouseDown(Sender
14、:TObject;Button:TMouseButton; Shift:TShiftState;X,Y:Integer); begin ifButton=mbLeftthen /开始进行拖动操作 (SenderAsTEdit).BeginDrag(False); end; 注意:过程BeginDrag具有一个布尔类型的参数,如果该参数设置为False,表示当按下鼠标左键并拖动一小段距离后才进行拖曳操作;如果设置为True,表示当按下鼠标左键后立即进行拖曳操作。通常将该参数设置为False。 (4)选中Memo组件并在对象编辑器中为其添加OnDragOver事件和OnDragDrop事件的处理 过程如下: procedureTForm1.Memo1DragOver(Sender,Source:TObject;X,Y:Integer; State:TDragState;varAccept:Boolean); begin ifSourceIsTEditthen Accept:=True;/可以接受拖动操作 end; procedureTForm1.Memo1DragDrop(Sende
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 无证房屋交易合同范本
- 合同转让合同的签订技巧
- 广告媒体设计合同
- 广告委托协议-合同范本
- 六年级语文上册第六单元口语交际 意见不同怎么办 公开课一等奖创新教学设计
- 《痴呆震颤麻痹》课件
- 狂犬病辩证论治方案
- 手术区铺无菌手术单
- 胫骨远端骨折术后护理
- 年产xx男帽项目建议书
- GB/T 19342-2024手动牙刷一般要求和检测方法
- 2023-2024学年广东省深圳市南山区八年级(上)期末英语试卷
- GB/T 15822.1-2024无损检测磁粉检测第1部分:总则
- QC080000培训资料课件
- 《研学旅行课程设计》课件-学习情境三 研之有方-研学课程教学设计
- 音乐教师职业生涯发展报告
- 年晋升司机理论考试HXD1专业知识题库
- 苯氯苯连续精馏塔设计二设计正文
- 焊缝焊条用量的计算公式
- 浆砌块石施工方法
- (推荐)浅谈初中学生英语写作中存在的问题、原因及解决策略
评论
0/150
提交评论