Home / LinuxUser / 2008 / 03 / Automatikgetriebe

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

War doch klar...
(241 Punkte bei 17 Stimmen)
Re: War doch klar...
(178 Punkte bei 7 Stimmen)
Re: Skype für 64-Bit-Prozessor u. Suse 12.1
(161 Punkte bei 4 Stimmen)
Kubuntu verliert Finanzierung
(130 Punkte bei 4 Stimmen)
Offen fürs Geschäft
(80 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

Automatikgetriebe

Einstieg in die Makroprogrammierung

Verzweigter Dosenöffner

Nach diesen kleinen Einstiegsübungen geht es nun endlich an die Schriftenliste. Das komplette Listing des Makros finden Sie auf der Heft-CD sowie unserer Website [1]. Dafür benötigen Sie zunächst ein neues Writer-Dokument – Sie könnten aber auch ein bestehendes öffnen. Dies erledigt der Dreizeiler aus Listing 2.

Listing 2
sDatei = "/home/tim/meindokument.odt"
sURL = ConvertToURL(sDatei)
oDokument=StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Array())

Zunächst wandert der Dateiname in die Variable sDatei (Zeile 1). Beachten Sie, dass Sie den Benutzernamen (tim) durch Ihren und den Dokumentnamen durch einen anderen auf Ihrem System ersetzen müssen, damit dieser Code funktioniert. Außerdem muss der Dateiname in einem speziellen Format vorliegen, der sich mitunter vom eigentlichen Namen unterscheidet. Beispielsweise dürfen im Namen nur die Zeichen A bis Z und die Ziffern von 0 bis 9 auftauchen. Alle anderen Zeichen müssen Sie durch spezielle Kodierungen ersetzen, beispielsweise ein Leerzeichen im Namen durch %20. Dieses Verfahren ist nötig, um die Plattformunabhängigkeit von OpenOffice zu wahren – schließlich soll das Makro auch unter Windows ohne Einschränkungen laufen.

Glücklicherweise müssen Sie sich mit dieser Umwandlung nicht selbst herumschlagen; diese Arbeit übernimmt die Funktion ConvertToURL in der zweiten Zeile. In eine Funktion wirft man etwas hinein, hier beispielsweise den Dateinamen, und bekommt im Gegenzug etwas heraus, hier den korrekt codierten Dateinamen, den das Makro direkt in die Variable sURL hineinschreibt.

Im letzten der drei Befehle steht StarDesktop als interne Bezeichnung für die gesamte OpenOffice-Anwendung. Sie stellt eine Funktion namens loadComponentFromURL bereit, der man den konvertierten Dateinamen übergibt. Das _blank sorgt dafür, dass das Dokument in einem neuen Fenster erscheint. Alle anderen Standardparameter sind ohne Belang.

Möchten Sie die Schriftproben aber lieber in einem neuen, leeren Dokument ablegen, sparen Sie sich die Konvertierung und kommen direkt zur Sache:

oDokument=StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Array())

Das Erstellen eines leeren Dokuments übernimmt ebenfalls loadComponentFromURL, allerdings müssen Sie dafür einen recht kryptischen Dateinamen angeben. Das swriter steht dabei für ein Textdokument. Weitere mögliche Dokumenttypen wären scalc für ein Tabellendokument, sdraw für eine Zeichnung, simpress für eine Präsentation und smath für eine Formel.

In jedem Fall enthält die Variable oDokument den Wert für das geöffnete Dokument – hoffentlich. Denn falls OpenOffice die Datei nicht findet oder aus Speichermangel eine neue nicht anlegen kann, bleibt die Variable leer. Dies sollten Sie vor allen weiteren Schritten ausschließen. Dabei hilft die Funktion IsNull: Sie liefert True zurück, wenn die übergebene Variable leer ist, und False, sofern oDokument zumindest irgendetwas enthält. Mit diesem Wert führen Sie dann den eigentlich Test durch:

istleer = IsNull(oDokument)
If istleer=True Then
 MsgBox "Dokument nicht geöffnet"
Else
 MsgBox "Dokument geöffnet"
End If

Was diese Befehle tun, erkennen Sie, wenn Sie die Übersetzung in verständliches Deutsch lesen: Wenn istleer den Wert True enthält, weil die Variable oDokument leer ist, erscheint ein Warnhinweis. Andernfalls (Else) erhalten Sie einen Hinweise darüber, dass das Dokument geöffnet ist. If und Else geben Bedingungen vor: Wenn-Dann-Sonst. Das aktuell geöffnete Dokument steckt immer in ThisComponent:

oDokument = ThisComponent

