claim.gif
Linux Magazin Linux User Easy Linux Ubuntu User International Linux Community
Erschienen in EasyLinux 02/2004   »   Ausgabe bestellen

Einführung in die Makroprogrammierung mit OpenOffice Basic

Selbst ist der Mann

von Tim Schürmann 


Mit dem eingebauten OpenOffice Basic programmieren Sie eigene Makros und Funktionen für OpenOffice oder StarOffice.

Wer intensiv mit OpenOffice oder dem kommerziellen StarOffice arbeitet, wünscht sich schon bald besondere Funktionen für gerade seine Anforderungen. So wäre es doch schön, hätte die Textverarbeitung einen eingebauten Taschenrechner, der auf einen Tastendruck mal eben eine Summe ausrechnet: Kein Suchen mehr im Startemenü, keine überdimensionierte Tabellenkalkulation.

Genau für diesen Bedarf ist in OpenOffice die Programmiersprache Basic eingebaut. Sie verbirgt sich hinter dem unscheinbaren Menüpunktpunkt Makros. Ein Makro ist hier nichts anderes, als eine Folge von Basic-Befehlen. Der Dialekt der OpenOffice-Sprache ist dabei vergleichbar mit Visual Basic aus der Windows-Welt und genauso leicht zu lernen.

Schnell, Schnell

Um simple, sich ständig wiederholende Arbeitsabläufe zu automatisieren, genügt der Makrorekorder. Er wurde mit OpenOffice 1.1, bzw. StarOffice 7 eingeführt und ermöglicht Makros, ohne eine Zeile Code schreiben zu müssen.

Ein Beispiel: Sie haben verschiedene Passagen, auch in verschiedenen Textdateien, die alle gleich und sehr kompliziert formatiert werden sollen. Doppelt unterstrichen, in einer anderen Schriftart und als Kapitälchen zum Beispiel. Damit sie sich nicht immer wieder eintönig durch den gleiche Menübandwurm klicken müssen, zeichnen Sie einmal ein Makro auf, und das geht so:

Markieren Sie eine Textpassage, die wie beschrieben formatiert werden soll. Wählen Sie Extras/Makros/Makro aufzeichnen.

Abb. 1: Hier finden Sie den Makrorekorder, der über das kleine Fenster links oben wieder beendet werden kann.

Alles was sie ab jetzt in OpenOffice tun oder aufrufen, zeichnet der Makrorekorder im Hintergrund auf. Für das Formatierungsbeispiel nehmen Sie unter Format / Zeichen... etwas ausreichend kompliziertes: Unter der Registerkarte Schrift wählen Sie Palatino, fett und den Schriftgrad 16, unter Schrifteffekt doppelte Unterstreichung und das ganze mit der Auszeichnung Kapitälchen. Schließen sie die Formatierung mit OK ab.

Klicken Sie anschließend im kleinen Fenster des Makrorekorders auf Aufzeichnung beenden. Das öffnet das Fenster der Makro-Verwaltung.

Abb. 2: Speichern eines neuen Makros.

Der Übersicht halber gliedert OpenOffice alle Makros hierarchisch. Der Baum ist im linken Fenster der Makroverwaltung dargestellt. Die Elemente unter soffice enthalten Makros, die für alle Office-Module gleichermaßen verfügbar sind. Ganz unten finden Sie einen Ordner für das gerade offene, gleichnamige Dokument. Makros, die hier nachgeordnet sind, funktionieren nur in diesem Dokument.

Die nächste Gliederungsebene bilden Bibliotheken wie Depot oder Euro; gruppiert nach Themenbereichen. Jede dieser Bibliotheken enthältn Module, in denen wiederum die eigentlichen Makros stecken.

Neuen Makros ist in der Bibliothek Standard das Modul Module1 vorgeschlagen; als Name Main. Sie können unter Makroname einen abweichenden eintragen, der keine Leerzeichen enthalten darf, z. B. MeineFormatierung.

Um zu prüfen, ob die Aufzeichnung geklappt hat, wählen Sie Format / Standard und geben einen Text ein. Markieren Sie ihn und wählen Sie Extras / Makros / Makro.... In der Liste markieren Sie MeineFormatierung und starten das Makro per Ausführen. Dieses einfaches Beispiel wäre auch mit bloßen Stilvorlagen lösbar -- zeigt aber die grundsätzliche Vorgehensweise.

