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

问题描述 投票:0回答:2

我在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

delphi chromium-embedded delphi-xe4
2个回答
1
投票

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

MyChromiumOSR.Browser.Host.Invalidate(PET_VIEW);

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


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.