• 在Delphi中处理word文档与数据库的互联 1


    在Delphi中处理word文档与数据库的互联 

    ---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具。在以Delphi为前台,一些大型数据库为后台的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: emp.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: emp.DOC') then 
     DeleteFile('c: emp.DOC');
          if FileExists('c: emp.tmp') then 
          begin
            RenameFile('c: emp.tmp', 'c: emp.DOC');
            Doc_ole.CreateObjectFromFile('c: emp.DOC',False);
            Doc_ole.Run;
          end;
    end;

    ---- 以上程序为从数据库从将WORD文档取出,并放在temp.doc的临时文件上并在ToleContainer构件中显示。 

    ---- 在程序的其他部份应准确控制表记录指针,使WORD文档的存取发生在正确的记录位置。 

  • 相关阅读:
    Linux ubuntu 下 git 服务器的配置 应用
    linux ubuntu 11.10 下的android开发环境的搭建!
    转载: Ubuntu下安装JDK图文教程详解 jdkjava630 .bin 的处理方法
    求助 关于openlaszlo的配置问题 。。
    J鬼
    Hibernate 之 概述
    C#实现http协议支持上传下载文件的GET、POST请求
    关于程序员的政治(转)
    使用VisualC#实现断点续传
    HttpWebRequest
  • 原文地址:https://www.cnblogs.com/westsoft/p/8964817.html
Copyright © 2020-2023  润新知