用于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的内部工作引起的?
无论如何,如何解决?谢谢。
我已成功使用从模态窗体调用的ExecuteJavaScript方法更新html元素。但你可能也使用CEF V8(这是我没有测试过的)。对于需要手动使当前视图无效的情况,可以调用Invalidate:
MyChromiumOSR.Browser.Host.Invalidate(PET_VIEW);
但这是解决方法而不是解决方案。 CEF引擎应该为您发生相关元素的无效。如果您想出MCVE,我可以更多地调查您的具体问题。
好吧,我发现了问题的根源 - 它不是cef3或dcef3中的错误,而是由于我不正确地使用Delphi Event Bus引起的,以下是重现问题的步骤:
- 在一个'delphi event bus'处理程序中,程序显示一个模态形式,此时主线程的执行被阻止。
- 在模态表单的顶部,执行某些操作的用户将启动后台线程,后者又将向主线程发送消息,主线程又将调用“delphi事件总线”以发布另一个新事件,将执行一些
js
代码来更新dcef3
内的网页,这反过来将触发一些dcef3
事件(在主线程中),这里是程序卡住的地方 - 因为TEventBus.Post()
方法被TCriticalSection
锁定。
解决方案:在步骤#1中,不要直接调用ShowModal
,而是使用PostMessage
winapi等技术来“延迟”执行ShowModal
。
我不确定我是否清楚地描述了它......
以上是关于用于Delphi的铬嵌入 - 当显示模态窗口时,不会触发TChromiumOSR.OnPaint的主要内容,如果未能解决你的问题,请参考以下文章