Не используйте OnValidate
для выполнения каких-либо действий, кроме создания исключения для отклонения значения Sender
.
Чтобы понять почему, настройте простое тестовое приложение, состоящее из TClientDataSet с полямиID (целое число) и имя (строка (20)), TDataSource, TDBNavigator, TDBGrid и TDBEdit для поля имени.Добавьте следующий код:
procedure TForm1.ClientDataSet1NameValidate(Sender: TField);
begin
if Sender.AsString = 'x' then
Sender.DataSet.Cancel;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ClientDataSet1.CreateDataSet;
ClientDataSet1.InsertRecord([1, 'a']);
ClientDataSet1.InsertRecord([2, 'b']);
ClientDataSet1.InsertRecord([3, 'c']);
end;
Скомпилируйте, запустите и введите 'x' (без кавычек) в DBEdit.Затем нажмите «Сохранить» в DBNavigator.
Обратите внимание, что редактирование отменено, но символ «x» остается в DBEdit.Это в Delphi 10.2.3, кстати.Еще в дни D7 было еще хуже - неправильная строка в сетке БД показала бы 'x'!
Другое дело, что OnValidate
никогда не вызывается в методах TDataSet, только потомки, напримерTClientDataSet.Таким образом, нет гарантии, что в целом OnValidate
будет вызван вообще или в нужное время - это зависит от автора типа набора данных, чтобы сделать это правильно.
Так что я думаю, что ответ на ваш вопрос:«Нет», оставьте OnValidate, чтобы вызывать исключения, но не более.