4.16.1 示例演示
执行该示例的步骤如下。
打开“任务窗格管理器”窗口,依次单击“控件”→“列表框”→“Treeview/列表框拖放”,打开图4-42所示的表单。表单中左边的两个列表演示了在ActiveX控件Treeview之间的拖放实现方法,右边两个列表演示的是在Visual FoxPro列表框控件之间通过OLE模式实现拖放的方法。
OLE拖放操作中,可以选择复制或移动数据。要移动数据,可以直接按住鼠标左键,拖动数据到放落目标上即可;要复制数据,需要按住鼠标左键的同时按住Ctrl键,拖动数据到放落目标上即可,此时鼠标指针下方将出现一个“+”形状。图4-43所示是移动拖放和复制拖放时鼠标指针的形状。
如果按住鼠标右键拖放数据到放落目标,则显示一个快捷菜单,询问是复制数据还是移动数据,如图4-44所示。
图表单
4-43 拖放操作
4-44 按住鼠标右键拖放数据
4.16.2 OLE拖放模式
Visual FoxPro支持控件的两种OLE拖放模式:固有模式和人工模式。在固有模式中,由Visual FoxPro处理OLE拖放操作;而在人工模式中,可通过编程来处理OLE拖放操作。
1.固有OLE拖放模式
固有OLE拖放模式可以提供标准的OLE拖放支持,而无须另外编程。要使用固有OLE拖放支持,需要将拖动源控件的OLEDragMode属性设置为1(自动),并将放落目标控件的OLEDropMode属性设置为1(启用)。
对于固有OLE拖放操作,Visual FoxPro确定放落目标是否支持将要放落在上面的数据格式。如果放落目标支持该格式,则可以放落,否则不允许放落。
4-17列出了在固有模式下可以作为拖动源的Visual FoxPro控件及所支持的数据格式。其中的CF_TEXT是文本,就像在文本框中输入的文本,而CFSTR_VFPSOURCEOBJECT是对Visual FoxPro控件或对象的引用。对于支持CF_TEXT数据格式的控件,可以从控件的文本部分拖动文本。
4-17                                                                      拖动源的数据格式
控件
数据格式(在文件中定义)
容器、图像、线条、页框和形状
CFSTR_VFPSOURCEOBJECT
命令按钮和标签
CFSTR_VFPSOURCEOBJECTCF_TEXT
复选框、组合框、编辑框、列表框、微调控件和文本框
CFSTR_VFPSOURCEOBJECTCF_TEXTCFSTR_OLEVARIANT
4-18列出了在固有模式中可以作为放落目标的Visual FoxPro控件及所支持的数据格式。对于下表中列出的控件,可以向控件的文本部分放落文本,文本将在插入点插入。
4-18                                                                    放落目标的数据格式
控件
数据格式
编辑框和组合框(当组合框的Style属性设置为0-下拉组合框)
CF_TEXT
微调控件和文本框
CFSTR_OLEVARIANT
2.人工OLE拖放模式
有时,可能需要控制放落目标上能够放落的数据类型,或者需要为拖放操作提供附加功能。如将数据转换成放落目标所支持的格式,或者显示一个对话框,询问用户是否确认将数据放落到目标上等。在这些情况下,就需要使用人工方式处理拖放操作,来提供更好的功能控制。
为了实现对控件的人工OLE拖放支持,需要编写事件或方法程序的代码,来覆盖需要进行控制的拖放事件或方法程序。在事件或方法程序代码中包含NODEFAULT关键字,可以覆盖固有的Visual FoxPro拖放行为。
4.16.3 DataObject对象
DataObject对象为控件提供了编程方式的OLE拖放支持。DataObject对象是一个数据容器,该容器内的数据从OLE拖动源转移到OLE放落目标,并且该对象只在OLE拖放操作过程中存在,而不能通过编程来创建DataObject对象,当OLE拖放操作结束后,对它的引用将无效。在OLEStartDragOLEDragOverOLEDragDropOLESetData事件中,DataObject通过oDataObject参数进行传递。
DataObject可以保存多组数据,每组数据可以有不同的格式。可使用GetFormat方法确定DataObject中数据存在的格式。
使用DataObject对象的方法程序可以通过编程来管理拖放的数据,下面将简单介绍这些方法。
1ClearData方法
该方法用于从OLE拖放DataObject对象中清除所有的数据和数据格式,该方法只能在OLEStartDrag事件中执行。
2GetData方法
该方法用于从OLE拖放DataObject对象获取数据,语法格式如下:
oDataObject.GetData(nFormat | cFormat [, @ArrayName])
nFormat | cFormat,指定要获取数据的格式。表4-19列出了每种数据格式的值和说明。
4-19                                                            DataObject对象支持的数据格式
数据格式(在中定义)
nFormat|cFormat
说明
CF_TEXT
1
文本格式
CF_OEMTEXT
7
包含OEM字符集中字符的文本格式
CF_UNICODETEXT
13
Unicode文本格式,只在和以后版本中可用
CF_FILESCF_HDROP
15
一个标识一组文件的句柄,例如从Windows资源管理器拖来的一组文件
CF_LOCALE
16
与剪贴板上文本相关的本地标识符的句柄
CFSTR_OLEVARIANTARRAY
"OLE Variant Array"
一个Visual FoxPro数组。使用这个格式在一次拖放中可以传送多个值。例如,这个格式可以用于将列表框中的一些项拖动到另一个列表框中
CFSTR_OLEVARIANT
"OLE Variant"
一个Visual FoxPro变量。Visual FoxPro中的所有数据类型都可以用变量代表。这个格式可以用于拖放Visual FoxPro数据,并且不丢失数据类型
CFSTR_VFPSOURCEOBJECT
"VFP SourceObject"
对一个Visual FoxPro对象的引用
@ArrayName,指定一个数组的名称,用于传递多个值。由表4-19可以看出,能够包含多个值的数据格式只有CF_FILESCF_HDROPCFSTR_OLEVARIANTARRAY。例如,可以从Windows资源管理器中将一组文件拖动到Visual FoxPro的一个列表框中。在列表框的OLEDragDrop事件中,通过GetData方法可以得到一个存放这些文件名称的数组,然后在ENDFOR循环中使用AddItem方法将数组中的内容添加到列表框中。
GetData方法中指定数组名称时,该数组必须存在。如果该数组存在,但是不足以包含所需的数据,Visual FoxPro自动增加该数组的大小。如果数组超过了需要的长度,Visual FoxPro会截断该数组。
GetData方法返回的值取决于nFormatcFormat指定的数据格式。如果DataObject不包含nFormatcFormat指定格式的数据,则返回.F.。如果数据符合多值格式,如CF_FILESCF_HDROPCFSTR_OLEVARIANTARRAY,则返回.T.。如果数据符合单值格式时,如CF_TEXTCFSTR_OLEVARIANTCFSTR_VFPSOURCEOBJECT,则返回DataObject中的值。
如果使用nFormatcFormat指定的数据格式存在,但是在DataObject中没有这种格式的数
据,则触发一个拖动源的OLESetData事件(在使用SetData方法将相应数据放在DataObject中之前,可以使用SetFormat方法指定一种数据格式)。
3GetFormat方法
该方法确定在OLE拖放DataObject中指定格式的数据是否可用,语法格式如下:
oDataObject.GetFormat(nFormat|cFormat)
nFormat|cFormat,指定要获取数据的格式,可获取的格式是表4-19中除CF_LOCALE之外的所有格式。
如果DataObject包含nFormatcFormat指定格式的数据,则该方法返回.T.,否则返回.F.
4SetData方法
该方法将数据放在OLE拖放DataObject中,语法格式如下:
oDataObject.SetData(unicode文件格式eData [, nFormat | cFormat])
eData,指定放在DataObject中的数据。如果省略可选的nFormatcFormat参数,Visual FoxProCF_TEXTCFSTR_OLEVARIANT格式将数据放在DataObject中。如果eData是一个数组,需要在eData前面加一个“@”记号。数组是按CFSTR_OLEVARIANTARRAY格式放在DataObject中的。如果eData是一个对象引用或通用字段,或者是包含对象引用的数组,则会产生一条错误信息。
nFormat | cFormat,指定放在DataObject中的数据的格式,可用格式见表4-19。使用cFormat也可以指定自定义格式,这时eData必须是使用CREATEBINARY( )创建的字符型或二进制型。
注意,SetData方法只能在OLEStartDrag事件中执行。
5SetFormat方法
该方法指定OLE拖放DataObject的数据格式,语法格式如下:
oDataObject.SetFormat(nFormat | cFormat)
nFormat | cFormat,指定DataObject的数据格式,可用格式是表4-19中除CF_LOCALE之外的所有格式。
可以在向DataObject中放置数据之前,首先放置数据格式。如果在DataObject中放置了数据格式,而不包含相应的数据,并且在OLEDragDrop事件中激活了SetData方法,则拖动源发生OLESetData事件。然后,拖动源在OLESetData事件中使用SetData方法将数据放在DataObject中。
SetFormat方法只能在OLEStartDragOLESetData事件中执行。
4.16.4 拖放数据
在拖放数据时,需要处理拖动源和放落目标两方面的事件过程。
1.拖动源处理
1OLEDragMode属性
该属性指定拖动源管理OLE拖动操作的方式,在设计和运行时可用。
如果属性值为0(默认值),表示使用人工方式。当试图拖动数据时,Visual FoxPro不开始OLE拖动操作。要开始OLE拖动操作,必须调用OLEDrag方法。如果属性值为1,表示使用自动方式。当试图拖动数据时,Visual FoxPro自动开始OLE拖动操作。
2OLEDragPicture属性
该属性指定在OLE拖放操作过程中,在鼠标指针下显示的图片。可以是.bmp.dib.jpg.gif.ani.cur.ico等为后缀的图像文件类型。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。