TField | TFieldDef | TFields | TFieldDefs | TFieldList、TFieldDefList |
---|---|---|---|---|
Assign AssignValue Clear FocusControl GetData GetParentComponent HasParent IsBlob IsValidChar RefreshLookupList SetData SetFieldType SetParentComponent Validate AsBCD OnChange |
AddChild Assign CreateField HasChildDefs FieldClass |
Add CheckFieldName CheckFieldNames Clear FindField FieldByName FieldByNumber GetEnumerator GetFieldNames IndexOf Remove Count DataSet Fields |
AddFieldDef Find Update Add GetItemNames IndexOf Owner Assign BeginUpdate Clear Delete EndUpdate FindItemID GetEnumerator GetNamePath Insert HiddenFields |
FieldByName Find Fields(FieldDefs) Update DataSet Add AddObject Clear Delete Exchange IndexOf Insert InsertObject Sort CustomSort Append AddStrings Assign BeginUpdate EndUpdate Equals GetEnumerator GetText IndexOfName IndexOfObject LoadFromFile LoadFromStream Move SaveToFile SaveToStream SetText Duplicates OnChange |
发现这些东西早在 Delphi 3 的时候就比较成熟了, 至今也基本没有变化; 我暂时对它们的理解是:
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;
字段类型列表:
TStringField { ftString ; String } TWideStringField { ftWideString ; WideString } TNumericField { } TIntegerField { ftInteger ; Integer } TLongWordField { ftLongWord ; LongWord } TSmallintField { ftSmallint ; Smallint } TShortintField { ftShortint ; Shortint } TByteField { ftByte ; Byte } TLargeintField { ftLargeint ; Int64 } TWordField { ftWord ; Word } TAutoIncField { ftAutoInc ; Integer } TUnsignedAutoIncField { ftAutoInc ; Cardinal } TFloatField { ftFloat ; Double } TSingleField { ftSingle ; Single } TCurrencyField { ftCurrency ; Currency } TExtendedField { ftExtended ; Extended } TBooleanField { ftBoolean ; WordBool } TDateTimeField { ftDateTime ; DateTime } TSQLTimeStampField { ftTimeStamp ; TSQLTimeStamp } TSQLTimeStampField { ftTimeStampOffset; TSQLTimeStampOffset } TDateField { ftDate ; Integer } TTimeField { ftTime ; Integer } TBinaryField { } TBytesField { ftBytes ; * } TVarBytesField { ftVarBytes ; * } TBCDField { ftBCD ; * } TFMTBCDField { ftFMTBCD ; * } TBlobField { ftBlob ; * } TMemoField { ftMemo ; * } TWideMemoField { ftWideMemo ; * } TGraphicField { ftGraphic ; * } TObjectField { } TADTField { ftADT ; * } TArrayField { ftArray ; * } TDataSetField { ftDataSet ; TDataSet } TReferenceField { ftReference ; * } TVariantField { ftVariant ; OleVariant } TInterfaceField { ftInterface ; IUnknown } TIDispatchField { ftIDispatch ; IDispatch } TGuidField { ftGuid ; TGUID } TAggregateField { ftUnknown ; * }