主题:[讨论]COMMAND的CLICK事件還有行數規定嗎?
GEORGECHIN
[专家分:440] 发布于 2009-12-26 20:01:00
[size=2] 今遇到一怪事.在一COMMAND的CLICK事件中用DO CASE嵌套(層數才兩層,共有22 CASE選項),當我一個一個的把CASE選項加進去時,加到第20個選項時,被報錯.其報錯的錯誤碼如下:
AA=&CNT1LJ.COMBO1.DISPLAYVALUE
BB=&CNT1LJ.COMBO2.DISPLAYVALUE
DO CASE
CASE &CNT1LJ.OPTIONGROUP1.VALUE=1 [color=FF0000]&&首先是這里報錯[/color](沒加第20個選項前這里是沒有任何錯誤的)
DO CASE
CASE AA=1
CASE AA=2
*
*
*
CASE AA=22
ENDC
DO CASE
CASE BB=1
THISFORM.LOCKSCREEN=.T. &&這里是一些顯示用的語句,為了一次性刷到位,暫時關閉了刷新.
*
*
CASE BB=5
ENDC
CASE &CNT1LJ.OPTIONGROUP1.VALUE=2
ENDC
WITH &CNT2LJ.COMMANDGROUP1 [color=FF0000]&&然后就是這里報錯.[/color]
.COMMAND1.ENABLED=.F.
.COMMAND2.ENABLED=.F.
ENDW
THISFORM.LOCKSCREEN=.F.
RETU
1.以上這一個事件大約有3000行代碼,如果我拿掉1~22個分支中的一個,其代碼可以運行.
2.第一外報錯的地方我如果把CASE &CNT1LJ.OPTIONGROUP1.VALUE=1改成如下:
CC=&CNT1LJ.OPTIONGROUP1.VALUE
DO CASE
CASE CC=1
這里就不再報錯.
以上請問各位朋友,是什麼原因導至呢,如果是"&"代換是問題,為何不加其中一個分支選項又不報錯呢?
[/size]
最后更新于:2009-12-26 20:56:00
回复列表 (共19个回复)
沙发
wzxc [专家分:9440] 发布于 2009-12-26 20:24:00
&CNT1LJ
我不知道CNT1LJ的内容,但从你的语句看,应该是变量,加了宏替换,后面是控件。所以似乎应该是:
&CNT1LJ..OPTIONGROUP1.VALUE=1
加一个宏替换结束符试试看!!!
板凳
GEORGECHIN [专家分:440] 发布于 2009-12-26 20:55:00
[quote]&CNT1LJ
我不知道CNT1LJ的内容,但从你的语句看,应该是变量,加了宏替换,后面是控件。所以似乎应该是:
&CNT1LJ..OPTIONGROUP1.VALUE=1
加一个宏替换结束符试试看!!![/quote]
謝謝您的回復.其CNT1LJ的內容為: THISFORM.PAGEFRAME1.PAGE1.CNTAINER1.
PS:我一直用&CNT1LJ.REFRESH,&CNT1LJ.OPTIONGROUP1.VALUE這種方式,且沒有出現過這種情況.在那麼多的分支當中,我把其中一個分支去掉,沒有任何問題.而且我用MESSAGEBOX(STR(&CNT1LJ.OPTIONGROUP1.VALUE)),其返回的值也是正確的.但緊接下一行用CASE &CNT1LJ.OPTIONGRIUP.VALUE=1 就報錯!
3 楼
GEORGECHIN [专家分:440] 发布于 2009-12-26 23:30:00
經測試其它運行不報錯的代碼,其代碼超過一定數量(估計在3000行左右)之后,用&代換就不可以正確執行了!
測試方法為:我把原先運行OK的代碼后面加上若干條A=1后,再執行此代碼.原來運行OK的程序報錯了(有&的部分),有時甚至是VFP 9.0也被報錯退出!
在此想問一下,這到底是VFP9.0的問題,還是我電腦內存的問題還是有其它的原因?
4 楼
jia523 [专家分:0] 发布于 2010-01-18 22:41:00
我的看法是Click的代码长度限制为小于64K,你可以这样测试一下你的代码长度,将代码复制到一个单独的prg文件中查看该文件的长度。我曾经遇到过这样的问题。
5 楼
kosung [专家分:910] 发布于 2010-01-18 22:55:00
按楼主的表述,首先排除电脑内存的问题,因为硬件的出错不是这样出的。
这样的现象应该是VFP9.0的问题,系统解释执行过程的缺陷(没有想到会有这么多的宏替换,呵呵)。
但个人认为,用得太多的宏替换不是好的办法,起码不是好的习惯,常引起一些不明的错误。
6 楼
GEORGECHIN [专家分:440] 发布于 2010-01-19 02:54:00
[quote]按楼主的表述,首先排除电脑内存的问题,因为硬件的出错不是这样出的。
这样的现象应该是VFP9.0的问题,系统解释执行过程的缺陷(没有想到会有这么多的宏替换,呵呵)。
但个人认为,用得太多的宏替换不是好的办法,起码不是好的习惯,常引起一些不明的错误。[/quote]
在相關資料上也有看到用宏會降低應用程序的性能,可是沒有辦法引用"()"啊,因為不同的頁框,絕對路徑不同,又要多次引用,就不得不用宏替換了!
7 楼
GEORGECHIN [专家分:440] 发布于 2010-01-19 13:51:00
[quote]我的看法是Click的代码长度限制为小于64K,你可以这样测试一下你的代码长度,将代码复制到一个单独的prg文件中查看该文件的长度。我曾经遇到过这样的问题。
[/quote]
可能是這個原因,因為我把這些代碼放在PRG中,其大小有123KB
8 楼
wuzhouhong [专家分:10890] 发布于 2010-01-19 14:28:00
你这个属于典型的宏替换使用不当,DO CASE没有行数限制,我现在的一个程序用了70多个CASE,分成5个程序来装,第1-4个程序末尾都是
OTHERWISE
do netxPRG1...5.prg
ENDCASE
其中每一个程序的行数都很多,字节数都在50KB左右
并没有报错。说明CASE并不是问题的所在。
THISFORM.PAGEFRAME1.PAGE1.CNTAINER1.
&CNT1LJ.REFRESH,&CNT1LJ.OPTIONGROUP1.VALUE
这种写法非常的难以理解,很容易因为漏掉那个.而造成运行时错误,因为这种写法不能在编译的时候进行检查。
正确的做法是:
with THISFORM.PAGEFRAME1.PAGE1.CNTAINER1
case .OPTIONGROUP1.VALUE=1
...
...
endwith
或者更彻底一点,变成这样
with THISFORM.PAGEFRAME1.PAGE1.CNTAINER1.OPTIONGROUP1
case .VALUE=1
...
...
endwith
9 楼
GEORGECHIN [专家分:440] 发布于 2010-01-19 14:55:00
[quote]你这个属于典型的宏替换使用不当,DO CASE没有行数限制,我现在的一个程序用了70多个CASE,分成5个程序来装,第1-4个程序末尾都是
OTHERWISE
do netxPRG1...5.prg
ENDCASE
其中每一个程序的行数都很多,字节数都在50KB左右
并没有报错。说明CASE并不是问题的所在。
THISFORM.PAGEFRAME1.PAGE1.CNTAINER1.
&CNT1LJ.REFRESH,&CNT1LJ.OPTIONGROUP1.VALUE
这种写法非常的难以理解,很容易因为漏掉那个.而造成运行时错误,因为这种写法不能在编译的时候进行检查。
正确的做法是:
with THISFORM.PAGEFRAME1.PAGE1.CNTAINER1
case .OPTIONGROUP1.VALUE=1
...
...
endwith
或者更彻底一点,变成这样
with THISFORM.PAGEFRAME1.PAGE1.CNTAINER1.OPTIONGROUP1
case .VALUE=1
...
...
endwith
[/quote]
1.首先真誠地感謝您的回貼.
2.我也知道是宏替換出了問題,因為我把宏替換拿掉,程序是不報錯的.
3.但是我在不改宏替換,第一,在不加那麼多CASE的情況下,第二,我把這些CASE部分由CLICK事件中挪到PRG中,然后由CLICK調用PRG,程序同樣也是不報錯的,所以我的疑惑就在這.
4.至於宏替換,我也用得挺糊塗.比如:
PUBL CNT1LJ
CNT1LJ="THISFORM.PAGEFRAME1.PAGE1.CONTAINER1." &&注意,后面有"."的.
DO CASE
CASE &CNT1LJ.OPTIONGROUP1.VALUE=1 &&注意,這句是完全可以正確引用的,但是如果把那全局變量的最后一個"."拿掉,這一句就會報錯.
5.為什麼不把宏替換拿掉,是因為頁框中的界面都近似,如果按您說的那樣,代碼的通用性太低了,要改的地方太多了,稍不注意就改漏了.
.
10 楼
wuzhouhong [专家分:10890] 发布于 2010-01-19 15:02:00
我建议你在这里插入
DO CASE
CASE &CNT1LJ.OPTIONGROUP1.VALUE=1
变成
Messagebox("&CNT1LJ.OPTIONGROUP1.VALUE")
DO CASE
CASE &CNT1LJ.OPTIONGROUP1.VALUE=1
你检查下宏替换后的语句是不是出了问题
使用with
endwith
只会让程序更清楚,因为重复的部分已经在with里面了,中间的部分都是必要的代码内容,一点也不重复
我来回复