使用VisulFoxPro的ActiveX控件.docx
- 文档编号:26475066
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:22
- 大小:35KB
使用VisulFoxPro的ActiveX控件.docx
《使用VisulFoxPro的ActiveX控件.docx》由会员分享,可在线阅读,更多相关《使用VisulFoxPro的ActiveX控件.docx(22页珍藏版)》请在冰豆网上搜索。
使用VisulFoxPro的ActiveX控件
使用VisualFoxPro的ActiveX控件
DougHennig
InterpretByRMH
简介
VisualFoxPro包括许多ActiveX(原来的OLE)控件,它们可用于添加大量新功能到你的应用程序.它们中包括了TreeView,ListView,StatusBar和CommonDialog控件,允许你创建Windows9x风格的应用程序.另外,如MAPI和Comm控件,允许你添加messaging和串口控件到你的应用程序.这些箜件中的一些没有多大用处:
如“threed”控件,有些控件与VFP自身已有控件只有极小差异,并且看起来只能用于VisualBasic或orAccess.
ActiveX控件很容易接触到:
只需从表单控件工具栏中的查看类菜单中选择ActiveX控件,会有30个新的控件出现在工具栏中.就象VFP自身的控件一样简单地从工具栏中拖动一个控件到表单中,给它取一个名字,设置一些属性.除VFP属性表外,各控件有一个自定义属性表.要访问该自定义属性表,在控件上右击并从出现的菜单中选择适当的项.
要想做得更好,你可以利用VFP是唯一的允许你派生ActiveX控件并添加附加行为的开发环境这一事实。
例如,你可以为一个控件建立一个封装类来隐藏它的复杂性和使其便于使用,或添加自定义属性和方法来进一步扩展控件功能。
我只试验了少量控件,并提供这些子类的源代码.
帮助文件包括了控件的属性,事件和方法(PEM)文档.共有三个帮助文件:
\WINDOWS\SYSTEM\MSACAL70.HLP(日历控件),\WINDOWS\SYSTEM\SYSINFO.HLP(SysInfo控件),和\VFP5\CTRLHELP\CTRLREF.HLP(其它控件).通常,你可以在表单设计器或类设计器中选定一个ActiveX控件并按下F1来查看该控件的帮助主题(我将在稍后注明一些例外).但是,这些新控件的文档对VFP程序员没有太大的帮助:
文本和示例是针对于VisualBasic或Access,一些文档的结构是离奇的,并存在着大量的错误和疏忽.我将指出各控件的这些情形.
由于有许多新控件本文时间和内容的限制,我不可能全部描述它们.我选择了我认为大多数用户可能会使用的控件:
ImageList,TreeView,CommonDialogs,Calendar,ProgressBar,和Slider.本文焦点是如何在VFP中使用这些控件,给出有用的示例,并讨论最普通的属性事件和方法,因此你可以定制它们的外观或行为.
ImageList控件
ImageList控件非常简单,但因为我论述的其它控件要用到它,所以我们将首先讨论它.ImageList控件预载入一些图象,因此其它控件(如TreeView和ListView控件)可以拥有图象资源.此外,它自己并不做任何用有的事情.
虽然该控件有少量属性,事件和方法,你可能不会用到它们.通常,你会使用ImageList控件的属性表(可在其上右击鼠标调出)来为另一个控件载入你需要的图象并设置图象的大小和颜色.
要载入图象到ImageList控件,简单地从ActiveX控件工具条上拖动一个到表单上,修改它的名字,调出ImageList控件的属性表,选择Images页,并插入你需要的图形.各图形的索引值(从1开始)用于其它控件选择一个图象.例如我们将很快看到的TreeView控件,肯的一个Add方法来添加一个新节点,并使用了相关ImageList控件的索引号作为节点使用的图象.
ImageList控件位于COMCTL32.OCX(in\WINDOWS\SYSTEM)其帮助文档在CTRLREF.HLP中.
TreeView控件
VFP5.0的新的ActiveX控件TreeView是一个有力的、可视的、吸引人的工具,你可以将它使用于许多应用程序。
但是,其使用的复杂和技术文档的简单使很多人望而却步。
本文探索了一些使用TreeView的有用的技术。
VISUALFoxPro5.0包含了很多新的ActiveX(原来的OLE)控件,这些控件可以为你的应用程序增加很多新功能。
这些控件包括TreeView、ListView、StatusBar、和CommonDialog控件,允许你为你的应用程序建立Windows95风格的界面。
ActiveX控件很容易找到:
在表单控件工具栏中的查看类菜单中选择ActiveX控件,会出现30个新的控件。
简单的从工具条拖放一个控件到一个表单中,就象使用VFP自身的控件一样,给它一个名字,设置一些属性,等等…在附加到VFP的属性表单,每一个控件都有一个定制的属性表。
要访问这个属性表,在控件上右击鼠标并从出现的快捷菜单中选择适当的项。
TreeView控件
我的意见是,最重要的新控件是TreeView。
你已经使用过TreeView控件-它被用于WindowsExplorer的左边窗口中,以及VFP的项目管理和类浏览器。
该控件在视觉上比VFP3.0中的Outline控件更吸引人,且更容易处理。
例如,你要使节点显示你必须顺序添加节点到Outline控件。
在TreeView控件中你可以以任意顺序添加节点,因为在添加新节点时你可以指定哪一节点是父节点。
你可以用TreeView控件来做许多事。
以下是一些例子:
●在库存控件系统中显示一些原始单据清单。
●用于向下延伸显示。
例如,你可以显示一个客户清单并为该客户向下延伸到订单的订货和产品。
另一个示例是区域表及所属销售人员及各销售人员的客户,等等。
●改善组织图表:
分隔主管人员扩展的分支,及其员工。
●创建任何其它层次显示信息。
TreeView控件位于COMCTL32.OCX(在\WINDOWS\SYSTEM中)。
如果你安装了VisualBasicControlCreationEdition,会安装一个更新版本的COMCTL32.OCX,这个版本有许多问题。
如果你的COMCTL32.OCX大于325K,你应该从你的VFP5.0CD-ROM上重新安装一个正确的版本(位于光盘上的\OS\SYSTEM目录中)。
很多用户诉说在他们的系统中TreeView不能正确工作,这也可能是原因之一。
TreeView控件的帮助文档在CTRLREF.HLP中(在VFP主目录中)。
这个TreeView控件的帮助文件的内容可能是所有ActiveX控件中最可怜的帮助文件了(可以说是高深莫测):
它的组织混乱,内容在多处有误,且经常是很模糊,尤其在文档中的如何访问一些方法和属性的地方更是如此。
TreeView控件允许你处理三个不同类型的对象:
TreeView控件自身,节点集合和节点对象。
节点集合与表单中的控件集合一样;它允许你用不同的索引号来访问个别节点对象。
但是,也可以不通过节点集合来访问不同的节点对象。
例如,TreeView的SelectedItem属性是一个选定节点的对象引用,因此象NodeClick和Expanded这样的方法接受一个节点的对象引用作为参数。
我将分别探讨这三个对象类型的属性,事件和方法。
在示例表单TREEVIEW.SCX中展示了我在本文中描述的许多技术。
TreeView控件的方法和事件
TreeView控件响应一些我们觉的VFP控件的方法和事件:
Click,DblClick,Drag,DragDrop,DragOver,GotFocus,KeyDown,KeyPress,KeyUp,LostFocus,MouseDown,MouseMove,MouseUp,Move,Refresh,SetFocus,ShowWhatsThis,和ZOrder。
有一个很大的例外:
没有RightClick事件。
在稍后,你会看到如何处理这种情况。
除这些方法和事件外,TreeView控件有一些它自己的方法和事件(帮助文件中列出的Clear和Remove方法,实际上是属性节点集合而不是TreeView控件自己的):
BeforeLabelEdit和AfterLabelEdit发生在标签被用户修改前和修改后(就象在Windows的资源管理器中,你可以单击选定的节点并修改它的文本(在稍后你可以看到如何废止该自动编辑功能)。
该事件中的代码通常用于在某处保存新的文本,如一个表中的字段。
Collapse和Expand当用户收缩或扩展一个节点时激发。
它们接受的参数是选定节点的对象。
收缩或扩展一个节点不会使该节点成为活动的节点,这一点通常会使用户糊涂。
添加以下代码到Collapse和Expand事件来确保存该节点成为活动的节点(调用了我将在稍解释的NodeClick(),它们只在你在这些方法中有一些自定义代码是才是必须的):
lparametersnode
Node.Selected=.T.
This.NodeClick(Node)
GetVisibleCount显示控件中全部可见的节点数。
如果控件可以显示最后的节点,该数可能看起来会很小。
HitTest:
如果传递的X和Y座标上存在节点,它返回一个节点对象引用,否则返回.NULL.这里有一个新的问题:
HitTest期待X和Y座标值是缇(twips)(用于VisualBasic),但VFP使用象素。
以下代码将转换象素值到缇。
TREEVIEW示例表单的INIT中有这些代码,并有两个自定义属性来保存计算值:
nTreeFactorX和nTreeFactorY。
localliHWnd,;
liHDC,;
liPixelsPerInchX,;
liPixelsPerInchY
*定义一些常数。
#definecnLOG_PIXELS_X88
*来自WINGDI.H
#definecnLOG_PIXELS_Y90
*来自FromWINGDI.H
#definecnTWIPS_PER_INCH1440
*每英寸1440缇
*定义一些WindowsAPI函数
declareintegerGetActiveWindowinWIN32API
declareintegerGetDCinWIN32API;
integeriHDC
declareintegerGetDeviceCapsinWIN32API;
integeriHDC,integeriIndex
*为VFP取得图形设备(devicecontext)。
liHWnd=GetActiveWindow()
liHDC=GetDC(liHWnd)
*取得每英寸象素值。
liPixelsPerInchX=GetDeviceCaps(liHDC,cnLOG_PIXELS_X)
liPixelsPerInchY=GetDeviceCaps(liHDC,cnLOG_PIXELS_Y)
*取得每象素缇并保存到表单属性中。
withThis
.nTreeFactorX=cnTWIPS_PER_INCH/liPixelsPerInchX
.nTreeFactorY=cnTWIPS_PER_INCH/liPixelsPerInchY
endwith
HitTest()有助于解决一个处理鼠标右击事件。
你可能想在用户在节点上右击时显示弹式菜单,但在节点上右击时不会使它成为选定节点。
在控件的MouseDown事件中用以下代码来处理这一点(因为没有RightClick事件,所以这是你能处理右击的唯一办法)。
同时,调用NodeClick()仅当你在该方法中放有代码时才是必须的:
lparametersButton,Shift,X,Y
localloNode
ifButton=2
*如果这是右鼠标键,取得鼠标下的节点的引用。
loNode=This.HitTest(X*Thisform.nTreeFactorX,;
Y*Thisform.nTreeFactorX)
*如果有可用的节点,选择它。
ifnotisnull(loNode)
loNode.Selected=.T.
This.NodeClick(loNode)
endifnotisnull(loNode)
*现在显示右击快捷菜单
else
*处理必要的鼠标左击
endifButton=2
NodeClick:
当用户在节点上单击时激活(在Click事件之前)。
NodeClick接受一个选定节点的对象引用作为参数。
该方法被典型地用于在一个节点被选定时更新一些东西(例如其它控件的值)。
如果NodeClick中的代码执行时花的时间太长,选定项会被高亮显示但以前的项会被断续线包围。
移动鼠标(即使没有单击鼠标按钮)会恢复以前项的高亮显示。
要避免这一问题,可以在NodeClick事件中放入以下代码来保证节点被单击而成为选定项:
Node.Selected=.T.
StartLabelEdit:
通常被用于编辑节点的标签。
它用于LabelEdit属性被设置为1-手动时。
TreeView控件属性
如同事件一样,TreeView控件支持一些其它控件所拥有的属性,包括DragIcon,DragMode,Enabled和Visible。
许多TreeView特定属性可以在设计时在TreeView控件上单击鼠标右键调出的TreeView控件属性表中设置。
包括Style,LineStyle,Indentation,PathSeparator和HideSelection。
在属性表中可编辑的属性中,你最需要改变其默认值的是:
●Style:
指明TreeView控件显示什么。
可以选择是否显示图像,线条,加号/减号等。
●LineStyle:
指明显示根线。
如果没有设置该属性为1-根线,无论Style是如何设置的,顶级对象上都不会有加号/减号标记。
●LabelEdit:
如果你不想让用户修改各节点上的文本,设置该属性为1-手动。
●ImageList:
一个ImageList控件对象引用,它包括了控件中的节点使用的图象;参见本文ImageList一章中关于该简单控件的说明。
不幸的是,该属性不能可视化地进行设置;你必须以编程方式用代码进行设置,象下面一样在表单的Init方法中:
=
注意你需要在表单的Init事件中而不是TreeView的Init事件中进行上述设置,因为TreeView可能会在ImageList之前实例化,如果这样,试着设置ImageList属性为一个尚不存在的对象将会失败。
同时,注意上述代码中的”object”关键字;这是必须的。
●Indentation:
子节点缩进多少。
●HideSelection:
如果没有关闭这一选项,当TreeView控件失去焦点时,选定节点不会保持高亮度。
这很容易把用户糊涂。
●Font:
用于节点文本的字体名字,字号和字型。
该属性可从属性表中修改(注意帮助文件中说明了ScrollBars属性,但没有该属性):
●DropHighlight:
该属性用于支持TreeView控件的DragOver事件,因此可以在鼠标经过一个节点时,高亮显示该节点。
但是,这只会在VFP6中的版本6的TreeView控件中才实现了;在老版本的控件中设置该属性为节点对象时,会引发一条”类型失配”错误。
在这种情况下,要达到同样目的,可用HitTest()来检查鼠标经过的是哪一节点并设置该节点的Selected属性为.T.TREEVIEW示例表单在DragOver事件中使用了该技术。
●Nodes:
控件中的节点集合引用。
●SelectedItem:
当前选定节点对象的引用。
节点集合方法
以下是TreeView控件的节点集合的方法(被指定的
●Add:
添加一个新节点并返回它的引用。
它使用以下语法:
SelectedImage)
其中:
Relative:
一个已存在节点的索引或键值。
如果未指定,新节点放在顶级节点的末端。
Relationship:
新节点放置的相对于第一个参数中指定的节点的位置,可以是以下值:
1:
节点放在相对节点所在级的所有节点的末端。
2:
节点放在相对节点的后面。
3:
节点放在相对节点的前面。
4:
节点成为相对节点的子节点。
●Key:
用于指明节点的唯一串。
如果显示内容是从一个表的记录中载入的,可使用记录的主关键字段值(如果不是字符型的,还需要转换为字符型)。
否则,可使用一个转换为串的顺序号。
●Text:
控件节点中显示的文本。
●Image:
相关ImageList控件中的图象索引。
●SelectedImage:
当节点选定时,要显示的相关ImageList控件中的图象索引。
●Clear:
清除全部节点。
●Remove:
移去指定索引号的节点。
节点集合属性
以下是节点集合属性:
●Count:
节点号。
●[
一个节点号的对象引用。
节点对象方法
以下是节点对象的方法:
●CreateDragImage:
该方法不能用于VFP,因为该方法返回一个图象时,DragIcon需要一个CUR文件名。
●EnsureVisible:
确保指定节点是可见的。
该方法在必要时卷动TreeView控件并扩展所有指定节点的父节点。
节点对象属性
以下是节点对象属性:
●Children:
如果节点对象拥有子节点,该值为.T.
●Expanded:
如果节点对象已经扩展,该值为.T.
●FullPath:
该节点的所有父节点(祖节点,曾祖节点等)的文本串接,各节点的文本间用控件的PathSeparator属性中指定的分隔符分隔。
它非常类似于带路么的文件名。
●Image,ExpandedImage和SelectedImage:
相关ImageList控件中的适当的图象号。
●Index:
节点集合中的节点对象的索引。
●Key:
当节点添加时指定的唯一键值。
●Child,FirstSibling,LastSibling,Previous,Parent,Next和Root:
指向与指定节点相关的节点对象。
●Selected:
如果节点对象是选定的,该值为.T.。
设置该属性为.T.会自动高亮显示该节点并设置先前选定的节点的Selected属性为.F.
●Text:
控件中显示的文本。
载入TreeView控件
在载入显示内容的初期相对的比较简单,可以使用一些的趣的手法。
首先,让我们看看直截了当的示例。
假如我们想载入一个客户及其订单(TREEVIEW示例表单就是这样做的)。
以下是代码;这些代码可以在表单初始化时调用(如,在表单的Init()方法或TreeView的Init()方法中调用表单的一个自定义方法):
withThis
*设置CUSTOMER和ORDERS表。
selectCUSTOMER
setordertoCUST_IDinORDERS
setordertoCOMPANY
scan
*从客户表中添加节点。
lcCustomerKey='C'+CUST_ID
.,1,lcCustomerKey,trim(COMPANY),1)
*找到该客户的第一个订单并逐个处理。
selectORDERS
seekCUSTOMER.CUST_ID
scanwhileCUST_ID=CUSTOMER.CUST_ID
.,4,'O'+ORDER_ID,;
dtoc(ORDER_DATE)+''+;
transform(ORDER_AMT,'$99,999.99'),2)
endscanwhileCUST_ID=CUSTOMER.CUST_ID
selectCUSTOMER
endscan
endwith
注意:
指定到各节点的键值是字段名加上一个前缀来指明该记录来自哪一个表(如”C”表示CUSTOMER,“O”表示ORDER)。
前缀可避免可能客户和订单表中具有相同主关键字值的问题,并且前缀加主关键字段值允许我们快速地找到与特定节点匹配的记录(使用节点的Key属性,从第一个字符取得表名,并用基本关键字来搜索余下部分的串)。
只展示这些代码是因为必须在表单显示前处理每一个客户的每一个订单。
如果有许多客户或订单,这会花很长时间。
一个较好的方法是只载入顶级的项(本例中是客户),然后在Expand()方法中,检查需要扩展的节点是否已载入了子节点。
如果没有,则只载入当前节点的子节点。
这就比在一开始时载入全部内容快多了。
这里有一个技巧:
如果一个节点没有载入任何子节点,就不会有+符号出现在该节点上。
因此你需要为每一个项级节点至少添加一个子节点,那怕是一个”占位”节点。
当该节点第一次扩展时,移去占位节点,然后添加真正的子节点内容。
TREEVIEW示例表单展示了如何使用该技术。
它有一个lLoadChildren自定义属性用于确定在表单显示前是否载入全部订单和产品。
试着设置该属性为.F.并注意在表单显示前用了多长时间。
你可能需要在一些点上重新载入显示内容。
例如,如果其它应用程序用户正在添添客户或订单,你可能需要用新添加的客户和订单刷新显示内容。
要避免解决哪些记录已经显示哪些没有显示的争论,可以使用节点集合的Clear()方法来清除显示内容,然后重新载入它。
该方法唯一的问题是一些节点可能已经扩展。
清除并重载显示内容会使所有节点以默认的收缩状态显示。
要克服这一点,可以保存各个已存在节点的Expanded和Key或FullPath属性到一个数组或游标中,清除并重载显示内容,然后遍历数组或游标恢复那些节点的Expanded属性。
TREEVIEW示例表单的GetExpanded和SetExpanded方法就是做这个工作的。
拖放
我曾在CompuServe看到过相关信息
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 VisulFoxPro ActiveX 控件