Public Sub COM_MSForms_Class_DataObject_Test()
''MSForms.DataObject对象,可以用来沟通VBA工程内各模块数据,其上可以存储各种格式的文本,格式名必须是
'' 整数或字符串:
''1.DataObject.GetText([format])从DataObject对象中,取得储存的某格式文本,如省略format参数,将取得
'' 格式为1的文本,也即对象的默认储存格式的文本;format参数也可以是1之外的整数,或者是任意字符串,
'' 字符串不区分大小写
''2.DataObject.SetText(Text,[format])将文本以一定格式储存到DataObject对象上,如果省略format参数,将
'' 把文本储存为格式为1的默认文本;format参数也可以是1之外的整数,或者是任意字符串,字符串不区分大
'' 小写
''3.DataObject.GetFormat(format)用于检索DataObject的格式列表,检查对应的format格式是否存在
''4.DataObject.GetFromClipboard()从系统剪切板取一次文本,并将它储存为DataObject格式为1的文本,如果
'' 系统剪切板此时为空,那么调用DataObject.GetFromClipboard()方法,会把DataObject对象中格式为1的文
'' 本和格式都删除
''5.DataObject.PutInClipboard()将DataObject对象格式为1的文本放入系统剪切板,此后DataObject对象的格
'' 式为1的文本的存储单元与系统剪切板共享,一者变,另一者跟着变,从功能设计角度,这可能是一个Bug,
'' 与其相反功能的DataObject.GetFromClipboard()则不会将数据的存储位置共享,所以如此说。
''6.DataObject.Clear()将DataObject存储的格式列表及文本数据全部清空,这个方法的调用并不能断开因为调
'' 用DataObject.PutInClipboard()方法,该DataObject对象格式为1的文本存储单元与系统剪切板之间建立的
'' 数据共享;要想完全断开,唯有将该变量重新初始化为一个新的DataObject对象
''7.DataObject.StartDrag([effect])开始基于MSForms界面程序的数据拖放,是此对象最复杂的一个方法,可以
'' 从任何一个MSForms控件的MouseMove事件中调用此方法,调用后它将阻塞MouseMove事件处理程序,你可以给
'' 任何你想要接受拖放数据的控件,添加BeforeDragOver和BeforeDropOrPaste两个事件处理程序,在前者中设
'' 置Cancel=True,以方便后一个事件处理传递过来的事件参数Data(DataObject类型)中的数据(这个数据是
'' 前面MouseMove事件调用DataObject.StartDrag()方法之前手动在该DataObject对象上设置的,也即在此调用
'' 之前,你需要先用DataObject.SetText(Text,[format])来设置好要传递的文本,否则传递一个空DataObject
'' 对象,也没有意义不是?!?
Dim Clip As New MSForms.DataObject, Clip1 As New MSForms.DataObject
''1.格式1是SetText()与GetText()方法的format参数的默认值,但没有设置前,这个格式在DataObject对象的
'' 格式列表中是不存在的
Debug.Print 1, Clip.GetFormat(1) 'False
''2.DataObject对象所有方法的format参数,如果是字符串,那么此字符串是不区分大小写的
Clip.SetText 'Smith' , 'Name'
Debug.Print 2, Clip.GetText( 'name' )
Debug.Print 2, Clip.GetText( 'NAME' )
''3.SetText(Text,[format])方法,参数format默认植为1
Clip.SetText 'hello world'
Debug.Print 3, Clip.GetFormat(1)
Clip.SetText 'Oh, Yeah' , 2
Debug.Print 3, Clip.GetFormat(2)
''4.GetText([format])方法,参数format默认植为1
Debug.Print 4, Clip.GetText 'hello world
Debug.Print 4, Clip.GetText(2) 'Oh, Yeah
''5.SetText()与GetText()方法的format参数必须是整数或字符串
Clip.SetText 'hao123' , 'website'
Debug.Print 5, Clip.GetText( 'website' )
Clip.SetText '格式为32' , 32
Debug.Print 5, Clip.GetText(32)
''5.1格式如果不是整数的数字,会执行CInt转换,不过也有例外,所以建议不要用这种奇淫技巧
Clip.SetText '格式为3.2' , 3.2
Debug.Print 5.1, Clip.GetText(3.2)
Clip.SetText '格式为True的文本' , True '格式为-1'
'Debug.Print Clip.GetText(-1) '报错
Clip.SetText '格式为False的文本' , False '格式为0
Debug.Print 5.1, Clip.GetText( False )
''6.DataObject对象所有方法的format参数,可以是字符串,但不可以是空字符串或者vbNullString
' Clip.SetText 'hello', ''
' Clip.SetText 'Good Good Study', vbNullString
''7.也可以通过DataObject.PutInClipboard()来将DataObject对象中的文本放入系统剪切板中
'' 注意:导入到系统剪切板的文本是DataObject对象中的格式为1的文本数据
Clip.PutInClipboard '粘贴发现是hello world
''8.可以通过DataObject.GetFromClipboard()来将系统剪切板中的文本导入这里的DataObject对象中格式为1的文本的字段中
Clip.SetText '12345'
Clip.GetFromClipboard
''8.1下面的GetText()调用,本应将上次调用PutInClipboard()方法后,放入系统剪切板的“hello world”导入进来,
'' 但导入进来的是新设置的'12345',所以PutInClipboard()方法会将DataObject对象与剪切板绑定,这肯定是个功能性bug
'' 更具体试验见下面的
Debug.Print 8.1, Clip.GetText '这里输出的是“hello world”
Clip.SetText 'hello world'
Debug.Print 8.1, Clip.GetText
''9.Clear()方法将清空所有的格式列表与文本数据
Clip.Clear
Debug.Print 9, Clip.GetFormat(1)
''9.1Clear()方法被调用之前,如果DataObject对象与系统剪切板数据共享了,也将清除系统剪切板中的数据
''================【粘贴试试】================
''9.2如果剪切板文本为空,GetFromClipboard()方法会将DataObject对象的格式为1的文本删除,该文本将无法访问
Clip.GetFromClipboard
' Debug.Print 9.2 , Clip.GetText
''9.3上面的代码,清除了DataObject中的数据,但由下面的试验可知,仍然不能断开上面建立的DataObject与系统剪切板之间
'' 的数据共享
Clip.SetText 12345
Debug.Print 9.3, Clip.GetText '如果被Clear()断开了,这里就应该是“hello world”,因为“12345”还没有被PutIn
''9.4要想断开DataObject与系统剪切板之间的数据共享,最好方法是重新初始化该对象
Set Clip = New MSForms.DataObject
Clip.SetText 'hello world'
Clip1.GetFromClipboard '注意:这里是Clip1
Debug.Print 9.4, Clip1.GetText '注意:这里是Clip1,如果没断开,应该输出“hello world”
''9.5GetFromClipboard()方法不会将DataObject对象与系统剪切板的数据共享
Clip1.SetText 'hello world' '注意:这里是Clip1
Clip.GetFromClipboard '注意:这里是Clip
Debug.Print 9.5, Clip.GetText '注意:这里是Clip,如果建立共享,应该输出“hello world”
End Sub
|