Richtext in Formularen und Berichten - Teil 1

15.07.2006 von André Minhorst
Die Verwaltung von formatierten Texten in Access ist nicht ohne Aufwand und den Einsatz externer Tools möglich, wenn etwa Word als Editor dient und die Texte als OLE-Objekt abgespeichert werden. Das Richtext-Format erlaubt es jedoch, formatierte Texte wesentlich effizienter in Memofeldern zu speichern. Wir zeigen Ihnen, welches Tool Sie dafür benötigen und wie es funktioniert.

Wenn Access eine Funktion nicht anbietet, springt meist irgendein Hersteller in die Bresche und bietet ein passendes ActiveX-Steuerelement oder ein Add-In dafür an. Im Fall der Verwaltung formatierter Texte ist das ähnlich: Neben einigen kostenpflichtigen Controls ist in der Community immer wieder die Rede vom kostenlosen RTF2-Steuerelement von Stephen Lebans (http://www.lebans.com). Es bietet die Möglichkeit, Texte in Formularen einzugeben, zu formatieren und in Berichten wieder auszugeben. In der vorliegenden Beitragsreihe erfahren Sie, wie Sie mit dem Steuerelement umgehen und welche Klippen es dabei zu umschiffen gilt.

Download und Installation

Unter http://www.lebans.com/richtext.htm finden Sie die Möglichkeit zum Download des RTF2- Steuerelements sowie weitere Informationen und Beispieldatenbanken und eine Zip-Datei mit einer Setup-Routine (May23-2004OCXonly.zip). Diese führen Sie aus und installieren damit das ActiveX-Steuerelement auf Ihrem Rechner.

RTF oder HTML?

Wenn Entwickler in Zusammenhang mit der Bearbeitung formatierter Texte über das RTF2-Control sprechen, ist meist auch die Rede von HTML und dem Webbrowser-Steuerelement. Denn leider ist es nicht ohne weiteres möglich, mit HTML formatierten Text per Bericht auszugeben.

Beispieldatenbank

Für die ersten Beispiele genügt eine Beispieldatenbank mit lediglich einer einzigen Tabelle. Nennen Sie sie tblRTF und fügen Sie ihr die folgenden Felder hinzu:

Anschließend kann es sofort losgehen: Erstellen Sie ein neues Formular namens frmRTF und weisen Sie diesem als Datenherkunft die soeben erstellte Tabelle zu. Ziehen Sie beide Felder der Datenherkunft in den Detailbereich des Formulars.

Steuerelement einfügen

Nun kommt das RTF2-Steuerelement. Fügen sie es über Einfügen/ActiveX-Steuerelement im entsprechenden Dialogfeld (Bild 1) ein. Benennen Sie das Steuerelement in ctlRTF2 um.

Bild 1: Einfügen des RTF2- Steuerelements.

Nach dem Einfügen der Steuerelemente passen Sie deren Größe und Ausrichtung am besten wie in Bild 2 an und stellen die Eigenschaft Steuerelementinhalt auf das Feld RTF ein.

Bild 2: Dieses Formular zeigt den Quelltext und die RTFAnsicht von RTF-Texten an.

Die Hintergrundfarbe des RTF2-Steuerelements ist standardmäßig grau. Ziehen Sie Weiß als Hintergrundfarbe vor, öffnen Sie den für ActiveX- Steuerelemente typischen Eigenschaften- Dialog über den Kontextmenü-Eintrag RTF2 Control-Object/Eigenschaften und wählen auf der Registerseite Farben per Klick auf die entsprechende Schaltfläche die gewünschte Farbe aus.

Die beiden großen Felder im Beispielformular sollen einerseits den Quelltext des RTF2-Dokuments und andererseits die formatierte Fassung des Textes anzeigen. In einer Anwendung würden Sie das Textfeld mit dem Quelltext weglassen, aber zum Kennenlernen ist dies sehr praktisch.

RTF2-Steuerelement im Einsatz

In der Formularansicht können Sie nun direkt mit der Eingabe von Texten loslegen – das heißt fast: Wenn das erste in das RTF2-Steuerelement eingetippte Zeichen nicht erscheint, haben Sie nicht etwa zu sanft auf die Taste gedrückt, sondern den ersten kleinen Bug entdeckt. Dieser ist allerdings – so der Autor des Tools – auf einen Bug im Access-ActiveX-Container zurückzuführen. Das Problem können Sie umgehen, indem Sie den Datensatz direkt beim Anzeigen als geändert markieren. Legen Sie dazu eine Prozedur an, die durch das Ereignis Beim Anzeigen ausgelöst wird (Listing 1).

Private Sub Form_Current()
Me!ctlRTF2.SetFocus
Me.Dirty = True
End Sub

Bild 3: Einstellen von Eigenschaften des RTF2- Steuerelements.

Interessant wäre es, die Änderungen im RTF2- Steuerelement direkt als RTF-Quellcode angezeigt zu bekommen. Das RTF2-Steuerelement bietet dazu eine Ereigniseigenschaft namens Change. Wie ebenfalls bei ActiveX-Steuerelementen üblich, lassen sich deren Ereigniseigenschaften nicht über die Registerseite Ereignis des Eigenschaftsfensters anlegen. Stattdessen legen Sie eine solche Ereigniseigenschaft direkt im VBA-Codefenster des Formularmoduls an.

Anlegen einer Ereignisprozedur

Wählen Sie dort im linken Kombinationsfenster im Kopf des Codefensters den Eintrag ctlRTF2 und im rechten Fenster den Eintrag Change aus (Bild 4). Der VBA-Editor legt daraufhin die passende Ereignisprozedur an.

Bild 4: Anlegen einer Ereignisprozedur für ein ActiveXSteuerelement.

Das Ziel der Aktion war ja das Anzeigen des RTF-Quellcodes. Mit einem an das Feld RTF gebundenen Textfeld funktioniert das allerdings nicht: Um jederzeit den aktuellen Quellcode im Textfeld anzuzeigen, müsste die Datenherkunft des Formulars nach der Eingabe jedes einzelnen Zeichens aktualisiert werden. Das funktioniert nur durch das Speichern des Datensatzes undanschließendes Aktualisieren der Datenherkunft, allerdings wird dadurch auch immer wieder die Einfügemarke an den Beginn des Steuerelements ctlRTF2 verlegt. Also gehen Sie einen alternativen Weg: Heben Sie die Bindung des Textfeldes zur Anzeige des Inhalts des Feldes RTF auf (durch Leeren der Eigenschaft Steuerelementinhalt), benennen Sie es, um Missverständnisse zu vermeiden, in txtRTF2 um, und ergänzen Sie die Ereignisprozedur ctlRTF2_Change wie in Listing 2.

Listing 2: Aktualisierung des Textfeldes txtRTF2 zur
Anzeige des RTF-Quellcodes
Private Sub ctlRTF2_Change()
Me!txtRTF2 = Me!ctlRTF2.RTFtext
End Sub

Bild 5: Das RTF2-Steuerelement erlaubt das Formatieren per Kontextmenü...
Bild 6: … oder per Systemdialog.

Anschließend können Sie beliebig formatierten Text in das RTF2-Steuerelement eingeben und sehen jeweils die Änderungen am Quellcode des RTF-Dokuments. Änderungen am Format nehmen Sie übrigens entweder über die bereits recht umfangreichen Möglichkeiten des Kontextmenüs vor (Bild 4) oder verwenden den passenden Windows-Dialog zum Einstellen der Schriftformatierung (Bild 5).

Löschen – oder doch nicht?

Ein weiterer kleiner Bug zeigt sich, wenn Sie den Inhalt des RTF2-Steuerelements komplett markieren und löschen. Das funktioniert zwar auf den ersten Blick, aber wenn Sie dann zu einem anderen Datensatz und wieder zurück wechseln, ist der alte Inhalt wieder da.

Dieses Problem beheben Sie, indem Sie eine Prozedur für die Ereigniseigenschaft Vor Aktualisierung des Formulars anlegen (Listing 3).

Private Sub Form_BeforeUpdate(Cancel As Integer)
If Len(Me.ctlRTF2.PlainText) = 0 Then
Me.TextInhalt = Me.ctlRTF2.RTFtext
End If
End Sub

Vom Plaintext zum RTF-Format

Und noch einem Bug begegnen Sie, wenn das Memofeld, an das Sie das RTF2-Steuerelement binden, Plaintext enthält. Das RTF2-Steuerelement kann mit diesem Format nichts anfangen, weil die RTF-Formatierungen fehlen, und gibt daher nichts aus (das ist immerhin besser als eine Fehlermeldung). Allerdings nicht ohne Grund: Der Inhalt wird nämlich kommentarlos durch ein leeres RTF-Dokument ersetzt.

Etwas praktischer wäre es, wenn das Steuerelement den enthaltenen Text in ein RTF-Dokument integrieren würde. Dies erledigt die Routine aus Listing 4. Die ersten Anweisungen kennen Sie ja bereits aus Listing 1, aber der Rest ist neu: Die If-Bedingung prüft, ob das RTF-Feld der Tabelle nicht leer ist, das RTF2-Steuerelement aber dennoch keinen Text anzeigt. Dazu verwendet es die Eigenschaft PlainText des Steuerelements. Ist das der Fall, enthält das Feld Text, der aber nicht im Steuerelement angezeigt wird.
In dem Fall wenden Sie einen kleinen Trick an: Sie kopieren den Inhalt des Tabellenfeldes RTF in die Zwischenablage und fügen den Inhalt der Zwischenablage dann in der RTF2-Steuerelement ein. Auf diese Weise gaukeln Sie dem Steuerelement vor, der Text wäre soeben eingegeben worden. Beim Datensatzwechseln speichert das Formular dann den RTF-Text mit dem gewünschten Inhalt.

Private Sub Form_Current()
Me!ctlRTF2.SetFocus
Me.Dirty = True
If Len(Me!RTF) > 0 And Len(Me!ctlRTF2.PlainText) = 0 Then
ClipBoard_SetData Me!RTF
Me!ctlRTF2.SetFocus
Me!ctlRTF2.Paste
End If
End Sub

Die zum Kopieren des Feldinhalts in die Zwischenablage verwendete Routine Clipboard_ SetData stammt von Microsoft. Weitere Informationen finden Sie unter http://support.microsoft.com/default.aspx?scid=kb;en-us;138909.

RTF2 und IntelliSense

Auch per IntelliSense können Sie nicht auf die Elemente des RTF2-Objekts in der VBA-Entwicklungsumgebung zugreifen. Und dass es da eine Menge Methoden und Eigenschaften gibt, zeigt allein ein Blick in den Objektkatalog (Bild 7).

Bild 7: Die Elemente des RTF2- Steuerelements im Objektkatalog.

Wer bereits ActiveX-Steuerelemente programmiert hat, kennt folgende Vorgehensweise vielleicht schon. Die Elemente des Steuerelements lassen sich nur via IntelliSense erschließen, wenn Sie mit einer Objektvariablen arbeiten, die auf das ActiveX-Steuerelement verweist.

Diese müssen Sie zunächst deklarieren und mit einem Verweis auf das RTF2-Steuerelement ausstatten. Wie das funktioniert, zeigt die geänderte Fassung der Routine Form_Current aus Listing 5; Bild 8 bestätigt, dass nun auch die Elemente des RTF2-Steuerelements zugänglich sind. Allerdings können Sie die allgemein verfügbaren Methoden und Eigenschaften wie etwa SetFocus nicht auf das RTF2-Objekt anwenden.

Bild 8: Mit IntelliSense geht vieles leichter.

Private Sub Form_Current()
Dim objRTF2 As RTF2Lib.RTF2
Set objRTF2 = Me.ctlRTF2.Object
Me!ctlRTF2.SetFocus
Me.Dirty = True
If Len(Me!RTF) > 0 And Len(objRTF2.PlainText) = 0 Then
ClipBoard_SetData Me!RTF
Me!ctlRTF2.SetFocus
objRTF2.Paste
End If
End Sub

Standardschrift

Das RTF2-Steuerelement bietet immer die gleiche Schriftart an, es sei denn, Sie ändern die Standardschriftart. Dies erledigen Sie im Eigenschaftsfenster des Steuerelements, das Sie bereits weiter oben kennen gelernt haben. Dort stellen Sie auf der Registerseite Schriftarten die gewünschte Standardschriftart, -größe und weitereEigenschaften ein.

Wie geht es weiter?

Hat man die kleinen Bugs des RTF2-Steuerelements im Griff, ist es ein sehr nützliches Werkzeug zum Erstellen von RTF-Dokumenten in Access. Im nächsten Teil dieser Beitragsreihe erfahren Sie, wie Sie die RTF-Dokumente zu Papier beziehungsweise in einen Bericht bringen.