Aber Vorsicht: Mit diesem Wert erhalten Sie in oDokument genau das Dokument, in dem das Makro gespeichert ist, und nicht unbedingt das, mit dem Sie gerade arbeiten. An letzteres gelangen Sie sicher über:

oDokument = GlobalScope.ThisComponent

Um nun an den im Dokument gespeicherten Textinhalt zu gelangen, definieren Sie eine weitere Variable:

oText = oDokument.Text

Aber auch damit erhalten Sie nicht den Text, sondern lediglich ein Objekt, mit dem Sie den Text manipulieren können. An die Zeichen selbst gelangen Sie erst per oText.getString:

MsgBox oText.getString

Unerfreulicherweise begrenzt OOoBasic die zurückgelieferte Textmenge auf 64 kByte, was nicht immer ausreicht. Einen Ausweg bietet ein so genannter TextCursor. Den kennen Sie aus Ihrer Textverarbeitung schon als blinkende Einfügemarke. In diesem Fall bleibt er allerdings unsichtbar und fungiert als eine Art Zeigestock, der auf ein Zeichen oder Wort im Text deutet. In einem Makro dürfen Sie beliebig viele Instanzen von TextCursor anlegen und unabhängig voneinander benutzen. Wie Sie einen neuen TextCursor erstellen und an den Anfang des Textdokuments zu platzieren, sehen Sie in den beiden ersten Zeilen von Listing 3. Mit dem TextCursor wählen Sie nun beispielsweise eine andere Schriftgröße (Zeile 3) schreiben dann gezielt in das Dokument (Zeile 4). Ein neuer Absatz erfordert das Einfügen eines Sonderzeichens mit halsbrecherisch langem Namen (Zeile 5).

Listing 3
oTextCursor = oText.createTextCursor
oTextCursor.gotoStart(False)
oTextCursor.CharHeight=15
oText.insertString(oTextCursor, "Dies ist ein Testtext", False)
oText.insertControlCharacter(oTextCursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)

Damit haben Sie schon fast alles für eine Übersicht über die installierten Schriften zusammen. Nun holen Sie sich aus dem Dokument eine Liste mit allen vorhandenen Schriftarten:

oFonts = oDokument.getCurrentControler().getFrame().getContainerWindow().getFontDescriptors()

Dieser Ausdruck liefert gleich mehrere Werte zurück. Bildlich gesprochen, stecken im Eimer oFonts weitere, hier einfach durchnummerierte Eimer. Eine solche Datenstruktur nennt man ein Array. Beachten Sie, dass die Zählung der Einträge in Arrays nicht bei 1, sondern bei 0 beginnt. Zugriff auf einen Eimer im Eimer erhalten Sie, indem Sie dessen Nummer in Klammern angeben. Die dritte Schriftart aus der Liste finden Sie in dieser Logik beispielsweise in oFonts(2).

Wie viele Elemente das Array oFonts enthält, verrät die Funktion Ubound. Jetzt setzen Sie den TextCursor auf den Anfang und die Schriftgröße auf 10 Punkt. Sicherheitshalber legen Sie noch den Namen der aktuellen Schriftart in einer Variablen ab:

nAnzahlFonts = UBound(oFonts)
oTextCursor.gotoStart(False)
oTextCursor.CharHeight=10
sUrsprungsFont=oTextCursor.charFontName

Als nächstes lassen Sie das Makro alle Schriftarten in oFonts durchlaufen. Für solche Zwecke bietet Basic die so genannte For-Schleife an, die in ihrer einfachsten Form wie folgt aussieht:

For i=0 To 5
  ' Hier folgen die Befehle
Next

OpenOffice wiederholt hier einfach alle Befehle, die zwischen For und Next stehen. Die Variable i zählt, wie oft das bereits passiert ist. Nach jedem Durchlauf erhöht sich der Wert von i um 1. Erreicht die Variable i den To-Wert, beendet das Makro die Schleife. Dem Schleifenzähler i können Sie einen beliebigen Startwert mitgeben.

Bei den Schriftproben geht es darum, jede Schriftart in oFonts einmal auszudrucken. Die einzelnen Elemente sind bereits durchnummeriert, das Ausdrucken erledigen Sie also mit der Schleife:

For i=0 To UBound(oFonts)
' Drucke Schriftmuster oFonts(i)
Next

