通常,當(dāng)使用類(lèi)時(shí),IntelliSense 顯示那個(gè)類(lèi)的所有成員。例如,下面的圖片將展現(xiàn)了 IntelliSense 為 ConnectionMgr 類(lèi)而提供的顯示。注意儘管只有一些自定義的屬性和方法,IntelliSense 顯示所有的事情。這就要求在選擇你真正想要的成員上,你得更加努力,特別是你對(duì)這個(gè)類(lèi)又不精通時(shí)。
不過(guò),如同你在下面的圖片所看到的那樣, My 命名空間的成員之智能感應(yīng),僅僅出現(xiàn)那些你感興趣的。
秘密就隱藏在My的智能感應(yīng)的后面,它做了兩件事:智能感應(yīng)以在IntelliSense表格中定義好的"類(lèi)型(TYPE)"來(lái)行事,還有就是IntelliSense腳本。
"類(lèi)型"常用于數(shù)據(jù)類(lèi)型,比如整數(shù)型或字符型,另外也有基本類(lèi),比如核選框和表單。其他的東東也可以被定義成類(lèi)型,要么在"工具(Tools)"菜單中,選中"智能感應(yīng)管理器(IntelliSense Manager)";要么手工加入記錄,把 TYPE 字段設(shè)置為 "T" 。別的種類(lèi)的"類(lèi)型"記錄,通常是自定義類(lèi),或者 COM 物件,如此你對(duì)它們也能智能感應(yīng)。 My 用到了類(lèi)型記錄,但它也自定義了如何讓 IntelliSense 通過(guò)使用腳本而工作。
如果在注冊(cè)了 MY 之后,你在 IntelliSense 表格中看到 (USE (_FOXCODE) AGAIN 和BROWSE) ,你會(huì)在表格的末尾看到新添加的兩條記錄。一條是命名空間的類(lèi)型記錄:它沒(méi)有包含太多的信息, "My" 在 ABBREV 和 DATA字段,以及 "{myscript}" 當(dāng)作腳本的名字,來(lái)在CMD字段用于IntelliSense。另外一條是腳本記錄,把 TYPE 設(shè)置為 "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
該代碼定義了一個(gè) FoxCodeScript 類(lèi)的子類(lèi),而后者是在 IntelliSense 程序中被 _CODESENSE 系統(tǒng)變量指明的。 該子類(lèi)重載了會(huì)被IntelliSense調(diào)用的 Main 方法,實(shí)例化存在于 MY.VCX 的 MyFoxCode 類(lèi) ,調(diào)用它的Main方法,傳遞給它到IntelliSense數(shù)據(jù)對(duì)象的引用,這個(gè)引用包含關(guān)于用戶已敲入的內(nèi)容,以及其他 IntelliSense 設(shè)置的信息。作爲(wèi)As a result of this scrip該腳本的一個(gè)結(jié)果, MyFoxCode.Main 被所有的 IntelliSense 任務(wù)調(diào)用。至于用于 My上時(shí),例如,當(dāng)你把"LOCAL My AS"都敲完了時(shí),或者敲入能夠"觸發(fā)"的字符 -- 比如一個(gè)左括號(hào),或者一個(gè)等于號(hào)時(shí),你就可以從IntelliSense彈出的列表中選擇"My"。
MyFoxCode 類(lèi)為My干了所有自定義的智能感應(yīng)的活。它的 Init 方法,只作兩件事情:在系統(tǒng)組件內(nèi)打開(kāi)調(diào)試(缺少它的話,你哪里能夠輕易地在代碼中調(diào)試問(wèn)題?);通過(guò)調(diào)用OpenMyTable來(lái)打開(kāi) My 表格,這個(gè)表格包含了關(guān)于My命名空間成員的信息(關(guān)于對(duì)MY表格更多的討論,請(qǐng)參見(jiàn)My Table一節(jié))。如果表格未打開(kāi), Init 方法顯示一個(gè)錯(cuò)誤消息,并返回 .F. ,這樣類(lèi)就不會(huì)被實(shí)例化。既然 My 用到了成員表格,它就是數(shù)據(jù)驅(qū)動(dòng),帶來(lái)了很多好處。
Main 方法,從 IntelliSense 腳本中調(diào)用,為所有的為My服務(wù)的 IntelliSense 任務(wù)所持有。正如所探討的,腳本傳遞一個(gè) FoxCode 對(duì)象給 Main。如果"My" 找到 FoxCode 對(duì)象的MenuItem 屬性 ,游標(biāo)必須在 LOCAL My AS 狀態(tài),這樣 Main 才能調(diào)用 HandleLOCAL 方法來(lái)處理它。除此之外, Main 決定哪一個(gè)字符觸發(fā)了 IntelliSense ,調(diào)用 GetMyMember 方法來(lái)偵測(cè)是哪一個(gè) My 成員被輸入(它也可以是 My 自身),然后從My表格的適當(dāng)記錄中,返回一個(gè) SCATTER NAME 對(duì)象。
假如觸發(fā)的字符是一段周期,MyFoxCode 需要顯示已注冊(cè)的 My 成員的列表,因此 Main 調(diào)用 DisplayMembers 來(lái)做這事。
如果觸發(fā)的字符是一個(gè)左括號(hào), My表格的LIST字段對(duì)它有填充,它就調(diào)用 DisplayEnumeratedValues 方法,來(lái)顯示可用的枚舉值列表,還為方法附帶參數(shù)(就像當(dāng)你敲入"DBGETPROP(")"時(shí),IntelliSense所呈現(xiàn)的那樣)。
如果觸發(fā)的字符是一個(gè)等于號(hào)、括號(hào)、逗號(hào)等,My表格的SCRIPT 字段 對(duì)它有填充,它就執(zhí)行字段中的代碼;這通常有用,例如,為屬性分配狀態(tài)枚舉值。
最后,如果觸發(fā)的字符時(shí)一個(gè)括號(hào),或者逗號(hào), My表格的TIP備注字段對(duì)它有填充,Main 使用它作爲(wèi) IntelliSense的工具提示。這通常用于顯示方法的符號(hào) -- 比如"Login(UserName as String, Password as String) as Boolean")。
當(dāng)你敲入 LOCAL My AS,然后從列表中選擇 My時(shí),Main 調(diào)用 HandleLOCAL。它所做的一切就是為類(lèi)的自動(dòng)化產(chǎn)生一條 NEWOBJECT() 語(yǔ)句。 另一方面,它在IntelliSense表格中找啊找,找一條符合TYPE = "F"(功能)并且 ABBREV = "NEWO"(NEWOBJECT的省略形式),以及在CASE字段中用到了該值的記錄。
GetMyMember,被 Main所調(diào)用,也在 My 表格中找你所敲入的成員。它使用 FoxCode 對(duì)象的UserTyped 屬性(作爲(wèi)一個(gè)參數(shù)傳遞),包含了與你所敲入的相關(guān)的文本到命名空間。例如,當(dāng)你敲入"llStatus = My.Computer.Audio.Play(", UserTyped 屬性包含著"Computer.Audio.Play"。 GetMyMember 在 My 表格找出合適的記后,它就從這個(gè)紀(jì)錄返回一個(gè) SCATTER NAME 對(duì)象。
DisplayMembers,被 Main 所調(diào)用,當(dāng)你在命令行中敲入一個(gè)過(guò)程時(shí),告知 IntelliSense 顯示已注冊(cè)的 My 成員列表。DisplayMembers 調(diào)用 GetMembers 來(lái)接收特定成員的成員集合。然后它就用成員的名字和描述來(lái)填充FoxCode對(duì)象的 Items 數(shù)組,把對(duì)象的 ValueType 屬性設(shè)置為"L",即告知 IntelliSense 用 Items 數(shù)組的內(nèi)容來(lái)顯示列表框。
不過(guò),如同你在下面的圖片所看到的那樣, My 命名空間的成員之智能感應(yīng),僅僅出現(xiàn)那些你感興趣的。
秘密就隱藏在My的智能感應(yīng)的后面,它做了兩件事:智能感應(yīng)以在IntelliSense表格中定義好的"類(lèi)型(TYPE)"來(lái)行事,還有就是IntelliSense腳本。
"類(lèi)型"常用于數(shù)據(jù)類(lèi)型,比如整數(shù)型或字符型,另外也有基本類(lèi),比如核選框和表單。其他的東東也可以被定義成類(lèi)型,要么在"工具(Tools)"菜單中,選中"智能感應(yīng)管理器(IntelliSense Manager)";要么手工加入記錄,把 TYPE 字段設(shè)置為 "T" 。別的種類(lèi)的"類(lèi)型"記錄,通常是自定義類(lèi),或者 COM 物件,如此你對(duì)它們也能智能感應(yīng)。 My 用到了類(lèi)型記錄,但它也自定義了如何讓 IntelliSense 通過(guò)使用腳本而工作。
如果在注冊(cè)了 MY 之后,你在 IntelliSense 表格中看到 (USE (_FOXCODE) AGAIN 和BROWSE) ,你會(huì)在表格的末尾看到新添加的兩條記錄。一條是命名空間的類(lèi)型記錄:它沒(méi)有包含太多的信息, "My" 在 ABBREV 和 DATA字段,以及 "{myscript}" 當(dāng)作腳本的名字,來(lái)在CMD字段用于IntelliSense。另外一條是腳本記錄,把 TYPE 設(shè)置為 "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
該代碼定義了一個(gè) FoxCodeScript 類(lèi)的子類(lèi),而后者是在 IntelliSense 程序中被 _CODESENSE 系統(tǒng)變量指明的。 該子類(lèi)重載了會(huì)被IntelliSense調(diào)用的 Main 方法,實(shí)例化存在于 MY.VCX 的 MyFoxCode 類(lèi) ,調(diào)用它的Main方法,傳遞給它到IntelliSense數(shù)據(jù)對(duì)象的引用,這個(gè)引用包含關(guān)于用戶已敲入的內(nèi)容,以及其他 IntelliSense 設(shè)置的信息。作爲(wèi)As a result of this scrip該腳本的一個(gè)結(jié)果, MyFoxCode.Main 被所有的 IntelliSense 任務(wù)調(diào)用。至于用于 My上時(shí),例如,當(dāng)你把"LOCAL My AS"都敲完了時(shí),或者敲入能夠"觸發(fā)"的字符 -- 比如一個(gè)左括號(hào),或者一個(gè)等于號(hào)時(shí),你就可以從IntelliSense彈出的列表中選擇"My"。
MyFoxCode 類(lèi)為My干了所有自定義的智能感應(yīng)的活。它的 Init 方法,只作兩件事情:在系統(tǒng)組件內(nèi)打開(kāi)調(diào)試(缺少它的話,你哪里能夠輕易地在代碼中調(diào)試問(wèn)題?);通過(guò)調(diào)用OpenMyTable來(lái)打開(kāi) My 表格,這個(gè)表格包含了關(guān)于My命名空間成員的信息(關(guān)于對(duì)MY表格更多的討論,請(qǐng)參見(jiàn)My Table一節(jié))。如果表格未打開(kāi), Init 方法顯示一個(gè)錯(cuò)誤消息,并返回 .F. ,這樣類(lèi)就不會(huì)被實(shí)例化。既然 My 用到了成員表格,它就是數(shù)據(jù)驅(qū)動(dòng),帶來(lái)了很多好處。
Main 方法,從 IntelliSense 腳本中調(diào)用,為所有的為My服務(wù)的 IntelliSense 任務(wù)所持有。正如所探討的,腳本傳遞一個(gè) FoxCode 對(duì)象給 Main。如果"My" 找到 FoxCode 對(duì)象的MenuItem 屬性 ,游標(biāo)必須在 LOCAL My AS 狀態(tài),這樣 Main 才能調(diào)用 HandleLOCAL 方法來(lái)處理它。除此之外, Main 決定哪一個(gè)字符觸發(fā)了 IntelliSense ,調(diào)用 GetMyMember 方法來(lái)偵測(cè)是哪一個(gè) My 成員被輸入(它也可以是 My 自身),然后從My表格的適當(dāng)記錄中,返回一個(gè) SCATTER NAME 對(duì)象。
假如觸發(fā)的字符是一段周期,MyFoxCode 需要顯示已注冊(cè)的 My 成員的列表,因此 Main 調(diào)用 DisplayMembers 來(lái)做這事。
如果觸發(fā)的字符是一個(gè)左括號(hào), My表格的LIST字段對(duì)它有填充,它就調(diào)用 DisplayEnumeratedValues 方法,來(lái)顯示可用的枚舉值列表,還為方法附帶參數(shù)(就像當(dāng)你敲入"DBGETPROP(")"時(shí),IntelliSense所呈現(xiàn)的那樣)。
如果觸發(fā)的字符是一個(gè)等于號(hào)、括號(hào)、逗號(hào)等,My表格的SCRIPT 字段 對(duì)它有填充,它就執(zhí)行字段中的代碼;這通常有用,例如,為屬性分配狀態(tài)枚舉值。
最后,如果觸發(fā)的字符時(shí)一個(gè)括號(hào),或者逗號(hào), My表格的TIP備注字段對(duì)它有填充,Main 使用它作爲(wèi) IntelliSense的工具提示。這通常用于顯示方法的符號(hào) -- 比如"Login(UserName as String, Password as String) as Boolean")。
當(dāng)你敲入 LOCAL My AS,然后從列表中選擇 My時(shí),Main 調(diào)用 HandleLOCAL。它所做的一切就是為類(lèi)的自動(dòng)化產(chǎn)生一條 NEWOBJECT() 語(yǔ)句。 另一方面,它在IntelliSense表格中找啊找,找一條符合TYPE = "F"(功能)并且 ABBREV = "NEWO"(NEWOBJECT的省略形式),以及在CASE字段中用到了該值的記錄。
GetMyMember,被 Main所調(diào)用,也在 My 表格中找你所敲入的成員。它使用 FoxCode 對(duì)象的UserTyped 屬性(作爲(wèi)一個(gè)參數(shù)傳遞),包含了與你所敲入的相關(guān)的文本到命名空間。例如,當(dāng)你敲入"llStatus = My.Computer.Audio.Play(", UserTyped 屬性包含著"Computer.Audio.Play"。 GetMyMember 在 My 表格找出合適的記后,它就從這個(gè)紀(jì)錄返回一個(gè) SCATTER NAME 對(duì)象。
DisplayMembers,被 Main 所調(diào)用,當(dāng)你在命令行中敲入一個(gè)過(guò)程時(shí),告知 IntelliSense 顯示已注冊(cè)的 My 成員列表。DisplayMembers 調(diào)用 GetMembers 來(lái)接收特定成員的成員集合。然后它就用成員的名字和描述來(lái)填充FoxCode對(duì)象的 Items 數(shù)組,把對(duì)象的 ValueType 屬性設(shè)置為"L",即告知 IntelliSense 用 Items 數(shù)組的內(nèi)容來(lái)顯示列表框。

