Delphi勾选标准手势时报rtl270.bpl访问违规错误问题咨询
问题概述
Delphi开发过程中无法正常选择标准手势,执行相关操作会触发固定报错,所有标准手势功能均无法使用,报错信息如下:
Error reading TGestureStreamData.Control: Access violation at address 500C3A53 in module 'rtl270.bpl'. Read of address 00000008
复现步骤
- 新建项目
- 添加退出按钮
- 添加
TabControl控件并创建若干TabItem - 添加
ActionList控件,创建关联TabControl的nexttab、previewstab动作 - 添加
GestureManager控件 - 为
TabControl指定上述GestureManager实例 - 尝试勾选左、右方向的标准手势时弹出前述报错
故障原因
该报错是Delphi 10.4 Sydney(对应rtl270.bpl版本)的已知设计期缺陷,本质是空指针访问错误:读取地址00000008是对空指针做0x8偏移量属性读取的典型特征。
触发逻辑为:当TabControl先绑定了ActionList中的分页切换动作,再绑定GestureManager并勾选手势时,设计期序列化模块读取TGestureStreamData.Control属性的流程先于手势关联控件的引用初始化流程执行,拿到空对象引用后直接访问属性触发访问冲突。
修复方案
- 顺序调整规避:调整控件配置顺序绕开bug触发逻辑。配置顺序调整为:新建项目→添加退出按钮、
TabControl及对应TabItem→添加GestureManager→为TabControl绑定GestureManager,提前勾选需要的左、右方向标准手势,确认无报错后→再添加ActionList,创建关联TabControl的nexttab、previewstab动作,最后完成手势和动作的映射绑定即可。 - 补丁修复:安装Delphi 10.4 Sydney的官方后续补丁,补丁已补全手势流数据读取逻辑的空指针校验,从根源解决该设计期报错。
- 缓存清理:如果调整顺序后仍触发报错,先删除当前窗体上的
GestureManager控件,保存全部项目文件后重启IDE清空设计期缓存,再按照调整后的顺序重新配置控件即可。
内容的提问来源于stack exchange,提问作者Iakovos
相关产品推荐
相关产品推荐

