VFP拖放操作编程.docx
- 文档编号:10896251
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:19
- 大小:341.11KB
VFP拖放操作编程.docx
《VFP拖放操作编程.docx》由会员分享,可在线阅读,更多相关《VFP拖放操作编程.docx(19页珍藏版)》请在冰点文库上搜索。
VFP拖放操作编程
4.16.1示例演示
执行该示例的步骤如下。
①打开“任务窗格管理器”窗口,依次单击“控件”→“列表框”→“Treeview/列表框拖放”,打开图4-42所示的表单。
表单中左边的两个列表演示了在ActiveX控件Treeview之间的拖放实现方法,右边两个列表演示的是在VisualFoxPro列表框控件之间通过OLE模式实现拖放的方法。
②在OLE拖放操作中,可以选择复制或移动数据。
要移动数据,可以直接按住鼠标左键,拖动数据到放落目标上即可;要复制数据,需要按住鼠标左键的同时按住Ctrl键,拖动数据到放落目标上即可,此时鼠标指针下方将出现一个“+”形状。
图4-43所示是移动拖放和复制拖放时鼠标指针的形状。
③如果按住鼠标右键拖放数据到放落目标,则显示一个快捷菜单,询问是复制数据还是移动数据,如图4-44所示。
图表单
图4-43拖放操作
图4-44按住鼠标右键拖放数据
4.16.2OLE拖放模式
VisualFoxPro支持控件的两种OLE拖放模式:
固有模式和人工模式。
在固有模式中,由VisualFoxPro处理OLE拖放操作;而在人工模式中,可通过编程来处理OLE拖放操作。
1.固有OLE拖放模式
固有OLE拖放模式可以提供标准的OLE拖放支持,而无须另外编程。
要使用固有OLE拖放支持,需要将拖动源控件的OLEDragMode属性设置为1(自动),并将放落目标控件的OLEDropMode属性设置为1(启用)。
对于固有OLE拖放操作,VisualFoxPro确定放落目标是否支持将要放落在上面的数据格式。
如果放落目标支持该格式,则可以放落,否则不允许放落。
表4-17列出了在固有模式下可以作为拖动源的VisualFoxPro控件及所支持的数据格式。
其中的CF_TEXT是文本,就像在文本框中输入的文本,而CFSTR_VFPSOURCEOBJECT是对VisualFoxPro控件或对象的引用。
对于支持CF_TEXT数据格式的控件,可以从控件的文本部分拖动文本。
表4-17 拖动源的数据格式
控件
数据格式(在文件中定义)
容器、图像、线条、页框和形状
CFSTR_VFPSOURCEOBJECT
命令按钮和标签
CFSTR_VFPSOURCEOBJECT和CF_TEXT
复选框、组合框、编辑框、列表框、微调控件和文本框
CFSTR_VFPSOURCEOBJECT、CF_TEXT和CFSTR_OLEVARIANT
表4-18列出了在固有模式中可以作为放落目标的VisualFoxPro控件及所支持的数据格式。
对于下表中列出的控件,可以向控件的文本部分放落文本,文本将在插入点插入。
表4-18 放落目标的数据格式
控件
数据格式
编辑框和组合框(当组合框的Style属性设置为0-下拉组合框)
CF_TEXT
微调控件和文本框
CFSTR_OLEVARIANT
2.人工OLE拖放模式
有时,可能需要控制放落目标上能够放落的数据类型,或者需要为拖放操作提供附加功能。
如将数据转换成放落目标所支持的格式,或者显示一个对话框,询问用户是否确认将数据放落到目标上等。
在这些情况下,就需要使用人工方式处理拖放操作,来提供更好的功能控制。
为了实现对控件的人工OLE拖放支持,需要编写事件或方法程序的代码,来覆盖需要进行控制的拖放事件或方法程序。
在事件或方法程序代码中包含NODEFAULT关键字,可以覆盖固有的VisualFoxPro拖放行为。
4.16.3DataObject对象
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
"OLEVariantArray"
一个VisualFoxPro数组。
使用这个格式在一次拖放中可以传送多个值。
例如,这个格式可以用于将列表框中的一些项拖动到另一个列表框中
CFSTR_OLEVARIANT
"OLEVariant"
一个VisualFoxPro变量。
VisualFoxPro中的所有数据类型都可以用变量代表。
这个格式可以用于拖放VisualFoxPro数据,并且不丢失数据类型
CFSTR_VFPSOURCEOBJECT
"VFPSourceObject"
对一个VisualFoxPro对象的引用
@ArrayName,指定一个数组的名称,用于传递多个值。
由表4-19可以看出,能够包含多个值的数据格式只有CF_FILES、CF_HDROP和CFSTR_OLEVARIANTARRAY。
例如,可以从Windows资源管理器中将一组文件拖动到VisualFoxPro的一个列表框中。
在列表框的OLEDragDrop事件中,通过GetData方法可以得到一个存放这些文件名称的数组,然后在FOR...ENDFOR循环中使用AddItem方法将数组中的内容添加到列表框中。
在GetData方法中指定数组名称时,该数组必须存在。
如果该数组存在,但是不足以包含所需的数据,VisualFoxPro自动增加该数组的大小。
如果数组超过了需要的长度,VisualFoxPro会截断该数组。
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(eData[,nFormat|cFormat])
eData,指定放在DataObject中的数据。
如果省略可选的nFormat和cFormat参数,VisualFoxPro按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(默认值),表示使用人工方式。
当试图拖动数据时,VisualFoxPro不开始OLE拖动操作。
要开始OLE拖动操作,必须调用OLEDrag方法。
如果属性值为1,表示使用自动方式。
当试图拖动数据时,VisualFoxPro自动开始OLE拖动操作。
(2)OLEDragPicture属性
该属性指定在OLE拖放操作过程中,在鼠标指针下显示的图片。
可以是.bmp、.dib、.jpg、.gif、.ani、.cur和.ico等为后缀的图像文件类型。
(3)OLEDrag方法
该方法用于开始一次OLE拖放操作。
语法格式如下:
LPARAMETERSlDetectDrag
lDetectDrag指定何时发生OLEStartDrag事件。
如果lDetectDrag为.T.(默认值),则立即发生OLEStartDrag事件。
如果lDetectDrag为.F.,则当用户按住鼠标一段时间之后,或者按住鼠标并移动了一段距离之后,才发生OLEStartDrag事件。
(4)OLEStartDrag事件
该事件在调用OLEDrag方法后立即发生。
语法格式如下:
LPARAMETERSoDataObject,nEffect
oDataObject提供对OLE拖放DataObject对象的引用。
nEffect指定拖动源支持的OLE拖动操作。
表4-20列出了nEffect的值和每种动作的说明。
nEffect是一个输出参数,并且在事件的入口设置为3,所以应该在本事件中提供nEffect的值。
例如,如果只允许复制操作,可将nEffect设置为1(DROPEFFECT_COPY)。
表4-20 nEffect参数的可用值
nEffect
常数
说明
0
DROPEFFECT_NONE
拖动源不支持任何拖动操作
1
DROPEFFECT_COPY
拖动源支持复制操作
2
DROPEFFECT_MOVE
拖动源支持移动操作(默认的)
4
DROPEFFECT_LINK
拖动源支持链接操作
一个拖动源可以支持多个拖动操作,只需将nEffect的多个值加在一起。
例如,如果nEffect为3,则拖动源支持复制和移动拖动操作(3=1+2)。
(5)OLESetData事件
当放落目标调用GetData方法,并且没有指定格式的数据时,拖动源发生该事件。
语法格式如下:
LPARAMETERSoDataObject,eFormat
oDataObject提供对OLE拖放DataObject对象的引用。
eFormat用于指定所需数据的格式,见表4-19。
(6)OLEGiveFeedback事件
在每次OLEDragOver事件之后发生,允许拖动源指定OLE拖放操作的种类以及可视反馈。
该事件的语法格式如下:
LPARAMETERSnEffect,eMouseCursor
nEffect指定当数据放落到目标上时所进行的操作,见表4-20。
eMouseCursor指定在OLE拖放操作过程中所显示的鼠标指针,可以是一个字符或数值。
如果eMouseCursor是一个字符值,则该字符值应当是.ani、.cur或.ico等为后缀的图像文件名称。
如果eMouseCursor是一个数值,则该值指定了所显示的鼠标指针。
(7)OLECompleteDrag事件
该事件在数据放落到目标上,或取消了OLE拖放操作时发生,语法格式如下:
LPARAMETERSnEffect
nEffect是从OLEDragDrop事件传递的值,对应于当数据放落到目标上时采取的动作。
见表4-20中的说明。
2.放落目标处理
(1)OLEDropMode属性
该属性指定放落目标如何管理OLE放落操作,可用的放落模式如表4-21所示。
表4-21 放落模式
属性值
常数
说明
0
DROP_DISABLED
禁止(默认值)。
数据不能放落到控件或对象上,并且不发生放落目标事件。
当鼠标指针位于控件或对象上时,显示不准放落鼠标指针
1
DROP_ENABLED
启用。
VisualFoxPro允许将数据放落到控件或对象上,并且发生放落目标事件
2
DROP_PASSTOCONTAINER
传递到容器。
控件或对象就像禁止了OLE放落操作一样,并且数据被放落到控件或对象的容器中。
为了接受数据,容器的OLEDropMode属性必须设置为1或2。
如果容器的OLEDropMode属性设置为0,则显示不准放落鼠标指针
如果一个控件或对象的Enabled属性设置为.F.,则不能将数据放落到该控件或对象上。
(2)OLEDropEffects属性
指定一个OLE放落目标所支持的放落操作类型,表4-22列出了可用的操作类型。
表4-22 放落操作类型
属性值
常数
说明
0
DROPEFFECT_NONE
放落目标不接受数据
1
DROPEFFECT_COPY
数据可以复制到放落目标中
2
DROPEFFECT_MOVE
数据可以移动到放落目标中
4
DROPEFFECT_LINK
数据可以链接到放落目标
一次放落可以支持多种放落操作,例如,如果属性值为3,则放落目标支持复制和移动放落操作。
OLEDropEffects是一个放落目标属性,应该在OLEDragOver事件中设置。
(3)OLEDropHasData属性
指定如何管理放落操作,该属性在设计时只读。
OLEDropHasData是一个放落目标属性,且应该在OLEDragOver事件中设置。
在OLEDragOver事件中使用DataObject的GetFormat方法,可以判断DataObject是否包含适合于放落目标的数据格式的数据。
如果数据符合放落目标的数据格式,则将OLEDropHasData置为1。
表4-23列出了该属性的可用值。
表4-23 OLEDropHasData属性的可用值
属性值
常数
说明
–1
DROPHASDATA_VFPDETERMINE
默认值。
VisualFoxPro自动确定DataObject是否包含可以放落到目标上的数据格式的数据。
如果DataObject包含的数据格式适于放落目标,则该数据就放落到目标上。
VisualFoxPro管理鼠标指针,并且通知拖动源。
如果DataObject包含的数据的格式不适于放落目标,则VisualFoxPro显示不准放落的鼠标指针,取消这次放落操作,并且通知拖动源这次放落操作被取消了
0
DROPHASDATA_NOTUSEFUL
DataObject不包含可以放落到目标上的数据格式的数据,并且显示不准放落的鼠标指针
1
DROPHASDATA_USEFUL
DataObject包含可以放落到目标上的数据格式的数据。
(4)OLEDragOver事件
当数据被拖动到一个放落目标上,并且放落目标的OLEDropMode属性设置为1时发生该事件。
语法格式如下:
LPARAMETERSoDataObject,nEffect,nButton,nShift,nXCoord,nYCoord,nState
oDataObject,对OLE拖放DataObject的对象引用。
nEffect,传递给OLEGiveFeedback事件的一个值,表明当数据放落到目标上时采取的动作。
该参数的可用值见表4-22。
nButton,包含一个数字,该数字指定了为将数据放落到目标上,放开了哪个鼠标键:
1(左键)、2(右键)或4(中间键)。
nShift,包含一个数字,该数字指定了将数据放落到目标上时辅助键的状态:
1(SHIFT)、2(CTRL)、4(ALT)。
如果按住了多个辅助键,则nShift参数包含这些辅助键的值的和。
nXCoord,nYCoord,鼠标指针在表单中的水平和垂直位置,表单的ScaleMode属性指定了度量单位。
nState,包含一个数值,该数值指定了数据被拖动的方向。
如果该值为0,表示数据被拖动到控件或对象中,这时可以设置OLEDropEffects和OLEDropHasData属性;如果该值为1,表示数据被拖动到控件或对象的外部;如果该值为2,表示数据被拖动到控件或对象的内部。
(5)OLEDragDrop事件
当数据放落到目标上,并且放落目标的OLEDropMode属性设置为1时发生。
语法格式如下:
LPARAMETERSoDataObject,nEffect,nButton,nShift,nXCoord,nYCoord
参数说明与OLEDragOver事件相同。
4.16.5拖动源设计
在介绍拖动源设计之前,首先来看一下本节示例表单的设计界面,如图4-45所示。
图的设计界面
表单中的Treeview控件Olecontrol1是拖动源,其OLEDragMode属性被设置为1,表示在拖动时自动启用OLE拖放。
表单中的List1列表框控件的拖动设计稍微复杂一些,OLEDragMode属性同样被设置为1。
同时,为了能够拖动多行被选定的数据项,所以在拖动时首先建立一个CFSTR_OLEVARIANTARRAY格式的数据,以取代默认的CF_TEXT、CFSTR_OLEVARIANT或CFSTR_VFPSOURCEOBJECT格式,然后将数据放在OLE拖放DataObject中。
从前面的介绍知道,这项工作只能在OLEStartDrag事件中完成。
List1的OLEStartDrag事件代码如下:
LPARAMETERSoDataObject,nEffect
LOCALaValues,i,nSelected
*!
*建立一个包含当前选定数据项的数组
nSelected=0
*!
*如果项目被选定,则添加到数组中
IFThis.Selected(i)
nSelected=nSelected+1
DIMENSIONaValues[nSelected]
aValues[nSelected]=This.List(i)
ENDIF
NEXT
*!
*列表框的自动格式是CF_TEXT、CFSTR_OLEVARIANT和CFSTR_VFPSOURCEOBJECT,
*!
*由于要拖放多行,所以需要存储数据为CFSTR_OLEVARIANTARRAY格式
IFnSelected>0
oDataObject.SetData(@aValues)
ENDIF
在List1的OLECompleteDrag事件中包含有下列代码,用于根据从放落目标的OLEDragDrop事件传递来的nEffect参数值,采取相应的动作。
LPARAMETERSnEffect
LOCALi,oldExact
*!
*如果执行了移动操作,从列表中移除项目
IFnEffect==2 &&DROPEFFECT_MOVE
IFEMPTY(THISFORM.aItems)
RETURN
ENDIF
oldExact=SET("EXACT")
SETEXACTON
FORi=This.ListCountto1step-1
IFASCAN(THISFORM.aItems,THIS.List[m.i])#0
This.RemoveItem(m.i)
ENDIF
NEXT
SETEXACT&oldExact
ENDIF
4.16.6放落目标设计
首
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VFP 拖放 操作 编程