如果你還沒明白我為什麼會問你那些問題,詳細解釋一下。
以下是你說的自定義類中的一個函數(過程)的代碼:
PARAMETERS LnTree
LnTree=IIF(VARTYPE(LnTree)#"N",THIS.Indexid,IIF(LnTree>THIS.ROWcount,THIS.Indexid,LnTree))
在這個代碼中,出現了一個變量THIS.Indexid,這是哪來的?VFP中沒有一個現成的類有名如Indexid的屬性,但你使用了,而且聲明這個屬性是THIS類中的,我就問你,這個THIS類是什麽類?你說是自定義的,但任何自定義類都必須有一個基類,自定義類從基類中繼承屬性和方法,才能建立起這個類。VFP最基本、最原始的基類是Custom類,但你似乎完全沒有意識到必須有基類,甚至不知道自己定義的類繼承自那裏。
如果說,你的自定義類中定義了自定義屬性Indexid,你自己怎麽答不出來?你再看看自己的那行代碼,除了Indexid這個未知哪來的屬性,還有一個ROWcount屬性,這個也是VFP現成類中沒有的東西。因此,有兩個可能是你出錯的原因,這兩個變量未定義!
但你又保守自己的代碼,不肯把完整的代碼拿出來,卻叫人猜你哪裡出了問題。正如上面說,這兩個屬性是可以自定義的,但你在哪裡定義的呢?自己又說不清。如果你上面這個代碼的名稱是Init事件,那麽這是類中最早執行的代碼,一旦你沒有在比它運行時更早的時間前事先初始化那兩個屬性,程序就會提示出錯然後退出,不過你只說“沒達到目的”而非出錯退出,這是比較不可思議的,我頗爲懷疑它竟然會不出錯,所以要問你確認。這樣叫人猜你的動作,是不行的,說句不好聽的話,似乎在考別人。
要實現你的目的,完整的代碼應該這樣寫:
程序代码:
DEFINE CLASS CustomClassName AS ParentClassName && CustomClassName是你自定義類的名稱,ParentClassName是繼承自的基類名稱,比如Form或Grid
ROWcount = 10 && 自定義屬性ROWcount,這是你使用THIS.ROWcount的基礎,它實際上在Init事件中執行
Indexid = 1 && 同上自定義屬性
* 本類的Init事件,將在建立實例對象時運行
* 上面自定義屬性的動作,其實也在這個事件中執行,等價於放入THIS.AddProperty("ROWcount", 0)語句,所以有兩處地方可做同一件事
* 估計你在對話框中輸入了上面兩個屬性,所以在代碼中看不到定義過程,屬性已經存在,所以沒有報錯退出。
* 事實上,這兩個屬性未必在這個類中定義,如果Parent.Class也是自定義類的話,就可能在父類中定義,不必在此顯式定義,繼承來的(可能性太多了)
PROCEDURE Init
LPARAMETERS lnTree
IF (PCOUNT() < 1) .OR. (VARTYPE(lnTree) != "N") && 沒有用PCOUNT()函數獲取參數個數,或預使用屬性沒有賦初値,是你這個代碼運行不正常的主因
* 如果沒有輸入參數,或者參數不是數值型,則令該參數取THIS.Indexid的値
lnTree = THIS.Indexid
ELSE
* 有參數,而且參數是數値型
IF lnTree > THIS.ROWcount
lnTree = THIS.Indexid
ENDIF
ENDIF
ENDPROC
ENDDEFINE
如果你寫的這段代碼,不在Init事件中,也可能因執行時機不對而運行不符預期。問你那是什麽事件的代碼,是有原因的。不肯答,有幫助嗎?有些東西,是你自以為清楚,卻不知道涉及解決問題的關竅所在,秘而不宣,去考別人的猜測能力。誰那麽有空猜你這樣那樣,亂答一氣又不犯法,反正事不關己,於你亦無益,其實傷不着別人分毫。
早兩天我也說過,可視化編程這種用鼠標東點西點的方式,很不適合於排錯。像這個例子,你不要以為寫了那兩代碼就什麽都很清楚了,其實什麽都不清楚,誰知道在類編製的其它地方還幹了什麽,比如沒有定義和初始化Indexid和ROWcount屬性呢?又看不出到底是什麽事件和方法的代碼,誰知道它在哪裡、什麽時候執行!只看代碼,直接告訴你“變量不存在”也可以,滿意嗎?如果像我現在寫這些代碼,在類定義中幹了什麽,一清二楚,絶不遺漏,查錯也方便得多。再用那種方法,查錯查死你!我看很多人喜歡那樣寫程序,在此多說兩句而已。
[
本帖最后由 TonyDeng 于 2011-7-13 02:38 编辑 ]