标题:请教这段代码错在哪里?
只看楼主
陶然愚者
Rank: 1
等 级:新手上路
帖 子:151
专家分:8
注 册:2012-12-13
得分:0 
回复 3楼 taohua300
没有错误提示啊,就是不执行赋值语句xazd=.........,始终只执行else后的语句。
2013-01-28 14:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:3 
要注意调试技巧:你已经跟踪出出错行,仔细观察那条语句,错误多数出在宏替换上,用MESSAGEBOX()检查xszd的内容,把文本展开到语句上看看。这是用宏常见的错误,写这种代码要非常小心,很多时候贪图简洁用宏语法,后患是无法预料的。

授人以渔,不授人以鱼。
2013-01-28 14:36
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:0 
回复 12楼 TonyDeng
是这样子的
2013-01-28 14:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
凡是用宏的,都要仔细检查所有的可能替换语句,直到完全不会出错为止——因为你不知道对方会给变量赋予什么内容,宏替换出来组成完整的语句,可能是错的。有些时候,宁愿用DO CASE写大量的代码,也比用宏稳妥得多。

从我个人的观点上来说,贪图减省代码的代价就是错误和隐患增多。

授人以渔,不授人以鱼。
2013-01-28 14:54
陶然愚者
Rank: 1
等 级:新手上路
帖 子:151
专家分:8
注 册:2012-12-13
得分:0 
以下是引用TonyDeng在2013-1-28 14:36:06的发言:

要注意调试技巧:你已经跟踪出出错行,仔细观察那条语句,错误多数出在宏替换上,用MESSAGEBOX()检查xszd的内容,把文本展开到语句上看看。这是用宏常见的错误,写这种代码要非常小心,很多时候贪图简洁用宏语法,后患是无法预料的。
谢谢。想了很久,错误的根源应该在以下这段代码:
   FOR xh=1 TO THISFORM.LIST2.LISTCOUNT
      IF thisform.list2.Selected(xh)
          xszd=xszd+","+alltrim(THISFORM.LIST2.list(xh))
      ENDIF
   ENDFOR
即变量XSZD(显示字段)的赋值有误。
列表框(list2)的列表项是在表单的Init事件中定义的,它们来源于两个数据库表:qyjbxxb,qyzycpk。代码如下:

SELECT qyjbxxb
for i=1 to (FCOUNT()-1)
    thisform.list2.additem(FIELD(i,'qyjbxxb',1))
ENDFOR
SELECT qyzycpk
    for i=3 to (FCOUNT()-1)
thisform.list2.additem(FIELD(i,'qyzycpk',1))
endfor

列表项显示的是字段标题,变量xszd接收的应该是字段名,因此,那段给XSZD赋值的代码肯定是错误的,它不能从表中找到应该显示的字段。现在的问题是,根据这种情况,该语句应该怎样写呢?怎样将列表框中选定的项所对应的表字段名赋值给变量XSZD?
2013-01-28 14:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
用二维数组记录列表框的内容,数组的一列是显示文字(列表框的记录源不需绑定到字段或什么,直接用数组循环赋值即可,用序号即数组下标来检索),一列是相应的字段名,按照选项的序号来检索字段名。用二维数组,可以储存任意你希望储存的东西,那其实就是一个临时内存数据表。

[ 本帖最后由 TonyDeng 于 2013-1-28 15:05 编辑 ]

授人以渔,不授人以鱼。
2013-01-28 15:02
陶然愚者
Rank: 1
等 级:新手上路
帖 子:151
专家分:8
注 册:2012-12-13
得分:0 
以下是引用TonyDeng在2013-1-28 15:02:56的发言:

用二维数组记录列表框的内容,数组的一列是显示文字(列表框的记录源不需绑定到字段或什么,直接用数组循环赋值即可,用序号即数组下标来检索),一列是相应的字段名,按照选项的序号来检索字段名。用二维数组,可以储存任意你希望储存的东西,那其实就是一个临时内存数据表。
谢谢。TonyDeng版能以此实例给予指点吗?本人对于数组的理解,实在是太肤浅了,比如定义数组时,下标都不知道如何确定为好,引用也是。
2013-01-28 15:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:3 
DIMENSION arr[FCOUNT(cAlias),2]
FOR nIndex = 1 TO ALEN(arr, 1)
    arr[nIndex,1] = FIELD(nIndex, cAlias, 1)
    arr[nIndex,2] = FIELD(nIndex, cAlias)
    ThisForm.List1.AddItem(arr[nIndex,1])
NEXT
……
xh = arr[ThisForm.List1.ListIndex,2]

授人以渔,不授人以鱼。
2013-01-28 15:30
陶然愚者
Rank: 1
等 级:新手上路
帖 子:151
专家分:8
注 册:2012-12-13
得分:0 
以下是引用TonyDeng在2013-1-28 15:30:02的发言:

DIMENSION arr[FCOUNT(cAlias),2]
FOR nIndex = 1 TO ALEN(arr, 1)
    arr[nIndex,1] = FIELD(nIndex, cAlias, 1)
    arr[nIndex,2] = FIELD(nIndex, cAlias)
    ThisForm.List1.AddItem(arr[nIndex,1])
NEXT
……
xh = arr[ThisForm.List1.ListIndex,2]
问题1:列表框项目来源于2个表,是不是要建立2个二维数组变量?并将以上代码重复2次?
问题2:这里的变量XH是用于存贮选定字段的字段名吗?

[ 本帖最后由 陶然愚者 于 2013-1-28 16:12 编辑 ]
2013-01-28 16:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:1 
啊,我只是举例而已啊。列表框需要两个表的字段总数,定义的时候就把行数定够,比如DIMENSION arr[FCOUNT(cAlias1) + FCOUNT(cAlias2), 2],然后对每个表循环把相应的数据填进去。

数组arr的第一列arr[,1]储存字段的Caption,第二列储存字段Name。List1.ListIndex是列表框控件被Click过的当前项序号,这个也就是被选中项在arr数组中的行序号,这一行的第2列arr[,2]就是你需要的字段名(我写xh = 只是告诉你怎么提取这个内容而已)。

总之,列表框被点选的项的序号,就是数组arr中的行号(总共是两个表的字段数之和那么多行),每行2列,第1列是Caption,第2列是Name,明白吗?如果你用两个表,那么字段名前面应该加别名,在前面给数组赋值的时候,就要把表别名也连进去,即arr[nIndex,2] = cAlias + "." + FIELD(nIndex, cAlias)

[ 本帖最后由 TonyDeng 于 2013-1-28 16:30 编辑 ]

授人以渔,不授人以鱼。
2013-01-28 16:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-397769-1-1.html




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

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