gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:38:28 24 4
gpt4 key购买 nike

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;

测试步骤:

  1. 运行应用程序
  2. 输入“b”
  3. 按“Enter”键
  4. 按"is"按钮
  5. 输入“c”
  6. 按“Enter”键
  7. 按“否”按钮
  8. 按“Esc”键

'b'将被恢复。

我想避免第8点,当用户按下“否”按钮时,我想自动重置以前的值。

尝试:

我已尝试如下,但 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;

最佳答案

使用TField.DataSet.Cancel作为

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

  • 如果单击否按钮,则 Cancel 过程将被调用,并且对事件记录的所有修改(如果这些更改尚未发布)都将被取消。

为什么?

来自docs

To reject the current value of the field from the OnValidate event handler, raise an exception.

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

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

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

<小时/>

更新:

  if MessageDlg('Validate?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
Sender.DataSet.Cancel
else
Sender.DataSet.Post;

步骤:

  • 输入'b'并点击
  • 输入'c'并点击
  • 该值将按照您的意愿返回到 'b'

Tested with Delphi 10 seattle using a TFDMemTable.

关于delphi - 如何通过代码恢复字段的最后一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54130504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com