本实例演示如何在数据库中存取图像文件
向窗体上添加一个TListBox组件一个TImage组件和一个TTable组件设计完成的主界面如图所示
图 主界面
本系统中需要设计一个新的基于Paradox 的数据库Imagedb图为设计完成的Imagedb数据库
图 设计完成的数据库
为了方便测试程序Imagedb数据库存储在实例程序所在的路径下
设置TTable组件的TableName属性为ImagedbActive属性为True
在程序运行初期首先会判断Imagedb数据库中是否存在记录如果没有记录存在那么就执行以下代码向Imagedb数据库中添加鸟bmp文件
procedure TFormFormCreate(Sender: TObject);
var
mem:TMemoryStream;
begin
if TableEof and TableBof then
begin
with Table do
begin
Insert;
FieldByName(Name)AsString:=鸟;
mem:=TMemoryStreamCreate();
memLoadFromFile(鸟bmp);
TBlobField(FieldByName(Data))LoadFromStream(mem);
Post;
end;
end;
end;
然后按照相同的方式顺序向Imagedb数据库中添加样品wav叶子wav和荷花图像文件
最后通过下面的代码把Imagedb数据库中存储的文件名字添加到窗体的TListBox组件中
with Table do
begin
First;
while not Eof do
begin
ListBoxItemsAdd(FieldByName(Name)AsString);
Next;
end;
end;
在程序运行过程中如果用户在窗体的TListBox组件中选择了图像文件程序会通过TTable组件的First方法把数据表中的第条记录作为当前记录然后通过一个循环来遍历数据库中的记录如果某条记录中Name字段的内容和用户的选择相同那么就把该记录中Data字段中的图像信息读取出来并且把图像显示在窗体上的TImage组件上代码如下
procedure TFormListBoxClick(Sender: TObject);
var
mem:TStream;
bmp:TBitmap;
begin
with Table do
begin
First;
while not Eof do
begin
if FieldByName(Name)AsString=ListBoxItems[ListBoxItemIndex] then
break;
Next;
end;
bmp:=TBitmapCreate;
mem:=CreateBlobStream(FieldByName(Data)bmRead);
memPosition:=;
bmpLoadFromStream(mem);
selfImagePictureAssign(bmp);
bmpFree;
memFree;
end;
end;
程序代码如下
unit Unit;
interface
uses
Windows Messages SysUtils Variants Classes Graphics Controls Forms
Dialogs StdCtrls DB DBTablesmmsystem ExtCtrls;
type
TForm = class(TForm)
ListBox: TListBox;
Table: TTable;
Image: TImage;
procedure FormCreate(Sender: TObject);
procedure ListBoxClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form: TForm;
implementation
{$R *dfm}
procedure TFormFormCreate(Sender: TObject);
var
mem:TMemoryStream;
begin
if TableEof and TableBof then
begin
with Table do
begin
Insert;
FieldByName(Name)AsString:=鸟;
mem:=TMemoryStreamCreate();
memLoadFromFile(鸟bmp);
TBlobField(FieldByName(Data))LoadFromStream(mem);
Post;
Insert;
FieldByName(Name)AsString:=样品;
mem:=TMemoryStreamCreate();
memLoadFromFile(样品bmp);
TBlobField(FieldByName(Data))LoadFromStream(mem);
Post;
Insert;
FieldByName(Name)AsString:=叶子;
mem:=TMemoryStreamCreate();
memLoadFromFile(叶子bmp);
TBlobField(FieldByName(Data))LoadFromStream(mem);
Post;
Insert;
FieldByName(Name)AsString:=荷花;
mem:=TMemoryStreamCreate();
memLoadFromFile(荷花bmp);
TBlobField(FieldByName(Data))LoadFromStream(mem);
Post;
memFree;
end;
end;
with Table do
begin
First;
while not Eof do
begin
ListBoxItemsAdd(FieldByName(Name)AsString);
Next;
end;
end;
end;
procedure TFormListBoxClick(Sender: TObject);
var
mem:TStream;
bmp:TBitmap;
begin
with Table do
begin
First;
while not Eof do
begin
if FieldByName(Name)AsString=ListBoxItems[ListBoxItemIndex] then
break;
Next;
end;
bmp:=TBitmapCreate;
mem:=CreateBlobStream(FieldByName(Data)bmRead);
memPosition:=;
bmpLoadFromStream(mem);
selfImagePictureAssign(bmp);
bmpFree;
memFree;
end;
end;
end
保存文件然后按F键运行程序程序运行的初始画面如图所示
在TListBox组件中选中一项后就会显示相对应的图像文件如图所示
图 程序运行的初始画面
图 程序运行结果