Richtext in Formularen und Berichten - Teil 2

15.08.2006 von André Minhorst
Berichte bieten standardmäßig alles, was man zur Ausgabe von Daten benötigt. Aber das nur, solange der Inhalt eines Steuerelements nicht mit mehreren unterschiedlichen Formaten gleichzeitig ausgestattet werden soll. Hier kommt das bereits in der vorherigen Ausgabe vorgestellte RTF2-Steuerelement von Stephen Lebans zum Tragen: Es ermöglicht die Ausgabe formatierter Inhalte in Access-Berichten.

Das Eingeben von Daten im RTF-Format hilft nur wenig weiter, wenn man die enthaltenen Informationen nicht auch ausdrucken kann. Das funktioniert zwar beispielsweise durch einen Export und anschließendes Ausdrucken in Word, interessanter ist aber die Ausgabe formatierter Texte in Access-Berichten.

Beispieldatenbank

Als Beispiel dienen einige Objekte der Nordwind- Datenbank. Die Tabelle Artikel erhält ein neues Feld namens Beschreibung mit dem Datentyp Memo. Es soll eine Beschreibung der Artikel mit Formatierungen im RTF-Format aufnehmen. Die Abfrage Rechnungen, die als Basis für den Bericht Rechnung dient, muss ebenfalls um dieses Feld erweitert werden.

Vom Bericht Rechnung legen Sie eine Kopie namens rptRechnungRTF2 an. Dieser wird später um ein entsprechendes RTF2-Steuerelement erweitert.

Formular Artikel

Zunächst ist jedoch das Formular Artikel an der Reihe: Sie fügen zu diesem einfach ein RTF2- Steuerelement hinzu, geben ihm den Namen ctlRTF2 und weisen ihm als Steuerelementinhalt das Feld Beschreibung zu. Dieses Formular dient zum Eingeben der Bemerkungen im RTF-Format, die später in der Rechnung mit ausgedruckt werden sollen.

Im Bestellformular soll dieses Feld nicht angezeigt werden. Der Grund ist einfach: In der Datenblatt- und Endlos-Ansicht können ActiveXSteuerelemente nicht eingesetzt werden, und die Formularansicht ist für das Unterformular zur Anzeige der Artikel einer Bestellung nicht gerade die ergonomischste Lösung. Dennoch fügen Sie zu dem Formular Bestellungen eine neue Schaltfläche hinzu, die den Bericht rptRechnungRTF2 in der Vorschauansicht öffnet (Listing 1).

Private Sub cmdVorschau_Click()
DoCmd.Open Report "rptRechnungRTF2", View:=acViewPreview, Where-
Condition:="[Bestell-Nr] = " & Me.Bestell_Nr
End Sub

Fehlt noch das Anpassen des Berichts: Hier fügen Sie im Detailbereich unterhalb der vorhandenen Felder ebenfalls ein RTF2-Steuerelement ein, vergeben den Namen ctlRTF2 und binden das Steuerelement an das Feld Beschreibung (Bild 1).

Bild 1: Der Bericht rptRechnungRTF mit eingebautem RTF2- Steuerelement.

Geben Sie für einen oder mehrere Artikel eine Beschreibung mit unterschiedlichen Formate ein (Bild 2), fügen Sie diese Artikel zu einer Bestellung hinzu, und zeigen Sie die Rechnung mit der passenden Schaltfläche in der Vorschau an: Der Bericht zeigt den formatierten Text wie gewünscht an (Bild 3).

Bild 2: Das Artikel-Formular aus der Nordwind- Datenbank wurde für die Eingabe von RTF-Texten präpariert.
Bild 3: RTF-Text im Rechnungsbericht.

Leider nutzt das Steuerelement mit und ohne Inhalt die volle Höhe und bietet nicht wie etwa Textfelder eine Eigenschaft wie Verkleinern oder Vergrößern.

RTF Height

Allerdings kann man mit der Eigenschaft RTF Height des RTF2-Objekts die Höhe des Steuerelements mit Inhalt ermitteln. Das nutzt eine Prozedur aus, die durch das Ereignis Beim Formatieren des Detailbereichs ausgelöst wird: Sie passt zunächst die Höhe des RTF2-Steuerelements an und stellt dann die entsprechende Eigenschaft des Detailbereichs selbst ein (Listing 2). Das Ergebnis sieht schon viel besser aus (Bild 4).

