您正在查看: 编程语言 分类下的文章

利用TDBChart显示图表数据

-->



实例120 利用TDBChart显示图表数据

本实例演示如何利用TDBChart组件以图表的形式显示数据库中的数据。

向窗体上添加一个TDBChart组件和一个TTable组件,如图7-3所示。

7-3 添加组件后的对话框

设置TTable组件的DatabaseName属性为DBDEMOS,设置该组件的TableName属性设置为animals.dbActive属性为True

单击TDBChart组件的属性列表框中SeriesList属性右侧的按钮,就会弹出如图7-4所示的对话框,可以在其中编辑TDBChart组件的属性。

7-4 编辑TDBChart组件的属性

单击ChartðSeries中的Add按钮,就会弹出设置图表类型的对话框,如图7-5所示。

7-5 选择图表类型

如图7-5所示,选择饼图Pie作为图表类型,单击OK按钮。

单击Series|Data Source,选择Data Source类型为Dataset,并设置Dataset属性为TTable组件,设置Labels属性为NAMEPie属性为WEIGHT(NAMEWEIGHTanimals.db数据库的两个字段),如图7-6所示。

7-6 设置数据源

保存文件,然后按F9键运行程序,程序运行结果如图7-7所示。

7-7 程序运行结果


在数据库中存取声音

-->



实例121 在数据库中存取声音

本实例演示如何在数据库中存取声音文件。

向窗体上添加一个TListBox组件和一个TTable组件,设计完成的主界面如图7-8所示。

7-8 界面

本系统中需要设计一个新的基于Paradox 7的数据库Sound.db,步骤如下:

(1) delphi开发环境中选择菜单Tools中的Database Desktop选项,弹出Database Desktop窗口,执行菜单FileNew子菜单中的Table命令。

(2) 在打开的Create Table对话框中选择Paradox 7,如图7-9所示。

7-9 Create Table对话框

(3) 单击OK按钮,就会出现如图7-10所示的表设计器。

7-10 表设计器

(4) 添加表的字段和其他详细资料。

在表设计器的网格内,在Field Name列输入字段名称,然后在TypeSize列设置该字段的数据类型、长度。图7-11所示为设计完成的Sound.db数据库。

7-11 设计完成的数据库

为了方便测试程序,Sound.db数据库存储在实例程序所在的路径下。

设置TTable组件的TableName属性为Sound.dbActive属性为True

在程序运行初期,首先会判断Sound.db数据库中是否存在记录。如果没有记录存在,那么就执行以下代码向Sound.db数据库中添加“惊叹号.wav”文件:

procedure TForm1.FormCreate(Sender: TObject);

var

mem:TMemoryStream;

begin

if Table1.Eof and Table1.Bof then

begin

with Table1 do

begin

Insert;

FieldByName('Name').AsString:='惊叹号';

mem:=TMemoryStream.Create();

mem.LoadFromFile('惊叹号.wav');

TBlobField(FieldByName('Data')).LoadFromStream(mem);

Post;

end;

end;

end;

然后按照相同的方式顺序向Sound.db数据库中添加“清空回收站.wav”、“缩到最小.wav”和“退出Windows.wav”声音文件。

最后通过下面的代码把Sound.db数据库中存储的文件名字添加到窗体的TListBox组件中:

with Table1 do

begin

First;

while not Eof do

begin

ListBox1.Items.Add(FieldByName('Name').AsString);

Next;

end;

end;

向程序的uses段中添加对mmsystem的引用。

在程序运行过程中,如果用户在窗体的TListBox组件中选择了提示声音,首先会通过TTable组件的First方法把数据表中的第1条记录作为当前记录,然后通过一个循环来遍历数据库中的记录,如果某条记录中Name字段的内容和用户的选择相同,那么就把该记录中Data字段中的声音信息读取出来,并且把声音信息存储到一个临时文件中,通过PlaySound函数播放这个临时文件,最后删除这个临时文件。代码如下:

procedure TForm1.ListBox1Click(Sender: TObject);

var

FileName:string;

FileStream:TFileStream;

BlobStream:TStream;

begin

with Table1 do

begin

First;

while not Eof do

begin

if FieldByName('Name').AsString=ListBox1.Items[ListBox1.ItemIndex] then

break;

Next;

end;

//为字段创建BLOB数据流

BlobStream:=CreateBlobStream(FieldByName('Data'),bmRead);

if BlobStream.Size=0 then

begin

BlobStream.free;

Exit;

end;

BlobStream.Position:=0;

