Richtext in Formularen und Berichten - Teil 1

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.