我希望动态创建一个OleContainer,并新建一个Word文档,但就是不知道代码怎么样写。(以前我都是先把OleContainer放在Form上面,然后再右键选择InsetObject,选择新建Word文档的)

解决方案 »

  1.   

    uses OleCtnrs;var
      OleContainer1: TOleContainer;
      

  2.   


    下面一段文字讲述了如何在OleContainer里调VBA以及把word文档保存在Table里和读出的方法.
    -----------------------------------------------------------
        有若干种办法把一个对象放到容器里:粘贴(使用"粘贴"命令Paste或"特殊粘贴"
    对话框 PasteSpecialDialog)、插入(使用"插入"对话框 InsertObjectDialog)、
    拖放、从文件读入(CreateObjectFromFile)、直接建立(CreateObject)或是通过
    "流"建立(CreateFromStream)。Delphi的OLE容器演示程序示范了上述的大多数特性,
    所以这里就不多作讲解。请到下面文件夹里察看源码:\Delphi5\Demos\ActiveX\Olecntrs在表(Table)中存储文档
    ---------------------
        OleContainer用来链接或嵌入OLE对象,比如Word文档。不过,这种链接并不持久,
    而且必须由开发人员操纵。同样,Delphi5中的Word控件也必须在Word环境成功设置后才能
    使用。如果必须由Delphi应用程序来直接管理特定文档,常用的解决方法是在文本字段中保
    存外部文档的文件名和路径,或在BLOB字段中保存实际的文档内容。两种方法各有其优缺点。    只保存文件名和路径允许其它程序共享及编辑文档,也不需要从数据库中读取文档数据。
    不过,当程序试图使用这些外部文档时,有时会发现它们已经不在原来的地方了(可能因为原
    始文件被删除、移动、改名,甚至所在磁盘被移走)。直接在BLOB字段中作为OLE对象保存的
    办法简单易实现,避免了找不到文档的危险,但数据库会变得过于庞大并且会降低程序的执行
    效率。    为了弄清楚OLE对象如何在表中存储,请查阅您的数据库技术资料。举例来说,在
    InterBase中BLOB数据还应进一步由subtype(子类型)定义。OLE对象必须保存在subtype
    为0的BOLB字段中,这也是存储二进制数据的缺省值。下面的SQL语句给CustomerLetter表
    增加了一个BLOB字段:ALTER TABLE CustomerLetter
      ADD OleObject BLOB SUB_TYPE 0 SEGMENT SIZE 80    TBlobStream用来访问和修改BLOB字段中的值。Word文档从BLOB字段中取出来放在
    TBlobStream对象中,并能很容易地装入OLE容器或WordDocument对象。下面的例子从
    BLOB字段中取出Word文档,放入容器,并激活它:var
      oStream : TBlobStream;
    begin
      oStream := nil;
      try
        Table1.Open;
        try
          oStream := TBlobStream.Create(Table1.FieldByName(
                       'OleObject') as TBlobField, bmRead);
          OleContainer1.LoadFromStream(oStream);
          Olecontainer1.DoVerb(ovPrimary);
        except
          MessageDlg('从BLOB字段中读取文档失败。',mtWarning, [mbOK], 0);
        end;
      finally
        oStream.Free;
        Table1.Close;
      end;
    end;
        请注意stream每次必须手工建立和释放。您不必考虑重新使用一个BLOBStream。
    使用SaveToStream方法把OLEContainer里的内容存回BLOB字段:var
      oStream : TBlobStream;
    begin
      oStream := nil;
      if OleContainer1.State <> osEmpty then
        try
          Table1.Open;
          try
            Table1.Edit;
            oStream := TBlobStream.Create(Table1.FieldByName(
              'OleObject') as TBlobField, bmReadWrite);
            OleContainer1.SaveToStream(oStream);
            Table1.Post;
            MessageDlg('文档已成功保存在BLOB中。',mtInformation,[mbOK], 0);
          except
            MessageDlg('文档没有保存于 BLOB 中。',mtWarning, [mbOK], 0);
          end;
        finally
          oStream.Free;
          Table1.Close;
        end
      else
        MessageDlg('没有文档要保存。', mtWarning, [mbOK], 0);
    end;    这一次,为保存所作的修改,oStream在创建时拥有读/写的能力。同时,代码中还在
    存盘前检验容器是否为空。