转自:

1、Fields 是 Field 的集合, 它们主要用于运行时对字段元数据和字段值的访问.


2、FieldDefs 是 FieldDef 的集合, 它们主要用于构建数据集(表)和对字段元数据的访问.


3、FieldList 和 FieldDefList 分别是访问 Field 和 FieldDef 的快捷列表; 主要使用其 FieldByName、Find 方法和默认的数组属性访问数据; 它们是只读的.


4、通过 Fields、FieldList、Field 可以得到更多信息, 但必须是在数据集打开的情况下;

通过 FieldDefs、FieldDefList、FieldDef 只能获取定义时的信息, 但即使在数据集关闭时也能使用.


5、顾名思义 FieldDef 是用于定义表的, 但通过 Field 也可以定义表;

用 FieldDef 定义表很方便, 用 Field 可以定义一些更复杂的表;

每个 FieldDef 都会对应一个 Field, 但一个 Field 不一定有 FieldDef 对应;

程序运行后 FieldDef 不能再改变, 而 Field 与 Fields 则可以动态改变或增减.


设计时两者是结合使用的.


  下面是通过三种方法动态建表的代码:


//使用 TFieldDef 建表:  

begin 

 with  ClientDataSet1.FieldDefs do 

 begin 

  Add('Name' , ftString, 12,  True); { True 表示是必填字段 } 

  Add('Age', ftInteger); 

 end; 

  ClientDataSet1.CreateDataSet; 

end; 


//使用 TField(这里是用其子类)建表: 

begin  

 with TStringField.Create(Self) do 

 begin 

  FieldName :=  'Name'; 

  Size := 12; 

  Required := True; { 必填字段 } 

  DataSet  := ClientDataSet1; 

 end; 

 with TIntegerField.Create(Self) do 

  begin 

  FieldName := 'Age'; 

  DataSet := ClientDataSet1; 

  end; 

 ClientDataSet1.CreateDataSet; 

end; 


//混合使用(这好像就是设计时的情形): 

var 

 F: TIntegerField; 

begin 

 with  ClientDataSet1.FieldDefs.AddFieldDef do 

 begin 

  Name := 'Name';  

  DataType := ftString; 

  Size := 12; 

  Required := True; 

  CreateField(ClientDataSet1); 

 end; 

 with  ClientDataSet1.FieldDefs.AddFieldDef do 

 begin 

  Name := 'Age'; 

  DataType := ftInteger; 

  { 指定最大值和最小值 } 

  F :=  CreateField(ClientDataSet1) as TIntegerField; 

  F.MinValue := 0; 

  F.MaxValue := 150; 

 end; 

 ClientDataSet1.CreateDataSet; 

end;