起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 541|回复: 15

【结贴】OleContainer 问题,急~!!!**

[复制链接]
发表于 2007-10-23 10:17:28 | 显示全部楼层 |阅读模式
我要实现:DataSetBrokerAffix数据集滚动的同时,OleContainer 里面要显示 DataSetBrokerAffix中的一个字段 FFile  
FFile:二进制流
回复

使用道具 举报

发表于 2007-10-23 10:19:01 | 显示全部楼层
用dataedit控件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-23 10:20:22 | 显示全部楼层

补充

procedure TMainForm.ButtonUpClick(Sender: TObject);
var
  FN: String;
begin
  with OpenDialog do
    if Execute then
      begin
        UPData:=False;      //打开文件
        FN := ExtractFileName(FileName);
        OleContainer.CreateObjectFromFile(FileName, False);   //创建OLE对象
        OleContainer.SaveToFile('tmp');
        with DataSetBrokerAffix.DataSet do
        begin
          Append;
          FieldByName('FName').AsString := FN;
          FieldByName('FFileName').AsString := FN;
          FieldByName('FSourceFile').AsString := FN;
          TBlobField(FieldByName('FFile')).LoadFromFile('tmp');
          FieldByName('FFKID').AsInteger := IID;
          Post;
          ApplyUpdates;
        end;
        UPData:=true;
      end;
end;

procedure TMainForm.DataSetBrokerAffixAfterScroll(DataSet: TDataSet);
var lStream: TMemoryStream;
begin
  if UPData then
    begin
      lStream := TMemoryStream.Create;
      TBlobField(DataSetBrokerAffix.DataSet.FieldByName('FFile')).savetostream(lStream);
      lStream.Position := 0;
      showmessage(inttostr(lstream.size));
      OleContainer.LoadFromStream(lStream);
    end;
end;

上面写下面读
读的时候
“Invalid stream format”
还是报错 OleContainer.LoadFromStream(lStream); 这句  

图片为窗体

123.jpg

43.48 KB, 下载次数: 286

回复 支持 反对

使用道具 举报

发表于 2007-10-23 10:29:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-23 10:39:35 | 显示全部楼层
to:lixy
和我写的一样一样一样的。。。就是报错“Invalid stream format”
回复 支持 反对

使用道具 举报

发表于 2007-10-23 10:41:59 | 显示全部楼层
但我也不知道你那个为啥报错。你ole里面的文件是不是不是预期格式的啊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-23 10:54:27 | 显示全部楼层
不知道什么原因啊。。。。问了一个delphi高手,告诉我读的这么写
procedure TMainForm.DataSetBrokerAffixAfterScroll(DataSet: TDataSet);
var lStream: TMemoryStream;
begin
  try
    DataSetBrokerAffix
    lStream := DataSetBrokerAffix.CreateBLOBSTREAM(DataSetBrokerAffix.fieldbyname('FFile'),bmRead);
    if lStream.Size = 0 then
    begin
        lStream.Free;
        Exit;
    end;
    OleContainer.CreateObject('word.document',true);
    Olecontainer.loadfromstream(lStream);
  finally
    lStream.free;
  end;
end;

可是这么写报错 找不到 CreateBLOBSTREAM
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-23 11:20:33 | 显示全部楼层
版主给个建议,或者有没有例子,请尽快给我个解决方法,谢谢
回复 支持 反对

使用道具 举报

发表于 2007-10-23 12:02:17 | 显示全部楼层
http://topic.csdn.net/t/20050113/19/3723832.html
zz:
----------
终于搞定了:OleContainer1的LoadFromStream加载的流不是所有的流文件,而OleContainer1加载的流必须是用它的SaveToStream方法保存的一个流文件才可以加载的。所以在导入数据库中的时候先选择文件显示在OleContainer1中,再用OleContainer1的SaveToStream方法保存的一个流,然后保存到数据库中,若直接从文件读到流中(未经OleContainer)则在读流时候会出现Invalid   stream   format流格式不正确错误!因为若用文件流去加载一个.doc文件,但是doc文件本身不是一个COM组件。   
  保存:   
  procedure   TFrmWord.Button9Click(Sender:   TObject);   
  var   
      FileName:string;   
      sm:TstringStream;   
  begin   
      try   
          if   opendialog1.Execute   then   begin   
          FileName:=opendialog1.FileName;   
          olecontainer1.CreateObjectFromFile(FileName,true);   
          olecontainer1.DoVerb(ovPrimary);   
          sm   :=   tstringstream.create('');   
          olecontainer1.savetostream(sm);   
          with   dm.qryTemp   do     
          begin   
              append;   
              TBlobFIELD(Fieldbyname('data')).LoadFromStream(sm);   
              post;   
          end;   
      finally   
        sm.free;   
      end;   
  end;   
  显示:   
  procedure   TFrmWord.Button5Click(Sender:   TObject);   
  var   
      srm:Tstream;   
  begin   
      try   
          srm   :=   dm.qryTemp.CreateBLOBSTREAM(dm.qryTemp.fieldbyname('data'),bmRead);   
          if   srm.Size   =   0   then   
          begin   
              srm.Free;   
              Exit;   
          end;   
          OleContainer1.CreateObject('word.document',true)   
          olecontainer1.loadfromstream(srm);   
      finally   
          srm.free;   
      end;   
  end;   
   
   
  接分..................
---------------------
回复 支持 反对

使用道具 举报

发表于 2007-10-23 12:04:30 | 显示全部楼层
解决的最好方法是先存临时文件。olecontainer.CreateObjectFromFile(opendialog1.FileName,false);
似乎这样写可以正常载入
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-6-29 09:53 , Processed in 0.050251 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表