Delphi 11 Alexandria RDP环境下TPaintBox重绘闪烁问题咨询
问题根因与结论
该问题属于Delphi 11 Alexandria的官方内置Bug,直接诱因就是你排查到的TApplication.Run中新增的RemoteSessionCheck逻辑存在设计缺陷。
RemoteSessionCheck是Delphi 11新增的远程会话适配逻辑,功能是检测到程序运行在RDP/远程桌面环境时,自动修改VCL全局和窗体的重绘参数(比如强制关闭双缓冲、调整裁剪区域逻辑),目的是降低远程画面传输的带宽占用。但该逻辑存在严重疏漏:仅会修改调用该方法之后创建的窗体的重绘参数,不会同步更新调用前已经完成创建的窗体的对应配置,参数不统一就会触发重绘冲突,直接表现为TPaintBox这类频繁重绘的控件出现闪烁。
你观测到的所有现象都和该逻辑完全吻合:
- 携带TPaintBox的窗体为项目首个创建窗体时,会在
Application.Run(也就是RemoteSessionCheck调用)前完成创建,参数不会被修改,因此无闪烁 - 本地运行时不会触发
RemoteSessionCheck中的远程会话判定,参数不会被篡改,因此无闪烁 - Delphi 10.4.2无该适配逻辑,不管什么运行环境、什么窗体创建顺序,重绘参数都保持统一,因此无闪烁
- 注释
RemoteSessionCheck调用后,不会触发RDP环境下的参数修改,所有窗体重绘逻辑和旧版本/本地环境一致,因此闪烁消失
无需修改VCL源码的解决方案
如果不想改动VCL官方源码,可任选以下方案解决:
- 调整窗体创建顺序,将所有包含TPaintBox、需要频繁重绘的窗体,放在
Application.Run执行前完成创建,避开参数篡改 - 在工程文件的
Application.Initialize之后、Application.Run之前添加代码,主动禁用该动态参数修改逻辑:
Application.UpdateMetricSettings := False;
- 给包含TPaintBox的窗体手动强制启用双缓冲:
// 对应窗体的OnCreate事件中添加 Self.DoubleBuffered := True; // 若窗体上有其他容器控件,也同步设置容器的DoubleBuffered为True
内容的提问来源于stack exchange,提问作者Rogfitz
相关产品推荐
相关产品推荐

