用于Delphi的铬嵌入 - 当显示模态窗口时,不会触发TChromiumOSR.OnPaint

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于Delphi的铬嵌入 - 当显示模态窗口时,不会触发TChromiumOSR.OnPaint相关的知识,希望对你有一定的参考价值。

我在dcef3包中使用了屏幕外渲染组件TChromiumOSR - Chromium-embedded库的Delphi包装器。

Situation

FormA包含TChromiumOSR并绘制输出。 Modal FormB通过对js执行一些FormA.TChromiumOSR代码来修改网页。

Issue

TChromiumOSR.OnPaint事件(在FormA)直到FormB.ShowModal返回才触发。

Notes

  • 在上述具有标准TChromium控制的情况下(在模态形式下)没有这样的问题。

我假设``TForm.ShowModal'方法只阻止背景形式的输入,而不是绘画?

或者它是由cef3的内部工作引起的?

无论如何,如何解决?谢谢。

dcef3 master branch is here

答案

我已成功使用从模态窗体调用的ExecuteJavaScript方法更新html元素。但你可能也使用CEF V8(这是我没有测试过的)。对于需要手动使当前视图无效的情况,可以调用Invalidate

MyChromiumOSR.Browser.Host.Invalidate(PET_VIEW);

但这是解决方法而不是解决方案。 CEF引擎应该为您发生相关元素的无效。如果您想出MCVE,我可以更多地调查您的具体问题。

另一答案

好吧,我发现了问题的根源 - 它不是cef3或dcef3中的错误,而是由于我不正确地使用Delphi Event Bus引起的,以下是重现问题的步骤:

  1. 在一个'delphi event bus'处理程序中,程序显示一个模态形式,此时主线程的执行被阻止。
  2. 在模态表单的顶部,执行某些操作的用户将启动后台线程,后者又将向主线程发送消息,主线程又将调用“delphi事件总线”以发布另一个新事件,将执行一些js代码来更新dcef3内的网页,这反过来将触发一些dcef3事件(在主线程中),这里是程序卡住的地方 - 因为TEventBus.Post()方法被TCriticalSection锁定。

解决方案:在步骤#1中,不要直接调用ShowModal,而是使用PostMessage winapi等技术来“延迟”执行ShowModal

我不确定我是否清楚地描述了它......

以上是关于用于Delphi的铬嵌入 - 当显示模态窗口时,不会触发TChromiumOSR.OnPaint的主要内容,如果未能解决你的问题,请参考以下文章

使用Light YouTube嵌入模态(从基础显示) - 如何在模态窗口关闭后停止视频播放?

Delphi TScrollBar 用于滚动窗口组件内容

Delphi 新建窗口在任务栏不显示

不希望模态视图在键盘显示上向上移动

如何在模态窗口中显示 pdf? [关闭]

如何在 nativescript 中显示模态视图时将窗口背景变为黑色