Как получить значение, которое вызвало ошибку 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;