Hinter den Kulissen

Alle Makros bestehen aus einer Folge von Basic-Befehlen, auch die mit dem Makrorecorder aufgezeichneten. Welche Befehle der Rekorder in diesem Beispiel aufgezeichnet hat, zeigt ein Blick in den Programmtext: Wählen Sie Extras / Makros / Makro..., markieren MeineFormatierung und klicken auf Bearbeiten. Ein neues Fenster gibt einen Einblick in den Programmtext.

Abb. 3: Diese Befehle zur Textformatierung hat der Makrorekorder aufgezeichnet.

Der Hauptbereich zeigt sämtliche Befehle aller Makros eines Moduls an. Der Text dort wirkt auf den ertsen Blick kryptisch -- mit dem nächsten Beispiel, einem Taschenrehner, lichtet sich aber der Dschungel. Schließen Sie das Editorfenster mit dem Basic-Programmtext.

Oberflächlich

Der Taschenrechner soll eine eigene grafische Oberfläche bekommen, die Grundrechenarten beherrschen und potenzieren können. Nachdem diese Anforderungen geklärt sind, ist die Oberfläche dran, die in einem dritten Schritt mit Funktionen hinterlegt wird.

Wählen Sie Extras / Makros / Makro... und klicken Sie auf Verwalten.... Es erscheint das Fenster aus Abbildung 4.

Abb. 4: Die Makroverwaltung.

Dort verwalten Sie Bibliotheken und Module. Legen Sie das neue Modul... Taschenrechner in der Bibliothek Standard an. Klicken Sie dazu unter dem Register Module auf Neues Modul... und geben sie als Namen Taschenrechner ein. Der erscheint nun markiert in der Liste. Mit Neuer Dialog... erzeugen Sie ein neues, leeres Fenster.

Abb. 5: Das neue Fenster des Taschenrechners bekommt den Namen RechnerDialog.

Geben Sie ihm für das Beispiel den Namen RechnerDialog. Der erstellte Dialog taucht in der Liste als neuer Eintrag auf. Klicken Sie auf Bearbeiten. Es erscheint der Dialogeditor mit einem neuen, leeren Fenster (vgl. Abbildung 6).

Abb. 6: Ein leeres Dialogfenster im Fenstereditor von OpenOffice Basic.

Füllen lässt es sich mit Schaltflächen oder Eingabefeldern. Die Auswahlpalette der verfügbaren Elemente befindet sich unter dem dritten Symbol von rechts ("Kontrollfelder"), in der unteren Symbolleiste (vgl. Abbildung 7).

Abb. 7: Hinter diesem Symbol verbirgt sich die wichtige Palette mit allen verfügbaren Fensterelementen.

Der Taschenrechner benötigt zunächst das Eingabefeld. OpenOffice bietet hier verschiedene Möglichkeiten: Das richtige ist das Numerische Feld (das Symbol mit den Zahlen 1,2,3). Klicken Sie es an und fahren Sie anschließend mit dem Mauszeiger auf das noch leere Fenster. Der Zeiger verändert seine Form. Bewegen Sie ihn etwas unterhalb der linken oberen Ecke. Halten Sie die linke Maustaste gedrückt. Sobald Sie nun die Maus bewegen, ziehen Sie einen Rahmen auf. Fahren Sie mit der Maus bis zur rechten Seite, so dass das Ergebnis wie in Abbildung 8 aussieht.

Abb. 8: Das Eingabefeld für den Taschenrechner steht.

Als nächstes kommen die Schaltflächen an die Reihe. Markieren Sie im Palettenfenster das erste Symbol links oben. Erstellen Sie nun analog zum Eingabefeld sechs Schaltflächen. Das Ergebnis sollte wie in Abbildung 9 aussehen. Das jeweils mit grünem Punkt versehene Element lässt sich übrigens mit der [Entf]-Taste löschen.

Abb. 9: Der Taschenrechner mit allen benötigten Elementen.

