Delphi 如何在包括其他组件的窗体上的任何位置检测单击事件

Ash*_*lar 0 forms delphi components frames onclick

我有一个TEditDelphi VCL 表单应用程序(包含在一个TFrame实例中,如果重要的话)。在用户指示他们完成编辑后,通过单击表单上的其他地方,插入符号和焦点将保留在此控件上,直到我单击另一个控件,然后该控件获得焦点。但是,TEdit无论用户单击何处,我都希望失去焦点。我希望我可以使用ActiveControl := nil结束对所选控件的关注,但我不确定在哪里调用它。

我想要的是焦点离开所选控件而不必将其转移到另一个控件。我可以在表单的OnClick事件中结束焦点,但是如果用户在我的表单上选择任何其他控件(也包含在框架中),这将不起作用,因为表单的OnClick事件没有被触发。OnClick为表单上的每个附加项目提供单独的事件似乎既不优雅又乏味。

实现这种行为的全局解决方案是什么?

Rem*_*eau 7

尝试使用该TApplication(Events).OnMessage事件来查找WM_LBUTTONDOWN消息。

您可以使用 VCLFindVCLWindow()FindDragTarget()函数(均在Vcl.Controls单元中)查看是否有TWinControl位于单击坐标处的 。或者更简单的是,您可以使用 VCL 的FindControl()函数(也在Vcl.Controls单元中)TWinControl直接从消息的目标中获取HWND

如果鼠标下方不存在控件,或者控件不可聚焦(其CanFocus()方法返回False),则设置ActiveControl=nil。否则,什么都不做,让被点击的控件在处理消息时自己获得焦点。