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

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

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

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

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

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

Не понимаю.

Использую range->ComputeStatistics(Word::wdStatisti cLines) для получения количества занимаемых range-ем линий. Если мой range занимает более 1ой лини - уменьшаю размер шрифта range-a, для того чтобы мой текст уместился в 1 линию.

Формируемый мною документ разбит по разному на колонки(файл в прикреплении) 1ая страница - все хорошо, 2ая - нехорошо.

В первой колонке ComputeStatistics всегда корректно, в остальных при видимом range-e в одну строку возвращается значение отличное от 1, к примеру 5.
В прикрепленном файле где очень мелкий текст, там статистика возвращает значение линий более 1.
Почему это может происходить?
Вложения
Тип файла: doc test ComputeStatistic.doc (36.0 Кб, 12 просмотров)
Diego__ вне форума Ответить с цитированием
Старый 16.12.2009, 13:54   #2
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Набросал небольшой тест(C++)

int main()
{

CComVariant width1(m_AppWord->CentimetersToPoints(4));
CComVariant width2(m_AppWord->CentimetersToPoints(3));

CComVariant spacing1(m_AppWord->CentimetersToPoints(1.0f));

CComVariant columnBreak(Word::wdColumnBreak), sectionBreak(Word::wdSectionBreakCo ntinuous);
try
{
m_AppWord->Selection->PageSetup->LeftMargin = m_AppWord->CentimetersToPoints(2);
m_AppWord->Selection->PageSetup->RightMargin = m_AppWord->CentimetersToPoints(0.5f);
m_WordDocument->PageSetup->TextColumns->Add(&width1, &spacing1);
m_WordDocument->PageSetup->TextColumns->Add(&width2, &spacing1);


int number = 0;
number = InsertText(L"first dsf asd sdf asdf d ad fad fads fadsf adsfadsf adsfasd fasdfasdfasdfasdf adf adsf adsf")->ComputeStatistics(Word::wdStatisti cLines);
m_AppWord->Selection->InsertBreak(&columnBreak);

number = InsertText(L"second adsfadfads d d sad fdf asdfadsf ads fadsfadsf a")->ComputeStatistics(Word::wdStatisti cLines);
m_AppWord->Selection->InsertBreak(&columnBreak);

}


Word::RangePtr InsertText(wchar_t *text)
{
long numStart = m_WordDocument->Paragraphs->Last->Range->GetEnd() - 1;
numStart = max(0, numStart);

m_AppWord->Selection->TypeText(text);

long numEnd = m_WordDocument->Paragraphs->Last->Range->GetEnd();
numEnd = max(0, numEnd);

CComVariant end(numEnd);
CComVariant start(numStart);

return m_WordDocument->Range(&start, &end);
}

После второго вызова InsertText(L"second a..) текст занимает более одной линии, number при этом не соответствует этому числу number = 1. После первого вызова, в первой колонки, текст занял 2 колонки, number = 2 - все хорошо. Почему так?

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

Немного наблюдений: Создал 2 колонки, вставил текст во вторую колонку, получил статистику, количество строк = 3, а реально 6. 1ая колонка в 2 раз шире 2ой, если скопировать текст со второй и вставить в 1ую текст займет 3 строки "как утверждает статистика". Данное наблюдение повторилось при различных размерах колонок и с различной длинной текста. Похоже, что количество линий определяется по размеру 1ой колонки, хотя и не факт. Может я использую ComputeStatistic не верно? Существует функция задания текущей колонки?
Diego__ вне форума Ответить с цитированием
Старый 16.12.2009, 17:07   #4
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Цитата:
Сообщение от Diego__ Посмотреть сообщение
Немного наблюдений... Может я использую ComputeStatistic не верно?
А как авторы объектной модели Word думали? «В обычном тексте нормально считает — ну и ладненько!»

Я пытался верстать — и мне больше понравилось использовать ячейки таблиц, а не колонки. Поэтому здесь я пас.

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

Я сделал аналог на VBA.
Код:
Sub test()
  ActiveDocument.PageSetup.TextColumns.Add CentimetersToPoints(7), , False
  Debug.Print InsertText("first " & String(500, "f")).ComputeStatistics(wdStatisticLines)
  Selection.InsertBreak wdColumnBreak
  Debug.Print InsertText("second " & String(500, "a")).ComputeStatistics(wdStatisticLines)
End Sub

Function InsertText(TextString As String) As Range
  Dim nStart As Long
  Dim nEnd As Long
  
  nStart = Selection.Start
  Selection.TypeText TextString
  
  nEnd = Selection.End
  Set InsertText = ActiveDocument.Range(nStart, nEnd)
End Function
Правильное количество строк получается только для первой колонки текста. Для всех остальных колонок возвращается общее количество строк в документе.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с Range miatu Microsoft Office Word 6 07.09.2009 12:06
синтаксис Range ? kievlyanin Microsoft Office Excel 2 23.04.2009 13:32
Range & Cells ("")(Э_Є)("") Microsoft Office Excel 6 26.01.2009 11:19
количество цифр и количество символов до первой гласной буквы 111111 Общие вопросы C/C++ 2 22.12.2008 12:15
MS Word: Range kate4ka Общие вопросы Delphi 1 19.02.2008 06:14