计算机二级vf9.0版,VFP9.0SP2中的MY组件帮助译文(一)

通常,当使用类时,IntelliSense 显示那个类的所有成员。例如,下面的图片将展现了 IntelliSense 为 ConnectionMgr 类而提供的显示。注意儘管只有一些自定义的属性和方法,IntelliSense 显示所有的事情。这就要求在选择你真正想要的成员上,你得更加努力,特别是你对这个类又不精通时。

不过,如同你在下面的图片所看到的那样, My 命名空间的成员之智能感应,仅仅出现那些你感兴趣的。

秘密就隐藏在My的智能感应的后面,它做了两件事:智能感应以在IntelliSense表格中定义好的"类型(TYPE)"来行事,还有就是IntelliSense脚本。

"类型"常用于数据类型,比如整数型或字符型,另外也有基本类,比如核选框和表单。其他的东东也可以被定义成类型,要么在"工具(Tools)"菜单中,选中"智能感应管理器(IntelliSense Manager)";要么手工加入记录,把 TYPE 字段设置为 "T" 。别的种类的"类型"记录,通常是自定义类,或者 COM 物件,如此你对它们也能智能感应。 My 用到了类型记录,但它也自定义了如何让 IntelliSense 通过使用脚本而工作。

如果在注册了 MY 之后,你在 IntelliSense 表格中看到 (USE (_FOXCODE) AGAIN 和BROWSE) ,你会在表格的末尾看到新添加的两条记录。一条是命名空间的类型记录:它没有包含太多的信息, "My" 在 ABBREV 和 DATA字段,以及 "{myscript}" 当作脚本的名字,来在CMD字段用于IntelliSense。另外一条是脚本记录,把 TYPE 设置为 "S" ,让ABBREV 包含"myscript."

脚本记录在它的 DATA 备注字段中,有如下的代码(此代码中, Path 被 MY.VCX所在的路径替代):

lparameters toFoxcode

local loFoxCodeLoader, ;

luReturn

if file(_codesense)

set procedure to (_codesense) additive

loFoxCodeLoader = createobject('FoxCodeLoader')

luReturn = loFoxCodeLoader.Start(toFoxcode)

loFoxCodeLoader = .NULL.

if atc(_codesense, set('PROCEDURE')) > 0

release procedure (_codesense)

endif atc(_codesense, set('PROCEDURE')) > 0

else

luReturn = ''

endif file(_codesense)

return luReturn

define class FoxCodeLoader as FoxCodeScript

cProxyClass = 'MyFoxCode'

cProxyClasslib = 'Path\my.vcx'

procedure Main

local loFoxCode, ;

luReturn

loFoxCode = newobject(This.cProxyClass, ;

This.cProxyClasslib)

if vartype(loFoxCode) = 'O'

luReturn = loFoxCode.Main(This.oFoxCode)

else

luReturn = ''

endif vartype(loFoxCode) = 'O'

return luReturn

endproc

enddefine

该代码定义了一个 FoxCodeScript 类的子类,而后者是在 IntelliSense 程序中被 _CODESENSE 系统变量指明的。 该子类重载了会被IntelliSense调用的 Main 方法,实例化存在于 MY.VCX 的 MyFoxCode 类 ,调用它的Main方法,传递给它到IntelliSense数据对象的引用,这个引用包含关于用户已敲入的内容,以及其他 IntelliSense 设置的信息。作爲As a result of this scrip该脚本的一个结果, MyFoxCode.Main 被所有的 IntelliSense 任务调用。至于用于 My上时,例如,当你把"LOCAL My AS"都敲完了时,或者敲入能够"触发"的字符 -- 比如一个左括号,或者一个等于号时,你就可以从IntelliSense弹出的列表中选择"My"。

MyFoxCode 类为My干了所有自定义的智能感应的活。它的 Init 方法,只作两件事情:在系统组件内打开调试(缺少它的话,你哪里能够轻易地在代码中调试问题?);通过调用OpenMyTable来打开 My 表格,这个表格包含了关于My命名空间成员的信息(关于对MY表格更多的讨论,请参见My Table一节)。如果表格未打开, Init 方法显示一个错误消息,并返回 .F. ,这样类就不会被实例化。既然 My 用到了成员表格,它就是数据驱动,带来了很多好处。

Main 方法,从 IntelliSense 脚本中调用,为所有的为My服务的 IntelliSense 任务所持有。正如所探讨的,脚本传递一个 FoxCode 对象给 Main。如果"My" 找到 FoxCode 对象的MenuItem 属性 ,游标必须在 LOCAL My AS 状态,这样 Main 才能调用 HandleLOCAL 方法来处理它。除此之外, Main 决定哪一个字符触发了 IntelliSense ,调用 GetMyMember 方法来侦测是哪一个 My 成员被输入(它也可以是 My 自身),然后从My表格的适当记录中,返回一个 SCATTER NAME 对象。

假如触发的字符是一段周期,MyFoxCode 需要显示已注册的 My 成员的列表,因此 Main 调用 DisplayMembers 来做这事。

如果触发的字符是一个左括号, My表格的LIST字段对它有填充,它就调用 DisplayEnumeratedValues 方法,来显示可用的枚举值列表,还为方法附带参数(就像当你敲入"DBGETPROP(")"时,IntelliSense所呈现的那样)。

如果触发的字符是一个等于号、括号、逗号等,My表格的SCRIPT 字段 对它有填充,它就执行字段中的代码;这通常有用,例如,为属性分配状态枚举值。

最后,如果触发的字符时一个括号,或者逗号, My表格的TIP备注字段对它有填充,Main 使用它作爲 IntelliSense的工具提示。这通常用于显示方法的符号 -- 比如"Login(UserName as String, Password as String) as Boolean")。

当你敲入 LOCAL My AS,然后从列表中选择 My时,Main 调用 HandleLOCAL。它所做的一切就是为类的自动化产生一条 NEWOBJECT() 语句。 另一方面,它在IntelliSense表格中找啊找,找一条符合TYPE = "F"(功能)并且 ABBREV = "NEWO"(NEWOBJECT的省略形式),以及在CASE字段中用到了该值的记录。

GetMyMember,被 Main所调用,也在 My 表格中找你所敲入的成员。它使用 FoxCode 对象的UserTyped 属性(作爲一个参数传递),包含了与你所敲入的相关的文本到命名空间。例如,当你敲入"llStatus = My.Computer.Audio.Play(", UserTyped 属性包含着"Computer.Audio.Play"。 GetMyMember 在 My 表格找出合适的记后,它就从这个纪录返回一个 SCATTER NAME 对象。

DisplayMembers,被 Main 所调用,当你在命令行中敲入一个过程时,告知 IntelliSense 显示已注册的 My 成员列表。DisplayMembers 调用 GetMembers 来接收特定成员的成员集合。然后它就用成员的名字和描述来填充FoxCode对象的 Items 数组,把对象的 ValueType 属性设置为"L",即告知 IntelliSense 用 Items 数组的内容来显示列表框。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值