(tclientdataset)现不用加入固定字,怎样动态创建一个计算字段,并且在计算事件里确发?

解决方案 »

  1.   

    在tclientdataset里加入几个计算字段留给后面用有什么不好呢?
    呵呵,其实我不会动态,帮你UP了
      

  2.   

    with tclientdataset1.FieldDefs do
      begin
        Add('field1', ftInteger, 0, True);
      end;
      for i:= 1 to tclientdataset1.FieldDefs.Count - 1 do
      begin
        if tclientdataset1.FieldDefs[i].Name = 'tclientdataset1field1' then
         tclientdataset1.FieldDefs[i].fieldkind := fkCalculated;
      end;
      tclientdataset1CalcFields(nil)
      

  3.   

    为了详细说明,引用 -- 陈立平 -- 的文章,如下:
    TClientDataSet使用要点  TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为.cds,是基于文件型数据存储和操作的控件。该控件封装了对数据进行操作处理的接口和功能,而本身并不依赖上述几种数据库驱动程序,基本上能满足单机"瘦"数据库应用程序的需要。  1.TClientDataSet的基本属性和方法介绍  1).FieldDefs: 字段定义列表属性  开发者可通过单击属性编辑器中该属性编辑按钮,或在该控件上单击右键选择弹出菜单中的"Fields Editor"菜单进行字段编辑。设置完此属性后,实际上就相当于定义了表的结构;如果想装入已有的数据表的结构和数据,可通过单击右键选择弹出菜单中的"Assign Local Data"菜单,从弹出对话框中选取当前窗体中已与数据库连接好的数据集控件名称即可(当前窗体中必须已放置好要套用的数据集控件并打开激活)。  使用注意:  对于自定义的字段名表,该属性编辑完后,该控件仍然无法打开。必须右键单击该控件,选择弹出菜单中的"Create DataSet"菜单,让该控件以上述编辑的字段列表为依据,创建数据集后,才能够被激活打开和使用。否则,会出现类似"ClientDataSet1: Missing data provider or data packet."的错误(包括在运行期,运行期可调用该控件的CreateDataSet方法,从而动态定义字段和表)。  2).FileName属性  说明:数据存储文件的名称。  因该控件是基于文件型的数据操作控件,因此,必须指定所操作的数据文件名称(默认扩展名称.cds),从而打开和激活该控件,进而进行数据编辑。  例1:利用此属性打开指定的.cds文件var
    Path: string;
    begin
     Path := ExtractFilePath(Application.ExeName); //取得可执行文件路径
     CDataSet1.FileName := Path + 'test.cds';
     CDataSet1.Open;
    end;   3).CreateDataSet方法  说明:该方法以FieldDefs中的字段名表为结构建立数据集,常用来进行动态定义表。  例2:动态创建一具有姓名和年龄两个字段的数据集。//创建字段名表
    CDataSet.FieldDefs.Clear;
    with CDataSet.FieldDefs.AddFieldDef do
    begin
     Name := 'Name';
     Size := 10;
     DataType := ftString;
    end;
    with CDataSet.FieldDefs.AddFieldDef do
    begin
     Name := 'Age';
     DataType := ftInteger;
    end;
     //动态创建数据集
     CDataSet.CreateDataSet;
     //激活和打开该数据集
     CDataSet.Open;   4).Open方法  说明: 打开和激活数据集控件,从而进行数据编辑。  a. 如果指定了FileName属性,则直接用Open方法即可打开和激活该控件,见例1。  b. 如果未指定FileName属性,可使用例2方法动态创建和打开数据集,进而操作数据。  5).LoadFromFile和SaveToFile   说明:从文件中装入表结构和数据以及存储数据到文件。该方法类似于Word中的打开新文件和另存为的功能。  例3:将数据集的数据存储到指定文件中CDataSet.SaveToFile('c:\windows\desktop\test.cds');   6).First(到首),Prior(向前),Next(向后),Last(到尾),Edit(编辑),CanCel(取消编辑),Post(保存),Insert(插入记录),Append(添加记录),Delete(删除),Refresh(数据刷新)等数据集常用方法  说明:当指定了FileName属性时,其Post方法可将数据存入指定的文件中,类似其SaveToFile方法;如果未指定存储文件名,则Post方法只将数据存储在RAM中。其它方法,同一般数据集控件使用方法,略。  7).Filter, Filtered: 过滤筛选属性  说明:用于筛选指定条件的记录,用法同一般数据集控件,略。  例4:在已经激活打开的数据集中筛选性别为男性的记录CDataSet.Close;
    CDataSet.Filter := '性别=''' + '男' + '''';
    CDataSet.Filtered := True;
    CDataSet.Open;   呵呵,此文章介绍的比较详细,所以推荐~~
      

  4.   

    引用:: Wally_wu(韦利) 
    熟悉一遍:)
    with tclientdataset1.FieldDefs do
      begin
        Add('field1', ftInteger, 0, True);
      end;
      for i:= 1 to tclientdataset1.FieldDefs.Count - 1 do
      begin
        if tclientdataset1.FieldDefs[i].Name = 'tclientdataset1field1' then
         tclientdataset1.FieldDefs[i].fieldkind := fkCalculated;
      end;
      tclientdataset1CalcFields(nil)
      

  5.   

    回答问题喜欢回答在点子上:)如何在Delphi中用代码来完成计算字段的创建    blazingfire(原作) 
    以前CSDN上有好多人问过这个问题,但是好象没有人给出满意的答案。我也是经过好长时间摸索才找到答案,现在在这给大家分享:
    procedure TForm1.FormCreate(Sender: TObject);
    var
      NewField:TField;
      i:integer;
    begin
    //表中有两字段SName,Birth,现在我们动态生成一个计算字段Age,显示出年龄
      NewField:=TStringField.Create(ADOTable);
      //创建一个TStringField类型的字段
      ADOTable.Close;
      for i:=0 to ADOTable.Fields.Count-1 do
        ADOTable.Fields[0].Free;//释放所有的静态字段
      for i:=0 to ADOTable.FieldDefs.Count-1 do
        ADOTable.FieldDefs.Items[i].CreateField(ADOTable);
     //根据FieldDefs的字段信息动态的生成静态字段 
      NewField.Size:=5;
      NewField.FieldName:='Age';
      NewField.FieldKind:=fkCalculated;
     //设置这个这字段为计算字段
      NewField.DataSet:=ADOTable;
     //把这个字段加到ADOTable上
      ADOTable.Open;
    end; procedure TForm1.ADOTableCalcFields(DataSet: TDataSet);
    var
      YY1,YY2,MM,DD:Word;
      TmpDate:TDate;
    begin
      DecodeDate(Date,YY1,MM,DD);
      TmpDate:=DataSet.FieldByName('Birth').AsDateTime;
      DecodeDate(TmpDate,YY2,MM,DD);
      DataSet.FieldByName('Age').AsString:=IntToStr(YY1-YY2)+'岁';
      //在OnCalField中显示出年龄
    end;
    以上是我用ADO写的。一开始我用BDE写的,也一样都可以通过.
      

  6.   

    方法好多哦,看来csdn是高手如云