Очень нуждаюсь в вашей помощи.
Установлен 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, находится ли искомое в сноске?
Заранее благодарен всем, кто поможет.
В OOo/LO можно проверить, поддерживает ли объект использование интерфейса следующей конструкцией:
If HasUnoInterfaces (oObject, "com.sun.star.text.XText") Then
Данная конструкция проверяет, поддерживает ли данный объект (oObject) работу с текстом.
Возможно, это поможет при решении данной задачи.
Спасибо, попробую, но уже после выходных...
Если что - напишу о результате.
Цитата: Yakov от 28 декабря 2012, 09:53В OOo/LO можно проверить, поддерживает ли объект использование интерфейса следующей конструкцией:
Код:
If HasUnoInterfaces (oObject, "com.sun.star.text.XText") Then
Данная конструкция проверяет, поддерживает ли данный объект (oObject) работу с текстом.
Возможно, это поможет при решении данной задачи.
Код не помогает: даже на найденном в абзаце он не срабатывает, что это - абзац. Тем более на сносках и т.д.