我的应用程序上有许多富文本框,用于打印从数字调制解调器类型设备接收的数据。有时需要将一个窗口复制到另一个窗口,因为 RTF 窗口中的某些文本是按某种方式着色和格式化的,我认为最好的方法是将窗口的 RTF 复制到另一个窗口。但是,当我运行程序并尝试复制文本时,如果我破坏代码并尝试手动读取 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)}
如果我使用 .RTF 或 .TextRTF,也会显示相同的错误 我不明白为什么当我使用富文本框时找不到 RTF。我正在使用 WinForm 并确保使用正确类型的 RTF。
打开 RTF 输出需要什么特殊的东西吗?
看来您所做的事情是通过带有
RichTextBox
的 Object
引用来访问您的 Option Strict Off
的。一开始就不好了。您应该一直拥有 Option Strict On
并相应地编写代码。我在表单中添加了一个 RichTextBox
并通过“立即”窗口中生成的字段直接访问它,得到了以下结果:
?RichTextBox1.Rtf “{ tf1 nsi nsicpg1252\deff0 ouicompat\deflang2057{ onttbl{ 0 nil Segoe UI;}}" & vbCrLf & "{\*\generator Riched20 10.0.22621} iewkind4\uc1 " & vbCrLf & "\pard 0 s18 Hello\par" & vbCrLf & "世界\ par" & vbCrLf & "}" & vbCrLf ?RichTextBox1.TextRTF 没有什么
然后我这样做了:
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
并在立即窗口中使用该
x
变量并得到以下结果:
?x.Rtf “{ tf1 nsi nsicpg1252\deff0 ouicompat\deflang2057{ onttbl{ 0 nil Segoe UI;}}" & vbCrLf & "{\*\generator Riched20 10.0.22621} iewkind4\uc1 " & vbCrLf & "\pard 0 s18 Hello\par" & vbCrLf & "世界\ par" & vbCrLf & "}" & vbCrLf ?x.RTF “{ tf1 nsi nsicpg1252\deff0 ouicompat\deflang2057{ onttbl{ 0 nil Segoe UI;}}" & vbCrLf & "{\*\generator Riched20 10.0.22621} iewkind4\uc1 " & vbCrLf & "\pard 0 s18 Hello\par" & vbCrLf & "世界\ par" & vbCrLf & "}" & vbCrLf ?x.TextRTF “x.TextRTF”引发了“System.MissingMemberException”类型的异常 类名:无 数据:{System.Collections.ListDictionaryInternal} H结果:-2146233070 帮助链接: 没什么 内部异常:什么都没有 会员姓名: 无 消息:“未找到类型“RichTextBox”上的公共成员“TextRTF”。” 签名: 没什么 来源:“Microsoft.VisualBasic.Core” StackTrace:“在 Microsoft.VisualBasic.CompilerServices.Symbols.Container.GetMembers(String& memberName,布尔报告错误)”&vbCrLf&“在 Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(对象实例,类型类型,字符串成员名称,对象[]参数,String[] argumentNames,Type[] typeArguments,Boolean[] copyBack)" & vbCrLf & " at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(对象实例,类型类型,字符串成员名称,对象[]参数,字符串[] ArgumentNames、类型 [] TypeArguments、布尔值 [] CopyBack)" TargetSite: {System.Reflection.MemberInfo[] GetMembers(System.String ByRef, Boolean)}
您应该从
Option Strict On
开始,因此您的代码不应编译。无论是否必须,您都应该将该 Object
引用强制转换为对象的实际类型,然后您可以直接访问该类型的成员,而无需后期绑定。以我的例子为例:
?DirectCast(x, RichTextBox).TextRTF 没有什么