| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2441 人关注过本帖
标题:VFP自定义类中 父类、子类、参数联系?
只看楼主 加入收藏
hw2007name
Rank: 1
等 级:新手上路
帖 子:11
专家分:2
注 册:2007-11-12
收藏
 问题点数:0 回复次数:19 
VFP自定义类中 父类、子类、参数联系?
以下是我在一个自定类的方法中的代码
PARAMETERS LnTree
LnTree=IIF(VARTYPE(LnTree)#"N",THIS.Indexid,IIF(LnTree>THIS.ROWcount,THIS.Indexid,LnTree))

生成的子类此方法中只有如下代码:(没有第二行)
PARAMETERS LnTree

问题:第二行在父类中设置,运行中,如何让子类不必再运行。
目的:想让程序自动为参数LnTree自动给予默认值,不知道这种想法可行否?可行该如何解决
搜索更多相关主题的帖子: 如何 
2011-07-12 16:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你這個自定義類從哪繼承的?上面寫的是什麽方法或事件的代碼?

授人以渔,不授人以鱼。
2011-07-12 16:39
hw2007name
Rank: 1
等 级:新手上路
帖 子:11
专家分:2
注 册:2007-11-12
收藏
得分:0 
这是我自己做的一个类,在此类中我自定义了一个方法,且此方法可以接收一个参数,也可以不接收,但如果不接收,我想让此参数有默认值(默认值就是上面的那个赋值语句),但创建子类后,在调用时,不能达到目的。不知道我的意思说清楚没?
2011-07-12 18:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我看你可能沒做過類。你的類的基類是什麽?你這個代碼寫在那裏?你做過類代碼就應該知道我問什麽。

授人以渔,不授人以鱼。
2011-07-12 22:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果你還沒明白我為什麼會問你那些問題,詳細解釋一下。

以下是你說的自定義類中的一個函數(過程)的代碼:
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 编辑 ]

授人以渔,不授人以鱼。
2011-07-13 01:56
hw2007name
Rank: 1
等 级:新手上路
帖 子:11
专家分:2
注 册:2007-11-12
收藏
得分:0 
首先感谢楼上仁兄的回答,我的意思是,在实例化调用此类时,在我的那个自定方法中,有一个接收参数,实例中可以在此方法中写入代码使用此参数,但我不想实例中来确定参数的默认值,想让它自动有默认值,如果调用此方法传递有参数值,则使用传递值,如果没有则使用一个默认值(这是一般方法不是事件,没有设置其它来激活此方法,如果是事件方式肯定就达到目的),关键就是在于如何让自定义方法,在调用时没传递参数时,让参数有默认,如果在类中方法设置了如何计算默认值,但是在实例中调用此方法时,如果在此方法中又添加有其它代码,默认值语句就不起作用,只有另外写判断写出参数的默认值,我就想有没有办法让其类中的代码也运行,在调用时先运行类中写的代码为参数赋值,即使作用DODEFAULT()后还是达不到目的,参数值一样是逻辑值‘.F.’。上面的this.indexid和rowcount属性也是类定义时自定义的属性,在实例时是设置了其值的,我想这个与此方法的参数取值没有关系吧!
2011-07-14 16:12
hw2007name
Rank: 1
等 级:新手上路
帖 子:11
专家分:2
注 册:2007-11-12
收藏
得分:0 
我刚又测试了一下,在实例中先加入代码:DODEFAULT(@LnTree)后,在其后写的代码就可以取得类中的默认值,但这样还不是多了一行代码与在实例中添加了设置默认值代码没多大区别。
2011-07-14 16:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
大概猜得到你的意思,但不敢肯定,是不是你在類中已經有同樣的自定義過程,但在實例化時又要用同樣的過程再多做點事情?

授人以渔,不授人以鱼。
2011-07-14 16:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在自定義函數或過程中,用PCOUNT()判斷是否傳入了參數,如果PCOUNT()=1,表示傳入了lnTree,如果PCOUNT()=0,表示沒有參數。假設你的自定義過程名稱爲DoTest,則前者對應DoTest(100),後者對應DoTest(),這是兩種不同的狀態,在自定義過程中一開始就判斷,分別處理。

你不能在過程定義中寫了LARAMETERS lnTree之後,靠VARTYPE(lnTree)!="N"來判斷,因為這樣即使外面沒有傳入參數,在這裏都會有lnTree = .F.存在。正確的判斷法是根據PCOUNT()來取得實際參數的個數。也就是說,即使你寫了LARAMETERS lnTree, lnIndexID, lnROWcount,容許接收三個參數,在實例中也未必要傳足三個,只要不超過三個,就是可以接受的(超過時報錯誤退出,但不會報少,這是我們熟知的),對參數的處理,在函數內靠PCOUNT()來做。這就是VFP可以接受可變參數的機制,就是這樣處理的。

在5樓我寫的代碼中,其實猜中了你的問題,說那是主因。

[ 本帖最后由 TonyDeng 于 2011-7-14 16:53 编辑 ]

授人以渔,不授人以鱼。
2011-07-14 16:41
hw2007name
Rank: 1
等 级:新手上路
帖 子:11
专家分:2
注 册:2007-11-12
收藏
得分:0 
恩,在过程或函数判断是否传递了参数用PCOUNT()或parameters(),这个我知道,我现在就现在的问题还是没有解决?
在实例方法中再写代码后,类中的代码用DODEFAULT()不就运行了,但参数nTree的值还未更变,非要添加DODEFAULT(@nTree)才能啊?
2011-07-14 17:29
快速回复:VFP自定义类中 父类、子类、参数联系?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025811 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved