Форум » [x]Harbour » шаблон Microsoft Word » Ответить

шаблон Microsoft Word

Новичок: Кто подскажет (и покажет) - требуется использовать шаблон Word (взаимодействие - подготовка, открытие, передача параметров и т.д.), то есть требуется подготовить определенный шаблон Word, передать параметры с программы, сохранить в формате docx в определенном месте или направить на печать.

Ответов - 103, стр: 1 2 3 4 5 6 All

Andrey: Петр пишет: oWord:Documents:Add() oActive := oWord:ActiveDocument() cTitle := oActive:Name hWnd := FindWindowEx(,,, cTitle ) Не пашет ! Додумался до следующего: [pre2] cTitle := oActive:Name hWnd := FindWindowEx(,,, cTitle ) ? cTitle, hWnd cTitle += " - MICROSOFT WORD" hWnd := FindWindowEx(,,, cTitle ) ? cTitle, hWnd [/pre2] Результат такой: [pre2]Документ1 0 Документ1 - MICROSOFT WORD 396408 [/pre2] Как быть с таким окном Ворда (у юзеров периодически попадают) ? cTitle := "Документ2 [Режим ограниченной функциональности] - MICROSOFT WORD"

Петр: Andrey пишет: Додумался до следующего: Нет универсальности, лучше сначала использовать коллекцию Documents, а потом Windows [pre2] cTitle := oActive:Name hWnd := FindWindowEx(,,, cTitle ) IF hWnd == 0 cTitle := oWord:Windows(1):Caption hWnd := FindWindowEx(,,, cTitle ) ENDIF[/pre2] если нет уверенности, сколько окон открыто в Ворде, а нужно последнее nCount := oWord:Windows:Count cTitle := oWord:Windows(nCount ):Caption или перебор можно сделать [pre2] cTitle := oActive:Name FOR nI := 1 TO nCount IF cTitle $ oWord:Windows(nI):Caption .. [/pre2] В отличие от коллекции Documents, в коллекцию Windows попадут и служебные окна (диалоги) Word, имейте ввиду. В общем выход есть - пробуйте, и не ждите готового ответа.

Andrey: Петр пишет: В отличие от коллекции Documents, в коллекцию Windows попадут и служебные окна (диалоги) Word, имейте ввиду. Что-то не работает: nCount := oWord:Windows:Count ? nCount ? oWord:Windows(1):Caption Выдает 1 и вылет с ошибкой на следующем операторе: Error Word.Application/0 S_OK: WINDOWS Called from TOLEAUTO:WINDOWS(0) Called from MYWORD1OLE(83) Хотя по Менеджеру памяти 5 скрытых процесса Ворд висят....


PSP: Andrey Может ЭТО поможет?

Andrey: PSP пишет: Может ЭТО поможет? Не, не понимаю... Уже совсем заработался... Достали эти окна...

Петр: Andrey пишет: Выдает 1 и вылет с ошибкой на следующем операторе: Error Word.Application/0 S_OK: WINDOWS Called from TOLEAUTO:WINDOWS(0) Called from MYWORD1OLE(83) Замените библиотеку hbole на hbwin.

Andrey: Петр пишет: Замените библиотеку hbole на hbwin. Поменял местами библиотеки, совсем избавиться не могу, т.е. проверка на наличие ВОРДА - требуется hbole. Сразу не работает код: [pre2] oWord := TOleAuto():NEW( "Word.Application" ) IF Ole2TxtError() != 'S_OK' MsgStop( "На этом компьютере MS Word не установлен !" , "Ошибка!" ) RETURN .F. ENDIF [/pre2] Если убрать выход, то ошибка пропадает, код этот работает: [pre2] nCount := oWord:Windows:Count ? nCount ? "Caption=",oWord:Windows(1):Caption [/pre2] Но результат всё равно не верен: 1 Caption= Документ5 Хотя 7 штук скрытых WORD сидят в памяти. Опять перебора не получается...

Петр: Andrey пишет: проверка на наличие ВОРДА - требуется hbole Да вы что, [pre2] IF ( oWord := win_oleCreateObject( "Word.Application" ) ) != NIL oWord:Documents:Add() .. ELSE ? "Error. MS Word not available.", win_oleErrorText() ENDIF [/pre2] Я вас не понимаю, что значит поменял библиотеки местами - просто используйте hbwin вместо hbole! ВСЕ! Что значит убрать выход? При чем здесь скрытые Word в памяти - что вы от них хотите? Что значит верно - не верно? Это согласно документации или вашим ожиданиям? Если вы хотите бороться с Word - боритесь. Если хотите, что бы кто-то помог - приведите полноценный фрагмент кода, в котором вы сомневаетесь, укажите, что и как используете и т.д.

Dima: Петр пишет: IF ( oWord := win_oleCreateObject( "Word.Application" ) ) != NIL А не лучше ли так ? IF ( oWord := win_oleCreateObject( "Word.Application" ) ) == "O" PS Я про Valtype забыл , нужно его туда прицепить

