При работе с компонентами, такими как TDBGrid и TDBGridInplaceEdit в среде разработки Delphi, разработчики могут столкнуться с различными ошибками, в том числе и с ошибками ввода данных. Одной из таких ошибок является EConvertError, возникающая при попытке присвоения значения полю, которое не соответствует ожидаемому типу данных. В данной статье мы рассмотрим, как можно обрабатывать такие ошибки и получать значение, которое стало причиной исключения.
Проблема
Предположим, у вас есть TDBGrid, загруженный данными, и вы хотите отследить ошибки ввода, чтобы отображать пользователю дружелюбные сообщения. В частности, вам необходимо узнать значение, которое было введено пользователем и вызвало ошибку TDBGridInplaceEdit, например, в поле "PartNo" при изменении числового значения на нечисловое.
Пример
Вы изменили значение в ячейке "PartNo" с 1313.3 на 1313..3 (с двумя десятичными точками), что привело к ошибке TDBGridInplaceEdit. Ошибка перехватывается, но получить значение "1313..3", которое вызвало ошибку, не удается.
Обработка ошибок
Для перехвата ошибок можно использовать обработчик исключений ApplicationEvents1Exception, который вызывается при возникновении ошибок в приложении. В данном случае вы уже пытаетесь собрать информацию об ошибке, но не удается получить некорректное значение.
Для получения значения, вызвавшего ошибку, можно использовать метод OnSetText поля в наборе данных. Это позволит перехватить попытку изменения значения поля и проверить корректность вводимых данных.
procedure TForm1.ADataSetAFloatFieldSetText(Sender: TField; const Text: string);
var
f: Double;
begin
if not TryStrToFloat(Text, f) then
begin
raise Exception.Create(
'Error on: ' +
#13#10'Dataset: ' + Sender.DataSet.Name +
#13#10'Field: ' + Sender.FieldName +
#13#10'Old Value: ' + Sender.AsString +
#13#10'New Value: ' + Text
);
end;
end;
Метод OnSetText можно определить для каждого поля в наборе данных, где это необходимо, или назначить его динамически после открытия набора данных.
procedure TForm1.ADataSetAfterOpen(DataSet: TDataSet);
var
i: Integer;
begin
for i := 0 to Dataset.FieldCount - 1 do
if Dataset.Fields[i].DataType in [ftFloat, ftCurrency, ftBCD] then
Dataset.Fields[i].OnSetText := ADataSetAFloatFieldSetText;
end;
Заключение
Используя метод OnSetText, можно перехватить попытку ввода некорректных данных и обработать их, например, отобразив сообщение об ошибке с указанием некорректного значения. Это позволит избежать возникновения исключений на уровне RTL и предоставит пользователю более информативное сообщение об ошибке.
Обработка ошибок ввода данных в компоненте TDBGridInplaceEdit в Delphi, получение значения, вызвавшего исключение.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS