5

TClientDataSet のフィールドに OnValidate イベントを書き込もうとしています。

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

しかし、Sender.AsFloat は常に 0 です - フィールド レベルの検証を行うにはどうすればよいですか (この場合、制約を使用したり、最小/最大値を設定したりできることに気付きました)

4

3 に答える 3

3

これは、Delphi XE3 で導入されたバグです。ここにQC レポートと、問題を明確に説明するために私が作成したクイックムービーがあります。うまくいけば、これは次のアップデートで修正されるでしょう。これをすぐに修正する必要がある場合は、QC ページのコメントの 1 つにホット フィックスがあります。

于 2012-11-02T01:01:09.293 に答える
1

これは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;
于 2012-11-01T08:14:37.127 に答える
0

Sender.NewValue に目的の値が含まれているかどうかを確認することをお勧めします。クライアント データセットの更新キャッシュがアクティブな場合、フィールドの OldValue、Value、および NewValue を使用できます。

于 2012-11-01T22:03:08.237 に答える