用ado连接表中存在long raw字段,嵌入ole连接visio,在第一次双击调入visio时,提示“呼叫方拒绝呼叫”,以后再调入时正常
原码如下
function Tfrm_jgbg_pdxlbgdjp.FLoadLawbgh(dataset:Tclientdataset;
lawName:String):boolean;
var stream:Tstream;
begin
  result:=false;
  OleContainer2.DestroyObject;
  OleContainer2.CreateObject('Visio.Drawing',true);
  try
    Stream:= cds_gis_bgptx_bgh.CreateBlobStream(cds_gis_bgptx_bgh.FieldByName('tx'),bmread);
    if stream.Size > 0 then  OleContainer2.LoadFromStream(stream);
    OleContainer2.DoVerb(ovshow);
  finally
    stream.Free ;
    OleContainer2.Modified :=false;
  end;
  result:=true;
end;procedure Tfrm_jgbg_pdxlbgdjp.Panel2DblClick(Sender: TObject);
var spid:string;
begin
  inherited;
  spid:=cds_gis_dwbgp.fieldbyname('sqpid').AsString ;
  if spid='' then exit;
  self.FLoadLawbgh(cds_gis_bgptx_bgh,'tx');   ////出错
  Button4.Enabled:=true;  
end;

解决方案 »

  1.   

    >>OleContainer2.DestroyObject;
    是不是這句有問題???
      

  2.   

    function Tfrm_jgbg_pdxlbgdjp.FLoadLawyxl(dataset:Tclientdataset;
    lawName:String):boolean;
    var stream:Tstream;
    begin
      result:=false;
      stream:=Tstream.Create;
      OleContainer1.DestroyObject;
      OleContainer1.CreateObject('Visio.Drawing',true);
      //调入visio
      try
        Stream := cds_gis_bgptx_yxl.CreateBlobStream(cds_gis_bgptx_yxl.FieldByName('tx'),bmread);
        if stream.Size > 0 then  OleContainer1.LoadFromStream(stream);
        OleContainer1.DoVerb(ovshow);
      except
        try
          OleContainer1.DoVerb(ovshow);
        finally
          stream.Free;
          OleContainer1.Modified :=false;
        end;
      end;
      result:=true;
    end;解决
      

  3.   

    我觉得那是OLE的小bug,打开OLE源码修改一下方法DoVerb中相连的代码,