В одной части приложения, над которым я работаю, есть элемент управления формой, который выполняет проверку при получении сообщения CMExit, что в точности соответствует тому, как в документации Delphi говорится об этом (этот пример кода взят из справки Delphi). файлы):
procedure TDBCalendar.CMExit(var Message: TWMNoParams);
begin
try
FDataLink.UpdateRecord; { tell data link to update database }
except
on Exception do SetFocus; { if it failed, don't let focus leave }
end;
inherited;
end;
Целью этого является выполнение проверки, как только элемент управления теряет фокус. Так, например, если бы я нажал кнопку «ОК», элемент управления формы потерял бы фокус, этот метод запустился бы и, в случае исключения, вернул бы фокус к этому элементу управления формы. (Таким образом, событие «click» на кнопке OK никогда не будет проходить, и диалоговое окно никогда не закроется).
У меня проблема в том, что этот элемент управления формы находится внутри модального диалогового окна. Нажатие ОК действительно отправляет сообщение CMExit и приводит к обновлению записи (и проверке). Однако нажатие клавиши Enter в элементе управления формы приводит к закрытию модального диалогового окна без отправки сообщения CMExit . Как будто контроль формы никогда не «теряет фокус». Это означает, что диалоговое окно не только закрывается без формы, которая фактически проверяет данные, но и набор данных также не обновляется.
Учитывая эту проблему, где мне лучше всего разместить код обновления / проверки набора данных? Я мог бы переместить его в саму диалоговую форму и реализовать его в обработчике OnCloseQuery, но это означало бы, что логика дублируется как в элементе управления , так и в самой форме. (Элемент управления формы используется в других местах, и я хочу избежать изменения его поведения).
(Я предполагаю, что CMExit не запускается, потому что элемент управления никогда на самом деле не теряет фокус. Форма закрыта, но элемент управления формы все еще "фокусируется" на закрытой форме.)