Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2009, 22:04   #11
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

PDF converter. Пока пытаюсь конвертиворвать растровую графику и текст. Возможно, позже буду пробовать векторную графику и формы (кнопки, списки...).

По поводу Selection-a. У меня получается неприятный эффект: во время работы моего приложения, не могу нормально работать в Word, selection все время дергается. Как перед изменением selection-a запомнить его, а после восстановить? Можете привести коротенький пример?

По поводу буфера, я не могу гарантировать, что во время между моим Copy и Paste буфер не будет изменен.

а, вот с
Цитата:
работать не с шейпом а с динамически добавляемым полем INCLUDETEXT. Добавляете поле для нужного ранга, обновляете и разрываете связь (unlink). В результате вы фактически добавите новый шейп на основе шаблона с привязкой к местоположению поля.
для меня это "темный лес". В конечном результате при использовании unlink я получаю 1 doc файл? Приведите, пожалуйста, пример, как это можно сделать.
Diego__ вне форума Ответить с цитированием
Старый 14.09.2009, 03:41   #12
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

1) IMHO, работать в Word одновременно с фоновым приложением, правящим активный документ - непродуктивная идея.
Cоздавайте скрытую копию Word и управляйте вашей программой работой этой копии.
2) О полях:
Код:
Public Sub ExampleAddFields()
    Dim oRng As Range
    Dim oFld As Field
    Dim iPage As Long
    Dim sXMLShapePath As String
    'Добавляем поле INCLUDETEXT на 3-ю страницу, обновляем вставку и разрываем связь с источником
    '(wa.xml в каталоге активного документа)
    iPage = 3
    With ActiveDocument
        sXMLShapePath = Replace(.Path & "\wa.xml", "\", "\\")
        Set oRng = .Range.GoTo(wdGoToPage, wdGoToAbsolute, iPage)
        Set oFld = .Fields.Add(oRng, wdFieldIncludeText, sXMLShapePath)
        With oFld
            .Update
            .Unlink
        End With
    End With
End Sub
Результатом этого кода будет вставка шейпа, заданного в XML файле на 3-ю страницу активного документа (предполагается что она есть).

Последний раз редактировалось Aent; 14.09.2009 в 04:04.
Aent вне форума Ответить с цитированием
Старый 14.09.2009, 20:04   #13
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Спасибо, Aent. У меня все получилось
Diego__ вне форума Ответить с цитированием
Старый 16.09.2009, 12:49   #14
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Не все получилось

Все хорошо в 2003 Word-e.
В 2007 Word-e не хорошо...

Код:
CComVariant fieldIncludeText(Word::wdFieldIncludeText);
_variant_t xmlShapePath(fileName);

Word::FieldPtr field = m_Document->Fields->Add(range, &fieldIncludeText, &xmlShapePath);
          
field->Update();
field->Unlink();
При использовании 2007 Word-a в данном коде при вызове метода Add сбиваются ранее установленные насторйки (размер страниц). Если до вызова Add в документе были вставлены изображения, изображения пропадают. Получаетя эффект затирания ранее сформированной страницы страницей из xml файла. При этом в 2003 Word-e все работает нормально.

В чем может быть проблема?
Может быть, необходимо подкорректировать xml-ку? Или задать другое значение WdFieldType? - пробовал wdFieldShape - ничего хорошего.
Diego__ вне форума Ответить с цитированием
Старый 18.09.2009, 23:04   #15
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Я проверил свой, приведённый выше, VBA код в Word 2007 на выложенных ранее файлах test.doc и wa.xml. Проблем не обнаружил. wdFieldShape тут в любом случае не при чём. Возможно у вас разные размеры страницы в целевом документе и в .xml и 2007 понимает это отличным от 2003 образом.
Что и где затирается не понял. На предыдущих листах все картинки остались. Попробуйте при добавлении поля указать после пути к
вставляемому фрагменту 4-й параметр PreserveFormatting:=TRUE и в хвост пути к XML фрагменту добавить " \* MERGEFORMAT"
Обратите внимание на то, что этот слэш "\*" не должен быть удвоен и перед слэшем должен быть пробел.

Последний раз редактировалось Aent; 18.09.2009 в 23:55.
Aent вне форума Ответить с цитированием
Старый 21.09.2009, 13:03   #16
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Установил PreserveFormatting в true, добавил \* MERGEFORMAT, не получилось, результат прежний.

Правильно ли я задаю строку?

Код:
"d:/DOCTemplate.xml" \* MERGEFORMAT
Я не совсем корректно выразился
Цитата:
Если до вызова Add в документе были вставлены изображения, изображения пропадают. Получается эффект затирания
Корректно будет так: если до вызова Add на текущую страницу были вставлены изображения, изображения пропадают.

Сейчас я поступаю следующим образом. Создаю документ, в цикле для каждой следующей страницы делаю
1. Задаю размеры страниц
2. Добавляю изображения
3. Добавляю WordArt-ы
4. Добавляю TextBox-ы
5. Добавляю нормальный текст

Попробовал добавлять WordArt самым первым, затем устанавливать размер страницы, затем все остальное. Первая страница сформировалась нормально, во второй словил исключение
Код:
m_Document->Fields->Add(GetRange(), &fieldIncludeText, &path, &preserveFormatting);
if(field->Update() == 0 || E_FAIL == field->Unlink()
{...}
else
{
    int c = m_Document->Shapes->Count;
    CComVariant count(c);
    wordArt = m_Document->Shapes->Item(&count);
    wordArt->TextEffect->PutFontSize(roundFontSize); //тут вылетело
    wordArt->TextEffect->PutFontName(wordFontName.c_str());
    wordArt->TextEffect->PutText(text.GetString());
    wordArt->TextEffect->PutFontBold(textBold);
    wordArt->TextEffect->PutFontItalic(textItalic);
}
вылетело в wordArt->TextEffect->PutFontSize(roundFontSize);

в обработке исключения
Код:
catch(_com_error& er)
{
const TCHAR * message = er.ErrorMessage();
message равен "The parameter is incorrect." при этом объект wordArt был добавлен в документ


Последний раз редактировалось Diego__; 21.09.2009 в 13:06.
Diego__ вне форума Ответить с цитированием
Старый 21.09.2009, 14:20   #17
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

1) Я не могу воспроизвести ваш эффект. Ничего не затирается. Изображения не пропадают. Word 2007 SP1 rus.
Выложите целевой файл сохранённый перед .add для поля. Определите точку вставки поля букмарком.
Выложите ваш doctemplate.xml.
2) В пути к вставляемому фрагменту слэши надо удваивать. И непонятно, квотируете ли вы двойные кавычки.
3) Что мешает устанавливать текст и параметры шрифта непосредственно в xml коде шейпа? Это можно сделать непосредственно, а можно с помощью XSL. Кстати, INCLUDETEXT понимает ссылку на XSL.
4) Общее впечатление, что вы неправильно формируете в цикле какой то параметр ...Проверьте в отладчике

