回 帖 发 新 帖 刷新版面

主题:[讨论]COMMAND的CLICK事件還有行數規定嗎?

[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]

回复列表 (共19个回复)

沙发

&CNT1LJ
我不知道CNT1LJ的内容,但从你的语句看,应该是变量,加了宏替换,后面是控件。所以似乎应该是:
&CNT1LJ..OPTIONGROUP1.VALUE=1
加一个宏替换结束符试试看!!!

板凳

[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 楼


  經測試其它運行不報錯的代碼,其代碼超過一定數量(估計在3000行左右)之后,用&代換就不可以正確執行了!
  
  測試方法為:我把原先運行OK的代碼后面加上若干條A=1后,再執行此代碼.原來運行OK的程序報錯了(有&的部分),有時甚至是VFP 9.0也被報錯退出!

  在此想問一下,這到底是VFP9.0的問題,還是我電腦內存的問題還是有其它的原因?

4 楼

我的看法是Click的代码长度限制为小于64K,你可以这样测试一下你的代码长度,将代码复制到一个单独的prg文件中查看该文件的长度。我曾经遇到过这样的问题。

5 楼

按楼主的表述,首先排除电脑内存的问题,因为硬件的出错不是这样出的。

这样的现象应该是VFP9.0的问题,系统解释执行过程的缺陷(没有想到会有这么多的宏替换,呵呵)。

但个人认为,用得太多的宏替换不是好的办法,起码不是好的习惯,常引起一些不明的错误。

6 楼

[quote]按楼主的表述,首先排除电脑内存的问题,因为硬件的出错不是这样出的。

这样的现象应该是VFP9.0的问题,系统解释执行过程的缺陷(没有想到会有这么多的宏替换,呵呵)。

但个人认为,用得太多的宏替换不是好的办法,起码不是好的习惯,常引起一些不明的错误。[/quote]

在相關資料上也有看到用宏會降低應用程序的性能,可是沒有辦法引用"()"啊,因為不同的頁框,絕對路徑不同,又要多次引用,就不得不用宏替換了!

7 楼

[quote]我的看法是Click的代码长度限制为小于64K,你可以这样测试一下你的代码长度,将代码复制到一个单独的prg文件中查看该文件的长度。我曾经遇到过这样的问题。
[/quote]

  可能是這個原因,因為我把這些代碼放在PRG中,其大小有123KB

8 楼

你这个属于典型的宏替换使用不当,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 楼

[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 楼

我建议你在这里插入
DO CASE
CASE &CNT1LJ.OPTIONGROUP1.VALUE=1

变成
Messagebox("&CNT1LJ.OPTIONGROUP1.VALUE")
DO CASE
CASE &CNT1LJ.OPTIONGROUP1.VALUE=1

你检查下宏替换后的语句是不是出了问题
使用with
endwith
只会让程序更清楚,因为重复的部分已经在with里面了,中间的部分都是必要的代码内容,一点也不重复

我来回复

您尚未登录,请登录后再回复。点此登录或注册