流(Streams)编程:写文件前要筹建流;  
创建流: IStorage.CreateStream; 
打开流: IStorage.OpenStream; 
读取流: IStream.Read; Delphi中在读取数据时采用IOleStream; 
向流中写数据: IStream.write; Delphi中常常采用TOleStream的类;  
 
创建和使用附加存储(Additional Storages):在存储中创建和访问流;还可以创建子存储;  
创建附加存储: IStorage.CreateStorage; 
打开已存在的存储(不是根存储):IStorage.OpenStorage;

解决方案 »

  1.   

    delphi算法与数据结构介绍得不错。另外,delphi开发人员指南。
      

  2.   

    微软提供的复合文档技术,自然是MSDN上面有资料。另外,DELPHI的单元里面已经对它们作一些封装。
    比如说TStreamAdapter对IStream接口的支持。
      

  3.   

    reallike说的那辆本书没有storage的说明,仅仅说明stream,我现在就想要一些Istorage的说明和例子,请问那位大侠可以帮帮忙啊????
    msdn上面的都是英文,小弟的说平实在说部出口,看了半天也没有看的懂...
      

  4.   

    procedure TFrmMain.TreeShowStorge(stg: IStorage; node: TTreeNode);
    var
      stgenum:IEnumStatStg;
      tree:TTreeNodes;
      vstatstg:STATSTG;
      newNode:TTreeNode;
      stgtmp:IStorage;
    begin
      stg.EnumElements(0,nil,0,stgenum);
      while(stgenum.Next(1,vstatstg,nil)=NOERROR) do
      begin
        tree:=node.Owner;
        newNode:=tree.AddChild(node,string(vstatstg.pwcsName));    if (vstatstg.dwType)=STGTY_STORAGE then
        begin
          newNode.ImageIndex:=2;
          if stg.OpenStorage(vstatstg.pwcsName,nil,
            STGM_READWRITE or STGM_SHARE_EXCLUSIVE,
            nil,0,stgtmp)=S_OK then
          begin
            TreeShowStorge(stgtmp,newNode);
          end;
        end
        else if vstatstg.dwType=STGTY_STREAM then
        begin
          Newnode.ImageIndex:=3
        end
      end;
    end;
    procedure TFrmMain.OpenSTG(fname: string);
    var
      s:string;
      stgroot:IStorage;
      root:TTreeNode;
    begin  root:=TreeView2.Items.AddChild(nil,'root');  if StgOpenStorage(StringToOleStr(fname),
        nil,
        STGM_READWRITE or STGM_SHARE_EXCLUSIVE,
        nil,0,
        stgroot
      )=S_OK then
      begin
        TreeShowStorge(stgroot,root);
      end;
    end;
    procedure TFrmMain.Button2Click(Sender: TObject);
    beginif OpenDialog1.Execute then
      OpenSTG(OpenDialog1.FileName);
    end;
      

  5.   

    procedure TFrmMain.TreeShowStorge(stg: IStorage; node: TTreeNode);
    var
      stgenum:IEnumStatStg;
      tree:TTreeNodes;
      vstatstg:STATSTG;
      newNode:TTreeNode;
      stgtmp:IStorage;
    begin
      stg.EnumElements(0,nil,0,stgenum);
      while(stgenum.Next(1,vstatstg,nil)=NOERROR) do
      begin
        tree:=node.Owner;
        newNode:=tree.AddChild(node,string(vstatstg.pwcsName));    if (vstatstg.dwType)=STGTY_STORAGE then
        begin
          newNode.ImageIndex:=2;
          if stg.OpenStorage(vstatstg.pwcsName,nil,
            STGM_READWRITE or STGM_SHARE_EXCLUSIVE,
            nil,0,stgtmp)=S_OK then
          begin
            TreeShowStorge(stgtmp,newNode);
          end;
        end
        else if vstatstg.dwType=STGTY_STREAM then
        begin
          Newnode.ImageIndex:=3
        end
      end;end;procedure TFrmMain.OpenSTG2(fname: string);
    var
      s:string;
      stgroot:IStorage;
      root:TTreeNode;
    begin
      root:=TreeView2.Items.AddChild(nil,'root');  if StgOpenStorage(StringToOleStr(fname),
        nil,
        STGM_READWRITE or STGM_SHARE_EXCLUSIVE,
        nil,0,
        stgroot
      )=S_OK then
      begin
        TreeShowStorge(stgroot,root);
      end;
    end;procedure TFrmMain.Button2Click(Sender: TObject);
    beginif OpenDialog1.Execute then
      OpenSTG(OpenDialog1.FileName);end;
      

  6.   

    非常感谢halfdream(哈欠),这些例子我会好好研究研究的!对我真的简直太有用了!
      

  7.   

    对了,我还想问一句:就是他把内容存储在文件中,用的是流stream形式的马?
      

  8.   

    是的。它读写文档内容都是使用IStream,
    我写的那例子没有用它,不过想来剩下内容已经比较简单了。
      

  9.   

    再次感谢你halfdream(哈欠)!
    最后一个问题:用流的形式写入文件,那么这个文件用记事本等普通的文本浏览器可以直接看到内容吗?我得意思是:我想把写入流文件的内容有加密功能,用普通的文本编辑器打开内容是杂乱无章的乱码,请问如何实现?