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:
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:
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
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.