ACC95: How to Bind a RichTextBox Control to a Field in a Table

Last reviewed: August 28, 1997
Article ID: Q148531
The information in this article applies to:
  • Microsoft Access version 7.0

SUMMARY

Advanced: Requires expert coding, interoperability, and multi-user skills.

The Rich TextBox ActiveX control which is available with the Microsoft Access Developer's Toolkit version 7.0 has no built-in property to bind its contents to a field in the form's record source. However, you can use Visual Basic for Applications to achieve the same result.

NOTE: The RichTextBox ActiveX control supplied with Microsoft Office 97, Developer Edition has a ControlSource property which can be used to directly bind its contents to a field in the form's record source. Although the technique described in this article will work with the Microsoft Office 97, Developer Edition Rich TextBox ActiveX control, we recommend that you use its ControlSource property instead.

As you enter text in a RichTextBox ActiveX control, the formatting and the text you enter is stored in the control's TextRTF property. This information is stored in Rich Text Format (RTF). Using Visual Basic for Applications, you can store the contents of the TextRTF property in a Memo field in the underlying table.

NOTE: It is important to remember that you cannot view the form in Datasheet view because the contents of the TextRTF property is stored in the table. Viewing the data sheet of the form will generate a run-time error.

This article shows the procedures that you can use to store the contents of the Rich TextBox ActiveX control in the form's underlying record. This simulates the ControlSource property that other controls have. The procedures shown deal specifically with saving the contents of the Rich TextBox ActiveX control, and does not touch on other Rich Text Format issues covered in other articles (including controls that are used to manipulate the Rich Text Format settings).

MORE INFORMATION

To store the contents of the Rich TextBox ActiveX control in the form's underlying record, follow these steps:

  1. Create the following table:

         Table: Table1
         ---------------------
         Field Name: MemoForRTF
         Data Type : Memo
    

  2. Create the following form:

         Form: Test1
         -----------------------
         RecordSource: Table1
         KeyPreview: YES
    

         Rich Textbox ActiveX Control:
    
            Name: OLERichTextbox
    
         Text Box:
            Name: MemoForRTF
            ControlSource: MemoForRTF
    
    

  3. On the View menu, click Code, and type the following statements in the Declarations section of the form module if they are not already there:

          Option Compare Database
          Option Explicit
    

         ' Constant that stores the name of the Memo control on the form.
         Const strMemoName As String = "MemoForRTF"
    

         ' Constant that stores the name of the RTF control on the form.
         Const strRTFName As String = "OLERichTextbox"
    

         ' Variable to note if the RTFText was just loaded (no changes made).
         Dim intJustLoaded As Integer
    

         ' Variable to note if the RTFText has been changed by the user.
         Dim intRTFChanged As Integer
    

  4. Type the following procedures in the form module:

          Private Sub Form_BeforeUpdate(Cancel As Integer)
    
             ' Before record is saved, put RTF control's text in the Memo
             ' field.
             Me(strMemoName) = Me(strRTFName).TextRTF
          End Sub
    
          Private Sub Form_Current()
             ' When arriving at a record, fill RTF control with Memo field
             ' text.
             Call PlaceMemoInRTF
          End Sub
    
          Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
          ' This checks that the any changes to the RTF text is not lost
          ' accidentally when the user presses the ESC key.
          ' Make sure that the form's Key Preview event is set to Yes.
             If KeyCode = 27 And Shift = 0 Then
                If Not Me.Dirty And intRTFChanged Then
                   Call AskToRestoreFromMemo
                End If
             End If
          End Sub
    
          Private Sub OLERichTextbox_Change()
          ' When RTF text is changed, dirty record so it will be saved.
             If intJustLoaded Then
                intJustLoaded = False
               Exit Sub
             End If
          intRTFChanged = True
             If Me.Dirty = True Then
                Exit Sub
             End If
          ' Otherwise, dirty the record to save changes.
          Me(strMemoName) = Me(strMemoName)
          End Sub
    
          Public Sub PlaceMemoInRTF()
          ' Place saved RTF in Memo field into RTF control.
          intRTFChanged = False
             If Me.NewRecord Then
                Me(strRTFName).TextRTF = ""
             ElseIf IsNull(Me(strMemoName)) Then
                Me(strRTFName).TextRTF = ""
             Else ' There is saved RTF text in the Memo field.
                intJustLoaded = True
                Me(strRTFName).TextRTF = Me(strMemoName)
               ' The RTF control's Change event fires here; that is where the
               ' intJustLoaded comes in. The flag tells the change event
               ' not to dirty the record. The RTF was just loaded, and no
               ' changes have been made.
                intJustLoaded = False
             End If
          End Sub
    
          Private Sub OLERichTextbox_KeyDown(KeyCode As Integer, _
             ByVal Shift As Integer)
          ' If user pressed ESC, then ask if user wants to discard changes.
             If KeyCode = 27 And Shift = 0 Then
               If intRTFChanged Then
                Call AskToRestoreFromMemo
               End If
             End If
          End Sub
    
          Public Sub AskToRestoreFromMemo()
          ' Ask if the user wants to discard the changes to the RTF text.
          ' If so, overwrite the RTF text in the RTF control with what is in
          ' the Memo field.
          Dim intResponse As Integer
          Dim strMessage As String
          strMessage = Left(Me(strRTFName).Text, 20)
             If strMessage = "" Then
                strMessage = "Do you want to discard changes to the text."
             Else
                strMessage = "Do you want to discard changes to the text " & _
                   """" & strMessage & "..." & """"
             End If
          intResponse = MsgBox(strMessage, 4, "Undo your work?")
             If intResponse = 6 Then
                Call PlaceMemoInRTF
             Else
                Me(strMemoName) = Me(strMemoName) 'Dirty record so text will
                                                  'save.
             End If
          End Sub
    
    

  5. Compile and save all modules. If you receive any errors, troubleshoot them.

  6. Open the form in Form view. Test the RichTextBox Control by entering text. The Rich TextBox ActiveX control should save your text in each record.

REFERENCES

For more information about the RichTextBox control, search on the phrase "RichTextBox Control," and then search the appropriate topic, using the Microsoft Office, Developer Edition Tools Help Index.


Additional query words: ADT, store, bound
Keywords : IntpCstm kbinterop PgmHowTo
Version : 7.0
Platform : WINDOWS
Hardware : x86
Issue type : kbhowto


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: August 28, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.