Delphi 的 Chromium 嵌入 - 当显示模态 window 时,不会触发 TChromiumOSR.OnPaint
Chromium-embedded for Delphi - TChromiumOSR.OnPaint is not fired when a modal window is shown
我正在使用 dcef3 包中的离屏渲染组件 TChromiumOSR
- Chromium-embedded
库的 Delphi 包装器。
情况
FormA
包含一个 TChromiumOSR
并绘制输出。
Modal FormB
通过针对 FormA.TChromiumOSR
.
执行一些 js
代码来修改网页
问题
TChromiumOSR.OnPaint
事件(在 FormA
中)直到 FormB.ShowModal
returns 才会触发。
备注
- 使用标准
TChromium
控件,没有这样的问题 在上述情况下(在模态形式下)。
我假设'TForm.ShowModal'方法只阻止背景表格的输入,而不是绘画?
还是cef3内部工作造成的?
请问如何解决?谢谢。
我使用 ExecuteJavaScript method called from a modal form. But you might have use CEF V8 as well (that's what I haven't tested). For cases when you need to invalidate the current view manually, you can call Invalidate:
成功更新了 HTML 元素
MyChromiumOSR.Browser.Host.Invalidate(PET_VIEW);
但这是解决方法而不是解决方案。 CEF 引擎应该为您使相关元素失效。如果你想出一个 MCVE,我可以调查更多关于你的具体问题。
好的,我找到了问题的根源 - 不是 cef3 或 dcef3 中的错误,而是由于我对 Delphi Event Bus 的不当使用造成的,以及以下内容是重现问题的步骤:
- 在一个 'delphi event bus' 处理程序中,程序显示 modal 形式,此时主线程的执行被阻塞。
- 在模态窗体之上,用户执行某些操作将启动一个后台线程,该线程又会向主线程发送消息,主线程又会调用 'delphi event bus' 到 post 另一个新事件,它会依次执行一些
js
代码来更新 dcef3
中的网页,这又会触发一些 dcef3
事件(在主线程中) ,这里是程序卡住的地方——因为 TEventBus.Post()
方法被 TCriticalSection
. 锁定
解决方法:
在步骤 #1 中,不要直接调用 ShowModal
,而是使用 PostMessage
winapi 等技术来 'delay' 执行 ShowModal
.
不知道有没有描述清楚...
我正在使用 dcef3 包中的离屏渲染组件 TChromiumOSR
- Chromium-embedded
库的 Delphi 包装器。
情况
FormA
包含一个 TChromiumOSR
并绘制输出。
Modal FormB
通过针对 FormA.TChromiumOSR
.
js
代码来修改网页
问题
TChromiumOSR.OnPaint
事件(在 FormA
中)直到 FormB.ShowModal
returns 才会触发。
备注
- 使用标准
TChromium
控件,没有这样的问题 在上述情况下(在模态形式下)。
我假设'TForm.ShowModal'方法只阻止背景表格的输入,而不是绘画?
还是cef3内部工作造成的?
请问如何解决?谢谢。
我使用 ExecuteJavaScript method called from a modal form. But you might have use CEF V8 as well (that's what I haven't tested). For cases when you need to invalidate the current view manually, you can call Invalidate:
成功更新了 HTML 元素MyChromiumOSR.Browser.Host.Invalidate(PET_VIEW);
但这是解决方法而不是解决方案。 CEF 引擎应该为您使相关元素失效。如果你想出一个 MCVE,我可以调查更多关于你的具体问题。
好的,我找到了问题的根源 - 不是 cef3 或 dcef3 中的错误,而是由于我对 Delphi Event Bus 的不当使用造成的,以及以下内容是重现问题的步骤:
- 在一个 'delphi event bus' 处理程序中,程序显示 modal 形式,此时主线程的执行被阻塞。
- 在模态窗体之上,用户执行某些操作将启动一个后台线程,该线程又会向主线程发送消息,主线程又会调用 'delphi event bus' 到 post 另一个新事件,它会依次执行一些
js
代码来更新dcef3
中的网页,这又会触发一些dcef3
事件(在主线程中) ,这里是程序卡住的地方——因为TEventBus.Post()
方法被TCriticalSection
. 锁定
解决方法:
在步骤 #1 中,不要直接调用 ShowModal
,而是使用 PostMessage
winapi 等技术来 'delay' 执行 ShowModal
.
不知道有没有描述清楚...