You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:45:03