Search code examples
delphispring4d

Using spring4d - TObjectDataset at runtime


I am not able to properly create and populate spring4d ObjectDataSet at run time,an exception saying "Field ID has no dataset, (Creating fields at design-time work fine) here is my code:

 procedure TForm2.FormCreate(Sender: TObject);
var
  _id: TIntegerField;
  _designation: TStringField;
  _dataset: TObjectDataSet;
  _artList: IList<TArticle>;
begin
  _artList := TCollections.CreateList<TArticle>(true);
  _artList.add(TArticle.Create(1, 'Article 1'));
  _artList.add(TArticle.Create(2, 'Article 2'));
  _artList.add(TArticle.Create(3, 'Article 3'));

  _dataset := TObjectDataSet.Create(self);
  _dataset.DataList := _artList as IObjectList;

  _id := TIntegerField.Create(self);
  _id.FieldKind := fkData;
  _id.Name := 'fid';
  _id.FieldName := 'ID';

  _designation := TStringField.Create(self);
  _designation.Size := 100;
  _designation.FieldKind := fkData;
  _designation.FieldName := 'Designation';

  with _dataset.Fields do
  begin
    add(_id);
    add(_designation);
  end;

  DataSource1.DataSet := _dataset;

  // self.DBEdit1.DataField := 'ID';
  // self.DBEdit2.DataField := 'Designation';

  _dataset.Open;
  _active := true;
end;

Solution

  • TFields.Add does not set the DataSet property of the passed field. That is nothing specific to the Spring4D TObjectDataSet but inside of Data.DB.pas. When you are creating a field at designtime the designer sets the DataSet property of the field (see DSDefine.pas)