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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2009, 12:54   #1
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию Как вставлять WordArt и TextBox на "текущую" страницу?

Последовательно вставляю

изображения
m_Document->Paragraphs->Last->Range->GetInlineShapes()->AddPicture(imagePath.GetString() );
Word::ShapePtr shapePtr = inlineShape->ConvertToShape();

shapePtr->WrapFormat->Type = Word::wdWrapBehind;
...

текстовые блоки
Word::ShapePtr textBox = m_Document->GetShapes()->AddTextbox(Office::msoTextOrientat ionHorizontal, ...);
textBox->WrapFormat->Type = Word::wdWrapFront;
...
textBox->GetTextFrame()->GetTextRange()->InsertAfter(L"privet");


объекты WordArt
Word::ShapePtr wordArt = m_Document->GetShapes()->AddTextEffect(Office::msoTextEffec t1, ...);
wordArt->WrapFormat->Type = Word::wdWrapFront;
...


обычный текст
m_Document->GetParagraphs()->GetLast()->GetRange()->InsertAfter(L"privet");
...

ставлю break
CComVariant m_PageBreak(Word::wdSectionBreakNex tPage);
m_WordDocument->GetParagraphs()->GetLast()->GetRange()->InsertBreak(&m_PageBreak);

еще раз повторно все вставляю. Все текстовые блоки и WordArt вставляются только на первую страницу, обычный текст и изображения - на следующую (нормально). Как сделать, чтобы после break-a текстовые блоки и WordArt вставлялись на текущую страницу, а не на первую? Можно ли этого добиться без использования Selection-a? очень не хочется использовать selection
Diego__ вне форума Ответить с цитированием
Старый 10.09.2009, 13:54   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

У объекта Range есть метод GoTo, который позволяет перенести диапазон на конкретную страницу. Пример использования показан в этой, очень недавней теме
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 10.09.2009, 17:48   #3
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

В данной теме Вы приводите пример вставки изображений. Они вставляются в Range через InlineShapes.AddPicture(...). У меня не получается добавить Shape-ы: TextBox и WordArt. Мне известны только 2 метода, как это сделать

m_Document->GetShapes()->AddTextEffect
m_Document->GetShapes()->AddTextbox

у Range-a я не нашел ничего похожего.

Попробовал после
m_WordDocument->GetParagraphs()->GetLast()->GetRange()->InsertBreak(&m_PageBreak);
вставить

CComVariant toPage(Word::wdGoToPage);
CComVariant toNext(Word::wdGoToNext);

m_WordDocument->GetParagraphs()->GetLast()->GetRange()->GoTo(&toPage, &toNext);

результат не радует - все текстовые блоки и WordArt на 1ой странице.
Что я делаю не так?
Diego__ вне форума Ответить с цитированием
Старый 10.09.2009, 18:06   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Правильно, InlineShapes, а затем, когда я уже вставил их на нужную страницу, я их конвертирую в обычный Shape
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 10.09.2009, 18:26   #5
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Как добавить WordArt и/или TextBox как InlineShape?
Diego__ вне форума Ответить с цитированием
Старый 10.09.2009, 18:47   #6
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Рискну предположить, что есть метод GetInlineShape, аналогичный методу GetShape
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 10.09.2009, 19:08   #7
miatu
Пользователь
 
Регистрация: 26.08.2009
Сообщений: 22
По умолчанию

У range есть метод GetInlineShapes(), GetShapes() метода у range нету.

Пробовал добавлять textBox через InlineShapes, не получилось.

Word::InlineShapePtr inlineShape = m_WordDocument->GetParagraphs()->GetLast()->GetRange()->GetInlineShapes()->AddPicture(L"C:\\1.jpg", &CComVariant(FALSE), &CComVariant(TRUE));
Word::ShapePtr shape = inlineShape->ConvertToShape();
shape->TextFrame->TextRange->InsertAfter(L"sdf");
miatu вне форума Ответить с цитированием
Старый 10.09.2009, 19:16   #8
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Вот часть кода из той темы, на которую я ссылался:
Код:
  'Переходим на указанную страницу
  Set oRng = ActiveDocument.Range.GoTo(wdGoToPage, wdGoToAbsolute, iPage)
  'Добавляем в текст этой страницы картинку
  Set oInShp = oRng.InlineShapes.AddPicture(sPicPath, False, True, oRng)
Как можно увидеть, в качестве последнего параметра этого метода указан oRng в качестве якоря. Этот параметр не является обязательным, но в данном случае он критичен. Предварительно перед этим я задал в oRng нужную страницу. Сделайте все так же.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 10.09.2009, 19:29   #9
miatu
Пользователь
 
Регистрация: 26.08.2009
Сообщений: 22
По умолчанию

Вот так пробую:

CComVariant pageBreak(Word::wdSectionBreakNextP age);

Word::RangePtr range = m_WordDocument->Range();

range->InsertParagraphAfter();
range->InsertBreak(&pageBreak);

range->GoTo(&CComVariant(Word::wdGoToPage ), &CComVariant(Word::wdGoToAbsolut e), &CComVariant(2));

Word::ShapePtr textBox = m_WordDocument->Shapes->AddTextbox(Office::msoTextOrientat ionHorizontal,
m_AppWord->CentimetersToPoints(10),
m_AppWord->CentimetersToPoints(5),
100, 100, &CComVariant(range));

Вылетает при вставке текс бокса. Там последний параметр VARIANT* Anchor. Может неправильно передаю?
miatu вне форума Ответить с цитированием
Старый 10.09.2009, 19:43   #10
miatu
Пользователь
 
Регистрация: 26.08.2009
Сообщений: 22
По умолчанию

Все проблема решена. Вот код:

CComVariant pageBreak(Word::wdSectionBreakNextP age);

Word::RangePtr range = m_WordDocument->Range();

range->InsertParagraphAfter();
range->InsertBreak(&pageBreak);

VARIANT anchor;
anchor.vt=VT_DISPATCH;
anchor.pdispVal=range;

Word::ShapePtr textBox = m_WordDocument->Shapes->AddTextbox(Office::msoTextOrientat ionHorizontal,
m_AppWord->CentimetersToPoints(10),
m_AppWord->CentimetersToPoints(5),
100, 100, &anchor);
miatu вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Паскаль. 2 задачи (Программа "Верификация","КАК БРИГАДИРУ РАЗДЕЛИТЬ ЗАРОБОТАННЫЕ ДЕНЬГИ") Valik102 Помощь студентам 3 20.05.2009 20:42
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49
Webbrowser и "Невозможно отобразить страницу" celovec Работа с сетью в Delphi 1 06.07.2007 13:45