因为表在Open以后,就会自动建立Field。所以除了Lookup和CalcField两种类型外,Delphi都会为你创建相关的Field。
如果需要动态创建,那么只要建立LookUp和CalcField就可以了。而且选择在DataSet的AfterOpen事件中建立是个不错的选择。

解决方案 »

  1.   

    不行的啊,错误显示不能对一个OPEN的dataset插入lookup字段//大意如此。
      

  2.   

    如果你后台是用SQLServer数据库的话,很好解决,你可以把任意数据表中的字段读到临时表中,从临时表中取数据。象这样:
    select name into #colname from syscolumns where id in (select id from sysobjects where name=你的表名)
      

  3.   

    如果没有猜错的话,Delphi一定是通过打开Query然后才取得Field的。
    因为有一次我不小心在Query中选取了一个非常大的表(有十几万的数据),然后Add Fields的时候就狂等了很长时间才有Field出来。
    那么一个笨方法就是,内建一个Query,先提取一下SQL语句,然后打开,根据这里面的Field创建记录。当然需要优化一下Where语句。比如Where语句可以使“Where 1=0”
      

  4.   

    呵呵,不是啊,是access,做个本地库。现在虽然我是解决了,用笨办法,一个个加入。但我觉得不舒服,因为不能一次性加,也缺少普遍性。
      

  5.   

    用TQuery1先Select * from ... where 1=2
    然后把TQuery1的字段用一个For循环倒到TQuery2里去,同时增加Lookup和Calc Fields。
      

  6.   

    内建一个Query的办法我想过了,不打开也行,对select 后面的语句分析一下,按,分开算,一个算全部的个数,一个取名称,然后动态的增加。
    //我也认为Delphi一定是通过打开Query然后才取得Field的,不然select *这种句子它怎么都不弄不出field来!
    如果没弄错的话,那我也心平了,气也消了。我担心的是原来就有什么简便方法,结果我却用了笨办法,那就气杀我也了!
    多谢chechy(我爱洁洁) 的支持!也谢谢forgot2000(忘记2000年) 。有什么帮得到的地方就联系 我。
      

  7.   

    总结:可以把各表的字段做成一张索引, 在adoquery.open前用个 For循环倒到TadoQuery中去,再增加lookup,行不行呢,我明天再试。
      

  8.   

    采用以下程序,ADODataSet1的条件是"where 1=0",目的是取出一个空表,这样TClientDataset就是你的纯结构数据表,这时,你可以任意把Field名提取出来了。
    在Form上,
        有一个TClientDataSet ClientDataSet1 
        和一个TADODataset ADODataset1 
    function GetData(ADataSet: TDataSet): OleVariant;
    begin
         with TDataSetProvider.Create(nil) do
         try
              DataSet := ADataSet;
              Result := Data ;
         finally
              Free;
         end;;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
         ClientDataSet1.Data := GetData(ADODataSet1);
    end;
      

  9.   

    大家有没有有发现:若没有在设计期中增加进字段,如果只是在程序运行中进行adoquery.open,那么它的字段是没有name的,比如:
    procedure TForm1.Button2Click(Sender: TObject);
    var t:TstringField;
        i,j :Integer;
    begin
      adoquery1.open;
      i := 0;
      Memo1.Clear();
      j := ADOquery1.FieldCount;
      while i < j do
      begin
        Memo1.Lines.Add(ADOquery1.Fields[i].Name);
        i := i + 1;
      end;
    end;//得出的是有内容,不过都是空的,name是'';而换成
    Memo1.Lines.Add(ADOquery1.Fields[i].DisplayName);则就有内容出来了,都是正确的字段名。
       这也就是说,delphi 在表在Open以后,就会自动建立Field,这个field是没有name的,而动态增加lookup字段却是需要一个KeyFields,这个KeyFields肯定是和name有关的,所以就象设计期时增加lookup字段时如果不先把字段都加入,也会出现找不到KeyFields的错误。
      

  10.   

    结论:只需动态增加lookup字段,而不需增加内置的字段怕是行不通的。
    另外加点分,不然还真太小气了。