Как проверить предыдущее значение поля из обработчика события OnValidate? - PullRequest
0 голосов
/ 16 января 2019

Мне нужно проверить новое значение TField на основе значения предыдущего поля самого поля.

Например: значение поля можно изменить только на большее значение

procedure  TForm1.FldOnValidate(AField : TField);
begin
  if(???) then
    raise Exception.Create('The new value is not bigger than the previous one');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Dst : TClientDataSet;
  Fld : TIntegerField;
begin
  //dataset
  Dst := TClientDataSet.Create(Self);
  Dst.FieldDefs.Add('TEST', ftInteger, 0);
  Dst.CreateDataSet();
  Dst.Active := True;
  Fld := Dst.Fields[0] as TIntegerField;
  Dst.Append();
  Fld.AsInteger := 5;
  Dst.Post();
  Fld.OnValidate := FldOnValidate;


  //this should be ok (from 5 to 6)
  Dst.Edit;
  Fld.AsInteger := 6;
  Dst.Post;

  //this should not pass the validation (from 6 to 5)
  Dst.Edit;
  Fld.AsInteger := 5;
end;

Я пытался проверить свойства OldValue, NewValue, AsVariant и Value, но всегда получаю новое значение:

procedure  TForm1.FldOnValidate(AField : TField);
begin
  ShowMessage(
    'OldValue = ' + VarToStr(AField.OldValue) + sLineBreak +
    'NewValue = ' + VarToStr(AField.NewValue) + sLineBreak +
    'AsVariant = ' + VarToStr(AField.AsVariant) + sLineBreak +
    'Value = ' + VarToStr(AField.Value)
  );
end;

Надеюсь, что кто-то может просветить меня об этом

1 Ответ

0 голосов
/ 16 января 2019

Использование Unassigned

procedure  TForm1.FldOnValidate(AField : TField);
begin
    if Sender.OldValue <> Unassigned then
      if Sender.NewValue <= Sender.OldValue then
        raise Exception.Create('The new value is not bigger than the previous one');
end;

Но правильное место - OnChange событие

procedure TForm1.ClientDataSet1ValChange(Sender: TField);

begin
    if Sender.OldValue <> Unassigned then
      if Sender.NewValue <= Sender.OldValue then
        raise Exception.Create('The new value is not bigger than the previous one');
end;
...