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.