| Startseite | Inhalt
StarBasic / OpenOffice.org Basic FAQ
Fragen und Infos: starbasic@dannenhoefer.de

Zurück Vor |
| 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: 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. |
Seitenanfang |

2003 - 2009 von Michael Dannenhöfer |
Letzte Aktualisierung: 06.04.2009