Question

I'm trying to write an OnValidate event on a field on a TClientDataSet, something along the lines of

procedure TForm8.ClientDataSet1MyFieldValidate(Sender: TField);
begin
  if Sender.AsFloat > 30 then
     raise Exception.Create('Too Much!!!');
end;

But Sender.AsFloat is always 0 - how do I do field level validation (I realize in this instance I could use constraints or set Min/Max values)

Was it helpful?

Solution

This is a bug that has been introduced in Delphi XE3, here is the QC report, and a quick movie I've made to illustrate the problem clearly. Hopefully this will be fixed in the next update. There is a hot fix in one of the comments on the QC page if you need this fixed immediately.

OTHER TIPS

this works fine on D2010, where's the difference ...

procedure TForm3.FloatValidate(Sender: TField);
begin
  if sender.AsFloat > 30 then Showmessage('No');

end;

procedure TForm3.Button1Click(Sender: TObject);
begin
   With Clientdataset1 do
    begin
      FieldDefs.add('ID',ftInteger,0);
      FieldDefs.add('Floatfield',ftFloat,0);
      Createdataset;
      Fields[1].OnValidate := FloatValidate;
    end;

end;

You might want to check if Sender.NewValue contains the value you are after. If the update cache on the client dataset is active you can use the OldValue, Value and NewValue of the fields.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top