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
联系客服