Форум: "Основная";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c