Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
94
Добавлен:
11.05.2015
Размер:
616.76 Кб
Скачать
      1. Но я только хочу найти графические объекты

Я проверил этот макрос на документе OOo Writer и он пересмотрел все графические объекты. Это явно наиболее быстрый способ найти графические объекты.

Листинг 7.16.5.1:Find all items on a draw page Найти все элементы страницы чертежа, графики (draw page).

Dim i As Integer

Dim oGraph

For i=0 To ThisComponent.Drawpage.getCount()-1

oGraph = ThisComponent.Drawpage.getByIndex(i)

Next i

      1. Найти текстовое поле, содержащееся в текущем параграфе?

CPH (Mr. Hennessy) хотел текстовое поле в начале текстового параграфа

  1. Можно перебирать текстовые поля, проверяя, привязаны ли они к текущему параграфу.

  2. Текстовый курсор может перебирать содержимое, но текстовые поля не включаются в перебор.

  3. Можно передвигать курсор на один симовол за один раз через весь текущий параграф в поисках полей (см. 7.16.6.1). Похожий способ использован для определения, содержится ли текущий курсор в текстовой таблице или ячейке (см. 7.1.1.1 и 7.1.2.1).

Листинг 7.16.6.1:Использовать курсор для поиска текстового поля.

oTCurs.gotoStartOfParagraph(False)

Do While oTCurs.goRight(1, False) и NOT oTCurs.isEndOfParagraph()

If NOT IsEmpty(oTCurs.TextField) Then

Print "Найдено поле путем перемещения курсора по тексту."

End If

Loop

Перебор текстового содержимого из текстового курсора будет перебирать графические объекты, но это НЕ перебирает текстовые поля.

Листинг 7.16.6.2:Перебрать текстовое содержимое.

sTContentService = "com.sun.star.text.TextContent"

oEnum = oTCurs.createContentEnumeration(sTContentService)

Do While oEnum.hasMoreElements()

oSect = oEnum.nextElement()

Print "Enumerating TextContent: " & oSect.ImplementationName

Loop

Текущий параграф может быть перебран из текстового курсора.

Листинг 7.16.6.3:Начать перебор из текстового курсора.

oEnum = oTCurs.createEnumeration()

Do While oEnum.hasMoreElements()

v = oEnum.nextElement()

oSecEnum = v.createEnumeration()

Do While oSecEnum.hasMoreElements()

oSubSection = oSecEnum.nextElement()

If oSubSection.TextPortionType = "TextField" Then

REM Заметьте, что доступ осуществляется к Textfield ,

REM Можно также получить доступ к

REM TextFrame, TextSection, или TextTable.

'Текстовое поле здесь

ElseIf oSubSection.TextPortionType = "Frame" Then

'Графические объекты здесь!

End If

Loop

Loop

Собирая макросы вместе в единую программу, получаем следующее:

Листинг 7.16.6.4:Найти графические объекты и текстовые поля в текущем параграфе.

Sub GetTextFieldFromParagraph

Dim oEnum 'Cursor enumerator.

Dim oSect 'Current Section.

Dim s$ 'Generic string variable.

Dim oVCurs 'Holds the view cursor.

Dim oTCurs 'Created text cursor.

Dim oText 'Text object that contains the view cursor

Dim sTContentService$

sTContentService = "com.sun.star.text.TextContent"

REM Only the view cursor knows where a line ends.

oVCurs = ThisComponent.CurrentController.getViewCursor()

REM Use the text object that contains the view cursor.

oText = oVCurs.Text

REM Require a text cursor so that you know where the paragraph ends.

REM Too bad the view cursor is not a paragraph cursor.

oTCurs = oText.createTextCursorByRange(oVCurs)

oTCurs.gotoStartOfParagraph(False)

oTCurs.gotoEndOfParagraph(True)

REM This does NOT work to enumerate text fields,

REM but it enumerates graphics.

oEnum = oTCurs.createContentEnumeration(sTContentService)

Do While oEnum.hasMoreElements()

oSect = oEnum.nextElement()

Print "Enumerating TextContent: " & oSect.ImplementationName

Loop

REM focus the cursor over the paragraph again.

oTCurs.gotoStartOfParagraph(False)

oTCurs.gotoEndOfParagraph(True)

REM и this provides the paragraph!

oEnum = oTCurs.createEnumeration()

Dim v

Do While oEnum.hasMoreElements()

v = oEnum.nextElement()

Dim oSubSection

Dim oSecEnum

oSecEnum = v.createEnumeration()

s = "Enumerating section type: " & v.ImplementationName

Do While oSecEnum.hasMoreElements()

oSubSection = oSecEnum.nextElement()

s = s & CHR$(10) & oSubSection.TextPortionType

If oSubSection.TextPortionType = "TextField" Then

REM Notice how a Textfield is accessed, you can also access a

REM TextFrame, TextSection, or a TextTable.

s = s & " <== here is a text field "

s = s & oSubSection.TextField.ImplementationName

ElseIf oSubSection.TextPortionType = "Frame" Then

s = s & " <== here is a Frame "

End If

Loop

MsgBox s, 0, "Пересчитать единственный параграф"

Loop

REM Move the cursor one character at a time looking

REM for a text field.

oTCurs.gotoStartOfParagraph(False)

Do While oTCurs.goRight(1, False) и NOT oTCurs.isEndOfParagraph()

If NOT IsEmpty(oTCurs.TextField) Then

Print "Найти поле передвижением курсора через текст."

End If

Loop

End Sub

Соседние файлы в папке ooo