注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

海宏软件的个人主页

用机器解放人的双手

 
 
 

日志

 
 

TOleContainer用Stream流读写数据库  

2008-10-22 19:05:29|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

OleContainer1.LoadFromStream和saveToStream的TBlobField总是出错。用文件处理又太慢,终于解决了。

原因是:oleContainer1的Stream有个头,在oleCtnrs.pas中定义如下:

const
  DataFormatCount = 2;
  StreamSignature = $434F4442; {'BDOC'}

type
  TStreamHeader = record
    case Integer of
      0: ( { New }
        Signature: Integer;
        DrawAspect: Integer;
        DataSize: Integer);
      1: ( { Old }
        PartRect: TSmallRect);
  end;

--------------------------

从数据库中读取Stream:

Var oStream:TMemoryStream;  F:TBlobField;
    Header:TOleStreamHeader;//oleCtnrs包含的定义,oleContainer加载的流中需要 TStreamHeader

......

oStream:=TMemoryStream.create;
            Header.Signature:=StreamSignature;    //参阅 http://blog.csdn.net/Foggia/archive/2007/11/21/1896317.aspx
            header.DrawAspect:=1;
            Header.DataSize:=F.BlobSize;
            oStream.Position:=0;                  //从0开始
            oStream.WriteBuffer(Header, sizeOf(header));  //先写入头
            //
            f.SaveToStream(oStream);
            oStream.Position:=0;
            oleContainer1.LoadFromStream(oStream);
            oStream.free;

-----------------

写入数据库:

            oStream:=TMemoryStream.Create;
            nHead:=sizeOf(header);
            OleContainer1.SaveToStream(oStream);
            oStream.Position:=nHead;              //跳开头
            //F.LoadFromStream(oStream);
            with DataSet.CreateBlobStream(F, bmWrite) do
                try CopyFrom(oStream, oStream.Size-nHead);  finally free; end;

-------------------------

用wordApp/wordDocument调用oleContainer里边的oleObject,并写入内容、表格、设置普通、大纲显示视图View:
var ole:TOleContainer;
    oIdx:oleVariant;
    Template,NewTemplate,itemindex,DocumentType,visible:OleVariant;
    NumRows, NumColumns, DefaultTableBehavior, AutoFitBehavior:olevariant;
    oStart,oEnd,paraindex:olevariant;
    i:integer ;
    j:integer;
    txindex:integer;
    shitiindex:integer;
begin
    inherited;          ole:=getCurrentOle;       oIdx:=1;       
    //连接  osEmpty, osLoaded, osRunning, osOpen, osInPlaceActive, osUIActive
    if not (ole.State in [osRunning, osOpen, osInPlaceActive, osUIActive]) then ole.DoVerb(ovShow);
    wapp_Main.ConnectTo( IDispatch( ole.OleObject.Application) as _Application);
    wdoc_Main.ConnectTo( wapp_Main.ActiveDocument );    //wapp_Main.Documents.Item(oIdx)
    //设置
    documenttype:=0;
    itemindex:=1;
    oStart:=0;
    oEnd:=oStart+0;
    NumRows:=6;
    NumColumns:=3;
    DefaultTableBehavior:=1;      //风格
    AutoFitBehavior:=0;
    txindex:=0;
    shitiindex:=0;
    paraindex:=0;
    //视图、页面风格.参阅VBA的View对象
    wapp_Main.ActiveWindow.View.type_:=wdNormalView;
    //加文字
    wdoc_Main.Range.InsertAfter('你好吗?测试。'#13#10);
    //加表格
    wdoc_Main.Tables.Add(wdoc_Main.Sentences.Last, NumRows, NumColumns, DefaultTableBehavior, AutoFitBehavior);  //Range(oStart, oEnd)
    //字体
    wdoc_Main.Range.Font.Size:=14;
    wdoc_Main.Range.InsertAfter('改变字体。');
    //断开结束
    wapp_Main.Disconnect;
end;

  评论这张
 
阅读(1078)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017