Интеграция CA-Visual Objects с Microsoft Word и Excel 3/4
 
Интеграция CA-Visual Objects с Microsoft Word

Предпосылки и отличия от Excel.

Из моего личного опыта я знаю, что наиболее популярная интеграция CA-Visual Object - это интеграция его с документом WORD. Программисты имеют желание научится работать с этим документом, обрабатывать текст, хранящийс в нем, печатать его на сетевом принтере и т.д. и т.п.
Сразу скажу, что методология, применяемая в данном случае точно така же как при интеграции Excel в CA Visual Objects. Разница, естественно, в представляемой информации. Ведь WORD это текстовый процессор, а EXCEL - электронная таблица.
Использование DDE

Операция DDE выглядит точно также, как это было сделано до этого с Excel. Одна интересная особенность, правда, появляется при выполнении команды DDE. В качестве примера посмотрите, пожалуйста, на команду:

oIPCClient:Execute("Документ1", "","Вставить текст! {ENTER}")

Эта команда вделывает текст "Вставить текст!" в текущую позицию курсора документа с названием "Документ1" и переводит курсор на следующую строку. Обратите внимание - здесь не применяются квадратные скобки, как это было в случае с Excel.
К сожалению, все что может сделать вышеупомянутая команда это вделать некий текст в текущую позицию курсора. Как можно передвинуть курсор в другую позицию? Ответ на этот вопрос очень простой - при помощи команд DDE никак. Однако это возможно при установки закладки где текст должен быть вставлен.
Затем Вам следует выполнить метод Execute с макросом EditGoTo до упомянутой закладки и вделывать текст.
Макроязык Word Basic

Microsoft Word поддерживает BASIC подобный макроязык именуемый WordBasic . С его помощью реализуются любые команды и операции с *.DOC файлами. Дл выполнения макрокоманды на Word Basic просто заключите имя этого макроса в квадратные скобки и вделайте его в команду DDE Execute:

oIPCClient:Execute(oTopic,"","[MyWordBasicMacro]")
Разница между версиями WORD

Есть небольшая разница между версиями WORD ранних версий и более поздних. Но это совсем не так ощутимо, как в Excel. Word полностью поддерживает все свои старые форматы - он совместим сверху вниз. Word 2.0 не поддерживает файлы от Word 7.0. Версия 7 не поддерживает формат файлов от Word97 без необходимого драйвера, который можно скачать с Site Microsoft. Поддержка DDE слабо меняется от версии к версии. Версия 7.0 и выше 32 разрядная, как и среда, в которой она работает. Нету версий 3-5 . Этот скачек обусловлен соображениями уникальности номеров версий для DOS и Windows.
И последнее Word97 уже не поддерживает Word Basic, в качестве внутреннего языка там используется VBA.
OLE и CA-Visual Objects 2.0

Вы можете легко использовать технологию OLE применительно к WORD. Лучше всего сделать это через OLE автоматизацию. В качестве сервера выступает сам WORD, а команды, которые он выполняет - это команды макроязыка Word Basic. Как и прежде Вы вправе использовать автоматические объекты от Word Basic, построенные при помощи класса OleAutoObject, так и сгенеренные классы, по соответствующему интерфейсу. Последний вариант намного предпочтительнее, так как сильно экономит время у конечного пользователя. Кроме того советую Вам опять же использовать только часть сгенеренных методов - это сильно экономит ресурсы.
OLE автоматизация.

В примере я сделал свой класс Word Basic, в котором значительно меньше методов, и только те, которые мне необходимы. Посмотрите как реализуютс команды Word Basic через CA-Visual Objects:
METHOD Start() CLASS App
    LOCAL ow AS ShellWindow 
    LOCAL oWordBasic AS WordBasic 
    LOCAL sP, sPo AS STRING 
    LOCAL sRet AS STRING 
    LOCAL sCommand AS STRING 
    // 
    oWordBasic := WordBasic{} 
    sP := "d:\St\Tehnicon97\Использование Excel и Word в CA-Visual Objects 2.0\TestWord.doc" 
    sPo := "d:\St\Tehnicon97\Использование Excel и Word в CA-Visual Objects 2.0\_TWord.doc" 
    sRet := "На этом месте было " 
    // 
    oWordBasic:FileOpen(sP,, 1) 
    // 
    oWordBasic:EditReplace("@001", "Это замена #1 текста @001", , , , , , , , TRUE) 
    oWordBasic:EditReplace("@002", "Это замена #2 текста @002", , , , , , , , TRUE) 
    oWordBasic:EditReplace("@003", "Это замена #3 текста @003", , , , , , , , TRUE) 
    oWordBasic:EditReplace("@004", "Это замена #4 текста @004", , , , , , , , TRUE) 
    oWordBasic:EditReplace("@005", "Ну как Вам это нравиться?", , , , , , , , TRUE) 
    // 
    WHILE TRUE
        oWordBasic:StartOfDocument() 
        oWordBasic:EditFind("\[*\]", , , , , 1) 
        IF oWordBasic:EditFindFound() != 0 //Если что-то нашли

            sCommand := oWordBasic:Selection() 
            sCommand := SubStr3(sCommand, 2, Len(sCommand)-2) 
            oWordBasic:EditClear() 
            oWordBasic:Insert(sRet + "'" + sCommand + "'")
        ELSE //Если ничиго не нашли, то выход
            EXIT 
        END IF
    END WHILE 
    // 
    oWordBasic:EditSelectAll() 
    oWordBasic:UpdateFields() 
    oWordBasic:LineUp(1, 0) 
    oWordBasic:FileSaveAs(sPo) 
    oWordBasic:Shell("WinWord") 
    oWordBasic:DocClose(2) 
    // 
    oW := ShellWindow{SELF} 
    oW:Show() 
    SELF:Exec() 
    // 
    RETURN 0
