Delphi 如何通过代码恢复字段的最后一个值?

Delphi 如何通过代码恢复字段的最后一个值?,delphi,dataset,delphi-2007,Delphi,Dataset,Delphi 2007,在t字段.OnValidate事件文件夹中,我必须要求用户确认新键入的值。 如果他不确认,我想恢复最后一个值 目前,我正在执行以下示例中的操作: procedure TForm1.FldOnValidate(AField : TField); begin if(MessageDlg('Are you sure?', mtConfirmation, [mbYes, mbNo], 0) = mrNo) then begin Abort; end; end; procedure

t字段.OnValidate
事件文件夹中,我必须要求用户确认新键入的值。 如果他不确认,我想恢复最后一个值

目前,我正在执行以下示例中的操作:

procedure  TForm1.FldOnValidate(AField : TField);
begin
  if(MessageDlg('Are you sure?', mtConfirmation, [mbYes, mbNo], 0) = mrNo) then
  begin
    Abort;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Dst : TClientDataSet;
  Dsc : TDataSource;
  Fld : TStringField;
  Grid : TDBGrid;
begin
  //dataset
  Dst := TClientDataSet.Create(Self);
  Dst.FieldDefs.Add('TEST', ftString, 20);
  Dst.CreateDataSet();
  Dst.Active := True;
  Fld := Dst.Fields[0] as TStringField;
  Dst.Append();
  Fld.AsString := 'a';
  Dst.Post();
  Fld.OnValidate := FldOnValidate;

  //datasource
  Dsc := TDataSource.Create(Self);
  Dsc.DataSet := Dst;

  //grid
  Grid := TDBGrid.Create(Self);
  Grid.DataSource := Dsc;
  Grid.Columns.Add.FieldName := Fld.FieldName;
  Grid.Align := alClient;
  Grid.Parent := Self;
end;
测试步骤:

  • 运行应用程序
  • b类
  • 按“回车”键
  • 按“是”按钮
  • 类型“c”
  • 按“回车”键
  • 按“否”按钮
  • 按“Esc”键
  • 将恢复值
    'b'

    我想避免第8点,当用户按下
    'No'
    按钮时,我想自动重置以前的值

    尝试:

    我尝试了以下方法,但是
    OldValue
    'c'
    (我认为这不是做我需要的事情的正确方法)


    使用
    t字段.数据集.取消

    procedure  TForm1.FldOnValidate(AField : TField);
    begin
      if MessageDlg('Are you sure?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
          Sender.DataSet.Cancel;
    end;
    
    • 如果单击“是”按钮,OnValidate事件处理程序不会引发异常,则数据将写入当前记录缓冲区,然后调用OnChange事件处理程序

    • 如果单击“否”按钮,则将调用过程,并且如果尚未发布这些更改,则将取消对活动记录的所有修改

    为什么?

    要拒绝OnValidate事件处理程序中字段的当前值,请引发异常

    因此,既然您不想引发异常,这是唯一的方法

    OnValidate事件处理程序用于验证数据,而不是用于确认

    如果您使用的是最新版本的Delphi,这将很容易,因为它提供了


    更新:

    步骤:

    • 键入
      'b'
      并单击
      Yes
    • 键入
      'c'
      并单击
      No
    • 该值将根据需要返回到
      'b'
    使用TFDMemTable使用Delphi 10西雅图进行测试


    你确定这样行吗?我猜这不会起作用,因为数据集已经发布。@nil是,如果单击“否”,则旧值将保留。如果单击“是”,数据将更改。OnValidate在OnChange之前触发,因此数据不会被后置导入,但字段的值会返回到“a”而不是“b”@Fabrizio是的,因为更改不是postedOk,但当我按“Esc”键时,它可以从某个地方检索到“b”值。难道没有一种方法可以在数据集级别执行同样的操作吗?
    procedure  TForm1.FldOnValidate(AField : TField);
    begin
      if MessageDlg('Are you sure?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
          Sender.DataSet.Cancel;
    end;
    
      if MessageDlg('Validate?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
        Sender.DataSet.Cancel
          else
            Sender.DataSet.Post;