0

我有一个类,它应该包含诸如 TIntegerField、TFloatField 之类的数据字段...... 因为我不想写下我想用 rtti 动态执行此操作的类的所有字段。我想知道如何创建一个 TFLoatfield 的实例并将 FloatField 从数据集复制到类字段。我的函数找到了 floatfiled,但我无法创建实例并复制值。

var
  rttiContext: TRttiContext;
  rttiType: TRttiType;
  attribute: TCustomAttribute;
  rttiField: TRttiField;
begin
  myQuery.Close;
  myQuery.SQL.Clear;
  myQuery.SQL.Add('SELECT * FROM prices');
  myQuery.SQL.Add('WHERE ID=' + IntToStr(FID));
  myQuery.Open();
  try
    rttiContext := TRttiContext.Create;
    try
      rttiType := rttiContext.GetType(TPrice);
      for rttiField in rttiType.GetFields do
      begin
        if rttiField.FieldType.ToString = 'TFloatField' then
        begin
          // create Instance of Floatfield does not work!
          if not assigned(TFloatField(rttiType.GetField(rttiField.Name))) then
            TFloatField(rttiType.GetField(rttiField.Name)).Create(nil);
          // Copy Floatfield from dataset to classfield does not work!
          TFloatField(rttiType.GetField(rttiField.Name)).Value := tmpQuery.FieldByName(rttiField.Name).Value;
        end;
      end;
    finally
      rttiContext.Free;
    end
  finally
    myQuery.Close;
  end;
end; 
4

1 回答 1

0

你的评论

将浮点域从数据集复制到类域不起作用!

是正确的,TFields 仅在与 TDataSet 关联时才起作用;它们不能孤立地工作,因为它们使用数据集设置的记录缓冲区来保存它们操作的数据。

创建 Floatfield 实例不起作用!

错误的。您可以通过您喜欢的任何方法创建 TFloatField 的实例,例如

var FloatField : TFloatField;

  FloatField := TFloatField.Create(Self);  //  self being e.g. TForm1 or DataModule1
  FloatField.FieldName := 'AFloatField';
  FloatField.FieldKind := fkData;
FloatField.DataSet := myQuery;
  [etc]

但我认为你错过的一点是你只能在打开数据集之前成功地做到这一点 。一旦数据集打开就为时已晚,因为在没有持久字段的情况下,数据集将动态创建一组默认字段,这些默认字段仅在数据集打开时才存在。

之所以称为“持久”字段,是因为它们存储在表单或 DataModule 的 DFM 中,它们是使用字段编辑器创建的,您可以使用 IDE 中数据集的上下文菜单进行访问。

顺便说一句,许多人使用类的属性注释来创建自定义数据集。一篇关于它的好文章在这里:

http://francois-piette.blogspot.co.uk/2013/01/using-custom-attribute-for-data.html

您可能还想看看 Spring4D 库,它可能会为您节省大量工作。参见例如https://spring4d.4delphi.com/docs/develop/Html/index.htm?Spring.Persistence.Core.Base.TDriverResultSetAdapter(T).DataSet.htm作为进入它的一种方式。

于 2017-04-06T09:41:16.313 回答