4

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

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

在此处输入图像描述
原始零件编号:1313.3

在此处输入图像描述
更改零件编号: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' 值来格式化我自己的消息。你如何得到这个值?

4

1 回答 1

5

如果要持久化数据集的字段,则可以在字段上定义 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;
于 2013-08-23T21:50:46.223 回答