Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обработка ошибок TDBGridInplaceEdit в Delphi: получение значения, вызвавшего исключение

Delphi , Компоненты и Классы , TDBGrid

При работе с компонентами, такими как TDBGrid и TDBGridInplaceEdit в среде разработки Delphi, разработчики могут столкнуться с различными ошибками, в том числе и с ошибками ввода данных. Одной из таких ошибок является EConvertError, возникающая при попытке присвоения значения полю, которое не соответствует ожидаемому типу данных. В данной статье мы рассмотрим, как можно обрабатывать такие ошибки и получать значение, которое стало причиной исключения.

Проблема

Предположим, у вас есть TDBGrid, загруженный данными, и вы хотите отследить ошибки ввода, чтобы отображать пользователю дружелюбные сообщения. В частности, вам необходимо узнать значение, которое было введено пользователем и вызвало ошибку TDBGridInplaceEdit, например, в поле "PartNo" при изменении числового значения на нечисловое.

Пример

Вы изменили значение в ячейке "PartNo" с 1313.3 на 1313..3 (с двумя десятичными точками), что привело к ошибке TDBGridInplaceEdit. Ошибка перехватывается, но получить значение "1313..3", которое вызвало ошибку, не удается.

Обработка ошибок

Для перехвата ошибок можно использовать обработчик исключений ApplicationEvents1Exception, который вызывается при возникновении ошибок в приложении. В данном случае вы уже пытаетесь собрать информацию об ошибке, но не удается получить некорректное значение.

procedure TMain.ApplicationEvents1Exception(Sender: TObject; E: Exception);
var
  str : string;
begin
  str := Sender.ToString;
  str := str + #10;
  str := str + RzDBGrid2.SelectedField.FieldName;
  str := str + #10;
  str := str + VarToStr(RzDBGrid2.SelectedField.Value);
  str := str + #10;
  str := str + E.Message;
  ShowMessage(str);
  // Application.ShowException(E);
end;

Решение

Для получения значения, вызвавшего ошибку, можно использовать метод 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TDBGrid ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 12:09:53/0.0035459995269775/0