精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>数据库技术>>[转载]在Delphi中处理word文档与数据库的

主题:[转载]在Delphi中处理word文档与数据库的
发信人: delphifan()
整理人: (2000-12-05 18:42:45), 站内信件
在Delphi中处理word文档与数据库的互联 
---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具。在以De
lphi为前台,一些大型数据库为后台的MIS系统中,图形的处理不可避免;即从以
Delphi开发的前台界面输入图形,并保存到相应的数据库字段中。在这种形式的
图形处理中,BMP文件的处理比较简单,因为Delphi本身有Image和DBImage构件,
用这些构件与数据库中可以保存图形的大型字段BLOB比较容易地进行数据交换。
以这种方式进行图形处理已应用在许多MIS软件中,包括处理人员照片的人事档案
系统等。 

---- 但是,BMP文件一般都比较大。而且有时要录入的是自己在计算机上画的简
图,并伴随大量文字说明。这种情况用Win95中的画图板等处理BMP文件的工具处
理就比较困难。一般应用人员都喜欢用WORD画图和写说明文字,然后保存到数据
库中。 

---- 经过一段时间的摸索,我们解决了这个问题,并经过完善,在应用中运行较
好。程序如下: 

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文档的存取发生在正确的
记录位置。 


--
=================================================
==          [email protected]                  ==
==    [一个真正有内容、较实用的Delphi网站]       ==
==        http://delphifan.wojia.com           ==
==  http://lmd.yeah.net  http://lmd.126.com    ==
=================================================

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.100.19.250]

[关闭][返回]