小弟我在写一个软件,用到了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 用的比较熟悉
的请指点一下。谢谢!注:不要告诉我使用临时表。我也知道用临时表可以解决。我想知道。能添加就一定能删除。
现在就是搞不明白怎么删除。
由于在运行期一些列是可变的。就像是学生成绩表那样,课程是可以添加、删除的。
在现有一个问题就是。我不知道如何删除动态添加的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 用的比较熟悉
的请指点一下。谢谢!注:不要告诉我使用临时表。我也知道用临时表可以解决。我想知道。能添加就一定能删除。
现在就是搞不明白怎么删除。
解决方案 »
- delphi简单试题求解答
- list index out of bounds是怎么回事?请大家帮帮忙!!!
- 你用DELPHI取过WINDOWS的字库吗?
- 能不能用一个select直接搞定?
- 如何把标注文字加在条形码的下面??
- 从表中删除一条纪录的sql语句!
- 为什么产生invalid class typecasts错误
- access violation 继续研究。
- Paradox库能实现Select语句的子查询吗?
- 紧急求救?。。。。。。
- 没分了,请大家帮帮忙.如何动态的设置DBCHART的数据源?
- 求一个算法 一个字符串(有字母,汉字,数字。标点符号,空格)等能够区别出来,只要是数字(一个)在这个数字前加A后面加B,汉字是前面
if not Assigned(cs) then
begin
cs := TClientDataSet.Create(Self);
DataSource1.DataSet := cs;
Grid.DataSource := DataSource1;
end;
这段写的不对。
改为
if cs.Active then cs.close;就可以了。
我现在作的是一款服装工艺的软件。由于每款衣服的SIZE号都不一样。
也就是说:A款可能只需要 S,SL,X,XL这几个SIZE就行了。那换成了另外一
款就可能不需要S,SL,X,XL这样的SIZE号,而需要另行设置。所以就需要删除了。
cs.FieldDefs.Clear;
有indexName别忘记了删除原来的Index