用于创建与TDataSet关联的持久字段组件的代码

时间:2011-06-29 20:27:55

标签: delphi components runtime

寻找一些示例代码,说明如何在运行时创建 与数据集关联的TField组件。

在IDE中,如果您放下数据集组件,右键单击会打开在设计时提供此功能的字段编辑器。无法找到显示如何在运行时执行此操作的代码。

TIA

2 个答案:

答案 0 :(得分:1)

每个字段类型都有一个Create函数,您可以将DataSet传递给它,从而创建该类型的字段并将其添加到Fields中。来自DB.TStringField.Create的帮助。

var
  T: TStringField;
begin
  SQLDataSet1.Close;
  T := TStringField.Create(SQLDataSet1);
  T.FieldName := 'LastName';
  T.Name := SQLDataSet1.Name + T.FieldName;
  T.Index := SQLDataSet1.FieldCount;
  T.DataSet := SQLDataSet1;
  SQLDataSet1.FieldDefs.UpDate;
  SQLDataSet1.Open;
end;

答案 1 :(得分:1)

在运行时创建的“持久字段”毫无意义。在IDE中创建持久字段允许将它们写入表单/ datamodule的.dfm,然后在从可执行文件加载.dfm时自动创建,并且可以在使用该数据模块的代码中按名称访问。

如果你不想在运行时使用FieldByName,你可以这样做:

TMyDataModule=class(TDataModule)
  // Usual IDE created stuff, etc.
public
  NameFld: TStringField;
  LimitFld: TFloatField;
end;

procedure TMyDataModule.DataModuleCreate(Sender: TObject);    
begin
  NameFld := MyDataSet.FieldByName('CompanyName') as TStringField;
  NameFld.Required := True;
  LimitFld := MyDataSet.FieldByName('CreditLimit') as TFloatField;
  LimitFld.Currency := True;
  // Set other properties as needed.
end;

现在,您在运行时具有等效的持久字段。在其他使用数据模块的代码中,可以像往常一样访问它们。

procedure TMyDataModule.DoSomethingWithData(CompanyName: string; CreditLimit: Currency);
begin
  MyDataSet.Edit;
  NameFld.AsString := CompanyName;
  LimitFld.AsCurrency := CreditLimit;
  MyDataSet.Post;
end;
编辑:只是想到我的陈述中的两个例外“没有意义” - 那些将被计算或查找字段。对于查找字段,最简单的方法是通过JOIN将它们添加到SQL中,让服务器执行此操作;对于计算字段,您可以使用DataSet.FieldDefs.Add并设置相应的属性来命名字段,将新创建的字段FieldType设置为ftCalculated,并指定OnCalcFields事件处理程序处理计算。