Как получить значение, которое вызвало ошибку TDBGridInplaceEdit?

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

Например:
У меня есть DBGrid, загруженный данными. Когда я намеренно изменяю поле PartNo строки #1 на нечисловое значение, чтобы вызвать ошибку TDBGridInplaceEdit... (От: 1313.3 до: 1313..3) ... Я перехватываю сообщение об ошибке и отображаю сообщение, но не могу ' не могу понять, как получить плохое значение "1313..3".


Оригинальный PartNo: 1313,3


Изменен PartNo: 1313..3 (два десятичных знака)


Отображается сообщение об ошибке из приложения onException

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;

Я хотел бы отформатировать собственное сообщение, используя введенное неверное значение "1313..3". Как вы получаете это значение?

1 ответ

Решение

Если вы сохраняете поля своего набора данных, вы можете определить метод 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;

Если вы хотите избежать сохранения ваших полей, вы можете динамически назначить метод для поля, например, после открытия набора данных.

procedure TForm1.ADataSetAfterOpen(DataSet: TDataSet);
Var
 i:Integer;
begin
  for I := 0 to Dataset.FieldCount - 1 do
      begin
        if Dataset.Fields[i].DataType in [ftFloat, ftCurrency, ftBCD] then
           Dataset.Fields[i].OnSetText := ADataSetAFloatFieldSetText;            
      end;
end;
Другие вопросы по тегам