Как отловить разрыв страницы

Автор Борис_С, 29 сентября 2020, 14:20

0 Пользователи и 1 гость просматривают эту тему.

Борис_С

Всем доброго дня!
Я анализирую текст в Writer. Двигаюсь по нему с помощью текстового курсора.
Можно как-то понять, что в каком-то месте текста есть разрыв страницы (переход на новую страницу)?
Спасибо.

economist

#1
Всё, как обычно, у Питоньяка:

oVCurs = ThisComponent.getCurrentController().getViewCursor()
oVCurs.jumpToLastPage() '(bExtend)  
oVCurs.jumpToEndOfPage()
oText = ThisComponent.getText()
oText.insertControlCharacter(oVCurs, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False) ' вставили Пустой абз
oVCurs.PageDescName = oVCurs.PageStyleName ' вставили Разрыв страницы + Оставляем предыдущий стиль страницы

Как видите - сложно даже со вставкой :-) Но разобраться можно.
Я предпочитаю не парсить док, а заранее знать где будет Разрыв страницы (ручной, тот который Ctrl+Enter или который предопределен Стилем). Для этого нужно переосмыслить док, создать стили, присвоить их и бить точно в цель.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Борис_С

У меня есть готовый документ. Мне не нужно корректировать его.
Мне нужно понять, где происходит переход на новую страницу.

sokol92

У Питоньяка эта техника изложена в подразделе "Keep the view cursor and text cursor in sync"
Процедура TextCursorPage показывает, находится ли текстовый курсор в начале или конце страницы.

Sub TextCursorPage(Byval oDoc, Byval oTextCursor)
  Dim oViewCursor, oText
  oText=oDoc.Text
  oViewCursor = oDoc.CurrentController.getViewCursor()
  oViewCursor.gotoRange(oTextCursor, False)
 
  oViewCursor.jumpToStartOfPage()
  Msgbox "Курсор находится " & IIf(oText.compareRegionStarts(oTextCursor, oViewCursor)=0, "", " не ") & "на начале страницы"
 
  oViewCursor.jumpToEndOfPage()
  Msgbox "Курсор находится " & IIf(oText.compareRegionStarts(oTextCursor, oViewCursor)=0, "", " не ") & "в конце страницы"

End Sub

Sub TestCursor()
  Dim oTextCursor
  oTextCursor =ThisComponent.Text.createTextCursorByRange(ThisComponent.CurrentController.getViewCursor())
  TextCursorPage ThisComponent, oTextCursor
End Sub

Владимир.

Борис_С

Спасибо. Похоже без отображаемого курсора не обойтись.
Я то хотел все это сделать с помощью текстового курсора, чтобы текст не скакал по экрану,
но похоже с этим API это невозможно.

sokol92

C мельканием экрана можно так бороться:

Sub TestCursor2()
  Dim oViewCursor, i As Long
  oViewCursor =ThisComponent.CurrentController.getViewCursor()

  ThisComponent.lockControllers()

  For i=1 To 40
    oViewCursor.jumpToPage(i)
    Wait 100
  Next i 
 
  ThisComponent.unlockControllers()
 
End Sub
Владимир.

Борис_С

Владимир, вы не сокол, вы - ангел. Это именно то, что мне нужно. Спасибо.