在delphi中理解和处理键盘事件

键盘事件和鼠标事件是用户与程序交互的主要元素。...

键盘事件和鼠标事件是用户与程序交互的主要元素。

下面是关于三个事件的信息,这三个事件可以让您在Delphi应用程序中捕获用户的击键:OnKeyDown、onkeydup和OnKeyPress。

下,上,按,下,上,按。。。

Delphi应用程序可以使用两种方法从键盘接收输入。如果用户必须在应用程序中键入某些内容,接收该输入的最简单方法是使用自动响应按键的控件之一,如编辑。

但是,在其他时候,出于更一般的目的,我们可以在表单中创建过程,以处理表单和接受键盘输入的任何组件识别的三个事件。我们可以为这些事件编写事件处理程序,以响应用户在运行时可能按下的任何键或键组合。

以下是这些活动:

OnKeyDown—当按下键盘上的任意键时调用OnKeyUp—当释放键盘上的任意键时调用DonKeyPress—当按下与ASCII字符对应的键时调用

键盘处理程序

所有键盘事件都有一个共同的参数。键参数是键盘上的键,用于通过引用传递按下键的值。Shift参数(在OnKeyDown和OnKeyUp过程中)指示Shift、Alt或Ctrl键是否与按键组合。

Sender参数引用用于调用该方法的控件。

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState) ; ... procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState) ; ... procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char) ;

当用户按下快捷键或快捷键(如随菜单命令提供的快捷键或快捷键)时进行响应,不需要编写事件处理程序。

什么是集中(focus)?

焦点是通过鼠标或键盘接收用户输入的能力。只有具有焦点的对象才能接收键盘事件。此外,在任何给定的时间,每个表单只能有一个组件在运行的应用程序中处于活动状态或具有焦点。

某些组件,如TImage、TPaintBox、TPanel和TLabel无法接收焦点。通常,从TGraphic控件派生的组件无法接收焦点。此外,在运行时不可见的组件(TTimer)无法接收焦点。

onkeydown,onkeydup

OnKeyDown和OnKeyUp事件提供最低级别的键盘响应。OnKeyDown和OnKeyUp处理程序都可以响应所有键盘键,包括功能键和结合Shift、Alt和Ctrl键的键。

键盘事件不是相互排斥的。当用户按键时,会生成OnKeyDown和OnKeyPress事件,当用户释放按键时,会生成OnKeyUp事件。当用户按下OnKeyPress未检测到的一个键时,只会发生OnKeyDown事件,然后是OnKeyUp事件。

如果按住某个键,OnKeyUp事件将在所有OnKeyDown和OnKeyPress事件发生后发生。

按键

OnKeyPress为“g”和“g”返回不同的ASCII字符,但OnKeyDown和OnKeyUp不区分大写字母键和小写字母键。

按键和换档参数

由于Key参数是通过引用传递的,因此事件处理程序可以更改Key,以便应用程序看到事件中涉及到不同的Key。这是一种限制用户可以输入的字符类型的方法,比如防止用户键入alpha键。

if Key in ['a'..'z'] + ['A'..'Z'] then Key := #0

上面的语句检查键参数是否是两个集合的并集:小写字符(即a到z)和大写字符(a-z)。如果是这样,则语句将字符值零指定给键,以防止任何输入到编辑组件中,例如,当它接收到修改的键时。

对于非字母数字键,可以使用WinAPI虚拟键代码确定按下的键。Windows为用户可以按的每个键定义特殊常量。例如,VK_RIGHT是右箭头键的虚拟键代码。

要获取某些特殊键(如TAB或PageUp)的键状态,我们可以使用GetKeyState Windows API调用。按键状态指定按键是向上、向下还是切换(打开或关闭-每次按键时交替)。

if HiWord(GetKeyState(vk_PageUp)) <> 0 then ShowMessage('PageUp - DOWN') else ShowMessage('PageUp - UP') ;

在OnKeyDown和OnKeyUp事件中,Key是表示Windows虚拟键的无符号字值。为了从键中获取字符值,我们使用了Chr函数。在OnKeyPress事件中,Key是表示ASCII字符的字符值。

OnKeyDown和OnKeyUp事件都使用TSHIFFSTATE类型的Shift参数来确定按下键时Alt、Ctrl和Shift键的状态。

例如,按Ctrl+A时,将生成以下按键事件:

KeyDown (Ctrl) // ssCtrl KeyDown (Ctrl+A) //ssCtrl + 'A' KeyPress (A) KeyUp (Ctrl+A)

将键盘事件重定向到窗体

要在窗体级别捕获击键,而不是将其传递给窗体的组件,请将窗体的KeyPreview属性设置为True(使用对象检查器)。组件仍然可以看到事件,但是表单有机会首先处理它——例如,允许或不允许按下某些键。