Die Schleife (Listing 4) zählt die Variable i von 0 bis zur Anzahl der Elemente in oFonts hoch. In der Schleife müssen Sie dann nur noch die i-te Schriftart in der Sammlung ausdrucken – und die steckt in oFonts(i). Innerhalb der For-Next-Schleife stellen Sie nun eine Schriftprobe zusammen. Dazu besorgt sich das Makro als erstes den Namen der Schriftart (Listing 4, Zeile 2), druckt diesen Namen noch einmal in der alten Schrift (Zeile 3) und wechselt zur neuen Schriftart (Zeile 4). Nun druckt es als Beispieltext das Alphabet (Zeile 5), erzeugt einen Absatz (Zeile 6) und wechselt im Hinblick auf den nächsten Durchgang wieder zur alten, normalen Schriftart zurück.

Listing 4
For i=0 To UBound(oFonts)
  sFontName=oFonts(i).Name + ": "
  oText.insertString(oTextCursor, sFontName, False)
  oTextCursor.charFontName=sFontName
  oText.insertString(oTextCursor, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", False)
  oText.insertControlCharacter(oTextCursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)
  oTextCursor.charFontName=sUrsprungsFont
Next

Zusammenarbeit mit Calc

Eine Schriftprobe ist zwar schon ganz schön, allerdings bietet OpenOffice noch Zusatzinformationen über jede Schriftart an, zum Beispiel die Zugehörigkeit zu einer Schriftfamilie. Diese Daten packen Sie am besten in eine Calc-Tabelle, die Sie so erzeugen, wie in Zeile 1 von Listing 5 gezeigt. Das Calc-Dokument gibt auf Anfrage auch Zugriff auf alle Tabellen (Zeile 2).

Ähnlich wie bei den Schriftarten hält man in oSheets ein Array mit allen Tabellen in der Hand. Deren Anzahl liefert ein oSheets.getCount(). Die einzelnen Tabellen in oSheets sind wieder von 0 an durchnummeriert. So lassen sich Tabellennamen auslesen (Zeile 3) und auch ändern. Sie können auch an beliebiger Position (in Listing 5, Zeile 5 an Position 1, also hinter der ersten mit der Positionsangabe 0) eigene Tabellen einfügen. Vorher sollten Sie jedoch noch prüfen, ober der vorgesehene Name nicht bereits für eine andere Tabelle vergeben ist (Zeile 4). Das (unwiederbringliche!) Löschen einer Tabelle lässt sich ebenfalls schnell erledigen (Zeile 7).

Listing 5
oCalcDokument=StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())
oSheets=oCalcDokument.Sheets
sSheetName = oSheets(1).Name
If Not oSheets.hasByName("MeineTabelle") Then
  oSheets.insertNewByName("MeineTabelle", 1)
End If
oSheets.removeByName("Kopie von MeineTabelle")
Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 59 Punkte (7 Stimmen)

Schlecht Gut

Infos zum Autor

Tim Schürmann

Tim Schürmann

Tim Schürmann ist Diplom-Informatiker und derzeit als freier Autor unterwegs. Mehr Informationen finden Sie auf seiner Homepage unter www.tim-schuermann.de.


Infos zur Publikation

Infos zur Publikation

LinuxUser 03/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Duden Korrektor unter 64-Bit
Duden Korrektor unter 64-Bit
Tim Schürmann, 06.02.2012 10:36, 0 Kommentare

Der Duden Korrektor bietet eine äußerst nützliche Rechtschreib- und Grammatikkorrektur für LibreOffice und bringt in der aktuellen Version 8 e...

Aktuelle Fragen

Ubuntu 11.10 Compiz 3D Cube flackern
Moritz Obenauer, 12.02.2012 12:25, 0 Antworten
Hallo! Ich habe Ubuntu 11.10 mit Unity und den Compiz 3D Cube ein gerichtet. Er funktioniert...
Suse 12.1 Bootvorgang bleibt seit Update stehen
Wimpy *, 12.02.2012 09:22, 3 Antworten
Seit Update auf Kernel 3.1.9-1.4-desktop i686 bleibt der Bootvorgang stehen. Es erscheint der gr...
N24 Stick (Huawei E173) und Ubuntu 11.04
Patrick Obenauer, 11.02.2012 11:54, 1 Antworten
Hallo zusammen! Ich benutze einen alten Laptop, der mit Ubuntu 11.04 flott und problemlos läuft....
Wie kann man beim Einsatz von Compiz die Fenster-Dekoration einstellen?
GoaSkin , 10.02.2012 20:12, 0 Antworten
Hallo, ich nutze Linux Mint mit dem Gnome-Derivat Mate. Da die Distribution Compiz nicht autom...
rndc reload zone - failed bad zone
Ludwig jun. B., 06.02.2012 16:08, 2 Antworten
Schönen guten Tag, ich habe folgendes Problem. Immer wenn ich folgendes Kommando ausführen bek...