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'
我想避免第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;