关于SpeedButton中使用下划线快捷键不响应的问题
在Windows应用程序,很多都有快捷键功能,这个Delphi也有,就是一个按钮上面有一个比如剪切(&X),这个时候剪切的快捷键就是Alt+X,这个功能有时候还是挺好用的,最近,公司中有同事,好些使用了SpeedButton,然后使用本方式整的快捷键,都不能用,于是问我,这个是神马问题,实际上确切的说,也不是不能用,而是在某些情况下不能用,比如说使用PageControl等一类控件,然后再TabSheet下面再放一个Panel,然后再Panel上放SpeedButton,这个时候,使用快捷键就会导致响应有问题,比如说TabSheet1中直接就有一个SpeedButton就在TabSheet1上,TabSheet2上的SpeedButton在Panel上,两个TabSheet的SpeedButton的快捷键都是Alt+A,此时按道理来说,应该快捷键,哪个TabSheet是激活状态,就应该响应那个TabSheet上的SpeedButton的快捷键事件,可是实际上,只要有Panel的那个SpeedButton页面激活过之后,就会一直响应那个页面的SpeedButton的快捷键激活。而且会导致混乱。
针对这个问题,啥办法呢,自然不能盲目的去整,Delphi比较好的一点就是VCL源码都带了,所以直接去VCL中去找答案就行了,通过跟踪发现Alt+X这类快捷键模式实际上是响应的Delphi的CM_DIALOGCHAR这个消息,然后查看TwinControl中的实现
procedure TWinControl.CMDialogChar(var Message: TCMDialogChar);
begin
Broadcast(Message);
end;
可知,他会向全局广播这个快捷消息,所有的控件都会获得这个消息,此时谁先获得,拦截处理之后,消息就不再继续。然后俺们看看SpeedButton的此消息处理过程
procedure TSpeedButton.CMDialogChar(var Message: TCMDialogChar);
begin
with Message do
if IsAccel(CharCode, Caption) and Enabled and Visible and
(Parent <> nil) and Parent.Showing then
begin
Click;
Result := ;
end else
inherited;
end;
IsAccel函数,实际上就是根据Caption来判定是否和快捷键匹配的,如果匹配,并且Enabled并且可视,并且Parent可视,那么就会触发了,于是问题根源找到了,就是这个parent可视,因为TabSheet上的Parent一直是可视的,所以这个就会触发,但是Parent的TabSheet确实隐藏了,所以,就导致了这个乱了。既然找到问题所在,那么针对此消息
过程进行拦截处理就行了。实现过程如下:
TSpeedButton = class(Buttons.TSpeedButton)
protected
procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
end; procedure TSpeedButton.CMDialogChar(var Message: TCMDialogChar);
var
p: TWinControl;
CanDlgChar: Boolean;
begin
CanDlgChar := False;
p := Parent;
while P <> nil do
begin
CanDlgChar := IsWindowVisible(P.Handle);
if not CanDlgChar then
Break;
p := p.Parent;
end; if CanDlgChar then
with Message do
if IsAccel(CharCode, Caption) and Enabled and Visible and
(Parent <> nil) and IsWindowVisible(Parent.Handle) and Parent.Showing then
begin
Click;
Result := ;
end else
inherited;
end;
再去使用,则触发正常
关于SpeedButton中使用下划线快捷键不响应的问题的更多相关文章
- 详解 Python 中的下划线命名规则
在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...
- [转]关于python中带下划线的变量和函数的意义
Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...
- [转帖]Go中的下划线
Go中的下划线 https://blog.csdn.net/wanglei9876/article/details/50475864 下划线的作用: 在import 时 是仅引入 init 函数 在正 ...
- 解决通过Nginx转发的服务请求头header中含有下划线的key,其值取不到的问题
1. 问题 由于在http请求头的头部中设置了一些自定义字段,刚好这些字段中含有下划线,比如bundle_name这种,后端在进去获取头部信息时,发现取不到对应的值 2. 原因及解决办法 分析 首先看 ...
- 为什么Java7开始在数字中使用下划线
JDK1.7的发布已经介绍了一些有用的特征,尽管大部分都是一些语法糖,但仍然极大地提高了代码的可读性和质量.其中的一个特征是介绍字面常量数字的下划线.从Java7开始,你就可以在你的Java代码里把长 ...
- Scala中_(下划线)的常见用法
Scala中_(下划线)的常见用法 地址:https://www.jianshu.com/p/0497583ec538
- Oracle中转义下划线
原意是查询出所有的月粒度模型,但是在oracle中,下划线也代表匹配单一任何字符,导致15分钟粒度的模型也被查询出来,在此,需要对下划线做转义,使其只表示下划线的含义,可以使用ESCAPE()函数. ...
- 自定义T4模板去掉实体对象中的下划线
在EF Power Tool 默认使用的T4模板中,如果数据库表有下划线,那么生成的实体也有下划线,但是我们实际使用的过程中,是不希望有下划线的,要解决这个问题,可以自定义这个T4模板 ...
- Python 数值中的下划线是怎么回事?
花下猫语:Python 中下划线的用法令人叹为观止,相信你已在各种文章或教程中见识过了.在 2016 年的 3.6 版本之后,Python 还引入了一种新的语法,使得下划线也可以出现在数值中.这篇翻译 ...
随机推荐
- iOS 汉字转拼音
- (NSString *)getFirstString:(ICCustom *)custom { NSMutableString *source = [custom.merchantAbbr ...
- Programming Assignment 4: 8 Puzzle
The Problem. 求解8数码问题.用最少的移动次数能使8数码还原. Best-first search.使用A*算法来解决,我们定义一个Seach Node,它是当前搜索局面的一种状态,记录了 ...
- Linux内核分析之跟踪分析Linux内核的启动过程
一.实验过程 使用实验楼虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-/arch/x86/boot/bzImage -initrd rootfs.img ...
- Linq to SQL 基础篇
LinqtoSqlDataContext Linq = new LinqtoSqlDataContext(ConfigurationManager.ConnectionStrings["sz ...
- 日期运算 jsf日期组建
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date; try { d ...
- linux-6的yum软件仓库
yum命令 命令 作用 yum repolist all 列出所有仓库 yum list all 列出仓库中的所有软件包 yum info 软件包名称 查看软件包信息 yum install ...
- du -sg 和df -g 所看的文件系统大小不一致
最近碰到一个问题: df -g 查看内存,发现空间已经满了,但是到对应目录查看,发现只用了一半的空间,感觉还有一半不见了. 经咨询其他人,给了两个解释: 1.fsck :使用Fsck命令修复损坏的分区 ...
- [ASE][Daily Scrum]11.13
今天的计划如下: View Shilin Liu 修复残缺地图下的行进问题 Client Jiafan Zhu(回学校了) 和服务器端对接测试 Yiming Liao ...
- Oracle数据创建表空间
一.直接在服务器端通过sqlplus命令行创建: 如果您用的是Linux系统,那么Oracle用户名为oracle.同时,您是在oracle服务器上操作. 如果是在Windows系统下, 请先点击“开 ...
- 设计模式之美:Chain of Responsibility(职责链)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现后继者链. 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链,并沿着这条 ...