Andrey: Петр пишет: Я вас не понимаю, что значит поменял библиотеки местами - просто используйте hbwin вместо hbole! ВСЕ! Убрал воообще hbole. На экране 3 открытых вордовых документов. Ещё один WORD скрытый процесс. Вот полноценный фрагмент кода: [pre2] oWord := TOleAuto():NEW( "Word.Application" ) oWord:Documents:Add() oActive := oWord:ActiveDocument() oText := oWord:Selection() oWord:ActiveDocument:PageSetup:Orientation := wdOrientLandscape oWord:ActiveDocument:PageSetup:LeftMargin := 72.0 //~2.5 см ....// построение таблицы и т.д. nCount := oWord:Windows:Count ? nCount[/pre2] Выдает 1. Почему ?

Dima: Andrey пишет: Вот полноценный фрагмент кода: nCount := oWord:Windows:Count ? nCount Начни с самого начала , где создается объект

Петр: Andrey пишет: Вот полноценный фрагмент кода: nCount := oWord:Windows:Count ? nCount Полноценный - так полноценный.. Вы каким-то образом создали экземпляр OLE обьекта Дальше, наверное, вы создали новый документ добавив его в коллекцию Documents oWord:Documents:Add() При этом, поскольку документы Word живут в Window, добавился также обьект в коллекцию Windows (заметим, что 1 обьект!) Поэтому oWord:Windows:Count вернет 1 Если вызвать oWord:Documents:Add() oWord:Documents:Add() получим 2 и т.д. Все ваши действия относятся к конкретному OLE экземпляру, а не к процессам в памяти или чему вы там решили.

Петр: Dima пишет: А не лучше ли так ? IF ( oWord := win_oleCreateObject( "Word.Application" ) ) == "O" win_oleCreateObject в случае неуспеха вернет NIL, когда-то это активно обсуждалось разработчиками. На том и порешили

Петр: Andrey пишет: Убрал воообще hbole. На экране 3 открытых вордовых документов. Ещё один WORD скрытый процесс. Вот полноценный фрагмент кода: oWord := TOleAuto():NEW( "Word.Application" ) Класс TOleAuto определен в библиотеке hbole. Что вы там делаете не знаю, но часть ваших слов вызывает определенные сомнения.

Andrey: Петр пишет: Все ваши действия относятся к конкретному OLE экземпляру, а не к процессам в памяти или чему вы там решили. А я решил что это относиться к процессам в памяти. Вопрос был изначален - как узнать хендл окна Worda с открытым документом, чтобы его на экран впереди всех задач вынести. В противном случае он остается после МиниГуи задачи.

Dima: Andrey А ты пробовал вообще , то что Петр советовал ? Использовать для создания объекта Word , win_oleCREATEOBJECT , ну а далее то что он предлагал.

Петр: Andrey пишет: Вопрос был изначален - как узнать хендл окна Worda с открытым документом, чтобы его на экран впереди всех задач вынести. Вы сами дали на него ответ - FindWindowEx В чем затык?

Andrey: Dima пишет: А ты пробовал вообще , то что Петр советовал ? Использовать для создания объекта Word , win_oleCREATEOBJECT , ну а далее то что он предлагал. Пробовал. Разница в одном операторе, который мне не нужен. Мне нужен хендл открытого документа, который я сам создал. Петр пишет: Вы сами дали на него ответ - FindWindowEx В чем затык? Это моё временное решение. Нужно добавлять к названию документа такую штуку: cTitle := "Документ2 - MICROSOFT WORD" cTitle2 := "Документ2 [Режим ограниченной функциональности] - MICROSOFT WORD" А для английской версии Ворда что нужно добавлять ? Вот и озадачился я сделать как в Excel'е - он же сразу правильно выдаёт хендл созданного окна.

Петр: Andrey пишет: Это моё временное решение. И опять позвольте усомниться в ваших словах Andrey пишет: Нужно добавлять к названию документа такую штуку: cTitle := "Документ2 - MICROSOFT WORD" cTitle2 := "Документ2 [Режим ограниченной функциональности] - MICROSOFT WORD" А для английской версии Ворда что нужно добавлять ? Нужно добавлять ТАКУЮ штуку cTitle := oWord:ActiveDocument():Name + "-" + oWord:Caption или nIndex := 1 cTitle := oWord:Windows(nIndex):Caption + "-" + oWord:Caption И еще раз: hbole старая версия OLE из hbwin, в ней больше ошибок, в частности не исправлена работа с коллекциями по индексу. А значит вы не можете использовать циклы по коллекциям. Но, по моему, это вас и не интересует.

Andrey: Петр пишет: Но, по моему, это вас и не интересует. Интересует. Понял что hbwin лучше ! А хендл окна сразу можно получить, без FindWindowEx() ?



полная версия страницы