delphi如何显示保存在数据库中的word文档?????

解决方案 »

  1.   

    用OLE可以实现吧!
    VB好像挺简单的,以前做出过.
    DELPHI不太清楚,关注ING
      

  2.   

    1、把word数据从数据库中提取出来,保存到一临时文件。
    2、用OLE将临时文件打开。简略代码
    从数据库读word数据:TBlobField(FieldByName('字段名')).SaveToFile('路径\word.doc');
    OLE打开word文件:OpenDialog1.Execute;
                     OleContainer1.CreateLinkToFile(OpenDialog1.FileName,True);
      

  3.   

    谢谢 happyggy(阿牛De牛)的热情帮助,
    我生成的word.doc为什么是空的啊,明明数据库里表对应的字段有二进制数据啊?
      

  4.   

    TBlobField(FieldByName('字段名')).SaveToFile('路径\word.doc');会出现invalid class typecast意外,用的是ADO连接的数据库
      

  5.   

    一,显示
    procedure TfrmOLE.SetOle(nodeName:string);
    var
      src:TStream;
      name,desc:string;
    begin
     self.caption := '您正在操作'+nodeName+'站点的文件数据';
     name := frmInfoGSM.tblFile.fieldbyname('fileName').AsString;
     desc := frmInfoGSM.tblFile.fieldbyname('fileDesc').AsString;
     editDesc.Text := desc;
     editName.Text := name;
     src := (frmInfoGsm.tblFile.CreateBlobStream(frmInfoGsm.tblFile.FieldByName('fileData'),bmRead));
     src.Position := 0;
     ole.LoadFromStream(src); FNodename := nodename;
     FFileName := name;
    end;二,修改后保存到数据库
    var
     fStream:Tmemorystream;
     name,desc:string;
    begin
        fStream := Tmemorystream.Create;
        ole.SaveToStream(fStream);
        name := editName.Text;
        desc := editDesc.Text;
        if frmInfoGSM.tblFile.Locate('nodeName;fileName',VarArrayOf([FnodeName,FFileName]),[loCaseInsensitive]) then
        begin
          frmInfoGSM.tblFile.edit;
          frmInfoGSM.tblFile.FieldByName('fileName').AsString := name;
          frmInfoGSM.tblFile.FieldByName('fileDesc').AsString := desc;
          fstream.Seek(0,soFromBeginning);
         (frmInfoGSM.tblFile.FieldByName('fileData') as TBlobField).LoadFromStream(fstream);
          frmInfoGSM.tblFile.Post;
      

  6.   

    谢谢hf_linux(悟空) :
    我测试了显示,代码如下:
    var
       Stream: TStream;
    begin
          ADOTable1.open;
          Stream := ADOTable1.CreateBLOBSTREAM(ADOTable1.fieldbyname('pic'), bmRead);
          if Stream.Size = 0 then  showmessage('fdd');
    end;
    还是会出现invalid class typecast意外
    希望大家给点意见
      

  7.   

    谢谢hf_linux(悟空) :
    我测试了保存部分,代码如下:
    var 
      stream1: TMemoryStream;
    begin 
      OpenDialog1.Filter:='WORD文档(*.DOC)|*.DOC';//{从对话窗选择文件}
      if OpenDialog1.Execute then
      begin
           stream1 := TMemoryStream.Create;
           OleContainer1.SaveToStream(Stream1);
           ADOTable1.Open;
           ADOTable1.Edit;
           Stream1.Seek(0,soFromBeginning);     
           (ADOTable1.FieldbyName('pic') as TBlobField).LoadFromStream(stream1);
           ADOTable1.Post;
       end;
    end; 还是会出现invalid class typecast意外
    希望大家给点意见
      

  8.   

    郁闷啊,为什么老是出现invalid class typecast意外错误,谁能帮我找出问题所在啊?