Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.038 c
9-1118348967
Cerberus
2005-06-10 00:29
2005.10.23
Вода


14-1128154494
Andy BitOff
2005-10-01 12:14
2005.10.23
Порты 1010-1013


3-1126179730
Angel[Saint]
2005-09-08 15:42
2005.10.23
ADOTable1.LoadFromFile не сохраняет данные в БД


1-1128254250
Ivanov
2005-10-02 15:57
2005.10.23
добавление Item в TDXImageList


1-1127979626
DeniM
2005-09-29 11:40
2005.10.23
проблема с генерацией отчетов в ворде





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский