В обработчике событий 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'
- Нажмите клавишу «Ввод»
- Нажмите кнопку «Да»
- Тип 'c'
- Нажмите клавишу «Ввод»
- Нажмите кнопку «Нет»
- Нажмите клавишу «Esc»
Значение '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;