Um Elemente zu verschieben, zu verkleinern oder zu vergrößern, ziehen Sie das Pfeilwerkzeug heran (das Pfeilsymbol rechts unten in der Palette). Um die Größe zu änderen, ziehen Sie mit gehaltener Maustaste an den grünen Kästchen an. Verschieben funktioniert mit Drag&Drop.

Beschriftung

Jedes Element hat verschiedene Eigenschaften, die angepasst und verändert werden können. Dazu gehört auch die Beschriftung. Markieren Sie mit dem Auswahlwerkzeug den ersten Knopf. Klicken Sie mit der rechten Maustaste und wählen Sie im Kontextmenü den Punkt Eigenschaften.... Es erscheint eine Liste, deren Einträge meist selbsterklärend sind.

Abb. 10: Im Eigenschaften-Fenster kann man an sämtlichen Eigenschaften des Knopfes schrauben.

Geben Sie unter Titel ein + ein. Diese Taste dient später der Addition von zwei Zahlen. Verwechseln Sie das Feld Titel nicht mit dem Feld Name. Letzteres ist der Name des Elementes, über den man später bei der Programmierung auf dieses Element zugreift.

Schließen Sie das Eigenschaftsfenster und wiederholen Sie die Prozedur mit den anderen Knöpfen, so dass das Ergebnis wie in Abbildung 11 aussieht.

Abb. 11: Die fertige Oberfläche des Taschenrechners.

Die Namensgebung der Elemente steht Ihnen frei. Dem Eingabefeld weisen Sie als Namen den Wert Eingabefeld zu und stellen die Formatüberprüfung auf Ein. Damit ist sicher gestellt, dass nur Ziffern eingegeben werden können.

Es lebt

Der Dialog ist fertig, nun kann ihm Leben eingehaucht werden. Das Bedienen eines Taschenrechners sieht immer gleich aus: Zunächst muss eine Zahl eingegeben werden, dann eine Taste mit einem Rechensymbol gedrückt, dann folgt eine weitere Zahl. Ein Klick auf das Gleichheitszeichen gibt das Ergabnis der Rechnung aus. Dieser Ablauf zeigt, es gibt Ereignisse (wie einen Tastendruck) und Eingaben die man zwischenspeichern sollte (die Operatoren und Funktionstasten). Unter OpenOffice kann einem bestimmbaren Ereignis ein bestimmtes Makros zugeordnet werden. Wird z.B. ein Knopf gedrückt, führt das Büropaket automatisch das zugeordnete Makro aus. Für unseren Taschenrechner sind somit sechs Makros notwendig. Um sie anzulegen, betrachten Sie die Leiste am unteren Rand des Dialogfenster-Editors. Für jedes Modul der Bibliothek finden Sie dort genau ein Registerelement. Klicken Sie das Register Taschenrechner an, woraufhin Sie im bereits bekannten Editor für den Programmtext landen. Im Gegensatz zu vorhin ist das Fenster ziemlich leer. Lediglich zwei einsame Anweisung Sub Main und End Sub sind vorhanden. Sie kennzeichnen genau ein Makro: Alle Befehle, die sich zwischen diesen beiden Zeilen befinden, gehören zum Makro mit dem Namen Main. Im Moment gibt es noch keine Befehle, womit das Makro keine Funktion hat. Erstellen Sie nun sechs Makros nach dem gleichen Schema. Das Ergebnis sollte wie in Abbildung 12 aussehen.

Abb. 12: Alle für den Taschenrechner benötigten Makros.

Damit haben Sie im Modul Taschenrechner sechs Makros angelegt, deren Name Rechne, Addiere, etc. lautet. Die beiden Zeilen für das Makro Main können Sie entfernen, es wird im Folgenden nicht gebraucht. OpenOffice achtet übrigens nicht auf Groß- oder Kleinschreibung.

