Delphi Как я могу обнаружить событие нажатия в любом месте формы, включая другие компоненты - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть TEdit в приложении формы Delphi VCL (содержится в экземпляре TFrame, если это имеет значение). После того, как пользователь укажет, что он закончил редактирование, щелкнув в другом месте формы, курсор и фокус останутся на этом элементе управления, пока я не нажму на другой элемент управления, который затем переместит фокус. Однако я хочу, чтобы TEdit потерял фокус независимо от того, где пользователь нажимает. Я ожидаю, что смогу использовать ActiveControl := nil, чтобы завершить фокус на выбранном элементе управления, но я не знаю, где его активировать.

Я хочу, чтобы фокус оставлял выбранный элемент управления без необходимости переноса его в другой контроль. Я мог бы закончить фокус в событии OnClick формы, но это не сработает, если пользователь выберет любой другой элемент управления (также содержащийся в кадрах) в моей форме, так как событие OnClick формы не инициируется. Кажется нелегким и утомительным предоставлять отдельные OnClick события для каждого дополнительного элемента в форме.

Каково глобальное решение для достижения такого поведения?

1 Ответ

6 голосов
/ 08 апреля 2020

Попробуйте использовать событие TApplication(Events).OnMessage для поиска сообщений WM_LBUTTONDOWN.

Вы можете использовать VCL FindVCLWindow() или FindDragTarget() (оба в блоке Vcl.Controls), чтобы увидеть, есть ли TWinControl, расположенный в координатах щелчка. Или проще: вы можете использовать функцию VCL FindControl() (также в блоке Vcl.Controls), чтобы получить TWinControl непосредственно от цели сообщения HWND.

Если нет элемент управления находится под мышью, или если элемент управления не фокусируется (его метод CanFocus() возвращает False), тогда установите ActiveControl=nil. В противном случае ничего не делать, и позволить элементу управления, на который нажали, фокусироваться самостоятельно при обработке сообщения.

...