假设表单上有多个编辑组件,form.OnKeyPress过程如下所示:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char) ; begin if Key in ['0'..'9'] then Key := #0 end;

如果其中一个编辑组件具有焦点,并且表单的KeyPreview属性为False,则不会执行此代码。换句话说,如果用户按下5键,5字符将出现在聚焦编辑组件中。

但是,如果KeyPreview设置为True,则表单的OnKeyPress事件将在编辑组件看到按下的键之前执行。同样,如果用户按下了5键,则会将字符值0指定给键,以防止数字输入到编辑组件中。

  • 发表于 2021-09-15 03:59
  • 阅读 ( 95 )
  • 分类:IT

你可能感兴趣的文章

将项目添加到tpopup delphi菜单

在Delphi应用程序中使用菜单或弹出菜单时,在大多数情况下,都是在设计时创建菜单项的。每个菜单项都由一个TMenuItem Delphi类表示。当用户选择(单击)一个项目时,OnClick事件将被触发,以供您(作为开发人员)获取该事件并...

  • 发布于 2021-09-06 15:10
  • 阅读 ( 173 )

了解delphi编程的基础知识

希望掌握Delphi编程语言的初学者应该已经熟悉Microsoft Windows的基础知识。学习Delphi是最容易的,如果你从一个有指导的、基于教程的参考框架来学习它。 基本概念 从一堂历史课开始,介绍(Turbo)Pascal到Delphi 2005的演变,例...

  • 发布于 2021-09-06 15:13
  • 阅读 ( 191 )

理解delphi项目和单元源文件

简而言之,Delphi项目只是组成由Delphi创建的应用程序的文件集合。DPR是用于Delphi项目文件格式的文件扩展名,用于存储与项目相关的所有文件。这包括其他Delphi文件类型,如表单文件(DFM)和单元源文件(.PASs)。 由于Delphi...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 184 )

程序退出时delphi中的内存泄漏通知

自Delphi 2006以来的所有Delphi版本都有一个更新的内存管理器,该管理器速度更快,功能更丰富。 “新”内存管理器最出色的功能之一是允许应用程序注册(和注销)预期内存泄漏,并在程序关闭时报告意外内存泄漏。 使用De...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 171 )

如何在运行时移动和调整控件大小(在delphi应用程序中)(move and resize controls at run time (in delphi applications))

...如何在应用程序运行时使用鼠标拖动和调整控件大小(在Delphi窗体上)。 运行时的表单编辑器 在窗体上放置控件(可视组件)后,可以调整其位置、大小和其他设计时特性。但是,在某些情况下,您必须允许应用程序的用...

  • 发布于 2021-09-10 20:45
  • 阅读 ( 199 )

在delphi的tdbgrid中显示和编辑备注字段

...德 备注字段用于表示长文本或文本与数字的组合。使用Delphi构建数据库应用程序时,TMemoField对象用于表示数据集中的备注字段。TMemoField封装了包含文本数据或任意长度的字段的基本行为。在大多数数据库中,备注字段的大小受...

  • 发布于 2021-09-10 20:47
  • 阅读 ( 173 )

德尔福单元剖析(德尔福初学者版)

如果您打算成为一名优秀的Delphi程序员,那么“接口”、“实现”和“使用”等词需要在您的编程知识中占有特殊的位置。 德尔福项目 当我们创建一个Delphi应用程序时,我们可以从一个空白项目、一个现有项目或Delphi的一...

  • 发布于 2021-09-10 20:53
  • 阅读 ( 187 )

在系统托盘中放置delphi应用程序

...还有其他图标吗?这个地方叫做Windows系统托盘。您想将Delphi应用程序的图标放在那里吗?您希望该图标设置动画还是反映应用程序的状态? 这对于长时间运行而没有用户交互的程序(通常整天都在电脑上运行的后台任务)非...

  • 发布于 2021-09-11 00:20
  • 阅读 ( 182 )

优化delphi程序的内存使用

...活动,最终降低计算机的速度。 02 2006年 何时在delphi应用程序中创建表单 假设您要设计一个包含主窗体和两个附加(模态)窗体的程序。通常,根据您的Delphi版本,Delphi将把表单插入到项目单元(DPR文件)中,并包...

  • 发布于 2021-09-15 03:43
  • 阅读 ( 206 )

用delphi截取键盘输入

...动我们的战舰。德尔福帮助! 截取键盘输入 大多数Delphi应用程序通常通过特定的事件处理程序处理用户输入,这些事件处理程序使我们能够捕获用户击键并处理鼠标移动。 我们知道焦点是通过鼠标或键盘接收用户输入的...

  • 发布于 2021-09-15 03:46
  • 阅读 ( 160 )
tbhd5a
tbhd5a

0 篇文章

相关推荐