| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1713 人关注过本帖
标题:表单-VFP9的工具中的修饰千万别用
只看楼主 加入收藏
xdzhhq
Rank: 2
等 级:论坛游民
帖 子:32
专家分:33
注 册:2011-11-23
结帖率:60%
收藏
 问题点数:0 回复次数:14 
表单-VFP9的工具中的修饰千万别用
偶而看到介绍说VFP工具中的“修饰”可以美化程序的缩进,想起原来曾自己做过一个程序完成这个功能,就把程序用这个功能美化了。结果,问题出现了,诸多变量值或运行结果不正确。百般检查,程序中变量赋值的变量名错了,我改!我改改改。。。。。。直到某天!
(注意)用修饰时,突然发现,修饰后的变量名被改成上面一个变量名了!我Ctrl+Z,变回来了,再修饰,又变了。

特意提醒:工具中的“修饰”功能千万别用了,检查逻辑过程可以看一下,看完了还是Ctrl+Z吧。

当然,我用的是本站提供的V9,别的版本不知道。
最后,感谢本站提供V9,真心的。
搜索更多相关主题的帖子: 工具 
2012-06-19 09:03
arefeng
Rank: 2
等 级:论坛游民
帖 子:69
专家分:61
注 册:2012-5-30
收藏
得分:0 
回复 楼主 xdzhhq
我反复测试了一阵子,
没发现有这类问题

如下, 对变量赋值, 由VFP工具进行修饰, 没有任何异常:
程序代码:
Set Order To 序号
m.tmp = 0
Scan
    =Messagebox(序号)
Ends

m.abc = 1
m.bdc = 2
m.cdd = 3

Store 23 To m.abcd, m.tdcc, m.gbtt, m.abcddef
Store 35 To m.abcd, m.tdcc, m.gbtt, m.abcddef


楼主的代码片段贴上来看看,
修饰前和修饰后的各贴一段,
我估计你使用的变量名可能跟关键字有某种冲突,
或者你的VFP的安装文件有某种改动.
2012-06-19 09:42
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
这个要有证据才行,楼主发了很多内容相同的帖子呀。

我们都在路上。。。。。
2012-06-19 11:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
1.好的做法是自己编码的时候就做好排版,不要靠什么自动美化。
2.VFP的美化是一个外部程序,而且美化语法是可以改动的。

授人以渔,不授人以鱼。
2012-06-19 11:33
xdzhhq
Rank: 2
等 级:论坛游民
帖 子:32
专家分:33
注 册:2011-11-23
收藏
得分:0 
回复 2楼 arefeng 见图吧
不用这么质疑吧?VFP我用的挺开心的,没必要抵毁。

图片我发不上去,QQ传给你?有想看的都回QQ号。

或者你用下面的代码试试。注意CZYMM名称的变化。从CZYMM变为CZYMM1。

MEMSZ='0123456789'
MEMZM='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
IF .NOT. ALLT(THISFORM.TEXT1.VALUE)==ALLT(THISFORM.TEXT2.VALUE)
MESSAGEBOX('  两次输入的密码不一致, 请重新输入 !  ',(0+48),'提示信息')
THISFORM.TEXT1.VALUE=SPACE(10)
THISFORM.TEXT2.VALUE=SPACE(10)
THISFORM.TEXT1.SETFOCUS
*RETURN 0
ELSE
MEMMM=ALLTRIM(THISFORM.TEXT1.VALUE)
IF LEN(ALLTRIM(thisform.text1.Value))<6 .OR. LEN(ALLTRIM(thisform.text2.Value))<6
MESSAGEBOX('  密码必须大于等于6位! 请重新输入......',(0+48),'提示信息')
THISFORM.TEXT1.SetFocus
ENDIF
MEMSB1=0
MEMSB2=0
FOR MEMLS=1 TO LEN(MEMMM)
   IF AT(SUBSTR(MEMMM,MEMLS,1),MEMSZ)<>0
      MEMSB1=1
   ELSE
      IF AT(SUBSTR(MEMMM,MEMLS,1),MEMZM)<>0
         MEMSB2=1
      ELSE
         MESSAGEBOX('  密码含非法字符! 请重新输入......',(0+48),'提示信息')
         THISFORM.TEXT1.SetFocus
      ENDIF
   ENDIF
ENDFOR
IF MEMSB1=0 .OR. MEMSB2=0
   MESSAGEBOX('  密码必须包含至少一位字母或一位数字! 请重新输入......',(0+48),'提示信息')
   THISFORM.TEXT1.SetFocus
else

