这是一个奇怪的问题:这就是情况
应用程序在运行时从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,它似乎有效。
哎呀!
答案 0 :(得分:0)
这只是答案的一半,但为了将来参考,这就是我所做的:
这是一个躲闪: - (
我在主窗体上放了一个TEdit并将其设置为不可见。然后我为MainForm OnFocusChanged
添加了一个处理程序,它设置了一个布尔陷阱标志来跟踪TWebBrowser先前是否已经被聚焦。
对于THtmlEditor的实例,我添加了一个OnClick
处理程序,它检查trap-flag并使TEdit可见,在其上调用SetFocus
,重新隐藏TEdit并返回True,这样THtmlEditor可以将焦点重新设置为自身。 trap-flag用于避免在用户只是单击THtmlEditor时不必要地失去焦点。
下一步 - 我可能永远不会到达 - 将追踪TEdit的焦点代码。我怀疑这一切都与TEdit支持的ITextInput
有关,而THtmlEditor则没有。