Delphi : kbmMemTable关于内存表的使用  
官方Delphi 学习QQ群: 682628230(三千人)
频道

Delphi : kbmMemTable关于内存表的使用


Delphi : kbmMemTable关于内存表的使用

关于内存表的使用(kbmMemTable)

关于内存表的使用说明
一、 Delphi使用内存表
1.1 Delphi创建内存表步骤:
1. 创建一个Ttable实例。
2. 设置一个DataBaseName为一个目录或是已有的数据库别名。
3. 指定TableName的值。
4.设置TableType属性指明要创建的数据库表类型。(如果此属性为ttDefault表示数据库类型与TableName指定值的扩展名对应)。
5. 调用TTable.FidldDefs对象的Add方法向数据库表中添加字段。Add有4个参数:
字段名:string。
字段类型:TfieldType。
字段大小:Word。一般只对String和Memo类型使用。
字段是否NotNull: Boolean。
6. 使用TTable.IndexDefs.Add()方法定义索引。Add有三个参数:
索引名:string;
索引字段名:string;
索引类型:TIndexOptions;
7. 调用TTable的CreateTable。这种方法适用于本地表。SQL表要用TQuery来创建。
代码如下:
var
MemTable: TTable;
begin
with MemTable.Create(Self) do
begin
DatabaseName := 'c:\Temp';
TableName := 'Test';
TableType := ttParadox;
with FieldDefs do
begin
Add('Age', ftInteger, 0, True);
Add('Name', ftString, 25, False);
Add('Weight', ftFloat, 0, False);
end;
IndexDefs.Add('', 'Age', [ixPrimary, ixUnique]);
CreateTable;
end;
end;
二、 kbmMemTable使用简述
2.1 kbmMemTable创建步骤:
1. 创建一个kbmMemTable对象实例。
2. 调用kbmMemTable.FidldDefs对象的Add方法向数据库表中添加字段。Add的方法和Delphi相同。
3. 使用kbmMemTable.IndexDefs.Add()方法定义索引。Add的方法和Delphi相同。
4. 调用kbmMemTable的CreateTable。
重要的区别:因为kbmMemTable不需要BDE的支持。所以不要指明DatabaseName, TableName和TableType三个属性。
代码如下:
with kbmMemTable1 do
begin
with kbmMemTable1.FieldDefs do
begin
Clear;
Add('Period', ftInteger, 0, false);
Add('VALUE', ftLargeInt, 0, false);
Add('BytesField', ftBytes, 20, false);
Add('Color', ftInteger, 0, false);
Add('Date', ftDate, 0, false);
Add('Memo', ftMemo, 0, false);
Add('AutoInc', ftAutoInc, 0, false);
end;
with kbmMemTable1.IndexDefs do
begin
Clear;
Add('Index1', 'VALUE', []);
end;
CreateTable;
end;
三、与Delphi创建内存表的对比
3.1主从表功能
kbmMemTable可以象其它TDataSet一样,通过设置MasterSource和MasterField来简单的完成主从表的操作。
3.2 SQL功能
没有发现kbmMemTable可以支持SQL语句的操作。它提供按字段排序和对排序字段的查找功能。
三、 kbmMemTable特点
从其它TDataSet得到数据。
代码如下:
LoadFromDataSet(Table1, [mtcpoStructure, mtcpoProperties]);
这样kbmMemTable就完全得到来自一个DataSet对象中的全部数据.
保存和载入内存表中数据的功能
Delphi的TTable不提供SaveToFile功能。
kbmMemTable提供保存到文件的功能,保存的文件有两种格式:
Options: TkbmMemTable.SaveFlags;
1. 二进制格式。kbmMemTable.SaveToBinaryFile('c:\test.bin', Options).
kbmMemTable1.LoadFromBinaryFile('c:\test.bin')
2. .csv格式。kbmMemTable.SaveToFile('c:\test.csv', Options);
kbmMemTable1.LoadFromFile('c:\test.csv')
(一种Excel支持的文档格式)打开后的内容如下:
@@FILE VERSION@@ 200
@@TABLEDEF START@@
Period=Integer,0,"Period","",10
VALUE=LargeInt,0,"VALUE","",15
BytesField=Bytes,20,"BytesField","",10
Color=Integer,0,"Color","",10
Date=Date,0,"Date","",10
Memo=Memo,0,"Memo","",10
AutoInc=AutoInc,0,"AutoInc","",10
CALC=String,20,"CALC","",20
@@TABLEDEF END@@
Period VALUE BytesField Color Date Memo AutoInc CALC
1 198 0 02/11/2001 This is a memo%n2001-11-2 10:19:52 1 0 1-二月
2 196 3 03/11/2001 This is a memo%n2001-11-2 10:19:52 2 1 2-三月
在文档的头部份描述了表的字段结构,在下面则是数据区域.
以下代码用ClientDataSet建立内存表,包含Field1和Field2两个字段,在Field1上建索引:
with ClientDataSet1 do
begin
//添加Integer类型的字段Field1
with FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := 'Field1';
end;
//添加string类型的字段Field2
with FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size := 10;
Name := 'Field2';
end;
//在Field1上建索引
with IndexDefs.AddIndexDef do
begin
Fields := 'Field1';
Name := 'IntIndex';
end;
//创建内存表
CreateDataSet;
end;



