運行時刻類分層
IntelliSense 是一件事情;它的另外一件任務(wù)是,當(dāng)你運行代碼時,真的要有 My 命名空間在工作。儘管把一個類叫做My,把它的成員叫做App、 Computer、 Data等等,看上去輕而易舉, 可My 實在做得比那多得多。就像IntelliSense,它是數(shù)據(jù)驅(qū)動的(實際上,用的是相同的 My 表格)。
My 類其實是 MyBase的一個子類,就像 Computer、 User和其他類那樣。MyBase,乃Custom類的一個子類,基于在 My 表格中所發(fā)現(xiàn)的,動態(tài)地把成員加到它自己身上。 這份工作要在 AddMembers 中完成,要從 Init 調(diào)用。此方法從 My 表格中選擇記錄,看是否與自定義的cNameSpace屬性中所指定的命名空間相匹配,這個屬性所包含的其實就是該物件的命名空間(例如,對于MY類來説,就是"MY";對于"Computer"類來説,就是"My.Computer")。然后它實例化在那些記錄中所指定的類,再加它們?yōu)槌蓡T。例如,對于 My 命名空間, My 表格有成員的記錄,分別叫做 My.App、 My.Computer、 My.Data、My.User。那樣,基于 MyBase,實例化 My 類,引發(fā)已在 My 表格中注冊的所有成員動態(tài)的創(chuàng)建。 My 實際上沒有代碼,它只不過簡單的把 cNameSpace 屬性設(shè)置為"My."
Computer, 該類再次描述 My.Computer 成員,也是 MyBase的一個子類。這樣,當(dāng)它從 被MY的AddMembers 方法而實例化時,它自己的 AddMembers 方法就是 My 表格里,找找 My.Computer 命名空間內(nèi)的乘員,比如 My.Computer.Audio、 My.Computer.FileSystem,諸如此些。那些類基于 MyBase而返回,如此一來,層次有深度,也有必要通過簡單地實例化一個類(My),來到到自動化建造。 例如,My.Computer.FileSystem.SpecialFolders命名空間,這個類的四層都是自動安裝的。
My 生成器
MyBase ( My 命名空間中,類的基類),有一個自定義的 Builder 屬性包含了"My.vcx,MyBuilderForm"。它告訴 VFP , 在 MY.VCX 中的MyBuilderForm,是一個生成器,既是它的,又是所有基于其上的類的。在建立了 My 的一個子類后,它和它的成員都能夠注冊進(jìn)入 My 表格,辦法是在類上右擊,然后選擇"Builder"。下面的圖片展示了生成器表單看起來的樣子。
My 注冊生成器讓你為類指定命名空間的名稱。默認(rèn)是 "My." 加上類名,不過你可以指定別的你所希望的(參見 Adding Your Own Classes to My 一文,以得到用你自己的類來擴(kuò)展 My 的信息)。例如,F(xiàn)ileSystem 類是 My.Computer 的一個成員,所以它的命名空間就叫做"My.Computer.FileSystem. "。在IntelliSense列表中,類的工具提示使用了描述字段。它默認(rèn)類的描述,是在類菜單的類信息(Class Info)中指定,或者在項目管理器的項目菜單下,選擇類是,在編輯描述功能中指定。
樹(TreeView)顯示類的公用自定義屬性和方法; 如果你想把本地成員全部顯示出來,那么就在MY.VCX的、MyBuilderForm類的、 LoadTree 方法中更改 AMEMBERS() 語句。
名稱前的核查框指示該成員是否包括在 IntelliSense 內(nèi);默認(rèn)情況下,所有的自定義成員都是包括的。
描述 (Description)是用來給 IntelliSense 列表中的成員作工具提示的;它的缺省值是當(dāng)你創(chuàng)建它時,你為這個成員所輸入的文字。
方法簽名(Method signature)在你為方法的參數(shù)列表而敲入括號、或逗號的時候,它就作爲(wèi)方法的工具提示而出現(xiàn)了。提示信息告訴你,什么參數(shù)可以傳遞給該方法。簽名默認(rèn)是方法的名稱,以及方法中任何 LPARAMETERS 語句的內(nèi)容,但是你把它編輯成泥所想顯示的,包含返回值的數(shù)據(jù)類型(例如,"DeleteKey(Key as String) as Logical")。
枚舉參數(shù)( Enumerated Parameters)文本框讓你指定方法參數(shù)的枚舉值的列表。例如,當(dāng)你敲入"My.Computer.Audio.PlaySystemSound(", IntelliSense 顯示你為這個方法的參數(shù),能夠使用的可用值的列表。要制定該值,逗號前輸入值(若是字符串類型的值,要包括引號),逗號后輸入工具提示。每一個值應(yīng)該各佔一行。以下是 My.Computer.Audio.PlaySystemSound 的列表:
'Default',播放 Windows 默認(rèn)的聲音
'Exclamation',播放 Windows 驚嘆的聲音
'Information',播放 Windows 消息的聲音
'Question',播放 Windows 提問題的聲音
'Stop',播放 Windows 停止的聲音
--------------------------------------------------------------------------------
腳本(Script)文本框用來定義執(zhí)行腳本,當(dāng)你輸入等于號(指示恰當(dāng)?shù)娜蝿?wù))、括號(方法的開始)、或是逗號(在方法調(diào)用中分割參數(shù))。它讓你為屬性指定可用的值、為不同的參數(shù)顯示不同的工具提示、或者你想做的任何任務(wù)。例如,如果某個屬性只允許包含 .T. 或是 .F.,下面的腳本代碼將顯示這些值的列表:
lparameters toFoxCode, toData
dimension toFoxCode.Items[2, 2]
toFoxCode.Items[1, 1] = ' .T.'
toFoxCode.Items[1, 2] = ''
toFoxCode.Items[2, 1] = ' .F.'
toFoxCode.Items[2, 2] = ''
toFoxCode.ValueType = 'L'
return ''
注意:腳本傳遞兩個參數(shù):一個指向 FoxCode 對象,這個對象包含了關(guān)于當(dāng)前IntelliSense語句的屬性信息,還有一個是 SCATTER NAME 對象,來自 My表格中合適的紀(jì)錄,合乎你需要的關(guān)于此物件的信息。
范例中的代碼,搞定 FoxCode 對象的Items數(shù)組。該書組包含列表,顯示在IntelliSense列表中,前提是如果 ValueType 屬性被設(shè)置成了"L"的話。數(shù)組的第一列包含的是要顯示的值,(如果用戶選了一個,那么就插入);第二列包含了該值得工具提示(本例中,代碼讓第二列留空,是因爲(wèi)這個值的意思太明白了)。
所以,這段代碼如果作爲(wèi)腳本,被賦予給一個叫做"SomeProperty"的屬性,在My.SomeNameSpace命名空間內(nèi)使用的話,那么敲入"My.SomeNameSpace.SomeProperty ="將顯示".T."和".F."的列表,作爲(wèi)能夠候選的可能值。
加入你自己的類到 My
想沒想過把你自己的命名空間加到 My ? 你能做的,乃是子類化 MyBase ,創(chuàng)建新類,再研發(fā)所渴望的功能。但是問題來了:假使你有了一個類,你想使用它,而它卻并非基于 MyBase,那該怎么辦?
在那種情況下,打開這個類,敲入"DO My.APP WITH 'Builder'"(實際上,你可以傳送任意類型的任意參數(shù);代碼簡單地檢查 PCOUNT() ,如果有任意參數(shù)傳遞了過來,那就保佑生産器表單吧)。 它顯示 MyBuilderForm 類的一個實例(在 My 表格 一文中已討論),能夠在 My 表格中注冊任何類。當(dāng)然,既然類不基于 MyBase,也就不會動態(tài)地加入成員于自身中,這些類不會有一個低于它們的動態(tài)的層次,也不會讓你在包含于類對象成員上得到智能感應(yīng)。
甚至,你可以使用不同的命名空間,只要你想這么做。例如,假若你有一個ConnectionManager 對象,你想在 Framework 命名空間注冊它,你可以把它指定成Framework.ConnectionMgr。然后你就可以使用 LOCAL loConn AS Framework.ConnectionMgr, 僅對ConnectionManager類的注冊成員得到智能感應(yīng)。此類和它的成員仍然在 MY.DBF 中注冊,但是使用了與MY所不同的命名空間。在這種情況下,附加的記錄被加到你的 IntelliSense 表格,每個命名空間各一行(本例子中是"Framework.ConnectionMgr")。注意命名空間的長度限制是別超過24個字符。
IntelliSense 是一件事情;它的另外一件任務(wù)是,當(dāng)你運行代碼時,真的要有 My 命名空間在工作。儘管把一個類叫做My,把它的成員叫做App、 Computer、 Data等等,看上去輕而易舉, 可My 實在做得比那多得多。就像IntelliSense,它是數(shù)據(jù)驅(qū)動的(實際上,用的是相同的 My 表格)。
My 類其實是 MyBase的一個子類,就像 Computer、 User和其他類那樣。MyBase,乃Custom類的一個子類,基于在 My 表格中所發(fā)現(xiàn)的,動態(tài)地把成員加到它自己身上。 這份工作要在 AddMembers 中完成,要從 Init 調(diào)用。此方法從 My 表格中選擇記錄,看是否與自定義的cNameSpace屬性中所指定的命名空間相匹配,這個屬性所包含的其實就是該物件的命名空間(例如,對于MY類來説,就是"MY";對于"Computer"類來説,就是"My.Computer")。然后它實例化在那些記錄中所指定的類,再加它們?yōu)槌蓡T。例如,對于 My 命名空間, My 表格有成員的記錄,分別叫做 My.App、 My.Computer、 My.Data、My.User。那樣,基于 MyBase,實例化 My 類,引發(fā)已在 My 表格中注冊的所有成員動態(tài)的創(chuàng)建。 My 實際上沒有代碼,它只不過簡單的把 cNameSpace 屬性設(shè)置為"My."
Computer, 該類再次描述 My.Computer 成員,也是 MyBase的一個子類。這樣,當(dāng)它從 被MY的AddMembers 方法而實例化時,它自己的 AddMembers 方法就是 My 表格里,找找 My.Computer 命名空間內(nèi)的乘員,比如 My.Computer.Audio、 My.Computer.FileSystem,諸如此些。那些類基于 MyBase而返回,如此一來,層次有深度,也有必要通過簡單地實例化一個類(My),來到到自動化建造。 例如,My.Computer.FileSystem.SpecialFolders命名空間,這個類的四層都是自動安裝的。
My 生成器
MyBase ( My 命名空間中,類的基類),有一個自定義的 Builder 屬性包含了"My.vcx,MyBuilderForm"。它告訴 VFP , 在 MY.VCX 中的MyBuilderForm,是一個生成器,既是它的,又是所有基于其上的類的。在建立了 My 的一個子類后,它和它的成員都能夠注冊進(jìn)入 My 表格,辦法是在類上右擊,然后選擇"Builder"。下面的圖片展示了生成器表單看起來的樣子。
My 注冊生成器讓你為類指定命名空間的名稱。默認(rèn)是 "My." 加上類名,不過你可以指定別的你所希望的(參見 Adding Your Own Classes to My 一文,以得到用你自己的類來擴(kuò)展 My 的信息)。例如,F(xiàn)ileSystem 類是 My.Computer 的一個成員,所以它的命名空間就叫做"My.Computer.FileSystem. "。在IntelliSense列表中,類的工具提示使用了描述字段。它默認(rèn)類的描述,是在類菜單的類信息(Class Info)中指定,或者在項目管理器的項目菜單下,選擇類是,在編輯描述功能中指定。
樹(TreeView)顯示類的公用自定義屬性和方法; 如果你想把本地成員全部顯示出來,那么就在MY.VCX的、MyBuilderForm類的、 LoadTree 方法中更改 AMEMBERS() 語句。
名稱前的核查框指示該成員是否包括在 IntelliSense 內(nèi);默認(rèn)情況下,所有的自定義成員都是包括的。
描述 (Description)是用來給 IntelliSense 列表中的成員作工具提示的;它的缺省值是當(dāng)你創(chuàng)建它時,你為這個成員所輸入的文字。
方法簽名(Method signature)在你為方法的參數(shù)列表而敲入括號、或逗號的時候,它就作爲(wèi)方法的工具提示而出現(xiàn)了。提示信息告訴你,什么參數(shù)可以傳遞給該方法。簽名默認(rèn)是方法的名稱,以及方法中任何 LPARAMETERS 語句的內(nèi)容,但是你把它編輯成泥所想顯示的,包含返回值的數(shù)據(jù)類型(例如,"DeleteKey(Key as String) as Logical")。
枚舉參數(shù)( Enumerated Parameters)文本框讓你指定方法參數(shù)的枚舉值的列表。例如,當(dāng)你敲入"My.Computer.Audio.PlaySystemSound(", IntelliSense 顯示你為這個方法的參數(shù),能夠使用的可用值的列表。要制定該值,逗號前輸入值(若是字符串類型的值,要包括引號),逗號后輸入工具提示。每一個值應(yīng)該各佔一行。以下是 My.Computer.Audio.PlaySystemSound 的列表:
'Default',播放 Windows 默認(rèn)的聲音
'Exclamation',播放 Windows 驚嘆的聲音
'Information',播放 Windows 消息的聲音
'Question',播放 Windows 提問題的聲音
'Stop',播放 Windows 停止的聲音
--------------------------------------------------------------------------------
腳本(Script)文本框用來定義執(zhí)行腳本,當(dāng)你輸入等于號(指示恰當(dāng)?shù)娜蝿?wù))、括號(方法的開始)、或是逗號(在方法調(diào)用中分割參數(shù))。它讓你為屬性指定可用的值、為不同的參數(shù)顯示不同的工具提示、或者你想做的任何任務(wù)。例如,如果某個屬性只允許包含 .T. 或是 .F.,下面的腳本代碼將顯示這些值的列表:
lparameters toFoxCode, toData
dimension toFoxCode.Items[2, 2]
toFoxCode.Items[1, 1] = ' .T.'
toFoxCode.Items[1, 2] = ''
toFoxCode.Items[2, 1] = ' .F.'
toFoxCode.Items[2, 2] = ''
toFoxCode.ValueType = 'L'
return ''
注意:腳本傳遞兩個參數(shù):一個指向 FoxCode 對象,這個對象包含了關(guān)于當(dāng)前IntelliSense語句的屬性信息,還有一個是 SCATTER NAME 對象,來自 My表格中合適的紀(jì)錄,合乎你需要的關(guān)于此物件的信息。
范例中的代碼,搞定 FoxCode 對象的Items數(shù)組。該書組包含列表,顯示在IntelliSense列表中,前提是如果 ValueType 屬性被設(shè)置成了"L"的話。數(shù)組的第一列包含的是要顯示的值,(如果用戶選了一個,那么就插入);第二列包含了該值得工具提示(本例中,代碼讓第二列留空,是因爲(wèi)這個值的意思太明白了)。
所以,這段代碼如果作爲(wèi)腳本,被賦予給一個叫做"SomeProperty"的屬性,在My.SomeNameSpace命名空間內(nèi)使用的話,那么敲入"My.SomeNameSpace.SomeProperty ="將顯示".T."和".F."的列表,作爲(wèi)能夠候選的可能值。
加入你自己的類到 My
想沒想過把你自己的命名空間加到 My ? 你能做的,乃是子類化 MyBase ,創(chuàng)建新類,再研發(fā)所渴望的功能。但是問題來了:假使你有了一個類,你想使用它,而它卻并非基于 MyBase,那該怎么辦?
在那種情況下,打開這個類,敲入"DO My.APP WITH 'Builder'"(實際上,你可以傳送任意類型的任意參數(shù);代碼簡單地檢查 PCOUNT() ,如果有任意參數(shù)傳遞了過來,那就保佑生産器表單吧)。 它顯示 MyBuilderForm 類的一個實例(在 My 表格 一文中已討論),能夠在 My 表格中注冊任何類。當(dāng)然,既然類不基于 MyBase,也就不會動態(tài)地加入成員于自身中,這些類不會有一個低于它們的動態(tài)的層次,也不會讓你在包含于類對象成員上得到智能感應(yīng)。
甚至,你可以使用不同的命名空間,只要你想這么做。例如,假若你有一個ConnectionManager 對象,你想在 Framework 命名空間注冊它,你可以把它指定成Framework.ConnectionMgr。然后你就可以使用 LOCAL loConn AS Framework.ConnectionMgr, 僅對ConnectionManager類的注冊成員得到智能感應(yīng)。此類和它的成員仍然在 MY.DBF 中注冊,但是使用了與MY所不同的命名空間。在這種情況下,附加的記錄被加到你的 IntelliSense 表格,每個命名空間各一行(本例子中是"Framework.ConnectionMgr")。注意命名空間的長度限制是別超過24個字符。

