在Access数据库中,在一张表里插入了一个Word的Ole对象的字段,在编程时要怎样把它读出并且小时出来呢???
在程序中我已经嵌入了一个OleContainer的Word对象,怎把读出的文档在OleContainer的Word对象中显示???
谢谢各位!!

解决方案 »

  1.   


    声明一个数据流对象
      
    Tstreams stream
    adoquery1.FieldByName('byte').SaveToFile (stream);
      

  2.   

    procedure towordsave(sourcetablename: string;sourceid:integer;dataset:tadodataset) ;
    var
        sCommandLine: string;
        bCreateProcess: boolean;
        lpStartupInfo: TStartupInfo;
        lpProcessInformation: TProcessInformation;
        MemSize: Integer;
        Buffer: PChar;
        MyFile: TFileStream;
        Stream: TADOBlobStream;
        RegF:TRegistry;
    begin
        RegF:=TRegistry.Create;    //查看.doc文档的打开程序
        RegF.RootKey:=HKEY_classes_root;
        try
           RegF.OpenKey('worddocument\protocol\stdfileediting\server',True);
           sCommandLine:=regf.ReadString('')+' '+ExtractFilePath(Application.EXEName)+'temp.doc';
        except
        End;
        RegF.CloseKey;
        RegF.Free;
        dataset.Close;
        dataset.commandtext :='select * from 二进制文档 where 来源=''' +sourcetablename+''' and 来源id='+inttostr(sourceid);
        dataset.open;
        if not dataset.eof then
            begin
            MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+'temp.tmp',fmCreate);
            Stream:=TADOBlobStream.Create(dataset.FieldByName('内容') as TBlobField, bmRead);
            MemSize := Stream.Size;
            Inc(MemSize);
            Buffer := AllocMem(MemSize);
            try
                Stream.Read(Buffer^,MemSize);
                MyFile.Write(Buffer^,MemSize);
            finally
                MyFile.Free;Stream.Free;
            end;
            if FileExists(ExtractFilePath(Application.EXEName)+'temp.DOC') then DeleteFile(ExtractFilePath(Application.EXEName)+'temp.DOC');
            if FileExists(ExtractFilePath(Application.EXEName)+'temp.tmp') then RenameFile(ExtractFilePath(Application.EXEName)+'temp.tmp', ExtractFilePath(Application.EXEName)+'temp.DOC');
            end
        else
            begin
               if FileExists(ExtractFilePath(Application.EXEName)+'empty.DOC') then
                    copyfile(pchar(ExtractFilePath(Application.EXEName)+'empty.DOC'),pchar(ExtractFilePath(Application.EXEName)+'temp.DOC'),false)
               else begin
                    ShowMessage('<'+ExtractFilePath(Application.EXEName)+'empty.DOC>不存在!');
                    dataset.close ;
                    exit;
               end;
            end;
        dataset.close ;
        //sCommandLine :='C:\Program Files\Microsoft Office\Office\winword.exe '+ExtractFilePath(Application.EXEName)+'temp.doc';    FillChar(lpStartupInfo, Sizeof(TStartupInfo), #0);
        lpStartupInfo.cb := Sizeof(TStartupInfo);
        lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
        lpStartupInfo.wShowWindow := SW_NORMAL;
        bCreateProcess := CreateProcess(nil, PChar(sCommandLine),nil, nil, True, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil, nil, lpStartupInfo, lpProcessInformation);
        //ShellExecute(zxdcc.Handle,'save',pchar(ExtractFilePath(Application.EXEName)+'empty.doc') ,'','',SW_SHOWNORMAL);    if bCreateProcess then
        WaitForSingleObject(lpProcessInformation.hProcess, INFINITE);
        dataset.Close;
        dataset.commandtext:='select * from 二进制文档 where 来源=''' +sourcetablename+''' and 来源id='+inttostr(sourceid);
        dataset.open;
        if not dataset.eof then
            dataset.Edit
        else begin
            dataset.close;
            dataset.commandtext:='select * from 二进制文档';
            dataset.open;
            dataset.append;
            end;
        dataset.FieldValues['来源']:=sourcetablename;
        dataset.FieldValues['来源id']:=sourceid;
        MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+'temp.doc',fmOpenRead);
        Stream := TADOBlobStream.Create(dataset.FieldByName('内容') as TBlobField, bmWrite);{‘Doc’为BLOB字段名}
        MemSize := MyFile.Size;
        Inc(MemSize);//增加的一字节给结尾的null
        Buffer := AllocMem(MemSize);
        try
            Stream.Seek(0, soFromBeginning);//流指针位置放到最前
            MyFile.Read(Buffer^,MemSize);
            Stream.Write(Buffer^,MemSize);
        finally
            MyFile.Free;
            Stream.Free;
        end;
        dataset.post;
        dataset.close;
    end;
    我做的一个过程!
      

  3.   

    用TSTream。
    Stream = table.savetoStream;
    在stream的head 上加上位置信息(TStreamHeader)
    Stream = StreamHeader + Stream;
    olecontain1.loadFromStream(Stream);即可
      

  4.   

    type
      TStHead = record
        biaozhi : integer; // 标志,$434F4442
        yangshi : integer; //样式,1
        Size    : integer; //文件大小
      end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Ms1,MS2 : TMemoryStream;
      SH :  TStHead;
    begin
      Ms1 := TMemoryStream.Create;
      Ms2 := TMemoryStream.Create;
      try
        TBlobField(ADOQuery1.FieldByName('content')).SaveToStream(Ms1);
        with sh do
        begin
          biaozhi := $434F4442;
          yangshi := 1;
          size    := ms1.Size;
        end;
        ms2.WriteBuffer(sh,sizeof(sh));
        ms2.CopyFrom(ms1,0);
        ms2.Position := 0;
        OleContainer1.LoadFromStream(ms2);
        OleContainer1.DoVerb(ovShow);
      Finally
        ms1.Free;
        ms2.Free;
      end;
    end;
      

  5.   

    还是不行呀!!运行弹出一出错的窗口 “EOLEsysError with message '1% 已经存在。'”这该这么办??????