我正在使用在CLX环境下用Delphi 7编写的旧程序。最近,我被要求对TMaskEdit组件(“类型”)的OnExit事件进行更改,我发现在某些情况下,离开“类型”组件时,OnExit事件不会触发。在这种情况下,如果您离开组件,然后返回组件并重新退出,则会触发。
此事件的触发器似乎与表单上的前一个组件TcxMaskEdit组件('ID')的OnExit事件(按工作流程顺序)相关。在“ ID”组件的OnExit事件中,将进行多次检查以评估输入到其中的数据的有效性。运行测试后,如果发现任何失败,则将焦点重新设置到“ ID”组件上。如果所有测试均通过,则焦点应该传递给出现问题的“类型”组件。
在测试中,我确定运行一组特定的测试时会出现实际问题,这会生成一个[Yes | No] MessageDlg框,询问最终用户数据是否有效(在这种情况下,该数据是否有效) ,即使初始检查未通过也可以。只要此MessageDlg不触发,一切似乎都可以正常工作,但如果出现MessageDlg框,则该事件结束时的SetFocus事件似乎无法正常工作-“类型”组件似乎获得了关注(键入将在其中显示字符),但“类型”组件中没有光标出现,并且不会触发其OnEnter和OnExit事件。我注意到,在没有断点的测试过程中确实会出现此问题,但是当我在正在创建的MessageDlg框和实际的SetFocus()调用之间的事件代码中的任何地方都有断点时,不会发生此问题。
对于解决该问题我不确定。我的第一个想法是使用application.ProcessMessages,但没有效果。我针对这种情况的在线搜索找到了两个选项:尝试设置活动控件,然后将焦点设置在窗体上(这对程序的行为没有影响),并使用PostMessage(Handle,Set_Focus,0,0)选项,在这里不起作用。 (Windows软件包不存在,因此没有PostMessage,并且尝试添加Windows软件包时发现CLX中的组件句柄不是PostMessage期望的HWND。)
我还需要其他哪些解决方案?