试试在LoadFromStream之前先把流定位到开头,我经常犯这样的错误。
Memstream.Seek( 0, 0 ); 或
Memstream.Position := 0;

解决方案 »

  1.   

    我用了下面的语句,可以了
        MemStream:=ADOQ.CreateBlobStream(ADOQblobfld,bmRead);
        MemStream.Position:=0;
        viewOleWord.LoadFromStream(Memstream);
    但,多试几次就出问题了,Access violation at address 77A6... in module 'ole32.dll'. Read of address 00000000008.
    用一个过程:
    procedure TMainFrm.OleLoadFromBlobFld(Ole:TOleContainer;BlobFld:TBlobField);
    var
      BlobStream: TBlobStream;
      MemStream: TMemoryStream;
    begin
      MemStream:=TMemoryStream.Create;
      with ADOQ do
      begin
        BlobStream:=TBlobStream.Create(BlobFld, bmRead);
        try
          MemStream.CopyFrom(BlobStream,BlobStream.Size);
          Memstream.Position:=0;
          Ole.LoadFromStream(MemStream);
        finally
          BlobStream.Free;
          Memstream.Free;
        end;
      end;
    end;
    执行到    BlobStream:=TBlobStream.Create(BlobFld, bmRead);
    时又出现: Invalid class typecast 错误,请各位大侠帮我。
      

  2.   

    在李唯的书中用Ado存取Blob自段是这样写的。能在TOleContainer中显示,也能够把他从数据库中取出存为文件:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, Grids, DBGrids, ExtCtrls, DBCtrls, StdCtrls, OleCtnrs;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADODataSet1: TADODataSet;
        DBNavigator1: TDBNavigator;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        OpenDialog1: TOpenDialog;
        OleContainer1: TOleContainer;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        SaveDialog1: TSaveDialog;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);//把Blob对象存入数库
    var
      sFileName:string;
      function BlobContentToString(const FileName:String):string;
       begin
        with TFileStream.Create(FileName,fmOpenRead) do
          try
           SetLength(Result,Size);
           Read(Pointer(Result)^,Size);
          finally
           Free;
          end;
       end;
    begin
     if (OpenDialog1.Execute) then
      begin
       sFileName:=OpenDialog1.FileName;
       AdoDataSet1.Append;
       AdoDataSet1.FieldByName('名称').AsString:=ExtractFileName(sFileName);
       AdoDataSet1.FieldByName('对象').AsString:=BlobContentToString(sFileName);
       AdoDataSet1.Post;
      end;end;procedure TForm1.Button2Click(Sender: TObject);
    //在TOleContainer中显示
    var
     sFileName:String;
     BS:TAdoBlobStream;
    begin
     BS:=TadoBlobStream.Create(TBlobField(AdodataSet1.FieldByName('对象')),bmRead);
     try
       sFileName:=ExtractFilePath(Application.ExeName);
       sFileName:=sFileName+AdoDataSet1.FieldByName('名称').asstring;
       BS.SaveToFile(sFileName);
       OleContainer1.CleanupInstance ;
       OleContainer1.CreateObjectFromFile(sFileName,false);
       OleContainer1.DoVerb(0);
     finally
       BS.Free;
     end;end;procedure TForm1.Button3Click(Sender: TObject);
    //把Blob字段从数据库中导出存为文件,不过出错处理没有写好
    //就是当出现存储对话框后,按取消按扭的是怎么取消
    //存为文件没有写好,不好意思了
    var
     sFileName:String;
     BS:TAdoBlobStream;
    begin
     SaveDialog1.FileName:=AdoDataSet1.FieldByName('名称').asstring;
     if SaveDialog1.Execute then  BS:=TadoBlobStream.Create(TBlobField(AdodataSet1.FieldByName('对象')),bmRead);
      try
        sFileName:=SaveDialog1.FileName;
        //ShowMessage(sFileName);
        sFileName:=sFileName;//+AdoDataSet1.FieldByName('名称').asstring;
        BS.SaveToFile(sFileName);
       // OleContainer1.CleanupInstance ;
        //OleContainer1.CreateObjectFromFile(sFileName,false);
        //OleContainer1.DoVerb(0);
      finally
        BS.Free;
     end;//怎么判断存为按扭是确定还是取消end;end.
      

  3.   

    谢谢!我用的是ADO连接的,所以将 
    BlobStream:=TBlobStream.Create(BlobFld, bmRead);
    改为
    BlobStream:=TADOBlobStream.Create(BlobFld, bmRead);
    就好了。
    但还是不稳定,用一会儿就出现
    Access violation at address 77A6... in module 'ole32.dll'. Read of address 00....8
      

  4.   

    主要是我用了两个OleContainer,一个显示Word,另一个窗口里编辑,之间用了
    FirstOle.Copy;
    SecondOle.Paste;
    传递数据,大多数情况下好的,偶尔就 Access violation at address 7D3A6...45 in module 'ole32.dll'. Read of address 00D3....A8
    请高手们帮我解决。