日期:2014-05-16 浏览次数:20857 次
?
用image字段保存这些文档。   
var   
      word_stream:   TMemoryStream;   
      filename:   string;   
begin   
      if   odgDoc.Execute   
then//odgDoc:OpenDialog   
      begin   
          filename   :=   
ExtractFileName(odgDoc.FileName);   
          word_stream   :=   
TMemoryStream.Create;   
          
word_stream.LoadFromFile(odgDoc.FileName);   
          
word_stream.Position   :=   0;   
          cdsPACT.Append   
          
cdsPACT.FieldByName('DocName').Value   :=   filename;   
          
TBlobField(cdsPACT.FieldByName('PactText')).LoadFromStream(word_stream);   
          cdsPACT.Post;   
          word_stream.Free;   
      end;   
end;
----   
目前,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:\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);