MEMCZYMM=ALLT(THISFORM.CZYMM1.VALUE)
MEMCZYMM1=ALLT(THISFORM.TEXT1.VALUE)
MEMCZYMM2=ALLT(THISFORM.TEXT2.VALUE)
IF LEN(MEMCZYMM1)=0
THISFORM.TEXT1.SETFOCUS
ELSE
SET EXAC ON
SELE 1
USE CZYB
LOCA FOR ALLT(CZYBM)=ALLT(SYSCZYBM) .AND. ALLTRIM(PAJIE(CZYXM,CZRQ,CZYMM))=ALLT(MEMCZYMM)
IF EOF()
MESSAGEBOX('  你谁啊你, 密码不能靠猜的 ! 不准你修改......  ',(0+48),'提示信息')
USE
THISFORM.RELEASE
ELSE
REPLACE CZRQ WITH DATETIME()
REPL czyxm WITH likoum(sysczyxm,czrq),CZYMM WITH PAJIA(SYSCZYXM,CZRQ,MEMCZYMM1)
USE
MESSAGEBOX('  密码修改成功 ! 下次登录要输入新密码啦......  ',(0+48),'提示信息')
*SET EXAC OFF
sysczylx1=sysczylx
THISFORM.RELEASE
ENDIF
ENDIF
ENDIF
endif

[ 本帖最后由 xdzhhq 于 2012-6-19 15:46 编辑 ]
2012-06-19 15:38
xdzhhq
Rank: 2
等 级:论坛游民
帖 子:32
专家分:33
注 册:2011-11-23
收藏
得分:0 
呵呵,问题找到了,在工具--修饰中有个符号选项,选大写、小写和不改变都不影响。如选“与第一次匹配”,则会出现问题。但它把MEMCZYMM1的“1”加到CZYMM后面就太没道理了。不过,这已经不重要了。
2012-06-19 16:12
arefeng
Rank: 2
等 级:论坛游民
帖 子:69
专家分:61
注 册:2012-5-30
收藏
得分:0 
用楼主的代码测试了一阵
确实有楼主提到的问题发生
原因分析中...
2012-06-19 21:34
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用arefeng在2012-6-19 21:34:01的发言:

用楼主的代码测试了一阵
确实有楼主提到的问题发生
原因分析中...
分析结果如何

坚守VFP最后的阵地
2012-06-21 06:22
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
我习惯在写程序时一次性将语句写全,例如写IF语句的同时将ENDIF写完整,然后再写中间的内容;写DO CASE时马上就写ENDCASE,再往中间添加语句。程序的行递进工作手工同步进行,从来没有去用过系统工具来修饰。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-06-21 07:15
arefeng
Rank: 2
等 级:论坛游民
帖 子:69
专家分:61
注 册:2012-5-30
收藏
得分:0 
以下是引用sdta在2012-6-21 06:22:30的发言:

分析结果如何
做了很多类比测试,
终于发现规律:
主要是要理解这个修饰功能中的"符号"选项对于"符号"的定义

"字符"+"数字"的组合, 被视作"符号",
猜测这个功能是用于方便程序员对符号进行"简写", 以下是测试例:

第一组测试:
 修饰前:
cText003 = 3
cTex = 9
cText0039 = 7
修饰后:
cText003 = 3
cText003 = 9
cText0039 = 7

第二组测试:
然后更改一下, 有更细节的规律如下:
 修饰前:
cText003 = 3
cTex = 9
cTex0039 = 7
修饰后:
cText003 = 3
cTex0039 = 9
cTex0039 = 7
注意看这两组例子, 字符和数字的组合, 其字符部分是优先判断的.

第三组测试:
然后进一步试验, 有了惊人发现:
 修饰前:
程序代码:
cText003 = 3
c = 5
cT = 8
cTe = 7
cTex = 9
cTex0039 = 7
cTe00335 = 6
修饰后:
程序代码:
cText003 = 3
cTe00335 = 5
cTe00335 = 8
cTe00335 = 7
cTex0039 = 9
cTex0039 = 7
cTe00335 = 6
这样这个规律就发现出来了.

其实VFP的这个功能相当体贴, 只是把它作为默认设置确实不合理,
程序员们(包括我)不太可能初次使用就去关注这么细节的东西,
用一下发现有问题很容易放弃掉.

总体来说用"修饰"是不错的,
我自己写代码的习惯不差,打字笔误极少,
用到"修饰"的时候不多,
但整理别人的代码应该就很有用了.

结论: 不要使用符号选项中的"与第一次匹配", 这个高级进阶功能不那么容易掌握, 它需要程序员写代码时对变量的命名原则一定不能是"字符"+"数字"的组合, 而咱们中国的程序员们, 好象都非常喜欢这样命名变量.(我自己就经常使用诸如tmp01,tmp02之类的变量名.)
2012-06-21 10:00
快速回复:表单-VFP9的工具中的修饰千万别用
数据加载中...
 
   



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

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