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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2009, 19:09   #1
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию Как перейти selection-ом в конец документа?

Ввожу текст в документ. Периодически меняю количество столбцов.

Затем формирую несколько текстовых блоков:
for (int i = 0; i < 5; ++i)
{
Word::ShapePtr textBox = m_WordDocument->Shapes->AddTextbox (Office::msoTextOrientationHorizont al, m_AppWord->CentimetersToPoints(5 + i*3), m_AppWord->CentimetersToPoints(5), 100, 100);
Word::TextFramePtr textFrame = textBox->GetTextFrame();
if (!textFrame)
return ;

Word::RangePtr textRange = textFrame->GetTextRange();
if (!textRange)
return ;

textRange->Select();
m_AppWord->GetSelection()->TypeText(L"param pam pam");
}
После этого каретка установлена в последнем текстовом боксе. Перевожу ее к основному тексту:
Word::SelectionPtr sel = m_AppWord->GetSelection();
sel->GoTo();

Здесь хочу сделать переход на новус страницу:
CComVariant variant(Word::wdSectionBreakNextPag e);
m_AppWord->GetSelection()->InsertBreak(&variant);

Но каретка стоит в начале страницы. Если я выполню последние 2 строчки кода, выше введенный текст перепрыгнет на следующую страницу. Как перевести каретку в конец основного введенного текста?
Пробую методом selection-a MoveRight, но я точно не подсчитываю сколько чего я ввел. Что здесь можно сделать?
Diego__ вне форума Ответить с цитированием
Старый 25.08.2009, 19:48   #2
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

пробую:
после основного текста
Word::RangePtr range = m_AppWord->GetSelection()->GetRange();

... добавляю текстовые блоки ...

m_AppWord->GetSelection()->GoTo();
m_AppWord->GetSelection()->SetRange(range->GetStart(), range->GetEnd());

все нормально, но если основного текста нет - текстовые блоки перепрыгивают на след страницу.

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

Код:
Selection.EndKey Unit:=wdStory
А перейти на следующую страницу можно методом GoTo, но указав его параметры:
Код:
Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext
Добавлено позже
Еще замечания. Чтобы добавить текст в диапазон (Range) его совершенно необязательно выделять. Вот это:
Код:
textRange->Select();
m_AppWord->GetSelection()->TypeText(L"param pam pam");
лишнее. У объекта Range есть как минимум три способа, которыми можно изменить его содержимое:
Range.Text = "заменяем содержимое указанного диапазона"
Range.InsertAfter "добавляем текст после диапазона"
Range.InsertBefore "Добавляем текст перед диапазоном"

По всей видимости должно быть так:
Код:
textRange->Text = "param pam pam"
Ну а если потом нужно добавить страницу, то без объекта Selection, предлагаю так:
Код:
Word::RangePtr textRange = m_WordDocument->GetRange();
textRange->Collapse(m_AppWord->wdCollapseDirection->wdCollapseEnd);
CComVariant variant(Word::wdSectionBreakNextPage);
textRange->InsertBreak(&variant);
Почему я не советую использовать Selection? Потому что работа с этим объектом вызывает мерцание на экране и уменьшает быстродействие. В подавляющем большинстве случаев можно и нужно обходится объектом Range. Тем более, если ты пишешь стороннее приложение, которое работает с Word через COM.
В случае, если ты работаешь с Selection, тебе необходимо показать приложение и документы в нем, чтобы что-то с ними делать. В случае же с Range и приложение и документы могут оставаться невидимыми, пока ты не закончишь свое черное дело. Могу привести пример такой работы c Word программой SolidWorks: она формирует сведения о проекте в виде документа Word, но при этом показывает готовый результат, а не заставляет пользователя наблюдать за процессом последовательного заполнения документа.
Пишу это тебе, Diego__, потому что чувствую, что семена упадут в благодатную почву.
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 26.08.2009 в 03:51.
viter.alex вне форума Ответить с цитированием
Старый 26.08.2009, 17:38   #4
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Спасибо, viter.alex. Вы, мне здорово помогли.

Вопросик по поводу быстродействия: насколько Range лучше/быстрее чем Selection?
В С++ у меня получается работать через Selection с невидимым документом. В каких случаях лучше использовать каждый из этих объектов?
Diego__ вне форума Ответить с цитированием
Старый 26.08.2009, 18:16   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Насколько быстрее, сказать не могу. Но быстрее, ведь действия с Range не требуют не прорисовываются на экране. Я подумаю над тестовой программкой.
Я всегда работаю с Range. Selection использовал в двух случаях: для определения объединенных ячеек в таблице (через Range не работает) и для вставки разделителя стилей (у Range нет такого метода). А также тогда, когда нужно получить выделенный объект от пользователя (таблицу там, рисунок и пр.)
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как перейти на сайт kuzmich Общие вопросы Delphi 2 01.06.2009 21:12
Как перейти на адрес сайта? eldar PHP 11 29.05.2009 21:06
Как перейти на ячейку komar73 Microsoft Office Excel 2 09.02.2009 13:30
Как перейти по ссылке (URL) Avron Общие вопросы Delphi 3 22.12.2008 16:56
Как перейти на следущюю строку? nikleb Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 16.06.2008 21:19