》》》》》》》》》》》》》》》》》



KbmMemTable是一款高效且强大的内存表控件,内存表顾名思义其最大的优势就是速度,KbmMemTable不仅完美地实现了高效的特征,同时,最新版本还支持索引、SQL语句等高级用法。其用法超简单,基本用法和ClientDataSet一致,以下是我简单的应用示例,实现了增删改查等基本功能:

Delphi:kbmMemTable关于内存表的使用

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, DBGrids, DB, StdCtrls, kbmMemTable;

type
 TForm1 = class(TForm)
   Button1: TButton;
   DataSource1: TDataSource;
   DBGrid1: TDBGrid;
   Button2: TButton;
   Button3: TButton;
   Button4: TButton;
   Button5: TButton;
   Button6: TButton;
   Button7: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure Button5Click(Sender: TObject);
   procedure Button6Click(Sender: TObject);
   procedure Button7Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 kbmMemTable1 : TkbmMemTable;
 Id:Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 //建表
 kbmMemTable1.FieldDefs.Clear;
 kbmMemTable1.FieldDefs.Add('Id', ftInteger, 0, False);
 kbmMemTable1.FieldDefs.Add('Value', FtString, 20, False);
 kbmMemTable1.FieldDefs.Add('Time', ftDateTime, 0, False);
 kbmMemTable1.IndexDefs.Add('Index1','Id',[]);//定义索引
 kbmMemTable1.CreateTable;
 kbmMemTable1.Active := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 fld_Id:TIntegerField;
 fld_Value:TStringField;
 fld_Time:TDateTimeField;
 i:Integer;
begin
 //插入
 with kbmMemTable1 do
 begin
   DisableControls; //切断数据感知控件
   try
     Open; //打开
     //定义Field
     fld_Id:=TIntegerField(FieldByName('Id'));
     fld_Value:=TStringField(FieldByName('Value'));
     fld_Time:=TDateTimeField(FieldByName('Time'));
     for i := 0 to 9 do
     begin
       Inc(Id);
       Append; //附加数据
       //赋值
       fld_Id.AsInteger := Id;
       fld_Value.AsString := 'Hello PFeng!'+inttostr(Id);
       fld_Time.AsDateTime := Now;
       Post; //确定
     end;
     UpdateIndexes;//更新索引
   finally
     EnableControls; //连接数据感知控件
   end;
 end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 fld_Id:TIntegerField;
 fld_Value:TStringField;
 fld_Time:TDateTimeField;
begin
 //更新
 with kbmMemTable1 do
 begin
   Open;
   fld_Id:=TIntegerField(FieldByName('Id'));
   fld_Value:=TStringField(FieldByName('Value'));
   fld_Time:=TDateTimeField(FieldByName('Time'));
   if Locate('Id',5,[]) then
   begin
     Edit;
     fld_Value.AsString := '内容被修改';
     fld_Time.AsDateTime := Now;
     Post;
   end;
 end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
 fld_Id:TIntegerField;
 fld_Value:TStringField;
 fld_Time:TDateTimeField;
begin
 //查询
 with kbmMemTable1 do
 begin
   Open;
   fld_Id:=TIntegerField(FieldByName('Id'));
   fld_Value:=TStringField(FieldByName('Value'));
   fld_Time:=TDateTimeField(FieldByName('Time'));
   if Locate('Id',5,[]) then
   ShowMessage(fld_Value.AsString);
   //还可以用FindKey实现,结合索引速度更快
   // kbmMemTable1.IndexFieldNames:='Id';
   // if kbmMemtable1.FindKey([5]) then ...
 end;
end;

procedure TForm1.Button5Click(Sender: TObject);
var
 fld_Id:TIntegerField;
 fld_Value:TStringField;
 fld_Time:TDateTimeField;
begin
 //删除
 with kbmMemTable1 do
 begin
   Open;
   fld_Id:=TIntegerField(FieldByName('Id'));
   fld_Value:=TStringField(FieldByName('Value'));
   fld_Time:=TDateTimeField(FieldByName('Time'));
   if Locate('Id',5,[]) then
   begin
     Delete;
     UpdateIndexes;
   end;
 end;
end;

procedure TForm1.Button6Click(Sender: TObject);
var
 fld_Id:TIntegerField;
 fld_Value:TStringField;
 fld_Time:TDateTimeField;
 id:Integer;
begin
 //循环比较最小值
 with kbmMemTable1 do
 begin
   Open;
   fld_Id:=TIntegerField(FieldByName('Id'));
   fld_Value:=TStringField(FieldByName('Value'));
   fld_Time:=TDateTimeField(FieldByName('Time'));
   DisableControls;
   try
     First;
     id := fld_Id.AsInteger;
     while not Eof do
     begin
       if id > fld_Id.AsInteger then
       id := fld_Id.AsInteger;
       Next;
     end;
     Locate('Id',id,[]);
   finally
     EnableControls;
   end;
 end;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
 //清空
 kbmMemTable1.EmptyTable;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 kbmMemTable1 := TkbmMemTable.Create(Self);
 DataSource1.DataSet := kbmMemTable1;
end;

end.
http://www.pfeng.org/archives/372


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.17589807510376 seconds