CleanData 2018-03-13
原文:http://www.cnblogs.com/lcw/p/3496764.html
TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为.cds/.xml,是基于文件型数据存储和操作的控件。
该控件封装了对数据进行操作处理的接口和功能,而本身并不依赖其它数据库驱动程序,基本上能满足单机"瘦"数据库应用程序的需要。
可通过单击属性编辑器中的属性编辑按钮,或在该控件上单击右键选择弹出菜单中的"Fields Editor"菜单进行字段编辑。设置完此属性后,实际上就相当于定义了表的结构;
如果想装入已有的数据表的结构和数据,可通过单击右键选择弹出菜单中的"Assign Local Data"菜单,从弹出对话框中选取当前窗体中已与数据库连接好的数据集控件名称即可(当前窗体中必须已放置好要套用的数据集控件并打开激活)
使用注意:对于自定义的字段名表,该属性编辑完后,该控件仍然无法打开。必须右键单击该控件,选择弹出菜单中的"Create DataSet"菜单,让该控件以上述编辑的字段列表为依据,创建数据集后,才能够被激活打开和使用。否则,会出现类似"ClientDataSet1: Missing data provider or data packet."的错误(包括在运行期,运行期可调用该控件的CreateDataSet方法,从而动态定义字段和表)
因该控件是基于文件型的数据操作控件,因此,必须指定所操作的数据文件名称(默认扩展名称.cds),从而打开和激活该控件,进而进行数据编辑。
例如:利用此属性打开指定的.cds文件
var Path: string; begin Path := ExtractFilePath(Application.ExeName); //取得可执行文件路径 CDataSet1.FileName := Path + 'test.cds'; CDataSet1.Open; end;
例如:动态创建一具有姓名和年龄两个字段的数据集
View Code
例如::将数据集的数据存储到指定文件中
CDataSet.SaveToFile('c:\windows\desktop\test.cds');
说明:用于筛选指定条件的记录,用法同一般数据集控件,略。
例如:在已经激活打开的数据集中筛选性别为男性的记录
View Code
First(到首),Prior(向前),Next(向后),Last(到尾),Edit(编辑),CanCel(取消编辑),Post(保存),Insert(插入记录),Append(添加记录),Delete(删除),Refresh(数据刷新)等
说明:
使用TClientDataSet控件的程序发布时不需要任何数据库驱动程序,大大节省了安装文件的大小。
但是,在发布程序时别忘了将Windows系统目录下midas.dll与应用程序一起发布,否则,程序可能无法正常运行。
示例代码:
View Code
代码可另写为(下面这种方法简单, 但上一种方法可设置更多选项):
View Code
方法介绍
View Code
数据读取示例:
例子使用了 Common Files\CodeGear Shared\Data\holdings.xml, 若更换文件需调整代码
这是 holdings.xml 的字段信息
View Code
先窗体上放置 ClientDataSet1、DataSource1、DBGrid1、Memo1 和七个 Button
View Code
方法介绍
其中的 GotoNearest、FindNearest 在找不到的情况下会定位到近似值
测试代码:
View Code
索引的目的有三: 快速定位、排序、建立主从表.
相关属性与方法:
View Code
添加索引的方法有二:
两种方法都可以在设计时完成; 后者会有更多功能, 譬如倒排序;
两种方法是互斥的, 指定一个会自动取消另一个.
TClientDataSet 会自动生成两个默认索引:
关于临时索引最常用的代码是在 DBGrid 的OnTitleClick事件中更换索引, 如:
{ 根据当前字段排序 } procedure TForm1.DBGrid1TitleClick(Column: TColumn); begin if not Column.Field.IsBlob then { 不能给大二进制字段建立索引或排序 } ClientDataSet1.IndexFieldNames := Column.FieldName; end; { 恢复默认排序 } procedure TForm1.Button1Click(Sender: TObject); begin ClientDataSet1.IndexName := 'DEFAULT_ORDER'; end;
使用IndexFieldNames可指定多个字段, 如: ClientDataSet1.IndexFieldNames := '字段x; 字段y; 字段z';
此时顺序很重要,这里会先按 "字段x" 排序; 在 "字段x" 的值相同时会按 "字段y" 排序; 在 "字段y" 的相同时...
IndexFieldNames 没有更多了, 更复杂的排序就需要建立排序对象(TIndexDef)了.
实现倒排序的例子:
View Code
View Code
View Code
AddIndex 能做到的, 用 IndexDefs.AddIndexDef 也可以, 并且也都能在设计时完成
运行时实现的分组统计:
View Code
http://www.cnblogs.com/Dragon7/archive/2011/08/31/2161244.html
http://www.cnblogs.com/del/