Why does this error show up accessing the RTF of a RichTextBox?

108 Views Asked by At

I have a number of rich text boxes on my application that print data received from a digital modem type device. At times it is necessary to copy a window to another window because some of the text in the RTF window is colored and formatted a certain way I thought the best way was to copy the RTF of the window to the other window. But when I run the program and I attempt to copy the text I get this same error either in run mode r if I break the code and try to manually read the RTF.

?Hostform.rtfRX(0).TextRTF

'Hostform.rtfRX(0).TextRTF' threw an exception of type 'System.MissingMemberException'
    ClassName: Nothing
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146233070
    HelpLink: Nothing
    InnerException: Nothing
    MemberName: Nothing
    Message: "Public member 'TextRTF' on type 'RichTextBox' not found."
    Signature: Nothing
    Source: "Microsoft.VisualBasic"
    StackTrace: "   at Microsoft.VisualBasic.CompilerServices.Symbols.Container.GetMembers(String& MemberName, Boolean ReportErrors)" & vbCrLf & "   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)" & vbCrLf & "   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)"
    TargetSite: {System.Reflection.MemberInfo[] GetMembers(System.String ByRef, Boolean)}

The same error is shown it I use .RTF or .TextRTF I do not understand why the RTF can't be found when I'm using a Rich Text Box. I'm using a WinForm and made sure the correct type of RTF is being used.

Is there something special I need to turn on the RTF output?

1

There are 1 best solutions below

4
jmcilhinney On BEST ANSWER

It appears that what you have done is accessed your RichTextBox via an Object reference with Option Strict Off. That's bad to start with. You should have Option Strict On pretty much all the time and write your code accordingly. I added a RichTextBox to my form and accessed it directly via the generated field in the Immediate window and I got this result:

?RichTextBox1.Rtf
"{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang2057{\fonttbl{\f0\fnil Segoe UI;}}" & vbCrLf & "{\*\generator Riched20 10.0.22621}\viewkind4\uc1 " & vbCrLf & "\pard\f0\fs18 Hello\par" & vbCrLf & "World\par" & vbCrLf & "}" & vbCrLf
?RichTextBox1.TextRTF
Nothing

I then did this:

Option Strict Off

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim x As Object = RichTextBox1
    End Sub

End Class

and used that x variable in the Immediate window and got this:

?x.Rtf
"{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang2057{\fonttbl{\f0\fnil Segoe UI;}}" & vbCrLf & "{\*\generator Riched20 10.0.22621}\viewkind4\uc1 " & vbCrLf & "\pard\f0\fs18 Hello\par" & vbCrLf & "World\par" & vbCrLf & "}" & vbCrLf
?x.RTF
"{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang2057{\fonttbl{\f0\fnil Segoe UI;}}" & vbCrLf & "{\*\generator Riched20 10.0.22621}\viewkind4\uc1 " & vbCrLf & "\pard\f0\fs18 Hello\par" & vbCrLf & "World\par" & vbCrLf & "}" & vbCrLf
?x.TextRTF
'x.TextRTF' threw an exception of type 'System.MissingMemberException'
    ClassName: Nothing
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146233070
    HelpLink: Nothing
    InnerException: Nothing
    MemberName: Nothing
    Message: "Public member 'TextRTF' on type 'RichTextBox' not found."
    Signature: Nothing
    Source: "Microsoft.VisualBasic.Core"
    StackTrace: "   at Microsoft.VisualBasic.CompilerServices.Symbols.Container.GetMembers(String& memberName, Boolean reportErrors)" & vbCrLf & "   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object instance, Type type, String memberName, Object[] arguments, String[] argumentNames, Type[] typeArguments, Boolean[] copyBack)" & vbCrLf & "   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)"
    TargetSite: {System.Reflection.MemberInfo[] GetMembers(System.String ByRef, Boolean)}

You should have Option Strict On to start with, so the code you have should not compile. Whether you have to or not, you should be casting that Object reference as the actual type of the object, then you can access members of that type directly, without late binding. Using my example:

?DirectCast(x, RichTextBox).TextRTF
Nothing