Delphi 如何获取导致TDBGridInplaceEdit错误的值?

Delphi 如何获取导致TDBGridInplaceEdit错误的值?,delphi,exception-handling,delphi-xe4,dbgrid,in-place-edit,Delphi,Exception Handling,Delphi Xe4,Dbgrid,In Place Edit,我正在尝试编写一个异常处理程序来显示用户友好的消息。我不知道如何获取导致TDBGridInplaceEdit错误的“新输入的”数据值 例如: 我有一个加载了数据的DBGrid。当我故意将第#1行的PartNo字段更改为非数值以导致TDBGridInplaceEdit错误时。。。(从:1313.3到:1313..3)。。。我捕获错误并显示一条消息,但我不知道如何获取错误的'1313..3'值 原始零件号:1313.3 更改的零件号:1313..3(两个小数点) 显示来自应用程序OneExce

我正在尝试编写一个异常处理程序来显示用户友好的消息。我不知道如何获取导致TDBGridInplaceEdit错误的“新输入的”数据值

例如:
我有一个加载了数据的DBGrid。当我故意将第#1行的PartNo字段更改为非数值以导致TDBGridInplaceEdit错误时。。。(从:1313.3到:1313..3)。。。我捕获错误并显示一条消息,但我不知道如何获取错误的'1313..3'值


原始零件号:1313.3


更改的零件号:1313..3(两个小数点)


显示来自应用程序OneException的错误消息

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”值格式化我自己的邮件。如何获取此值?

如果要持久化数据集的字段,可以在字段上定义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;

在回答之前我没有仔细阅读(我现在已经删除了答案)。您将得到一个EConvertError,它发生在赋值过程中,因此RTL本身实际上失败了,并且永远不会达到您可以通过
NewValue
获得它的程度。我不知道有什么方法可以得到这个值。最好的方法可能是在字段本身上设置一个编辑掩码,这将首先防止输入无效值。我想我可以解析e.消息并以这种方式获取值:)是的,我想。;-)不过,我想我应该阻止无效条目;它不那么“粗俗”。如果您决定这样做,则必须测试特定的异常类型(EConvertError),然后进行分析,以了解要分析什么类型的转换(整数、浮点或其他),并添加对其他类型异常的处理(例如,缺少必填字段、数据截断错误(字符串太长)等)由于错误不一定会从cxGrid中发生,但可能来自绑定到该字段的每个控件,因此我更喜欢在字段的SetText中捕获问题,例如过程TForm1.ADataSetAFloatFieldSetText(发送方:TField;const Text:string);var f:双;如果不是TryStrToFloat(Text,f),则开始引发异常。Create('Error on:'+Sender.FieldName+#13#10+Sender.AsString+#13#10+Text);结束;结束@bummi您真的会在UI处理程序中引发异常吗?∞ +1-谢谢你的例子。这真是太棒了!我永远也不会知道这个存在。你是如何发展关于德尔福的知识的?你推荐哪些资源来获得深入的知识?只是对酒店和活动感兴趣(包括来源),在问答或论坛上阅读,练习,但尽管答案可能有用,但还远远不够精彩。