Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Определение номера страницы в RichTextBox


Автор: ProgramerForever 20.8.2018, 21:39
Добрый день, уважаемые участники форума.
Подскажите, как определать номер страницы найденного текста, в RichTextBox? Везде говорится про номер строки и метод .GetLineFromCharIndex(position)
Код

'rtb(i) - RichTextBox
'findPos - позиця найденного текста
Dim findPos As Long = rtb(i).Find(txtQuery.Text)
x.subitems(2).text = CStr(rtb(i).GetLineFromCharIndex(findPos)) + " строка"

Автор: diadiavova 22.8.2018, 00:09
Возможно есть смысл подсчитать в тексте символы https://en.wikipedia.org/wiki/Page_break. 

Автор: ProgramerForever 25.8.2018, 18:17
Для перехода на новую строку в rtf используется \page . В моём документе этого нет. Видимо текст сплошняком идёт, а при открытии в Word он сам разбивает на страницы.
Пару костылей приходят в голову, но хочется более красивого решения
1) Взять текст, сделать split по \n, суммировать длины получившихся строк, деленных на 80, результат разделить на 45. (45 строк, 80 символов в строке)
2) Загрузить в Word, и там попытаться получить номер страницы. Уверен что в Word это сделать проще.
Пример файла в аттаче

Автор: diadiavova 26.8.2018, 01:02
Цитата(ProgramerForever @  25.8.2018,  18:17 Найти цитируемый пост)
Взять текст, сделать split по \n, суммировать длины получившихся строк, деленных на 80, результат разделить на 45. (45 строк, 80 символов в строке)

Тогда уж проще умножить 45 на 80, получить количество символов на странице и разбить документ на блоки такого размера, только что-то мне подсказывает, что это даст неверный результат. Хотя, если учитывать границы слов и тому подобные вещи, то почему бы и не попробовать.

Цитата(ProgramerForever @  25.8.2018,  18:17 Найти цитируемый пост)
 Загрузить в Word, и там попытаться получить номер страницы. Уверен что в Word это сделать проще.

Ну в ворде номер текущей страницы отображается в строке состояния, а если надо программно получить номер страницы, на которой находится курсор или выделение, то можно сделать так
Код

   MsgBox Selection.Information(wdActiveEndPageNumber)
Но, кстати, ворд тоже может делить по-разному, там можно даже параметры деления на страницы задавать. И там учитывается не только количество символов, но и размер шрифта и тому подобные вещи, поскольку страница должна вписываться в определенные размеры. Так что здесь еще неплохо бы выяснить для чего это нужно.

Автор: ProgramerForever 26.8.2018, 02:55
Понятно что точность подобных методов плюс-минус лапоть, потому и говорю, что костыль. Нужно это всё для поиска по документам. Программа ищет текст в документах и выдаёт результат: что найдено, в каком документе, на какой странице.

Автор: diadiavova 26.8.2018, 11:42
ProgramerForever, тут вопрос в том, по какому принципу нужно делить документ на страницы. Так как это делает ворд? Тогда вопрос в том, какие настройки использовать, ведь ворд делает это для печати и тому подобных вещей. Если есть возможность загрузить все в ворд, то там можно найти логические разрывы страниц, например так
Код

    Selection.Find.Execute ("^m")
Каждый такой вызов будет перемещать выделение к концу логической страницы, куда можно вставить реальные разрывы. Таким образом можно в цикле обойти загруженный документ, повставлять разрывы и сохранить, тогда в документе уже будут присутствовать реальные разрывы и с ними уже можно будет работать.

Автор: ProgramerForever 26.8.2018, 13:17
Спасибо. я опробую этот вариант. Всё равно некоторый препроцессинг делается с файлами (переводится в rtf, он быстрее и надёжнее грузится), там и это можно добавить.

Автор: ProgramerForever 10.9.2018, 02:06
Попробовал такой метод. Не получилось, т.к. в исходном документе нет разрывов страниц, Word их тоже не видит. Открыл в Word вручную и пробовал заменить "^m" на свой текст. Результат - Произведено 0 замен.

Автор: diadiavova 11.9.2018, 00:30
ProgramerForever, ну я там говорил не об использовании функции замены, а о выполнении приведенного кода в макросе. Но сейчас снова попробовал этот код и что-то он не работает, хотя в тот раз работал. Странно. Наверно надо этот вопрос задавать в разделе, посвященном VBA, там лучше знают как это сделать. Могу перенести тему туда, если хочешь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)