Bild 4: Das RTF-Steuerelement im Bericht mit angepasster Höhe.

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
Dim intHeightRTF As Integer
Dim intMaxHeightRTF As Integer
intMaxHeightRTF = 0
With Me!ctlRTF2
intHeightRTF = Me!ctlRTF2.Object.RTFheight
If intHeightRTF > 0 Then
If intHeightRTF < 32000 Then
.Height = intHeightRTF
Me.Section(acDetail).Height = .Height + .Top
If intMaxHeightRTF > .Height + .Top Then
intMaxHeightRTF = .Height + .Top
End If
End If
End If
End With
Me.Section(acDetail).Height = intMaxHeightRTF
End Sub

Wenn der Text nicht passt …

Solange im vorliegenden Beispiel nur kurze Texte zum Einsatz kommen, funktioniert alles einwandfrei. Wenn die RTF-Texte aber einmal etwas umfangreicher ausfallen, wird unter Umständen ein kurzer Text noch auf der ersten Seite der Rechnung angezeigt, ein längerer Beschreibungstext beim zweiten Artikel, der nicht mehr auf die erste Seite passt, rutscht auf die zweite Seite.

Einem Umbruch inmitten des RTF-Textes verweigert sich der Bericht. Also müssen Sie schwerere Geschütze auffahren. Das folgende ist relativ trickreich, lohnt aber den Aufwand: Dabei werden längere Texte in ihre einzelnen Absätze aufgeteilt, falls welche vorhanden sind. Damit kann der Bericht nun umgehen: Er verschiebt nicht mehr den kompletten Datensatz auf die nächste Seite, sondern nur die Absätze, die definitiv nicht mehr auf die Seite passen.

Bild 5: Lange Beschreibungstexte werden auf die Folgeseite verschoben.

Was sich einfach anhört, erfordert schon eine Menge Aufwand: Stellen Sie sich den Bericht aus Bild 5 als Ausgangspunkt vor. Der Beschreibungstext des Artikels besteht aus mehreren Absätzen, die auf mehrere Datensätze aufgeteilt werden sollen. Diese schreibt man in eine temporäre Tabelle, die als neue Datenherkunft des Berichts dient. Mit der Eigenschaft Duplikate ausblenden blendet man die Felder aus, die nur einmal mit dem ersten Absatz angezeigt werden sollen. Fehlt noch eine Funktion, die das Aufteilen des Beschreibungstextes in die enthaltenen Absätze übernimmt. Man könnte natürlich den RTF-Code analysieren, die Textbestandteile herausfiltern, die Steuerzeichen für den Zeilenumbruch identifizieren und daraus neue RTFDokumente erzeugen. Wer sich einmal den RTF-Code eines solchen Dokuments angesehen hat, wird vor diesem Ansatz allerdings zurückschrecken.

Manuelle Vorgehensweise

Einfacher ist die Abbildung der manuellen Vorgehensweise für dieses Problem: Man könnte die Beschreibung in einem RTF2-Steuerelement anzeigen, mit der Maus den ersten Absatz markieren, in ein weiteres RTF2-Steuerelement einfügen und dessen Inhalt speichern – fertig. Das Ganze muss nur noch programmiert werden. Passieren soll dies, wenn der Benutzer auf die Schaltfläche zum Anzeigen der Rechnungsvorschau im Formular Rechnung klickt. Das Formular ist also schon einmal der passende Ort, um die beiden RTF2-Steuerelemente für den Originaltext und die extrahierten Absätze unterzubringen.

Fügen Sie also zwei solcher Steuerelemente in das Formular ein, und nennen Sie sie und ctlRTFAbsatz. Die beiden Steuerelemente können Sie an beliebiger Stelle positionieren und direkt deren Eigenschaft Sichtbar auf Nein einstellen.

Das RTF2-Steuerelement ist leider kein Bestandteil von Windows- oder Office-Installationen – darauf müssen Sie besonders achten, wenn Sie eine Anwendung weitergeben, die dieses Steuerelement verwendet. Das bedeutet im Detail, dass Sie selbst für das Vorhandensein der passenden Dateien Sorge tragen müssen.

Meist verwendet man in diesem Fall ein Setup, das alle benötigten Dateien enthält, diese an die passenden Orte auf der Festplatte kopiert und Dateien wie DLLs anschließend – sofern erforderlich –registriert oder gibt dem Anwender eine passende Anleitung mit. In einer der folgenden Ausgaben von inside Access lernen Sie eine alternative Variante kennen: Dort speichern Sie die benötigten Dateien einfach in der Datenbank und erledigen das „Setup“ per VBA.