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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2009, 12:33   #1
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию Проблема с Window->GetPoint

Код на С++.

Создаю документ.
В цикле вставляю в него текст.

Код:
test.AddNewDocument(true);
		
int i = 0;
int count = 5;
for (i; i < count ; ++i)
{
        test.WindowGetPointTest();
	test.InsertParagraph();

	test.WindowGetPointTest();
	test.InsertParagraph();

	if (i != count - 1)
		test.InsertRangePageBreak();
}
Код:
void Test::AddNewDocument(bool show)
{
	m_WordDocument = m_AppWord->Documents->Add();
	m_Window = m_WordDocument->GetActiveWindow();
	
	m_Window->PutVisible(show);
        m_Window->GetView()->GetZoom()->PutPercentage(100);
}
void Test::WindowGetPointTest()
{
	try
	{
		long numStart = m_WordDocument->GetParagraphs()->GetLast()->GetRange()->GetEnd();

		Word::RangePtr range = m_WordDocument->GetParagraphs()->GetLast()->GetRange();
		range->InsertAfter(L"Param pam pam");	

		long numEnd = m_WordDocument->GetParagraphs()->GetLast()->GetRange()->GetEnd();

		//узнаю размер вставленного текста:

		if (numStart != numEnd)
		{
			CComVariant end(numEnd);	
			CComVariant start(numStart);

			Word::RangePtr caclulateRange = m_WordDocument->Range(&start, &end);

			long left = 0, top = 0, width = 0, height = 0;
			m_Window->GetPoint(&left, &top, &width, &height, range); //кидает комовское исключение
		}
	}
	catch (_com_error &er)
	{
			const TCHAR * comMessage = er.ErrorMessage();
	}
}
void Test::InsertParagraph()
{
	try
	{
		Word::RangePtr range = m_WordDocument->GetParagraphs()->GetLast()->GetRange();
		range->InsertParagraphAfter();
	}
	catch (_com_error &er)
	{
		const TCHAR * message = er.ErrorMessage();
	}
}
void Test::InsertRangePageBreak()
{
	CComVariant pageBreak(Word::wdSectionBreakNextPage);
	CComVariant continuousBreak(Word::wdSectionBreakContinuous);

	try
	{
		m_WordDocument->GetParagraphs()->GetLast()->GetRange()->InsertParagraphAfter();
		m_WordDocument->GetParagraphs()->GetLast()->GetRange()->InsertBreak(&continuousBreak);	
		m_WordDocument->GetParagraphs()->GetLast()->GetRange()->InsertBreak(&pageBreak);	
		m_WordDocument->GetParagraphs()->GetLast()->GetRange()->InsertParagraphAfter();
	}
	catch(_com_error &er)
	{
		const TCHAR * message = er.ErrorMessage();
	}
}
В функции WindowGetPointTest метод m_Window->GetPoint кидает комовское исключение. Это происходит на разных итерациях цикла бывает при i = 0, = 1, = 4. Точно не пойму, может, это зависи от видимости окна (widnows-a), в msdn-е сказано
Цитата:
Window.GetPoint Method
...
Remarks
If the entire range or shape isn't visible on the screen, an error occurs.
но, как при true или false бывает работае, бывает нет.

В чем здесь может быть проблема?

Последний раз редактировалось Diego__; 11.12.2009 в 17:06.
Diego__ вне форума Ответить с цитированием
Старый 11.12.2009, 15:48   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Может в проблема в глюке? Точно весь диапазон виден?
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 11.12.2009, 16:59   #3
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Ага... начинаю понимать
я расценил "isn't visible" как какой-то скрытый элемент, присутствующий на странице, но не отображаемый. Теперь мне ясно...
Не совсем понятно как "правильно" за вводимым текстом скроллировать документ. Если есть range, можно отцентрировать документ по нему не меня View-шный zoom?
Diego__ вне форума Ответить с цитированием
Старый 11.12.2009, 17:00   #4
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Успех.

CComVariant start(true);
m_Window->ScrollIntoView(range, &start);

где то так.
Diego__ вне форума Ответить с цитированием
Старый 11.12.2009, 17:02   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Не «где-то», а именно так!
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 11.12.2009, 17:17   #6
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

спасибо за наводящий вопрос
Diego__ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование в X Window TheVampire Общие вопросы C/C++ 1 04.10.2009 19:14
Immediate Window ZORRO2005 Microsoft Office Excel 1 24.05.2008 16:23
window() ( Pascal ) Artificial Помощь студентам 1 16.01.2008 21:50
Функция window( ). Adamant Общие вопросы C/C++ 1 27.10.2007 09:10