0

TFieldフィールド自体の以前の値に基づいて、a の新しい値を検証する必要があります。

例: フィールドの値は、より大きな値にのみ変更できます

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;

OldValueNewValueAsVariantおよびプロパティをチェックしようとしました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;

誰かがそれについて私に教えてくれることを願っています

4

1 に答える 1

0

使用する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;
于 2019-01-16T20:19:22.120 に答える