LibreOfficeWrite: Макрос перехода текстового курсора oCurs на найденное в vFound

Автор kvesda, 27 декабря 2012, 08:52

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

kvesda

Очень нуждаюсь в вашей помощи.
Установлен LibreOffice 3.6.4.3
Есть такой простенький код форматирования текста документа:

Sub Main
    Dim oDoc As Object : oDoc = ThisComponent
    Dim oEndCurs As Object ' окончание документа
    oEndCurs = oDoc.getText().createTextCursor()
    oEndCurs.gotoEnd( False )
    Dim oCurs As Object
    oCurs = oDoc.getText().createTextCursor() ' текущий курсор

    Dim vSearch As Variant
    vSearch = oDoc.createSearchDescriptor()
    Dim vFound As Variant
    With vSearch
        .SearchRegularExpression = False
        .SearchString = "С++"
        .ValueSearch = False
    End With

    Do While Not oDoc.Text.compareRegionEnds( oCurs, oEndCurs ) <= 0
        vFound = oDoc.findNext( oCurs.getEnd(), vSearch )
        If IsNull( vFound ) Then Exit Do
        oCurs.gotoRange( vFound, False )
        oCurs.CharPosture = com.sun.star.awt.FontSlant.ITALIC
    Loop
    Print "Документ обработан."
End Sub


Код работает хорошо: находит заданное поисковое выражение в документе и форматирует его курсивом.

Проблема возникает, когда в документе есть сноски/таблицы/врезки, содержащие заданное поисковое выражение. Тогда происходит "Ошибка времени выполнения BASIC" на строке:

oCurs.gotoRange( vFound, False )

Курсор oCurs не может переместиться на найденное (vFound).

В связи с этим у меня 2 взаимосвязанных вопроса:
1. Как переиестить курсор в сноску/таблицу/врезку, чтобы не возникала ошибка?
2. По свойствам vFound (TextTable и TextFrame) можно определить, находится ли найденное в таблице/врезке. Но НЕЛЬЗЯ определить, находится ли найденное в сноске (свойство Footnote не работает - оно всегда пустое, даже если искомое выражение было найдено в сноске). По vFound.ParaStyleName и/или vFound.ParaConditionalStyleName не всегда можно корректно проверить - если текст сноски имеет НЕ СТАНДРТНЫЙ стиль, то никогда ParaStyleName и/или ParaConditionalStyleName не дадут нужного "Footnote".
Как же все-таки определить по vFound, находится ли искомое в сноске?

Заранее благодарен всем, кто поможет.

Yakov

В OOo/LO можно проверить, поддерживает ли объект использование интерфейса следующей конструкцией:


If HasUnoInterfaces (oObject, "com.sun.star.text.XText") Then


Данная конструкция проверяет, поддерживает ли данный объект (oObject) работу с текстом.

Возможно, это поможет при решении данной задачи.

kvesda

Спасибо, попробую, но уже после выходных...
Если что - напишу о результате.

kvesda

Цитата: Yakov от 28 декабря 2012, 09:53В OOo/LO можно проверить, поддерживает ли объект использование интерфейса следующей конструкцией:

Код:

If HasUnoInterfaces (oObject, "com.sun.star.text.XText") Then


Данная конструкция проверяет, поддерживает ли данный объект (oObject) работу с текстом.

Возможно, это поможет при решении данной задачи.
Код не помогает: даже на найденном в абзаце он не срабатывает, что это - абзац. Тем более на сносках и т.д.