请教:如何动态增加、删除Lookup字段-----高手请进(200分)

  • 主题发起人 主题发起人 FreedomBird
  • 开始时间 开始时间
F

FreedomBird

Unregistered / Unconfirmed
GUEST, unregistred user!
使用一个 TQuery控件动态连结不同的表,希望在不创建永久字段的情况下,动态的增加
和删除Lookup字段,以便将外键值显示为文本而不是数字。

代码过程如下,请教DynaLoadLKField如何来些。

procedure LoadData(qryProcess:TQuery;TableName,Filter:string);
begin
with qryProcess do
begin
if Filter<>'' then
SQL.Add('select * from '+TableName+' where '+Filter)
else
SQL.Add('select * from '+TableName);
Open;
Active:=False;
DynaLoadLKField;
Active:=True;
end;
end;
 
应该是一样的,动态创建 TField 就是了,Delphi IDE 虽然能够让你在设计期创建永久字段,
实际上在运行时还是会重新创建的。
但是你的 Table 仍然需要创建永久字段。
 
对不起,没有讲清楚。

我现在要做的就是在不事先创建永久字段的前提下。即做TQuery在运行中创建动态字段
(包括数据字段和Lookup字段)的工作。我已经尝试这样做,但下面的代码在Fields.Clear
时会出错。


procedure LoadData(qryProcess:TQuery;TableName,Filter:string);
begin
with qryProcess do
begin
if Fields.Count<>0 then //如果上一次创建的TField存在,则清除;否则,Open过程出错。
Fields.Clear; //因为每次打开的表可能不同,所以要这么做。
if Filter<>'' then
SQL.Add('select * from '+TableName+' where '+Filter)
else
SQL.Add('select * from '+TableName);
Open;
Active:=False;
DynaLoadLKField(qryProcess); //必须在数据集关闭时添加。
Active:=True;
end;
end;

//LKData是一个保存创建Lookup字段所必需的数据Record
procedure DynaLoadLKField(Dataset:TDataset;LKRecord:LKData,DataType:T);
var I:integer;
begin
for I := 0 to DataSet.FieldDefList.Count - 1 do //必须首先创建数据字段,否则Open时会错误。
with DataSet.FieldDefList do
if (DataType <> ftUnknown) and not (DataType in ObjectFieldTypes) then
CreateField(DataSet, nil, DataSet.FieldDefList.Strings);
CreateLookupRecord(LKRecord);
end;
 
你在 Fields.Clear 之前有没有把 Query 关掉?
还有,LookUp 字段的很多属性,你动态创建的时候都设置了吗?
 
这个问题有两个解决办法,其中一个在这里,是我现在采用的:
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=273644

而我原来的方法或许也适合你,如果需要,我再来回答。
 
对不起,前一段时间连不到大富翁,也非常忙。
谢谢温柔一刀的答案,我还想看看你原来的方法。
还有,我想看看其他人有没有象我原来的思路调用DataSet.FieldDefList.Item.CreateField
方法来实现的。
 
>>我想看看其他人有没有象我原来的思路调用DataSet.FieldDefList.Item.CreateField
我想你只看了那个贴子的表面内容,没有完全理解,其实本质上和你说的方法是一致的,
我现在的程序就是这样(与那个贴子内容并不完全一样,倒是与你上面的程序很象 :-)
不过有一个FieldDefs从哪里来的问题而已

另外,我原来的方法是:
重载了TDataSet 的 CreateFields方法,在那里面先inherited,这时候,
数据字段就根据fielddefs被创建了(不用自己操心),然后执行创建新fields的语句。
只有这个方法能解开预先不定义fields,而又要自己添加field的“死结”。

我之所以不用这个方法,因为这样做必须要自定义类,不能是一个简单query,
因此不能“放”在form上了,所以我说不爽。而我现在用的方法(其实就是你想用的)
等于把CreateFields方法搬到自己程序来了,殊途同归...

废话说了一大堆,最后一句:
你上面的程序之所以通不过,纯属程序写的有问题,思路是没错的... :-)
 
多人接受答案了。
 
后退
顶部