小弟我在写一个软件,用到了TClientDataSet 这个组件。是用它当作内存中的表来用的。
由于在运行期一些列是可变的。就像是学生成绩表那样,课程是可以添加、删除的。
在现有一个问题就是。我不知道如何删除动态添加的Field。因为我想在运行的时候动态的
改变现有的TClientDateSet。
以下是动态创建的代码:首先从数据库中读出应用的列 使用的是Ehlib组件。
procedure TForm1.Button5Click(Sender: TObject);
var
  s : string;
  Item : TColumnEh;
begin
  //从数据库中创建列
  s := 'select * from cm';
  with qry do
  begin
    close;
    SQL.Clear;
    sql.Add(s);
    open;
    if not IsEmpty then
    begin
      while not Eof do
      begin
        Item := Grid.Columns.Add;
        Item.FieldName := FieldByName('name').AsString;
        Next;
      end;
    end;
  end;
  Item := Grid.Columns.Add;
  Item.Title.Caption := '合计';
  Item.FieldName := 'hj';
end;//创建与界面相对应的内存中的本地表
procedure TForm1.Button3Click(Sender: TObject);
var
  i : Integer;
begin
  //创建本地表
  if not Assigned(cs) then
  begin
    cs := TClientDataSet.Create(Self);
    DataSource1.DataSet := cs;
    Grid.DataSource := DataSource1;
  end;  with cs do begin
    with FieldDefs.AddFieldDef do begin
      DataType := ftString;
      Size := 20;
      Name := 'ddbh';
    end;    with FieldDefs.AddFieldDef do begin
      DataType := ftString;
      Size := 20;
      Name := 'gg';
    end;    with FieldDefs.AddFieldDef do begin
      DataType := ftInteger;
      //Name := 'hj';
    end;    for i := 2 to Grid.Columns.Count -1 do
    begin
      with FieldDefs.AddFieldDef do begin
        DataType := ftInteger;
        Name := Grid.Columns[i].FieldName;
      end;
    end;
    CreateDataSet;
  end;
end;//然后调用一个存储过程来查询。采用的方法是动态SQL语句。已写成proc。
把数据填到界面上是没有问题的。关键是在运行期如果我想把现在内存中的
本地表。也就是TClientDateSet的所有的动态创建的Field删除掉,应该怎么删除。
因为第一次创建是必须要调用一下CreateDataSet方法。有试过FREE掉再重新创建,
但是会出现地址错误。希望大家都帮我看看。有谁对TClientDataSet 用的比较熟悉
的请指点一下。谢谢!注:不要告诉我使用临时表。我也知道用临时表可以解决。我想知道。能添加就一定能删除。
现在就是搞不明白怎么删除。

解决方案 »

  1.   

    不明白你为什么要删除, 如果单纯是不显示, 那设置其visible := false 就可
      

  2.   

    问题已解决了。
      if not Assigned(cs) then
      begin
        cs := TClientDataSet.Create(Self);
        DataSource1.DataSet := cs;
        Grid.DataSource := DataSource1;
      end;
    这段写的不对。
    改为
    if cs.Active  then cs.close;就可以了。
      

  3.   

    删除的原因是:在软件运行期,由用户来设置这些不确定的列。
    我现在作的是一款服装工艺的软件。由于每款衣服的SIZE号都不一样。
    也就是说:A款可能只需要 S,SL,X,XL这几个SIZE就行了。那换成了另外一
    款就可能不需要S,SL,X,XL这样的SIZE号,而需要另行设置。所以就需要删除了。
      

  4.   

    cs.Close;
    cs.FieldDefs.Clear;
    有indexName别忘记了删除原来的Index