我做了个小实验,一个AdoConnection,AdoQuery,DataProvider和一个CDS,在CDS->DataProvider->AdoQuery->AdoConnection,这样建立连接,在设计期就把表A的数据拿过来,这时候你去看CDS的FieldDef里面就是表A的所有字段,而这时CDS的Fields里面什么都没有(打开CDS的Fields Editor里面什么也没有),即使这样也可以通过DBGrid显示。那这样frankie_24说的Fields是显示的字段就不成立了,同样fangsp说的FieldDef是数据库设计时的第一个字段也不成立了。但是就利用这样一个情况,在程序启动之后,你再看CDS的Fields里却有了所有的表A的字段。这个不明白是为什么?我的认为是FieldDef是表字段的定义,而且在CDS的CreateDataSet之后是不能改变的(FieldDefs lists the field definitions for a dataset. While an application can examine FieldDefs to explore the field definitions for a dataset, it should not change these definitions unless creating a new table with CreateTable or CreateDataSet.)多谢大家的回复,还请大家踊跃呀,我现在还是不会怎么动态创建一个LookUp的Field。
给你一段代码: var TmpField : TstringField; i : integer; begin with qry_work do begin Close; sql.Clear; SQL.Add('select * from t_User'); if qry_work.Fields.FindField('TEST') =nil then begin TmpField := TstringField.Create(self); With TmpField do begin FieldKind:=fkLookUp; FieldName :='TEST'; LookupDataSet:=adoquery2; KeyFields:='COMPANYID'; LookupKeyFields := 'COMPANYID'; LookupResultField :='COMPANYNAME'; size:=200; Lookup :=True; Dataset := qry_work; end; end; Open; if qry_work.Fields.FindField('TEST') = nil then qry_work.Fields.Add(TmpField);
Fields就是用来显示的字段.
我这样说理解不?
而
FieldDel指的是数据库设计时的第一个字段
var TmpField : TstringField;
i : integer;
begin
with qry_work do
begin
Close;
sql.Clear;
SQL.Add('select * from t_User');
if qry_work.Fields.FindField('TEST') =nil then
begin TmpField := TstringField.Create(self); With TmpField do
begin
FieldKind:=fkLookUp;
FieldName :='TEST';
LookupDataSet:=adoquery2;
KeyFields:='COMPANYID';
LookupKeyFields := 'COMPANYID';
LookupResultField :='COMPANYNAME';
size:=200;
Lookup :=True;
Dataset := qry_work;
end;
end;
Open;
if qry_work.Fields.FindField('TEST') = nil then
qry_work.Fields.Add(TmpField);
TmpField : TstringField; //类型要用这个
关键2
qry_work.Fields.Add(TmpField); //一定要在OPEN之后增加