在TField.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'
(而且我认为这不是做我需要的正确方法)。
procedure TForm1.FldOnValidate(AField : TField);
begin
if(MessageDlg('Are you sure?', mtConfirmation, [mbYes, mbNo], 0) = mrNo) then
begin
AField.OnValidate := nil;
try
AField.AsVariant := AField.OldValue;
finally
AField.OnValidate := FldOnValidate;
end;
Abort;
end;
end;
答案 0 :(得分:2)
使用TField.DataSet.Cancel
作为
procedure TForm1.FldOnValidate(AField : TField);
begin
if MessageDlg('Are you sure?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
Sender.DataSet.Cancel;
end;
如果单击“是”按钮,则OnValidate事件处理程序不会引发异常,则将数据写入当前记录缓冲区,然后调用OnChange事件处理程序。
如果单击“否”按钮,则将调用 Cancel
过程,如果尚未发布对活动记录的所有修改,则将被取消。
为什么?
来自 docs
要拒绝OnValidate事件处理程序中字段的当前值,请引发异常。
因此,由于您不想引发异常,因此这是唯一的方法。
OnValidate 事件处理程序用于验证数据,而不用于确认。
如果使用最新版本的Delphi,这会很容易,因为它提供了
更新:
if MessageDlg('Validate?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
Sender.DataSet.Cancel
else
Sender.DataSet.Post;
步骤:
'b'
,然后单击Yes
'c'
,然后单击No
'b'
使用TFDMemTable在Delphi 10西雅图进行了测试。