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_VFPSOURCEOBJECT和CF_TEXT |
复选框、组合框、编辑框、列表框、微调控件和文本框 | CFSTR_VFPSOURCEOBJECT、CF_TEXT和CFSTR_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拖放操作结束后,对它的引用将无效。在OLEStartDrag、OLEDragOver、OLEDragDrop和OLESetData事件中,DataObject通过oDataObject参数进行传递。
DataObject可以保存多组数据,每组数据可以有不同的格式。可使用GetFormat方法确定DataObject中数据存在的格式。
使用DataObject对象的方法程序可以通过编程来管理拖放的数据,下面将简单介绍这些方法。
1.ClearData方法
该方法用于从OLE拖放DataObject对象中清除所有的数据和数据格式,该方法只能在OLEStartDrag事件中执行。
2.GetData方法
该方法用于从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_FILES或CF_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_FILES、CF_HDROP和CFSTR_OLEVARIANTARRAY。例如,可以从Windows资源管理器中将一组文件拖动到Visual FoxPro的一个列表框中。在列表框的OLEDragDrop事件中,通过GetData方法可以得到一个存放这些文件名称的数组,然后在ENDFOR循环中使用AddItem方法将数组中的内容添加到列表框中。
在GetData方法中指定数组名称时,该数组必须存在。如果该数组存在,但是不足以包含所需的数据,Visual FoxPro自动增加该数组的大小。如果数组超过了需要的长度,Visual FoxPro会截断该数组。
GetData方法返回的值取决于nFormat或cFormat指定的数据格式。如果DataObject不包含nFormat或cFormat指定格式的数据,则返回.F.。如果数据符合多值格式,如CF_FILES、CF_HDROP或CFSTR_OLEVARIANTARRAY,则返回.T.。如果数据符合单值格式时,如CF_TEXT、CFSTR_OLEVARIANT或CFSTR_VFPSOURCEOBJECT,则返回DataObject中的值。
如果使用nFormat或cFormat指定的数据格式存在,但是在DataObject中没有这种格式的数
据,则触发一个拖动源的OLESetData事件(在使用SetData方法将相应数据放在DataObject中之前,可以使用SetFormat方法指定一种数据格式)。
3.GetFormat方法
该方法确定在OLE拖放DataObject中指定格式的数据是否可用,语法格式如下:
oDataObject.GetFormat(nFormat|cFormat)
nFormat|cFormat,指定要获取数据的格式,可获取的格式是表4-19中除CF_LOCALE之外的所有格式。
如果DataObject包含nFormat或cFormat指定格式的数据,则该方法返回.T.,否则返回.F.。
4.SetData方法
该方法将数据放在OLE拖放DataObject中,语法格式如下:
oDataObject.SetData(unicode文件格式eData [, nFormat | cFormat])
eData,指定放在DataObject中的数据。如果省略可选的nFormat和cFormat参数,Visual FoxPro按CF_TEXT和CFSTR_OLEVARIANT格式将数据放在DataObject中。如果eData是一个数组,需要在eData前面加一个“@”记号。数组是按CFSTR_OLEVARIANTARRAY格式放在DataObject中的。如果eData是一个对象引用或通用字段,或者是包含对象引用的数组,则会产生一条错误信息。
nFormat | cFormat,指定放在DataObject中的数据的格式,可用格式见表4-19。使用cFormat也可以指定自定义格式,这时eData必须是使用CREATEBINARY( )创建的字符型或二进制型。
注意,SetData方法只能在OLEStartDrag事件中执行。
5.SetFormat方法
该方法指定OLE拖放DataObject的数据格式,语法格式如下:
oDataObject.SetFormat(nFormat | cFormat)
nFormat | cFormat,指定DataObject的数据格式,可用格式是表4-19中除CF_LOCALE之外的所有格式。
可以在向DataObject中放置数据之前,首先放置数据格式。如果在DataObject中放置了数据格式,而不包含相应的数据,并且在OLEDragDrop事件中激活了SetData方法,则拖动源发生OLESetData事件。然后,拖动源在OLESetData事件中使用SetData方法将数据放在DataObject中。
SetFormat方法只能在OLEStartDrag和OLESetData事件中执行。
4.16.4 拖放数据
在拖放数据时,需要处理拖动源和放落目标两方面的事件过程。
1.拖动源处理
(1)OLEDragMode属性
该属性指定拖动源管理OLE拖动操作的方式,在设计和运行时可用。
如果属性值为0(默认值),表示使用人工方式。当试图拖动数据时,Visual FoxPro不开始OLE拖动操作。要开始OLE拖动操作,必须调用OLEDrag方法。如果属性值为1,表示使用自动方式。当试图拖动数据时,Visual FoxPro自动开始OLE拖动操作。
(2)OLEDragPicture属性
该属性指定在OLE拖放操作过程中,在鼠标指针下显示的图片。可以是.bmp、.dib、.jpg、.gif、.ani、.cur和.ico等为后缀的图像文件类型。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论