Последний раз редактировалось Aent; 21.09.2009 в 14:31.
Aent вне форума Ответить с цитированием
Старый 21.09.2009, 15:27   #18
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

В прикреплении в архиве 2 файла, один перед добавлением Field-a, второй полностью заполненной первой страницей (изображения куда то пропали). doctemplate.xml - это wa.xml.

Не совсем понимаю
Цитата:
Определите точку вставки поля букмарком
Двойные кавычки я добавляю к основной стоке, т.е. программно у меня получается
Код:
"\"d:/DOCTemplate.xml\" \\* MERGEFORMAT"
в С++ символ после '\' интерпретируется как специальный, т.е. запись \" дает мне кавычки в строке, \\ - интерпретируется как один \.

Вы писали: "Что мешает устанавливать текст и параметры шрифта непосредственно в xml коде шейпа?". У меня каждый шаблон может иметь различные параметры шрифта (цвет, размер, название шрифта, болд, италик).

Пробую отлаживать, но пока верного решения не обнаружил
Вложения
Тип файла: rar Desktop.rar (129.4 Кб, 6 просмотров)
Diego__ вне форума Ответить с цитированием
Старый 21.09.2009, 19:16   #19
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

1) Bookmarks (Закладки) - коллекция именованных объектов Word, позволяющих ссылаться на места в документе. Cм. HELP по "закладки"
Я хотел что бы вы указали точку вставки поля на листе.
2) По синтаксису INCLUDETEXT для Winword в пути к вставляемому фрагменту слэши нужно удваивать.
Правильная строка для C++: "\"d:\\\\DOCTemplate.xml\" \\*MERGEFORMAT"
Т.е Word должен получить D:\\t.xml а не D:\t.xml
3)
Цитата:
У меня каждый шаблон может иметь различные параметры шрифта (цвет, размер, название шрифта, болд, италик).
Я всё таки не понял почему вы не можете при генерации XML для шейпа (при записи файла) сразу не установить требуемые текст и шрифт непосредственно в коде VML. Просто это нужно делать каждый раз перед добавлением поля и сразу делать обновление с отвязкой от источника . Или воспользоваться XSL и генерировать его для изменения атрибутов текста в шейпе. Я не вижу с этим проблемы.
4) Обратите внимание в каком слое находится вставляемый объект/холст.
5) Во вложении ваш файл с добавленным макросом.
Добавление идёт без проблем. Ничего не исчезает.
Вложения
Тип файла: rar Example.rar (134.4 Кб, 10 просмотров)

Последний раз редактировалось Aent; 21.09.2009 в 19:45.
Aent вне форума Ответить с цитированием
Старый 27.09.2009, 15:54   #20
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Я тут подумал, что в общем то поле для вставки вам не нужно.
Ничто не мешает использовать непосредственно метод InsertFile, применяя его к рангам на каждой странице куда вам нужно вставить шейп.
Aent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в lable задать степень (нижний и верхний регистр) Polotenchik Общие вопросы Delphi 17 17.07.2009 23:30
как задавать клавиши в Меню StudentPolitech Помощь студентам 1 10.12.2008 02:17
не просто текст, а как word или wordArt andrey4623 Общие вопросы Delphi 2 29.12.2007 21:11
Как задавать параметры в EXE ???? ПОМОГИТЕ! UnD)eaD)Snake Общие вопросы Delphi 2 22.07.2007 17:28
КАК поместить ИКОНКУ программы в правый нижний угол панели(там где пуск)??? micaell Общие вопросы Delphi 5 21.02.2007 19:58