使用THtmlEdit进行奇怪的wm_keydown行为

时间:2016-10-12 17:00:02

标签: delphi firemonkey

这是一个奇怪的问题:这就是情况

应用程序在运行时从XML文档构建编辑表单。 UI / UX设计有三层嵌套的TTabControl,而最终(最低)级别则是在运行时创建的TTabItem。这有一个TVertScrollBox,它本身包含我的列网格控件,并且(最后!)包含THtmlEditor。

问题是,当构建控件并加载内容时,THtmlEdit最初会忽略keydown。它将响应鼠标事件,可以定位插入符号。切换到不同的顶级选项卡,或远离整个应用程序并返回,然后解决问题,编辑器响应keydown消息。

我尝试在procedure THtmlEditor.KeyDown()中添加一个断点...然后跟踪调用链。似乎没有任何表现不同的东西。我特别注意输入焦点,显式调用Editor.SetFocus,尽管显然已经调用了...

我尝试在function TPlatformWin.HandleMessage: Boolean;中添加一个条件断点...我唯一的观察是,当处于非工作模式时,对DispatchMessage(Msg)的调用没有到达编辑器,或者它父母表格。

已经尝试为此构建一个MDC,复制上面列出的结构,但......总是有效!

接下来我可以尝试什么? 有没有人见过这种行为(并修复了它)?

修改

我没有提到的细节 - 没有想到 - 是为了显示错误条件,控制集中在THmtlEditor是TWebBrowser之前。如果我将焦点放在TWebBrowser之后的TEdit和然后到THtmlEditor,它似乎有效。

哎呀!

1 个答案:

答案 0 :(得分:0)

这只是答案的一半,但为了将来参考,这就是我所做的:

这是一个躲闪: - (

我在主窗体上放了一个TEdit并将其设置为不可见。然后我为MainForm OnFocusChanged添加了一个处理程序,它设置了一个布尔陷阱标志来跟踪TWebBrowser先前是否已经被聚焦。

对于THtmlEditor的实例,我添加了一个OnClick处理程序,它检查trap-flag并使TEdit可见,在其上调用SetFocus,重新隐藏TEdit并返回True,这样THtmlEditor可以将焦点重新设置为自身。 trap-flag用于避免在用户只是单击THtmlEditor时不必要地失去焦点。

下一步 - 我可能永远不会到达 - 将追踪TEdit的焦点代码。我怀疑这一切都与TEdit支持的ITextInput有关,而THtmlEditor则没有。