Die grau hinterlegte Zeile am Anfang ist ein Kommentar. Alles was hinter REM oder einem Hochkomma (') steht, ignoriert OpenOffice bei der Ausführung. Bei eigenen Makros sollten Sie von dieser Möglichkeit der Dokumentation regen Gebrauch machen -- das dient der Verständlichkeit.

Zuweisen

Nun haben Sie sechs Makros vorliegen, die irgendwie den Schaltflächen zugeordnet werden müssen. Dazu wechseln Sie über das Register am unteren Fensterrand wieder zurück zum Dialog. Wählen Sie zunächst den Plusknopf und im Eigenschaftsdialog (hinter dem Kontextmenü der rechten Maustaste) das Register Ereignisse aus. Das Makro Addiere soll aufgerufen werden, sobald der Knopf gedrückt wird.

Abb. 13: Diesen Ereignissen einer Schaltfläche können Makros zugeordnet werden.

Klicken Sie daher auf die Schaltfläche ... rechts neben dem Punkt Beim Auslösen. Es öffnet sich ein neues Fenster. Im Bereich links unten, entfalten Sie die Liste aller Makros mit einem Klick auf das Plus-Zeichen. Arbeiten Sie sich in dem Baum über Standard bis zum Taschenrechner vor. Das rechte Fenster zeigt alle dort vorhandenen Makros. Markieren Sie Addiere, klicken Sie auf Zuweisen und anschließend auf Ok.

Abb. 14: In diesem Fenster werden bestimmten Ereignissen Makros zugeordnet, die beim Eintritt des jeweiligen Ereignisses ausgeführt werden.

Schließen Sie das Eigenschaftenfenster und wiederholen Sie den Vorgang mit den anderen Schaltflächen, denen Sie ihre jeweils korrespondierenden Makros zuweisen. Über das Register am unteren Fensterrand schalten Sie wieder auf die Programmieransicht des Taschenrechners um.

Mehr Funktionen

Im nächsten Schritt müssen die eingegeben Werte auf irgend eine Weise zwischengespeichert werden. Das betrifft zum einen die Zwischensumme, also den eingegebenen oder berechneten Wert und zum anderen das Rechensymbol, das ausgewertet werden soll. Programmiersprachen wie Basic benutzen für diesen Zweck so genannte Variablen. Ähnlich wie Behälter, kann man Zeichen, Zahlen oder ähnliches darin aufbewahren. Beim Taschenrechner müssen alle Makros auf diese Variablen zugreifen können. Deswegen müssen Sie außerhalb der einzelnen Makros, sozusagen zentral, am Anfang des Moduls definiert werden. Ergänzen Sie den Programmtext wie in Abbildung 15 dargestellt.

Abb. 15: Zwei Variablen wurden hinzu gefügt. Da sie außerhalb aller Makros definiert wurden, sind sie in allen Makros sichtbar und werden daher als globale Variablen bezeichnet.

Der Befehl Dim reserviert den folgenden Namen als Variable.

Sobald der Addiere-Knopf gedrückt wird, muss man sich merken, dass eine Addition gewünscht ist. Das Makro Addiere sieht dann so aus:

Sub Addiere
        Rechensymbol = "Plus"
End Sub

Hierdurch wird die Zeichenkette Plus in der Variable Rechensymbol abgelegt, bzw. gespeichert.

Wiederholen Sie dieses Schema auch bei den restlichen vier Makros -- lediglich das Makro für das Gleichheitszeichen (Rechne) bleibt noch frei, da dort die eigentliche Rechnung statt findet. Später muss dort nur noch geprüft werden, welchen Text die Variable Rechensymbol enthält.

Es werde Licht

Der Taschenrechner steht vor seinem ersten Test. Das Fenster des Taschenrechners selbst muss durch ein eigenes, neues Makro auf dem Bildschirm angezeigt werden. Es heißt in diesem Beispiel TaschenrechnerStart. Fügen Sie folgende Befehle vor den bestehenden Makros ein:

Sub TaschenrechnerStart
  Rechensymbol = "keins"
  BasicLibraries.LoadLibrary("Tools")
  oDialog = LoadDialog("Standard", "RechnerDialog")
  'Dialog anzeigen und ausführen:
  oDialog.Execute()
  'Aufräumen:
  oDialog.Dispose()
End Sub

Der erste Befehl weist der Variable Rechensymbol den Wert keins zu -- ein Defaultwert, der zeigt, dass noch kein Rechensymbol vom Benutzer ausgewählt wurde. Der zweite Befehl lädt eine Bibliothek mit Hilfsfunktionen nach. Von diesen wird in der nächsten Zeile LoadDialog benötigt. Eine Funktion ist nichts anderes als ein Makro, dem in Klammern Werte mit auf den Weg gegeben werden können und das ein Ergebnis zurück liefert. In diesem Fall wird der Dialog geladen, der sich in der Bibliothek Standard unter dem Namen RechnerDialog versteckt. Das Ergebnis wird in der Variablen oDialog gespeichert. Da sie zuvor nicht explizit mit dem Befehl Dim definiert wurde, legt sie OpenOffice automatisch an. Stillschweigend wurde hier übrigens ausgenutzt, dass Makros andere Makros aufrufen können.

Die Variable oDialog ist etwas besonderes. Sie enthält gleich den gesamten Dialog, der selbst mehrere Variablen beinhaltet und sogar spezielle Funktionen anbietet. Ein solches Gebilde bezeichnet man als Objekt. Über die Variable oDialog kann man auf die Funktionen und Werte des Objekts zugreifen. Der Punkt trennt Objekt und Funktionen. Als Beispiel dient gleich die nächste Zeile: die Funktion Execute() erstellt das Dialogfenster und zeigt es an. Wird der Taschenrechner geschlossen, räumt Dispose() auf. Welche Variablen und Funktionen die einzelnen Elemente anbieten, ist im Kapitel 11 des Programmierhandbuchs aufgeführt [2].

Um das Makro zu testen, klicken Sie auf das zweite Symbol von links auf der unteren Symbolleiste (Ausführen). Diese Funktion führt stets das erste Makro eines Moduls aus -- hier also TaschenrechnerStart, das den Taschenrechner anzeigt.

Viel können Sie im Fenster noch nicht tun -- ein Klick auf einen Knopf bleibt ohne Ergebnis. Um zu sehen, dass die entsprechenden Makros tatsächlich aufgerufen werden, ergänzen Sie das Makro Addiere um den Befehl

MsgBox "Addiere wurde aufgerufen"

der eine Textbox mit dem nachgestellten Text anzeigt.

Starten Sie das Programm erneut und klicken Sie auf den Additionsknopf.

Felder

Weil das Eingabefeld nachdem eine Rechensymbol-Taste betätigt wird, für den zweiten Wert frei sein muss, muss der erste eingegebene Wert zwischengespeichert werden. Das Eingabefeld ist Teil des Dialogfensters, also ein Unterobjekt. Getreu den Grundsätzen objektorientierter Programmierung wird das Eingabefeld beim Dialog angefordert, und der entsprechende Rückgabewert in einer Variablen abgelegt. Weil jede Rechenopartion und damit jedes Makro auf diese Weise das Eingabefeld ausliest, muss die zugehörige Variable wiederum ausserhalb der einzelnen Makros defineirt werden:

Dim oEingabefeld As Object

Das nachgestellte As Object bewirkt, dass die so definierte Variable Objekte aufnehmen kann. Im Makro TaschenrechnerStart fügen Sie vor der Zeile oDialog.Execute()

'hole Zugriff auf die Eingabezeile:
oEingabefeld = oDialog1.GetControl("Eingabefeld")

ein. Gleich nach dem Start des Makros wird damit der Zugriff auf das Eingabefeld vorbereitet. In den einzelnen Makros für die Schaltflächen wird die eingegebene Zahl dann mit folgendem Befehl ausgelesen:

Zwischensumme = oEingabefeld.Value

Der Kern

Das Makro Rechne enthält die Hauptfunktion. Welche Rechensymbol-Taste gedrückt wurde, unterscheidet eine Abfrage:

select case Rechensymbol
  'Die Befehle für die Addition:
  case "plus"
  'Die Befehle für die Subtraktion:
  case "minus"
  '...
  'Es passiert nichts, wenn kein Symbol:
  case else
end select

In dieser Abfrage wird der Inhalt der Variable Rechensymbol mit dem jeweiligen Wert hinter case verglichen. Stimmen beide überein, werden die Befehle bis zum nächsten "case" ausgeführt.

Das vollständige Rechne-Makro zeigt Listing 1. Das Potenzieren besorgt eine Schleife, die die Variable Zaehler von 1 bis auf den Wert des Eingabefelds hochzählt. In jedem Durchlauf werden die Befehle zwischen For und Next ausgeführt.

Liefert ein Testlauf keine Fehlermeldung, speichern Sie das Makro und beenden Sie den Editor. Das fertige Makro liegt nun unter Extras / Makros / Makro... im linken Fenster unter Standard / Taschenrechner. Markieren Sie TaschenrechnerStart und klicken Sie auf Ausführen.

Sie können ein Makro auch einer Tastenkombination zuordnen. Das geht über Extras / Anpassen... auf dem Register Tastatur. Die Makros liegen unter Bereich hinter dem Pluszeichen von OpenOffice.org BASIC Makros.

Ausblick

Der selbstprogrammierte Taschenrechner macht Lust auf mehr. Die Dokumentation zur OpenOffice-Basic-Prorammierung gibt es derzeit leider nur englisch, sie ist darüber hinaus nicht einfach [2]. Die integrierte Hilfe zu OpenOffice Basic bietet einen ersten Einstieg. (fan)

Listing 1: Das komplette Modul des Taschenrechners 
Dim oEingabefeld As Object
Dim Zwischensumme
Dim Rechensymbol

Sub TaschenrechnerStart
  rechensymbol="keins"
  BasicLibraries.LoadLibrary("Tools")
  oDialog1 = LoadDialog("Standard", "RechnerDialog")
  'hole Zugriff auf das Eingabefeld:
  oEingabefeld = oDialog1.GetControl("Eingabefeld")
  'Dialog anzeigen und ausführen:
  oDialog1.Execute()
  'Aufräumen:
  oDialog1.Dispose()
end sub

Sub Rechne
  'Zwischenspeicher für das Ergebnis der Berechnung:
  Dim ergebnis
    select case rechensymbol
      case "plus"
        ergebnis = zwischensumme + oEingabefeld.Value
      case "minus"
        ergebnis = zwischensumme - oEingabefeld.Value
      case "mal"
        ergebnis = zwischensumme * oEingabefeld.Value
      case "durch"
        ergebnis = zwischensumme / oEingabefeld.Value
      case "potenz"
        For Zaehler = 1 To oEingabefeld.Value
          ergebnis = ergebnis * zwischensumme
        Next Zaehler
      case else
        REM es passiert nichts, da kein Symbol gewählt
        ergebnis = zwischensumme
   end select

  REM und alles wieder in den Ausgangszustand versetzen
  rechensymbol = "keins"
  zwischensumme = ergebnis
  oEingabefeld.Value = zwischensumme
end sub

Sub Addiere
  'Wert merken:
  Zwischensumme = oEingabefeld.Value
  Rechensymbol="plus"
end sub

Sub Subtrahiere
  'Wert merken:
  Zwischensumme = oEingabefeld.Value
  Rechensymbol="minus"
end sub

Sub Multipliziere
  'Wert merken:
  Zwischensumme = oEingabefeld.Value
  Rechensymbol="mal"
end sub

Sub Dividiere
  'Wert merken:
  Zwischensumme = oEingabefeld.Value
  Rechensymbol="durch"
end sub

Sub Potenziere
  'Wert merken:
  Zwischensumme = oEingabefeld.Value
  Rechensymbol="potenz"
end sub
Infos 
[1] http://www.openoffice.org Homepage des OpenOffice.org Projektes.
[2] http://api.openoffice.org/DevelopersGuide/DevelopersGuide.html Das umfassende Programmierhandbuch "Developers Guide"

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.

Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2018 COMPUTEC MEDIA GmbH | Last modified: 2007-01-25 16:55

Nutzungsbasierte Onlinewerbung

[Linux-Magazin] [LinuxUser] [Linux-Community] [Admin-Magazin] [Ubuntu User] [Smart Developer] [Linux Events] [Linux Magazine] [Ubuntu User] [Admin Magazine] [Smart Developer] [Linux Magazine Poland] [Linux Community Poland] [Linux Magazine Brasil] [Linux Magazine Spain] [Linux Technical Review]