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

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

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

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

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

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

код на С++

Создал новый документ, задал маргины

Код:
Word::SectionPtr lastSection = m_WordDocument->Sections->GetLast();
	
lastSection->PageSetup->BottomMargin = m_AppWord->CentimetersToPoints(1);
lastSection->PageSetup->TopMargin = m_AppWord->CentimetersToPoints(1);
lastSection->PageSetup->LeftMargin = m_AppWord->CentimetersToPoints(1);
lastSection->PageSetup->RightMargin = m_AppWord->CentimetersToPoints(10);
Дальше, в цикле вставляю текст

Код:
Word::ParagraphPtr paragraph = m_WordDocument->GetParagraphs()->GetLast();
paragraph->PutSpaceBefore(spaceBefore);

Word::RangePtr range = paragraph->GetRange();
range->InsertAfter(text);	

Word::_FontPtr font = range->GetFont();
font->PutName(fontName);
font->PutSize(fontSize);
font->PutColor(Word::WdColor(color));
Как на i-ой итерации цикла узнать в какую точку документа будет вставлен текст? При этом устанавливая маргины станицы, спейсинги и индеты параграфам.

Можно ли узнать размер вводимого текста? Если у нас есть текст в заранее не известного размера, после вставки его на страницу, существует возможность узнать его параметры (например: описывающий прямоугольник)?
Diego__ вне форума Ответить с цитированием
Старый 04.12.2009, 06:26   #2
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Есть такой объект Надпись — по сути, текстбокс. С ней в вашем случае было бы удобнее работать.

Обычный же текст на странице (поскольку ширина знаков и пробелов разная) трудно «просчитать» как прямоугольник известного размера. Легче экпериментально выяснить, задав шрифт, поля, интерлиньяж, отступы красной строки, пробел между абзацами... много чего.

Наверное, высота этого прямоугольника пропорциональна размеру шрифта в квадрате. Но точнее не скажу.

Последний раз редактировалось Sasha_Smirnov; 04.12.2009 в 06:34.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 04.12.2009, 09:41   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Я уже отвечал на этот вопрос на другом форуме. Хочу уточнить: что ты подразумеваешь под точкой документа? Что значит для тебя «размер вводимого текста»
После вставки текста в документ, он «растворяется» в тексте. Если знаешь место, куда вставляешь текст, т.е. смещение от начала документа, то, зная длину текста, можно определить куда попал его конец, а также, как изменился документ: добавились ли страницы, абзацы, разделы и т.д.
Насколько я помню, ты занимаешься перегонкой из pdf, но там несколько другая объектная модель и как её сопоставить с моделью Word, я не знаю.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 04.12.2009, 12:03   #4
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

В данном случае мне не походит использование текстбокса.

Под точкой в документе подразумеваю расстояние от верхнего левого угла страницы.
«размер вводимого текста» - есть начало документа, я задал маргин, отступ и все такое, т.е. я знаю точку начала ввода. Ввожу текст
Код:
Word::RangePtr range = paragraph->GetRange();
range->InsertAfter(text);
"где я" сейчас? Есть ли возможность, зная параметры текста и сам текст, узнать в сантиметрах его высоту, длину, сколько строк он занимает?
Цитата:
Если знаешь место, куда вставляешь текст, т.е. смещение от начала документа, то, зная длину текста, можно определить куда попал его конец, а также, как изменился документ: добавились ли страницы, абзацы, разделы и т.д.
- Можешь подсказать, привести пример как узнать "куда попал его конец" (текста) ?
Цитата:
Я уже отвечал на этот вопрос на другом форуме.
- можно ссылку на форум? Не я, часом, было автором на том форуме
Diego__ вне форума Ответить с цитированием
Старый 04.12.2009, 13:53   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Diego__ Посмотреть сообщение
"где я" сейчас? Есть ли возможность, зная параметры текста и сам текст, узнать в сантиметрах его высоту, длину, сколько строк он занимает?…
Пока ты текст не введешь, ты не можешь знать его размеры. Range абстрактно не существует, только в привязке к конкретному документу.
Попробуй так, вроде бы даёт то, что тебе нужно:
Код:
Sub RangeSize()
  Dim pLeft As Long
  Dim pTop As Long
  Dim pWidth As Long
  Dim pHeight As Long
  Dim oRngPage As Range
  'начало страницы, на которой заканчивается диапазон
  Set oRngPage = .Range.GoTo(wdGoToPage, wdGoToAbsolute, Selection.Information(wdActiveEndPageNumber))
  'Задаём диапазон от начала страницы до конца выделенного текста
  oRngPage.SetRange oRngPage.Start, Selection.End
  'Считаем размеры диапазона в пикселах
  ActiveDocument.Windows(1).GetPoint pLeft, pTop, _
        pWidth, pHeight, oRngPage
  Debug.Print "Верхний левый угол: (" & PointsToCentimeters(PixelsToPoints(pLeft)) & ";" & PointsToCentimeters(PixelsToPoints(pTop)) & ")"
  Debug.Print "Ширина: " & PointsToCentimeters(PixelsToPoints(pWidth)) & vbTab & "Высота: " & PointsToCentimeters(PixelsToPoints(pHeight))
End Sub

Цитата:
Сообщение от Diego__ Посмотреть сообщение
…Под точкой в документе подразумеваю расстояние от верхнего левого угла страницы…
В этом ты расходишься с Майкрософтом. Объекта Page в Word нет. Можно лишь получить диапазон (Range), соответствующий определённой странице
Цитата:
Сообщение от Diego__ Посмотреть сообщение
- можно ссылку на форум? Не я, часом, было автором на том форуме
На винграде
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 04.12.2009, 17:07   #6
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Спасибо, кое что получилось.

Есть какие-нибудь ограничения на работу с GetPoint, если окно невидимо, может это повлиять?

Если текст моего ренжа занимает больше 1ой страницы ширина и высота получаемые из GetPoint дают мне не совсем "то", хотя и ожидаемый результат. Как правильно определить принадлежит ли данный ренж более чем 1ой странице?
Diego__ вне форума Ответить с цитированием
Старый 04.12.2009, 17:11   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Код:
Range.ComputeStatistics(wdStatisticPages)
Положение Range относительно видимой области экрана не имеет значения. По крайней мере, я не заметил.
Лучше день потерять — потом за пять минут долететь!©

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

Спасибо, еще раз.

Последний метод оказался очень полезным
Diego__ вне форума Ответить с цитированием
Старый 05.12.2009, 17:56   #9
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Тут всё грустнее. Расстояние точки на странице от верхнего угла печатного листа помимо всего прочего зависит и от установленного
принтера по умолчанию...
Т.е. даже получив эту координату вы будете иметь нулевую портабельность.
Всё таки Word это текстовый процессор а не система полиграфической вёрстки
Aent вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вставить кусок текста в текст Tomatos Общие вопросы Delphi 5 24.09.2009 21:00
Как узнать куда и что отправляет программа? TwiX Работа с сетью в Delphi 9 10.08.2009 08:17
как узнать положение CheckBox в StringGrid Lisi4ka Общие вопросы Delphi 1 04.05.2009 20:58
Как узнать размер файла имея его URL SeRhy Работа с сетью в Delphi 2 19.04.2009 21:04