寻找一些示例代码,说明如何在运行时创建 与数据集关联的TField组件。
在IDE中,如果您放下数据集组件,右键单击会打开在设计时提供此功能的字段编辑器。无法找到显示如何在运行时执行此操作的代码。
TIA
答案 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
事件处理程序处理计算。