8.3.3 Wie kann man auf Absätze zugreifen?
Jedes Textdokument besteht aus Absätzen (engl. Paragraph). Diese Absätze werden im Service "Text" des Dokumentes zusammengefasst. Diese Zusammenfassung schließt auch Tabellen mit ein. StarBasic betrachtet Absätze und Tabellen als ein Objekt unterhalb des Textes. Diese beiden unterscheiden sich in der Unterstützung der entsprechenden Services für Tabellen (com.sun.star.text.Texttable) und Absätze (com.sun.star.text.Paragraph). Es gibt also die Absatztypen "Text" und "Tabelle".

Ein gezielter Zugriff auf einen Textabsatz ist nicht möglich. Absätze werden nicht durchnummeriert, wie zum Beispiel die Arbeitsblätter in Calc, und sie können auch nicht mit einem Namen versehen werden. Tabellen können dagegen einen Namen erhalten und durch diesen kann man auch auf diese zugreifen. Zu dem Tabellen kommt ein eigener Bereich.
Nun zu Absätzen die Text enthalten.
Um auf die einzelnen Absätze zugreifen zu können muß man das Enumeration-Objekt verwenden.

Als Beispiel nehmen wir erstmal ein Dokument mit drei Absätzen:
graphic

Wir können die drei Absätze sehen, die durch das Paragraphzeichen getrennt sind.

Tipp: Wenn das Paragraphzeichen nicht sichtbar ist unter Ansicht -> Steuerzeichen anklicken.

Um jetzt auf diese Absätze zu zugreifen benötigen wir eine Enumeration im Service Text, der die Absätze enthält. Zusätzlich müssen wir aber noch prüfen, ob es sich um einen Absatz oder eine Tabelle handelt. Dies erfolgt mit der Runtime Funtion hasunointerfaces. Eine Tabelle unterstützt ein Interface, auf das man prüfen kann (com.sun.star.text.TextTable). Umgekehrt kann man auch das Interface com.sun.star.text.TextRange prüfen. Dieses wird nur durch Absätze unterstützt.

sub absatz1
     Doc = thisComponent
     Enum = Doc.Text.createEnumeration
     ' Schleife über alle Absätze
     Doc = ThisComponent
     Enum = Doc.Text.createEnumeration
     ' Schleife über alle Absätze
     While Enum.hasMoreElements
               TextElement = Enum.nextElement
               check=hasunointerfaces(TextElement,"com.sun.star.text.XTextTable")
               if check=false then  Msgbox TextElement.string
     Wend

end sub

Als Alternative kann man auch prüfen ob zwei bestimmte Services unterstützt werden: com.sun.star.text.Paragraph für Absätze und com.sun.star.text.TextTable.

sub absatz2
     Doc = thisComponent
     Enum = Doc.Text.createEnumeration
     ' Schleife über alle Absätze
     While Enum.hasMoreElements
               TextElement = Enum.nextElement
               if TextElement.supportsService("com.sun.star.text.Paragraph") then
                       Msgbox TextElement.string
                  end if
     Wend
end sub

(Eine Funktion um alle Absätze auszulesen gibt es bei den Tools -> getParagraphs)
Auf beiden Wegen erhalten wir für jeden Absatz eine Messagebox mit dem Text. Beim ersten Absatz sieht das dann so aus:


graphic

Das heißt über die Eigenschaft String kann man sich den gesamten Text eines Absatzes auslesen und diesen bearbeiten.
Die Sache hat aber einen Haken. Das Ganze funktioniert mit den ersten Absatz wunderbar, aber beim dritten Absatz haben wir ein Problem. Dieser Absatz enthält unterschiedliche Formatierungen. Und diese unterschiedlichen Formatierungen werden nicht beachtet. Dass heißt wenn der Text in dem String geändert wird, erhält der Text die Formatierung des ersten Teiles.
Wenn wir zum Beispiel die ReplaceString-Funktion aus der mitgelieferten Bibliothek Tools verwenden, um ein oder mehrere Worte auszutauschen erhalten wir eine andere Formatierung.

     DialogLibraries.LoadLibrary( "Tools" )   
     While Enum.hasMoreElements
               TextElement = Enum.nextElement
               Textelement.string=ReplaceString(Textelement.string,"BlahBlah","BlaBla")
     Wend

graphic
Die beiden Textstellen sind ausgetauscht worden, aber die Formatierung ist leider auch verschwunden.
StarOffice teilt Absätze mit verschiedenen Formatierungen in einzelne Unterteile. Achtung: Nicht die Sätze, sonderen Satzteile mit gleicher Formatierung. Wird der gesamte Text geändert gehen diese einzelnen Teile wieder verloren, da der neue Text wieder ohne unterschiedliche Formatierung als ein Teil übernommen wird.
Um nun auch an diese einzelnen Textteile zu gelangen steht wieder ein Enumeration-Objekt zur Verfügung.

             enumTextTeile=Textelement.createEnumeration
                while  enumTextTeile.hasMoreElements
                 TextTeil=     enumTextTeile.nextelement
                 msgbox TextTeil.string
             wend 


Wenn man nun diese einzelnen Teile bearbeitet, bleibt die Formatierung erhalten.
             enumTextTeile=Textelement.createEnumeration
                while  enumTextTeile.hasMoreElements
                 TextTeil=     enumTextTeile.nextelement
                 Textelement.string=ReplaceString(Textelement.string,"BlahBlah","BlaBla")
             wend 



Beide Services bieten natürlich auch die Möglichkeit Formatierungen vorzunehmen.