FileName:='Sound.tmp';

if FileExists(FileName) then

DeleteFile(FileName);

//设置临时文件名

FileStream:=TFileStream.Create(FileName,fmcreate or fmopenwrite);

//为临时文件创建文件流

FileStream.CopyFrom(BlobStream,BlobStream.Size);

//拷贝blob到临时文件中

FileStream.free;

BlobStream.free;

//释放流

PlaySound(PChar(FileName),0,SND_FILENAME + SND_ASYNC);

//播放WAVE文件

if FileExists(FileName) then

DeleteFile(FileName);

//删除临时文件

end;

end;

程序代码如下:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, DB, DBTables,mmsystem;

type

TForm1 = class(TForm)

ListBox1: TListBox;

Table1: TTable;

procedure FormCreate(Sender: TObject);

procedure ListBox1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

var

mem:TMemoryStream;

begin

if Table1.Eof and Table1.Bof then

begin

with Table1 do

begin

Insert;

FieldByName('Name').AsString:='惊叹号';

mem:=TMemoryStream.Create();

mem.LoadFromFile('惊叹号.wav');

TBlobField(FieldByName('Data')).LoadFromStream(mem);

Post;

Insert;

FieldByName('Name').AsString:='清空回收站';

mem:=TMemoryStream.Create();

mem.LoadFromFile('清空回收站.wav');

TBlobField(FieldByName('Data')).LoadFromStream(mem);

Post;

Insert;

FieldByName('Name').AsString:='缩到最小';

mem:=TMemoryStream.Create();

mem.LoadFromFile('缩到最小.wav');

TBlobField(FieldByName('Data')).LoadFromStream(mem);

Post;

Insert;

FieldByName('Name').AsString:='退出Windows';

mem:=TMemoryStream.Create();

mem.LoadFromFile('退出Windows.wav');

TBlobField(FieldByName('Data')).LoadFromStream(mem);

Post;

mem.Free;

end;

end;

with Table1 do

begin

First;

while not Eof do

begin

ListBox1.Items.Add(FieldByName('Name').AsString);

Next;

end;

end;

end;

procedure TForm1.ListBox1Click(Sender: TObject);

var

FileName:string;

FileStream:TFileStream;

BlobStream:TStream;

begin

with Table1 do

begin

First;

while not Eof do

begin

if FieldByName('Name').AsString=ListBox1.Items[ListBox1.ItemIndex] then

break;

Next;

end;

//为字段创建BLOB数据流

BlobStream:=CreateBlobStream(FieldByName('Data'),bmRead);

if BlobStream.Size=0 then

begin

BlobStream.free;

Exit;

end;

BlobStream.Position:=0;

FileName:='Sound.tmp';

if FileExists(FileName) then

DeleteFile(FileName);

//设置临时文件名

FileStream:=TFileStream.Create(FileName,fmcreate or fmopenwrite);

//为临时文件创建文件流

FileStream.CopyFrom(BlobStream,BlobStream.Size);

//拷贝blob到临时文件中

FileStream.free;

BlobStream.free;

//释放流

PlaySound(PChar(FileName),0,SND_FILENAME + SND_ASYNC);

//播放WAVE文件

if FileExists(FileName) then

DeleteFile(FileName);

//删除临时文件

end;

end;

end.

保存文件,然后按F9键运行程序,程序运行的初始画面如图7-12所示。

7-12 程序运行的初始画面

TListBox组件中选中一项后,就会播放相对应的声音文件。


统计记录的数目

-->



实例119 统计记录的数目

本实例演示如何正确统计查询结果中记录的数目。

新建一个应用程序,然后在uses段中加入对DBTables的引用,并且添加程序代码如下:

procedure TForm1.FormCreate(Sender: TObject);

var

TempQuery:TQuery;

begin

TempQuery:=TQuery.Create(nil);

TempQuery.DatabaseName:= 'DBDEMOS';

TempQuery.SQL.Add('Select * from animals');

TempQuery.Open;

if TempQuery.Eof and TempQuery.Eof then

begin

ShowMessage('没有记录');

end

else

begin

TempQuery.Last;

TempQuery.First;

ShowMessage('记录数目为:'+IntToStr(TempQuery.RecordCount));

end;

end;

程序首先创建了一个TQuery组件TempQuery,并且设置它的DatabaseName属性为delphi的示例数据库DBDEMOS。然后在TQuery组件中执行SQL语句Select * from animals以从animals.db中查询数据;如果TQuery组件的Eof属性和Bof属性同时为True,那么就表示没有记录,否则调用TQuery组件的Last方法和First方法以正确地通过读取它的RecordCount属性获得记录数目。

