Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

OleConvertIStorageToOLEStream   Найти похожие ветки 

 
Digitman ©   (2005-09-30 16:19) [0]

Кто-нибудь исследовал на практике вопросы использования этой ф-ции ?
Интересует возможность ее использования в целях сохранения указанного хранилища в ole1-потоке с целью дальнейшей загрузки olecontainer"а из этого потока ... т.е. минуя промежуточное сохранение хранилища в файл ..


 
Digitman ©   (2005-09-30 17:37) [1]

Скажем, имеется xls-файл, в содержимое соотв.документа внедрен Word-документ

Идея проста: открыть xls-файл как Storage (RootStorage), открыть в нем дочерний Storage, соответствующий внедренному док-ту, сохранить открытый дочерний Storage в IStream-объект, загрузить этот стрим в TOleStream и открыть документ вызовом TOleContainer.LoadFromStream(OleStream)

Преимущество очевидно : минуем стадию сохранения дочернего Storage в файл ..


 
Набережных С. ©   (2005-10-01 09:08) [2]

По-моему, OleConvertIStorageToOLEStream - не совсем то, хотя я особо в нее не вникал.
 Загрузить внедренный документ можно иначе:

procedure LoadContainedDocument(const FileName, DocName: WideString;
 const OleContainer: TOleContainer);
var
 Root, Doc: IScrStorage;
 TempStg: IStorage;
 LB: ILockBytes;
 MS: TMemoryStream;
 H: HGlobal;
 pBuf: Pointer;
 Header: TStreamHeader;
begin
 OleCheck(CreateILockBytesOnHGlobal(0, true, LB));

 OleCheck(StgCreateDocfileOnILockBytes(LB, STGM_CREATE or STGM_READWRITE or
   STGM_SHARE_EXCLUSIVE, 0, TempStg));

 Root:=CreateStorage(FileName);
 Root.GetStorage(DocName, Doc);
 OleCheck((Doc as IStorage).CopyTo(0, nil, nil, TempStg));
 OleCheck(TempStg.Commit(STGC_DEFAULT));

 OleCheck(GetHGlobalFromILockBytes(LB, H));

 MS:=TMemoryStream.Create;
 try
   with Header do
   begin
     Signature:=StreamSignature;
     DrawAspect:=DVASPECT_CONTENT;
     DataSize:=GlobalSize(H);
   end;
   MS.Write(Header, SizeOf(Header));
   pBuf:=GlobalLock(H);
   try
     MS.WriteBuffer(pBuf^, Header.DataSize);
   finally
     GlobalUnlock(H);
   end;

   MS.Position:=0;
   OleContainer.LoadFromStream(MS);
 finally
   MS.Free;
 end;
end;

Использовать так:

procedure TForm1.Button1Click(Sender: TObject);
begin
 LoadContainedDocument("Example.xls", "MBD000C3BCC", OleContainer1);
 OleContainer1.DoVerb(ovShow);
end;


 
Набережных С. ©   (2005-10-01 09:09) [3]

Да, здесь использован модуль StorageObject, он есть в кладовке, в файле Storage.zip. Хотя и без него вполне можно переделать.


 
Набережных С. ©   (2005-10-01 09:41) [4]

Еще одно забыл:)
TStreamHeader и StreamSignature выдернуты из файла OleCtnrs.pas:

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

const
 StreamSignature = $434F4442; {"BDOC"}



Страницы: 1 вся ветка

Текущий архив: 2005.10.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.036 c
8-1117219733
Sulimxar
2005-05-27 22:48
2005.10.23
Звук с модема


1-1127969777
AngelOKES
2005-09-29 08:56
2005.10.23
Экспорт в Excel тремя способами


1-1127882869
Novic
2005-09-28 08:47
2005.10.23
Организовать признак прочтения


2-1127369002
alexm
2005-09-22 10:03
2005.10.23
как назначить одну процедуру многим компонентам


2-1128336602
jeka_t
2005-10-03 14:50
2005.10.23
Помогите задать значение даты новичку, пожалуйста...