Этот пример открывает файл TestWord.doc . Это шаблон для замен текста внутри него. Программа ищет строки вида @001 и заменяет их. Кроме того программа ищет строки в тексте, ограниченные квадратными скобками и заменяет содержимое на это же содержимое с небольшой добавкой - "на этом месте было". После чего открывает Word и загружает в него скорректированный документ.

На этом можно было бы и завершить рассказ об интеграции Word и CA-Visual Object, если бы не одна маленькая деталь. Дело в том, что механизм OLE автоматизации очень универсален, я бы сказал через чур универсален. Настолько универсален, что работает ну очень медленно. Как вы знаете за все в нашем мире приходится платить, в том числе и за универсальность, тем более за излишнюю. Да, при помощи OLE механизма Вы можете делать с документом WORD все, что он сам с ним может делать. Но будьте любезны подождать некоторое время. В связи с вышесказанным мною был разработан механизм заполнени документа WORD значительно более шустрый.
Интеграция Word и CA Visual Object через RTF формат.

Механизм этот основан на том, что WORD поддерживает файлы формата RTF (Rich Text Forman). По сути своей это текстовый файл в котором информаци хранится в специальных тегах. Word может сохранить любой документ в формате RTF. Самое важное, что работа идет через обычный текстовый формат - что значительно удобнее. Для доступа к текстовым файлам мною была написана функция на языке С, которая находиться в DLL библиотеке VO32_UT. Исходные тексты этой библиотеки распространяются вместе со статьей. Формат функции:

fRepl(<ucpBlank>, <ucpOutBlank>, <ucpBase> [, <ucS>]) -> <uiSuccess>
<ucpBlank> - Имя бланка (RTF файла)
<ucpOutBlank> - Имя выходного бланка (RTF файла)
<ucpBase> - Имя базы данных со структурой:

{"S", "C", 255, 0}}.; Строка замены
<ucS> - Код символа идентификации (по умолчанию код символа @)
<uiSuccess> - Результат работы, если 0 то все в порядке

Функция эта делает следующее. Берет входной бланк - RTF файл и производит поиск в нем строк вида @001 ... @nnn. Если такая строка нашлась, то беретс из нее номер (все, что после @). Этот номер воспринимается как номер записи в базе данных <ucpBase>. По номеру записи из базы вытаскиваетс строка замены и количество символов, которое она занимает и делается замена в исходном файле. По завершению работы все изменения сохраняются в выходном файле <ucpOutBlank>.
Прототип функции fRepl на языке VO выглядит:

_DLL FUNCTION fRepl(ucpBlank AS PSZ, ucpOutBlank AS PSZ, ucpBase AS PSZ, ucFiller AS BYTE) AS INT PASCAL:VO32_UT.fRepl

Естественно, что при выполнение программы необходимая библиотека VO32_UT.DLL должна быть доступна. Кроме того, сама библиотека VO32_UT.DLL требует для своей работы стандартную библиотеку из Borland C++ 5.01 CW3220.DLL.
Следующие шаги, как я предполагаю достаточно прозрачны. Организуем базу данных указанной структуры, заполняем ее строками замещения. Делаем через Word бланк для заполнения. Пишем элементарную процедуру на VO:

METHOD Start() CLASS App
    LOCAL ow AS ShellWindow 
    LOCAL sP, sPo, sB AS STRING 
    // 
    sP := "d:\St\Tehnicon97\Использование Excel и Word в CA-Visual Objects 2.0\TestWord.rtf" 
    sB := "d:\St\Tehnicon97\Использование Excel и Word в CA-Visual Objects 2.0\TestWord.dbf" 
    sPo := "d:\St\Tehnicon97\Использование Excel и Word в CA-Visual Objects 2.0\_TWord.rtf" 
    // 
    IF fRepl(PSZ(sP), PSZ(sPo), PSZ(sB), 64) != 0
        TextBox{NULL_OBJECT, "Плохо!"}:Show()
    END IF 
    // 
    WinExec(PSZ("c:\msoffice\winword\winword.exe "+sPo), SW_SHOW) 
    // 
    oW := ShellWindow{SELF} 
    oW:Show() 
    SELF:Exec() 
    // 
    RETURN 0
Может это конечно и не последний писк ультрасовременной технологии, но работает приблизительно в 10 раз быстрее метода основанного на OLE.


 
Сайт создан в системе uCoz