程序代码如下:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DBTables, DB;

type

TForm1 = class(TForm)

Query1: TQuery;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

var

TempQuery:TQuery;

begin

TempQuery:=TQuery.Create(nil);

TempQuery.DatabaseName:= 'DBDEMOS';

TempQuery.SQL.Add('Select * from animals');

TempQuery.Open;

if TempQuery.Eof and TempQuery.Eof then

begin

ShowMessage('没有记录');

end

else

begin

TempQuery.Last;

TempQuery.First;

ShowMessage('记录数目为:'+IntToStr(TempQuery.RecordCount));

end;

end;

end.

保存文件,然后按F9键运行程序,程序运行结果如图7-2所示。

7-2 程序运行结果


利用SQL语句创建Paradox表

-->



实例117 利用SQL语句创建Paradox表

本实例演示如何在程序运行过程中利用SQL语句动态创建Paradox表。

新建一个应用程序,然后在uses段中加入对DBTables的引用,自动创建Paradox表的响应代码如下:

procedure TForm1.FormCreate(Sender: TObject);

var

TempQuery:TQuery;

DefField :String;

TableName:String;

CreateSQL:String;

begin

CreateSQL:='Create Table "%s" (%s)';

Deffield := ' Field1 Integer, Field2 CHAR(30) ';

TableName := 'C:\DB01.DB';

TempQuery := TQuery.Create(Application);

with TempQuery do

begin

try

SQL.Text:=Format(CreateSQL,[tableName,deffield]);

ExecSQL;

finally

Free;

end;

end;

end;

程序首先创建了一个TQuery组件TempQuery。然后设置该组件的SQL属性以符合创建表的规范。最后调用ExecSQL方法执行SQL语句创建一个Paradox表。

程序代码如下:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DB, DBTables;

type

TForm1 = class(TForm)

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

var

TempQuery:TQuery;

DefField :String;

TableName:String;

CreateSQL:String;

begin

CreateSQL:='Create Table "%s" (%s)';

Deffield := ' Field1 Integer, Field2 CHAR(30) ';

TableName := 'C:\DB01.DB';

TempQuery := TQuery.Create(Application);

with TempQuery do

begin

try

SQL.Text:=Format(CreateSQL,[tableName,deffield]);

ExecSQL;

finally

Free;

end;

end;

end;

end.

保存文件,然后按F9键运行程序。程序会自动创建ParadoxC:\DB01.DB


将FoxPro表转换为Paradox表

-->



实例118 将FoxPro表转换为Paradox表

本实例演示如何在程序运行过程中自动将FoxPro表转换为Paradox表。

向窗体上添加一个TBatchMove组件和两个TTable组件,设计完成的主界面如图7-1所示。

7-1 界面

自动将FoxPro表转换为Paradox表的响应代码如下:

procedure TForm1.FormCreate(Sender: TObject);

begin

self.Table1.DatabaseName:='f:\';

self.Table1.TableName:='temp.DBF';

self.Table2.DatabaseName:='f:\';

self.Table2.TableName:='new.db';

self.Table2.TableType:=ttParadox;

self.BatchMove1.Source:=self.Table1;

self.BatchMove1.Destination:=self.Table2;

self.BatchMove1.Mode:=batCopy;

self.BatchMove1.Execute;

end;

程序首先指定了FoxPro表和Paradox表的路径和文件名。然后指定TBatchMove组件的源表和目的表分别为Table1Table2,设置该组件的ModebatCopy,表示操作的模式为拷贝操作。最后通过调用TBatchMove组件的Execute方法完成自动将FoxPro表转换为Paradox表的操作。

程序代码如下:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ComCtrls, DBCtrls, DBTables, DB;

type

TForm1 = class(TForm)

Table1: TTable;

Table2: TTable;

BatchMove1: TBatchMove;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

self.Table1.DatabaseName:='f:\';

self.Table1.TableName:='temp.DBF';

self.Table2.DatabaseName:='f:\';

self.Table2.TableName:='new.db';

self.Table2.TableType:=ttParadox;

self.BatchMove1.Source:=self.Table1;

self.BatchMove1.Destination:=self.Table2;

self.BatchMove1.Mode:=batCopy;

self.BatchMove1.Execute;

end;

end.

保存文件,然后按F9键运行程序。程序会自动将FoxProf:\temp.DBF拷贝为Paradoxf:\ new.db