Delphi 11 Alexandria PaintBox 在 RDP 中闪烁
Posted
技术标签:
【中文标题】Delphi 11 Alexandria PaintBox 在 RDP 中闪烁【英文标题】:Delphi 11 Alexandria PaintBox flicker in RDP 【发布时间】:2021-11-14 19:04:33 【问题描述】:我刚刚从 Delphi 10.4.2 升级到 Delphi 11 Alexandria。我经常使用 RDP,所以当 TPaintBox 无效时我注意到闪烁。奇怪的是,如果带有 TPaintBox 的表单是第一个创建的表单,它不会闪烁。如果在本地机器上运行,它也不会闪烁。仅在 RDP 中。如果我在 Delphi 10.4.2 中编译相同的项目,它不会在 RDP 中闪烁。
有人能猜出这个吗?它是“简单”的 Delphi 11 中的一个错误吗?
编辑:演示项目http://procurisupdate.se/downloads/Temp/PaintBoxFlicker.zip
具有两种形式的简单项目。一个有一个 TImage,所以它非常大。 如果按原样运行,当您单击图片并移动鼠标时,它会闪烁。如果您更改为首先创建 Form23(或者即使它是在 Application.run 之前创建的),它也不会闪烁。请注意,它仅在 RDP 中闪烁。
Edit2:经过一番查看,我在 TApplication.Run 中找到以下内容:
procedure TApplication.Run;
begin
FRunning := True;
try
$IF NOT DEFINED(CLR)
AddExitProc(DoneApplication);
$ENDIF
RemoteSessionCheck; // This has been added since Delphi 10.4.2
if FMainForm <> nil then
...
如果我注释掉 RemoteSessionCheck;并重新编译(您必须将您的 Source\vcl 目录添加到库路径)它不会闪烁。
【问题讨论】:
如果你能展示一个我们可以玩的minimal, complete, verifiable and reproducible example,那就太好了。 请编辑问题并在问题本身中包含最少的代码,而不是作为外部链接。 听起来像是一个错误,你应该report to Embarcadero,因为它与 11.0 中添加的新功能有关 【参考方案1】:根据与 Embarcadero 的私人通信:
fyi:这个问题似乎与:
TRemoteSessionChangedEvent = procedure (Sender: TObject; var InRemoteSession) of object;
应该是:
TRemoteSessionChangedEvent = procedure (Sender: TObject; var InRemoteSession: Boolean) of object;
我们的
Support
团队追踪到了这个问题;解释了为什么它不会影响自动创建的表单,以及这将如何搞砸C++
(其中 untyped 参数将显示为Variant
)。
提交了一个错误票,但它只对他们的内部系统是私有的。
【讨论】:
【参考方案2】:您可以检查TApplication.SingleBufferingInRemoteSessions
属性并将其设置为False。
【讨论】:
以上是关于Delphi 11 Alexandria PaintBox 在 RDP 中闪烁的主要内容,如果未能解决你的问题,请参考以下文章
Delphi 11 / RAD Studio 11 月 11 日补丁 - 完成了吗?