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

Вниз

Word 2000 + Delphi   Найти похожие ветки 

 
Hooch ©   (2002-12-23 12:22) [0]

День добрый !
Господа, можно ли загрузить в Word документ из потока без промежуточного сохранения на диске ?


 
Игорь Шевченко ©   (2002-12-23 12:58) [1]

Можно, используя методы Com-объекта Word. Как - много примеров здесь и на других сайтах по Delphi


 
Hooch ©   (2002-12-23 13:31) [2]

Дык пол-дня сегодня примеры искал .. не нашел :-((( старею наверное :-)


 
Digitman ©   (2002-12-23 13:48) [3]


> Hooch


ты про какой поток-то речь ведешь ?


 
Hooch ©   (2002-12-23 14:58) [4]

> Digitman ©


В БД в блобе лежит файл *.doc, выкачиваю его в MemoryStream и нужно загрузить его в Word без сохранения на диске


 
Digitman ©   (2002-12-23 15:22) [5]

WORD не знает, что такое MemoryStream... да и знать не может)
А если бы и знал, то уж никак не борландовский TMemoryStream, а как минимум - объект, поддерживающий стандартный интерфейс IStream (о котором, в свою очередь, Борланд знать ничего не знает, да и знать не желает, когда речь идет ТОЛЬКО об обмене данными в формате, совместимом с VCL, внутри одного и того же приложения)

Т.о., если ты найдешь в Ворде (как OLE/COM-объекте) хоть один метод, который допускает пользоваться для этой цели интерфейсом IStream, тогда дело остается за малым : реализовать собств.фабрику класса, предоставляющую интерфейс IStream


 
asmith   (2002-12-23 17:31) [6]

Delphi обеспечивает реализацию IStream от Borland - класс TStreamAdapter (в D6 unit Classes), так что этим можно вполне пользоваться, программируя на Delphi. Более того, нет необходимости реализовывать "собств.фабрику класса, предоставляющую интерфейс IStream" - среда СОМ это может сделать сама бесплатно. Если нужен IStream, связанный с некой областью памяти, поможет функция CreateStreamOnHGlobal, если же все нужна на файле, то SHCreateStreamOnFile.
Что же касается вопроса про *.doc, нужно поискать в направлении интерфейса IStorage, функций StgCreateDocfileOnILockBytes, StgOpenStorage и других из категории Structured Storage (Platform SDK: COM).


 
Digitman ©   (2002-12-23 17:52) [7]


> asmith


Хорошая идея насчет IStorage !
Спасибо за инфу, не знал (просто не интересовался ранее)


 
Набережных С.   (2002-12-23 18:29) [8]

>asmith (23.12.02 17:31)

Проблема-то в том, чтобы передать объект в Word. Как здесь может помочь IStorage?


 
asmith   (2002-12-23 21:13) [9]

Согласен, поторопился.


 
Набережных С.   (2002-12-23 21:17) [10]

Жаль :(
Я сам искал. Не настолько настырно, чтобы сказать "это невозможно", но довольно настойчиво.


 
asmith   (2002-12-23 22:00) [11]

Да, на форуме ATL/COM/DCOM (rsdn.ru) в похожей ситуации посоветовали через клипборд вставить


 
Набережных С.   (2002-12-23 22:28) [12]

А формат не помнишь какой?


 
diMAN ©   (2002-12-24 11:05) [13]

Я такой же вопрос (загрузить в Word документ из потока) задавал где-то с месяц назад. Тогда такой дискуссии не было. И я решил вставлять данные через клипборд. Вот что у меня получилось:


uses ..., Clipbrd;

var CF_RTF : Word;
MemoryStream: TMemoryStream;
begin
CF_RTF := RegisterClipboardFormat("Rich Text Format");
MemoryStream := TMemoryStream.Create;
MemoryStream.LoadFromFile("Report1.rtf"); // Это к примеру (у меня в MemoryStream формируется с помощью компонента EkRTF отчёт)
MemoryStream.Seek(0, soFromEnd);
MemoryStream.WriteBuffer(NullStr^, 1); // Дописываем нулевой символ, т.к. передавать будем строку типа PChar, если ты будешь передавать таким же образом doc-файл, то ничего не получится, т.к. в doc-файле содержатся символы #0
ClipBoard.Open;
ClipBoard.SetAsHandle(CF_RTF, Cardinal(MemoryStream.Memory));
ClipBoard.Close;
FreeAndNil(MemoryStream);
end.


 
asmith   (2002-12-24 13:56) [14]

>А формат не помнишь какой?
Там нужно было вставлять HTML-текст, чтобы сохранились таблицы и пр. Посоветовали почитать MSQN, Q274326, HOWTO: Add HTML Code to the Clipboard by Using Visual Basic





 
Набережных С.   (2002-12-24 16:53) [15]

>diMAN © (24.12.02 11:05)
>asmith (24.12.02 13:56)
Спасибо. К сожалению, это не совсем то, что хотелось бы


 
diMAN ©   (2002-12-25 16:45) [16]

В догонку к > diMAN © (24.12.02 11:05):
Для того, чтобы автоматически открыть Word и вставить в него данные из Clipboard я использую вот это:

if GetActiveObject(ProgIDToClassID("Word.Application"), nil, Unknown) <> MK_E_UNAVAILABLE
then WordApp := GetActiveOleObject("Word.Application")
else WordApp := CreateOleObject("Word.Application");
try
WordApp.Documents.Add.ActiveWindow.Selection.Paste;
WordApp.Visible := True;
WordApp := Unassigned;
except
end;



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

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

Наверх




Память: 0.5 MB
Время: 0.011 c
3-24796
Elka
2002-12-14 08:49
2003.01.09
Сохранение колонок в DBGridEh 2.5


4-25158
vvs2002
2002-11-20 04:56
2003.01.09
Помогите, работа с чужим окном ... кнопку нажать


6-24989
Foxsi
2002-11-10 12:03
2003.01.09
Help


3-24780
EternalWonderer
2002-11-29 13:09
2003.01.09
Parse to Execute Ratio = 101


14-25015
Свой
2002-12-18 11:00
2003.01.09
Сами мы не местные помогите кто чем может