Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-24824
idz
2002-12-15 18:47
2003.01.09
Распознавание СУБД по типу файла БД


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


14-25037
Карелин Артем
2002-12-18 15:11
2003.01.09
Подключение Palm 105 к модему.


1-24895
бред
2002-12-25 19:46
2003.01.09
новый компонент ошибку дает


14-25098
Igor_thief
2002-12-22 12:20
2003.01.09
Защитные очки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский