![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Word 2000 + Delphi
Hooch © (2002-12-23 12:22:00)День добрый !
Господа, можно ли загрузить в Word документ из потока без промежуточного сохранения на диске ?
diMAN (2002-12-25 16:45:00) [1]В догонку к > 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;
Набережных С. (2002-12-24 16:53:00) [2]>diMAN © (24.12.02 11:05)
>asmith (24.12.02 13:56)
Спасибо. К сожалению, это не совсем то, что хотелось бы
asmith (2002-12-24 13:56:00) [3]>А формат не помнишь какой?
Там нужно было вставлять HTML-текст, чтобы сохранились таблицы и пр. Посоветовали почитать MSQN, Q274326, HOWTO: Add HTML Code to the Clipboard by Using Visual Basic
diMAN (2002-12-24 11:05:00) [4]Я такой же вопрос (загрузить в 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.
Набережных С. (2002-12-23 22:28:00) [5]А формат не помнишь какой?
asmith (2002-12-23 22:00:00) [6]Да, на форуме ATL/COM/DCOM (rsdn.ru) в похожей ситуации посоветовали через клипборд вставить
Набережных С. (2002-12-23 21:17:00) [7]Жаль :(
Я сам искал. Не настолько настырно, чтобы сказать "это невозможно", но довольно настойчиво.
asmith (2002-12-23 21:13:00) [8]Согласен, поторопился.
Набережных С. (2002-12-23 18:29:00) [9]>asmith (23.12.02 17:31)
Проблема-то в том, чтобы передать объект в Word. Как здесь может помочь IStorage?
Digitman (2002-12-23 17:52:00) [10]
> asmith
Хорошая идея насчет IStorage !
Спасибо за инфу, не знал (просто не интересовался ранее)
asmith (2002-12-23 17:31:00) [11]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 15:22:00) [12]WORD не знает, что такое MemoryStream... да и знать не может)
А если бы и знал, то уж никак не борландовский TMemoryStream, а как минимум - объект, поддерживающий стандартный интерфейс IStream (о котором, в свою очередь, Борланд знать ничего не знает, да и знать не желает, когда речь идет ТОЛЬКО об обмене данными в формате, совместимом с VCL, внутри одного и того же приложения)
Т.о., если ты найдешь в Ворде (как OLE/COM-объекте) хоть один метод, который допускает пользоваться для этой цели интерфейсом IStream, тогда дело остается за малым : реализовать собств.фабрику класса, предоставляющую интерфейс IStream
Hooch (2002-12-23 14:58:00) [13]> Digitman ©
В БД в блобе лежит файл *.doc, выкачиваю его в MemoryStream и нужно загрузить его в Word без сохранения на диске
Digitman (2002-12-23 13:48:00) [14]
> Hooch
ты про какой поток-то речь ведешь ?
Hooch (2002-12-23 13:31:00) [15]Дык пол-дня сегодня примеры искал .. не нашел :-((( старею наверное :-)
Игорь Шевченко (2002-12-23 12:58:00) [16]Можно, используя методы Com-объекта Word. Как - много примеров здесь и на других сайтах по Delphi