OnValidate для TClientDataSet

Я пытаюсь написать событие OnValidate для поля в TClientDataSet, что-то вроде

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

Но Sender.AsFloat всегда равен 0 - как мне выполнить проверку на уровне поля (я понимаю, что в этом случае я мог бы использовать ограничения или установить значения Min/Max)

3 ответа

Решение

Это ошибка, которая была введена в Delphi XE3, вот отчет о контроле качества и небольшой фильм, который я сделал, чтобы проиллюстрировать проблему. Надеюсь, это будет исправлено в следующем обновлении. В одном из комментариев на странице контроля качества есть исправление, если вам нужно это исправить немедленно.

Это отлично работает на D2010, где разница...

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;

Возможно, вы захотите проверить, содержит ли Sender.NewValue значение, которое вы после. Если кэш обновлений в наборе данных клиента активен, вы можете использовать поля OldValue, Value и NewValue.

Другие вопросы по тегам