Показать сообщение отдельно
  #5  
Старый 22.08.2009, 22:15
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Как вариант, есть еще и это :

Doc-файлы («DocFiles», «compound file», «составной файл», «хранилища структурированной информации», «structured storage») – средство для хранения структурированной информации в виде единого файла. Структура файла построена в виде дерева по аналогии с файловой системой. При этом, эквивалентом каталога(папки) является хранилище(storage), а эквивалентом файла – поток(stream). Doc-файлы ориентированы на хранение разнородных данных (текст, видео, графика, звук и т.д.).
Этот формат используется в MS Office (Word, Excel, PowerPoint).

Примерно так (открыть файл и отобразить в TTreeView) :

Код:
procedure TForm1.Button1Click(Sender: TObject);
Var
  Node : TTreeNode;
  stgRoot: IStorage;
begin
  OD1.FileName:=fn_1Cv7_md;
  OD1.InitialDir:=ExtractFilePath(fn_1Cv7_md);
  if OD1.Execute then begin
     fn_1Cv7_md:=OD1.FileName;
     Caption:=fn_1Cv7_md;
     if StgIsStorageFile(PWideChar(fn_1Cv7_md))=S_OK then begin
        //ShowMessage(ExtractFileName(fn_1Cv7_md)+' - это Doc-файл');
        OleCheck(StgOpenStorage(PWideChar(fn_1Cv7_md),
                                nil,
                                stgm_read or stgm_share_exclusive,
                                nil,
                                0,
                                stgRoot));
        TreeView1.Items.BeginUpdate;
        try
          TreeView1.Items.Clear;
          Node:=TreeView1.Items.Add(nil,'<Root>');
          GetNextStorage(Node,stgRoot);
          Node.Expand(true);
        finally
          TreeView1.Items.EndUpdate;
          stgRoot:=nil;
        end;
     end
     else begin
        ShowMessage(ExtractFileName(fn_1Cv7_md)+' - это не Doc-файл');
     end;
  end;
end;

procedure TForm1.GetNextStorage(pn : TTreeNode; stg : IStorage);
Var
  ESS : IEnumStatStg;
  StatStg : TStatStg;
  NodeName : string;
  cn : TTreeNode;
  ctgChild : IStorage;
  Sx : string;
begin
  OleCheck(stg.EnumElements(0,nil,0,ESS));
  while ESS.Next(1,StatStg,nil) = S_OK do
   begin
     NodeName:=StatStg.pwcsName;
     Sx:='???';
     if StatStg.dwType = STGTY_STORAGE then Sx:='STORAGE';
     if StatStg.dwType = STGTY_STREAM then Sx:='STREAM';
     if StatStg.dwType = STGTY_PROPERTY then Sx:='PROPERTY';
     if StatStg.dwType = STGTY_LOCKBYTES then Sx:='LOCKBYTES';
     cn:=TreeView1.Items.AddChild(pn,NodeName+'='+Sx+'');
     if (StatStg.dwType = STGTY_STORAGE) then begin
        OleCheck(Stg.OpenStorage(StatStg.pwcsName,
                 nil,
                 stgm_read or stgm_share_exclusive,
                 nil,
                 0,
                 ctgChild));
        GetNextStorage(cn,ctgChild);
     end;
  end;
end;
Ответить с цитированием