怎样在Delphi中处理word文档与数据库的互联?(300分)

  • 主题发起人 MR.ZHANG
  • 开始时间
M

MR.ZHANG

Unregistered / Unconfirmed
GUEST, unregistred user!
目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具。在以
Delphi为前台,一些大型数据库为后台的MIS系统中,图形的处理不可避免;
即从以Delphi开发的前台界面输入图形,并保存到相应的数据库字段中。在这
种形式的图形处理中,BMP文件的处理比较简单,因为Delphi本身有Image和
DBImage构件,用这些构件与数据库中可以保存图形的大型字段BLOB比较容易
地进行数据交换。以这种方式进行图形处理已应用在许多MIS软件中,包括处理
人员照片的人事档案系统等。
但是,BMP文件一般都比较大。而且有时要录入的是自己在计算机上画的
简图,并伴随大量文字说明。这种情况用Win95中的画图板等处理BMP文件的工
具处理就比较困难。一般应用人员都喜欢用WORD画图和写说明文字,然后保存
到数据库中。
 
这个很简单的,我用的是rxlib空间包,这是很有名的软件包,rxdbrichedit,可以直接关联,
太容易了。
 
不用控件的话可以这样做
程序如下:
procedure TsampleForm.OpenDOCClick(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TBlobStream;
begin
OpenDialog1.Filter:='WORD文档(*.DOC)|*.DOC'
;{从对话窗选择文件}
if OpenDialog1.Execute then begin
MyFile:=TFileStream.Create
(OpenDialog1.FileName,fmOpenRead);
with table1 do {‘table1’为含BLOB字段的表名}
begin
Open;
Edit;
Stream := TBlobStream.Create(FieldByName('Doc')
as TBlobField, bmWrite);
{‘Doc’为BLOB字段名}
MemSize := MyFile.Size;
Inc(MemSize); {Make room for the
buffer's null terminator.}
Buffer := AllocMem(MemSize);
{Allocate the memory.}
try
Stream.Seek(0, soFromBeginning);
{Seek 0 bytes from the stream's end point}
MyFile.Read(Buffer^,MemSize);
Stream.Write(Buffer^,MemSize);
finally
MyFile.Free;
Stream.Free;
end;
try
Post;
except
on E: EDatabaseError do
if HandelException(E)< >0 then exit
else
raise;
end;
end;
Doc_ole.CreateObjectFromFile
(OpenDialog1.FileName,False);
Doc_ole.Run;{Doc_ole为ToleContainer构件名}
end;
end;
---- 以上为向数据库中写入的程序,应用中从对话窗取出文件在
ToleContainer构件中显示的同时存入数据库。
procedure TsampleForm.GetDocClick
(Sender: TObject);
var
MemSize: Integer;
Buffer: PChar;
MyFile: TFileStream;
Stream: TBlobStream;
begin
MyFile:=TFileStream.Create('c:/temp.tmp',fmCreate);
with Query1 do
begin
Stream := TBlobStream.Create
(FieldByName('Doc') as TBlobField, bmRead);
MemSize := Stream.Size;
Inc(MemSize);
{Make room for the buffer's null terminator.}
Buffer := AllocMem(MemSize);
{Allocate the memory.}
try
Stream.Read(Buffer^,MemSize);
MyFile.Write(Buffer^,MemSize);
finally
MyFile.Free;
Stream.Free;
end;
end;
if FileExists('c:/temp.DOC')
then DeleteFile('c:/temp.DOC');
if FileExists('c:/temp.tmp')
then begin
RenameFile('c:/temp.tmp', 'c:/temp.DOC');
Doc_ole.CreateObjectFromFile
('c:/temp.DOC',False);
Doc_ole.Run;
end;
end;
---- 以上程序为从数据库从将WORD文档取出,并放在temp.doc的临时文件上
并在ToleContainer构件中显示。
---- 在程序的其他部份应准确控制表记录指针,使WORD文档的存取发生在正确
的记录位置。
 
谢谢,Triton太厉害了!
 
triton太厉害了
 
顶部