Автор | Сообщение |
|
| |
Пост N: 2
Зарегистрирован: 22.04.15
|
|
Отправлено: 22.04.15 20:48. Заголовок: шаблон Microsoft Word
Кто подскажет (и покажет) - требуется использовать шаблон Word (взаимодействие - подготовка, открытие, передача параметров и т.д.), то есть требуется подготовить определенный шаблон Word, передать параметры с программы, сохранить в формате docx в определенном месте или направить на печать.
|
|
|
Ответов - 103
, стр:
1
2
3
4
5
6
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 5203
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.16 00:44. Заголовок: Петр пишет: oWord:D..
Петр пишет: цитата: | oWord:Documents:Add() oActive := oWord:ActiveDocument() cTitle := oActive:Name hWnd := FindWindowEx(,,, cTitle ) |
| Не пашет ! Додумался до следующего: cTitle := oActive:Name hWnd := FindWindowEx(,,, cTitle ) ? cTitle, hWnd cTitle += " - MICROSOFT WORD" hWnd := FindWindowEx(,,, cTitle ) ? cTitle, hWnd Результат такой: Документ1 0 Документ1 - MICROSOFT WORD 396408 Как быть с таким окном Ворда (у юзеров периодически попадают) ? cTitle := "Документ2 [Режим ограниченной функциональности] - MICROSOFT WORD"
|
|
|
|
| постоянный участник
|
Пост N: 1357
Зарегистрирован: 09.10.06
|
|
Отправлено: 04.12.16 01:05. Заголовок: Andrey пишет: Додум..
Andrey пишет: Нет универсальности, лучше сначала использовать коллекцию Documents, а потом Windows cTitle := oActive:Name hWnd := FindWindowEx(,,, cTitle ) IF hWnd == 0 cTitle := oWord:Windows(1):Caption hWnd := FindWindowEx(,,, cTitle ) ENDIF если нет уверенности, сколько окон открыто в Ворде, а нужно последнее цитата: | nCount := oWord:Windows:Count cTitle := oWord:Windows(nCount ):Caption |
| или перебор можно сделать cTitle := oActive:Name FOR nI := 1 TO nCount IF cTitle $ oWord:Windows(nI):Caption .. В отличие от коллекции Documents, в коллекцию Windows попадут и служебные окна (диалоги) Word, имейте ввиду. В общем выход есть - пробуйте, и не ждите готового ответа.
|
|
|
|
| постоянный участник
|
Пост N: 5204
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.16 02:34. Заголовок: Петр пишет: В отлич..
Петр пишет: цитата: | В отличие от коллекции 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 скрытых процесса Ворд висят....
|
|
|
|
| постоянный участник
|
Пост N: 1285
Зарегистрирован: 27.01.07
|
|
Отправлено: 04.12.16 12:07. Заголовок: Andrey Может ЭТО по..
Andrey Может ЭТО поможет?
|
|
|
|
| постоянный участник
|
Пост N: 5205
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.16 13:41. Заголовок: PSP пишет: Может ЭТ..
PSP пишет: Не, не понимаю... Уже совсем заработался... Достали эти окна...
|
|
|
|
| постоянный участник
|
Пост N: 1358
Зарегистрирован: 09.10.06
|
|
Отправлено: 04.12.16 14:45. Заголовок: Andrey пишет: Выдае..
Andrey пишет: цитата: | Выдает 1 и вылет с ошибкой на следующем операторе: Error Word.Application/0 S_OK: WINDOWS Called from TOLEAUTO:WINDOWS(0) Called from MYWORD1OLE(83) |
| Замените библиотеку hbole на hbwin.
|
|
|
|
| постоянный участник
|
Пост N: 5207
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.16 16:06. Заголовок: Петр пишет: Заменит..
Петр пишет: цитата: | Замените библиотеку hbole на hbwin. |
| Поменял местами библиотеки, совсем избавиться не могу, т.е. проверка на наличие ВОРДА - требуется hbole. Сразу не работает код: oWord := TOleAuto():NEW( "Word.Application" ) IF Ole2TxtError() != 'S_OK' MsgStop( "На этом компьютере MS Word не установлен !" , "Ошибка!" ) RETURN .F. ENDIF Если убрать выход, то ошибка пропадает, код этот работает: nCount := oWord:Windows:Count ? nCount ? "Caption=",oWord:Windows(1):Caption Но результат всё равно не верен: 1 Caption= Документ5 Хотя 7 штук скрытых WORD сидят в памяти. Опять перебора не получается...
|
|
|
|
| постоянный участник
|
Пост N: 1359
Зарегистрирован: 09.10.06
|
|
Отправлено: 04.12.16 16:46. Заголовок: Andrey пишет: прове..
Andrey пишет: цитата: | проверка на наличие ВОРДА - требуется hbole |
| Да вы что, IF ( oWord := win_oleCreateObject( "Word.Application" ) ) != NIL oWord:Documents:Add() .. ELSE ? "Error. MS Word not available.", win_oleErrorText() ENDIF Я вас не понимаю, что значит поменял библиотеки местами - просто используйте hbwin вместо hbole! ВСЕ! Что значит убрать выход? При чем здесь скрытые Word в памяти - что вы от них хотите? Что значит верно - не верно? Это согласно документации или вашим ожиданиям? Если вы хотите бороться с Word - боритесь. Если хотите, что бы кто-то помог - приведите полноценный фрагмент кода, в котором вы сомневаетесь, укажите, что и как используете и т.д.
|
|
|
|
| |
Пост N: 6170
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.12.16 17:17. Заголовок: Петр пишет: IF ( o..
Петр пишет: цитата: | IF ( oWord := win_oleCreateObject( "Word.Application" ) ) != NIL |
| А не лучше ли так ? IF ( oWord := win_oleCreateObject( "Word.Application" ) ) == "O" PS Я про Valtype забыл , нужно его туда прицепить
|
|
|
|
| постоянный участник
|
Пост N: 5208
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.16 17:21. Заголовок: Петр пишет: Я вас н..
Петр пишет: цитата: | Я вас не понимаю, что значит поменял библиотеки местами - просто используйте hbwin вместо hbole! ВСЕ! |
| Убрал воообще hbole. На экране 3 открытых вордовых документов. Ещё один WORD скрытый процесс. Вот полноценный фрагмент кода: 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 Выдает 1. Почему ?
|
|
|
|
| |
Пост N: 6171
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.12.16 17:22. Заголовок: Andrey пишет: Вот п..
Andrey пишет: цитата: | Вот полноценный фрагмент кода: nCount := oWord:Windows:Count ? nCount |
| Начни с самого начала , где создается объект
|
|
|
|
|
| постоянный участник
|
Пост N: 1360
Зарегистрирован: 09.10.06
|
|
Отправлено: 04.12.16 17:38. Заголовок: Andrey пишет: Вот п..
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 экземпляру, а не к процессам в памяти или чему вы там решили.
|
|
|
|
| постоянный участник
|
Пост N: 1361
Зарегистрирован: 09.10.06
|
|
Отправлено: 04.12.16 17:41. Заголовок: Dima пишет: А не лу..
Dima пишет: цитата: | А не лучше ли так ? IF ( oWord := win_oleCreateObject( "Word.Application" ) ) == "O" |
| win_oleCreateObject в случае неуспеха вернет NIL, когда-то это активно обсуждалось разработчиками. На том и порешили
|
|
|
|
| постоянный участник
|
Пост N: 1362
Зарегистрирован: 09.10.06
|
|
Отправлено: 04.12.16 17:49. Заголовок: Andrey пишет: Убрал..
Andrey пишет: цитата: | Убрал воообще hbole. На экране 3 открытых вордовых документов. Ещё один WORD скрытый процесс. Вот полноценный фрагмент кода: oWord := TOleAuto():NEW( "Word.Application" ) |
| Класс TOleAuto определен в библиотеке hbole. Что вы там делаете не знаю, но часть ваших слов вызывает определенные сомнения.
|
|
|
|
| постоянный участник
|
Пост N: 5209
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.16 18:02. Заголовок: Петр пишет: Все ваш..
Петр пишет: цитата: | Все ваши действия относятся к конкретному OLE экземпляру, а не к процессам в памяти или чему вы там решили. |
| А я решил что это относиться к процессам в памяти. Вопрос был изначален - как узнать хендл окна Worda с открытым документом, чтобы его на экран впереди всех задач вынести. В противном случае он остается после МиниГуи задачи.
|
|
|
|
| |
Пост N: 6172
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.12.16 18:41. Заголовок: Andrey А ты пробова..
Andrey А ты пробовал вообще , то что Петр советовал ? Использовать для создания объекта Word , win_oleCREATEOBJECT , ну а далее то что он предлагал.
|
|
|
|
| постоянный участник
|
Пост N: 1364
Зарегистрирован: 09.10.06
|
|
Отправлено: 04.12.16 18:41. Заголовок: Andrey пишет: Вопро..
Andrey пишет: цитата: | Вопрос был изначален - как узнать хендл окна Worda с открытым документом, чтобы его на экран впереди всех задач вынести. |
| Вы сами дали на него ответ - FindWindowEx В чем затык?
|
|
|
|
| постоянный участник
|
Пост N: 5211
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.16 19:10. Заголовок: Петр пишет: Вы сами..
Dima пишет: цитата: | А ты пробовал вообще , то что Петр советовал ? Использовать для создания объекта Word , win_oleCREATEOBJECT , ну а далее то что он предлагал. |
| Пробовал. Разница в одном операторе, который мне не нужен. Мне нужен хендл открытого документа, который я сам создал. Петр пишет: цитата: | Вы сами дали на него ответ - FindWindowEx В чем затык? |
| Это моё временное решение. Нужно добавлять к названию документа такую штуку: cTitle := "Документ2 - MICROSOFT WORD" cTitle2 := "Документ2 [Режим ограниченной функциональности] - MICROSOFT WORD" А для английской версии Ворда что нужно добавлять ? Вот и озадачился я сделать как в Excel'е - он же сразу правильно выдаёт хендл созданного окна.
|
|
|
|
| постоянный участник
|
Пост N: 1365
Зарегистрирован: 09.10.06
|
|
Отправлено: 04.12.16 19:17. Заголовок: Andrey пишет: Это м..
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, в ней больше ошибок, в частности не исправлена работа с коллекциями по индексу. А значит вы не можете использовать циклы по коллекциям. Но, по моему, это вас и не интересует.
|
|
|
|
| постоянный участник
|
Пост N: 5212
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.16 19:42. Заголовок: Петр пишет: Но, по ..
Петр пишет: цитата: | Но, по моему, это вас и не интересует. |
| Интересует. Понял что hbwin лучше ! А хендл окна сразу можно получить, без FindWindowEx() ?
|
|
|
Ответов - 103
, стр:
1
2
3
4
5
6
All
[только новые]
|
|