【问题标题】:Chromium-embedded for Delphi - TChromiumOSR.OnPaint is not fired when a modal window is shown为 Delphi 嵌入 Chromium - 显示模态窗口时不会触发 TChromiumOSR.OnPaint
【发布时间】:2018-02-27 09:20:39
【问题描述】:

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

情况

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

问题

TChromiumOSR.OnPaint 事件(在FormA 中)在FormB.ShowModal 返回之前不会触发。

注意事项

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

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

还是cef3内部工作造成的?

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

dcef3 master branch is here

【问题讨论】:

  • 无法重现。我已经尝试使用最新的 DCEF3 (Delphi 2009) 修改 offline HTML 文档,方法是使用 Browser.MainFrame.ExecuteJavaScript 并且即使从模态表单调用该事件也已触发绘制事件。你能更具体地说明你在做什么吗?无论如何,要使视图无效,您可以在修改文档后调用Browser.Host.Invalidate(PET_VIEW);。但是,我认为如果没有这个明确的调用,这应该可以工作。最好尝试制作一个 MVCE。

标签: delphi chromium-embedded delphi-xe4


【解决方案1】:

我已经成功地使用从模态表单调用的ExecuteJavaScript 方法更新了一个HTML 元素。但是您可能也使用过 CEF V8(我还没有测试过)。对于需要手动使当前视图失效的情况,可以调用Invalidate

MyChromiumOSR.Browser.Host.Invalidate(PET_VIEW);

但这是解决方法而不是解决方案。相关元素的失效应该由 CEF 引擎为您完成。如果您提出 MCVE,我可以针对您的具体问题进行更多调查。

【讨论】:

  • 感谢您的帮助,所以我继续制作了一个 MCVE,结果发现问题不在 dcef3 内部,而是在我的代码中的某个地方!修复后我会进一步检查并发布详细信息。
  • 我猜我的代码有问题,它阻止了应该触发TChromiumOSR.OnPaint事件的windows消息浮动......它必须与ShowModal()相关,但我现在卡住了,不知道,会继续努力......
  • 好吧,我看不到您的代码,所以我无能为力。您是否尝试通过 Invalidate 调用手动使视图无效?你能分享你的MCVE吗?同时我会尝试在东京测试我的,但我有点怀疑,因为 CEF 渲染器不依赖于 Windows (VCL) 消息泵..
  • 不,即使在东京也能正常工作。因此我需要查看您的代码。
  • 抱歉,我之前创建的 MCVE 无法重现原帖中描述的问题。我现在正在研究ShowModal 方法...
【解决方案2】:

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

  1. 在一个“delphi 事件总线”处理程序中,程序显示一个模态形式,此时主线程的执行被阻塞。
  2. 在模态表单之上,执行某些操作的用户将启动一个后台线程,该线程反过来会向主线程发送消息,而主线程又会调用“delphi 事件总线”来发布另一个新事件,这又会执行一些js 代码来更新dcef3 中的网页,这又会触发一些dcef3 事件(在主线程中),这就是程序卡住的地方——因为@ 987654325@ 方法被TCriticalSection 锁定。

解决方案: 在步骤#1中,不要直接调用ShowModal,而是使用诸如PostMessagewinapi之类的技术来“延迟”ShowModal的执行。

不知道有没有描述清楚……

【讨论】:

    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2020-11-25
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多