注册 登录
编程论坛 VFP论坛

问个小问题,请教这个怎么解决

hytizj023 发布于 2023-04-20 21:31, 2163 次点击
程序代码:
.................
COUNT FOR 路数比='3:0:0' to lsb1
COUNT FOR 路数比='2:1:0' to lsb2
COUNT FOR 路数比='2:0:1' to lsb3
COUNT FOR 路数比='1:2:0' to lsb4
COUNT FOR 路数比='1:1:1' to lsb5
COUNT FOR 路数比='1:0:2' to lsb6
COUNT FOR 路数比='0:3:0' to lsb7
COUNT FOR 路数比='0:2:1' to lsb8
COUNT FOR 路数比='0:1:2' to lsb9
COUNT FOR 路数比='0:0:3' to lsb10

表单代码如下:
DO 统计
FOR i=1 TO 10
tt=ALLTRIM(STR(i))
thisform.pageframe1.page1.container4.label&tt..Caption=lsb+str(i)
thisform.pageframe1.page1.container4.Init
ENDFOR
报错说lsb不存在,是不是这个只是局部变量,只能在程序里用,表单里面就不能用了啊!
还有lsb+str(i)这里写法应该也有错,这个该怎么写!
do 统计
messagebox(lsb1)
一样报错说变量不存在,我觉得说明问题还是在没有获取到变量

[此贴子已经被作者于2023-4-20 21:34编辑过]

36 回复
#2
吹水佬2023-04-20 21:39
这些代码不是在表单的同一个方法或事件里的吧
给数据和代码测试
#3
hytizj0232023-04-20 21:40
以下是引用吹水佬在2023-4-20 21:39:44的发言:

这些代码不是在表单的同一个方法或事件里的吧
给数据和代码测试

不是,有没有办法解决,吹版
#4
hytizj0232023-04-20 21:44
下面是表单代码
查询按钮代码
SELECT 历史
DO 统计
FOR i=1 TO 10
tt=ALLTRIM(STR(i))
thisform.pageframe1.page1.container4.label&tt..Caption=lsb+str(i)
thisform.pageframe1.page1.container4.Init
ENDFOR
统计程序代码:
&&select 历史
COUNT FOR 路数比='3:0:0' to lsb1
COUNT FOR 路数比='2:1:0' to lsb2
COUNT FOR 路数比='2:0:1' to lsb3
COUNT FOR 路数比='1:2:0' to lsb4
COUNT FOR 路数比='1:1:1' to lsb5
COUNT FOR 路数比='1:0:2' to lsb6
COUNT FOR 路数比='0:3:0' to lsb7
COUNT FOR 路数比='0:2:1' to lsb8
COUNT FOR 路数比='0:1:2' to lsb9
COUNT FOR 路数比='0:0:3' to lsb10
我就是想程序和表单分开,不然程序太多,看起来太乱,又长,不利于看,所以我想把程序和表单分开,没有写在一起

[此贴子已经被作者于2023-4-20 21:46编辑过]

#5
laowan0012023-04-20 21:44
程序代码:
表单代码如下:
DO 统计
FOR i=1 TO 10
tt=ALLTRIM(STR(i))
thisform.pageframe1.page1.container4.label&tt..Caption=lsb+str(i)
thisform.pageframe1.page1.container4.Init
ENDFOR
报错说lsb不存在,是不是这个只是局部变量,只能在程序里用,表单里面就不能用了啊!
还有lsb+str(i)这里写法应该也有错,这个该怎么写!

lsb没有定义就使用,结果就会是变量未找到
local lsb   
lsb='字符串'    && 初始化了变量,后面就可以用了
变量在程序或表单都可以用
#6
hytizj0232023-04-20 21:52
Caption=lsb+str(i)这里该怎么写啊!
这些写他只是报错lsb,而不是lsb1
#7
laowan0012023-04-20 21:55
FOR i=1 TO 10
tt=ALLTRIM(STR(i))
thisform.pageframe1.page1.container4.label&tt..Caption=lsb+str(i)

上面最后一句话之前,lsb的值是什么?
#8
laowan0012023-04-20 21:56
Caption=lsb+str(i)这里该怎么写啊!
这些写他只是报错lsb,而不是lsb1

怎么又出来个lsb1?
#9
hytizj0232023-04-20 21:57
以下是引用laowan001在2023-4-20 21:55:58的发言:

FOR i=1 TO 10
tt=ALLTRIM(STR(i))
thisform.pageframe1.page1.container4.label&tt..Caption=lsb+str(i)
上面最后一句话之前,lsb的值是什么?

报错啊,找不到变量lsb,而不是lsb1
#10
laowan0012023-04-20 22:00
以下是引用hytizj023在2023-4-20 21:57:08的发言:


报错啊,找不到变量lsb,而不是lsb1

那就给变量lsb赋值啊
#11
laowan0012023-04-20 22:01
FOR i=1 TO 10
tt=ALLTRIM(STR(i))
lsb='aaa'    && 加上这句试试
thisform.pageframe1.page1.container4.label&tt..Caption=lsb+str(i)
#12
hytizj0232023-04-20 22:04
以下是引用laowan001在2023-4-20 22:00:27的发言:


那就给变量lsb赋值啊

local lsb1,lsb2,lsb3,lsb4,lsb5,lsb6,lsb7,lsb8,lsb9,lsb10
DO 统计
FOR i=1 TO 10
tt=ALLTRIM(STR(i))
yy=lsb+STR(i)
thisform.pageframe1.page1.container4.label&tt..Caption='&yy'
thisform.pageframe1.page1.container4.Init
统计程序已经赋值了啊!
你还没有理解到意思吗?现在不是变量空值,而是没有找到变量,我要循环打印lsb1到lsb10的值
我的意思是lsb+STR(i)这种写法有错,应该怎么写!
报错是找不到lsb,正确的应该是找不到lsb1变量,而不是lsb
#13
hytizj0232023-04-20 22:20
我自己解决了
#14
cssnet2023-04-20 22:25
这小问题问得确实异常搞笑。

1、难道你不明白什么是字符串常量?什么是变量名吗?
yy = "lsb" + tt
或者
yy = "lsb" + ALLTRIM(STR(i))
了解一下。

2、local lsb1,lsb2,lsb3,lsb4,lsb5,lsb6,lsb7,lsb8,lsb9,lsb10,然后试图在子程序“统计”中改变lsb1,lsb2,lsb3,lsb4,lsb5,lsb6,lsb7,lsb8,lsb9,lsb10的值,这一点,实在令人震惊!完全颠覆了我对于“菜鸟无下限”的认知!这样子搞法,那你还要什么“局部变量"、还要什么"作用域"做啥?——直接将你的代码搅拌成一大锅面条就好啦。

3、.Caption='&yy'的赋值,又再度刷新了我的震惊!我都不惜得说你了。唉,你自己反省一下吧。任何字符,只要被包括到了''当中,都不可能被VFP解释为宏替换了啊,亲。

#15
hytizj0232023-04-20 22:47
刷新了哈!刷新的还在后面,看到一半就在跑
#16
csyx2023-04-20 22:53
。。。
#17
csyx2023-04-20 22:55
以下是引用cssnet在2023-4-20 22:25:25的发言:
3、.Caption='&yy'的赋值,又再度刷新了我的震惊!我都不惜得说你了。唉,你自己反省一下吧。任何字符,只要被包括到了''当中,都不可能被VFP解释为宏替换了啊,亲。

不一定吧,如果yy是字符型,宏替换还是要执行的
yy = '123'
Caption='&yy'
? Caption

[此贴子已经被作者于2023-4-20 22:56编辑过]

#18
hytizj0232023-04-20 23:11
以下是引用csyx在2023-4-20 22:55:58的发言:


不一定吧,如果yy是字符型,宏替换还是要执行的
yy = '123'
Caption='&yy'
? Caption

帮我解决一下:
COUNT FOR 路数比='3:0:0' to lsb1
COUNT FOR 路数比='2:1:0' to lsb2
COUNT FOR 路数比='2:0:1' to lsb3
COUNT FOR 路数比='1:2:0' to lsb4
COUNT FOR 路数比='1:1:1' to lsb5
COUNT FOR 路数比='1:0:2' to lsb6
COUNT FOR 路数比='0:3:0' to lsb7
COUNT FOR 路数比='0:2:1' to lsb8
COUNT FOR 路数比='0:1:2' to lsb9
COUNT FOR 路数比='0:0:3' to lsb10

FOR i=1 TO 10
tt=ALLTRIM(STR(i))
thisform.pageframe1.page1.container4.label&tt..Caption=lsb+STR(i)
thisform.pageframe1.page1.container4.label&tt..refresh
thisform.pageframe1.page1.container4.init
ENDFOR

thisform.pageframe1.page1.container4.label&tt..Caption=lsb+STR(i)这句还是不行,研究了半天还是不行,我就是要打印lsb1到lsb10,出来
之前是用表来统计,我改变想法了,我想直接用变量
lsb+STR(i)主要是这里错了,老是提示找不到lsb,说明后面的1没有识别到

[此贴子已经被作者于2023-4-20 23:12编辑过]

#19
sdta2023-04-20 23:16
lsb+STR(i)
改为
lsb+ALLTRIM(STR(i))
#20
csyx2023-04-20 23:49
.Caption = eval('lsb'+ trans(i))
#21
laowan0012023-04-21 07:46
local lsb1,lsb2,lsb3,lsb4,lsb5,lsb6,lsb7,lsb8,lsb9,lsb10
DO 统计
FOR i=1 TO 10
tt=ALLTRIM(STR(i))
yy='lsb'+STR(i)
thisform.pageframe1.page1.container4.label&tt..Caption=yy    &&'&yy'
thisform.pageframe1.page1.container4.Init
#22
laowan0012023-04-21 07:54
以下是引用hytizj023在2023-4-20 22:04:31的发言:


local lsb1,lsb2,lsb3,lsb4,lsb5,lsb6,lsb7,lsb8,lsb9,lsb10
DO 统计
FOR i=1 TO 10
tt=ALLTRIM(STR(i))
yy=lsb+STR(i)
thisform.pageframe1.page1.container4.label&tt..Caption='&yy'
thisform.pageframe1.page1.container4.Init
统计程序已经赋值了啊!
你还没有理解到意思吗?现在不是变量空值,而是没有找到变量,我要循环打印lsb1到lsb10的值
我的意思是lsb+STR(i)这种写法有错,应该怎么写!
报错是找不到lsb,正确的应该是找不到lsb1变量,而不是lsb


local lsb1,lsb2,lsb3,lsb4,lsb5,lsb6,lsb7,lsb8,lsb9,lsb10
DO 统计
第1句中定义的10个局部变量,在第2句的程序“统计”中是不可用的!就算是同名变量也不是一回事
要养成定义变量及变量作用域的习惯,这样不至于出现一些莫名的问题

建议:“统计”如果只是为了获得某结果,建议写成函数,或者在当前表单做个button当函数用也行
#23
hu9jj2023-04-21 07:58
以下是引用hytizj023在2023-4-20 21:52:26的发言:

Caption=lsb+str(i)这里该怎么写啊!
这些写他只是报错lsb,而不是lsb1

你将“lsb+str(i)”作为字符串显示出来看看,就可以发现问题所在。
#24
csyx2023-04-21 08:00
.Caption = trans(eval('lsb'+ trans(i)))
#25
hytizj0232023-04-21 08:36
以下是引用csyx在2023-4-21 08:00:05的发言:

.Caption = trans(eval('lsb'+ trans(i)))

,成功解决,感谢
#26
hytizj0232023-04-21 08:38
以下是引用laowan001在2023-4-21 07:54:58的发言:



local lsb1,lsb2,lsb3,lsb4,lsb5,lsb6,lsb7,lsb8,lsb9,lsb10
DO 统计
第1句中定义的10个局部变量,在第2句的程序“统计”中是不可用的!就算是同名变量也不是一回事
要养成定义变量及变量作用域的习惯,这样不至于出现一些莫名的问题

建议:“统计”如果只是为了获得某结果,建议写成函数,或者在当前表单做个button当函数用也行

我把local,变成public,结果也是一样
我试了'lsb'+str(i),结果就是输出了,lsb1
#27
sam_jiang2023-04-21 08:55
lsb没加引号是变量,加了引号是字符串,楼主还不知道错在哪?
#28
hytizj0232023-04-21 09:04
COUNT FOR 路数比='3:0:0' to lsb1
COUNT FOR 路数比='2:1:0' to lsb2
COUNT FOR 路数比='2:0:1' to lsb3
COUNT FOR 路数比='1:2:0' to lsb4
COUNT FOR 路数比='1:1:1' to lsb5
COUNT FOR 路数比='1:0:2' to lsb6
COUNT FOR 路数比='0:3:0' to lsb7
COUNT FOR 路数比='0:2:1' to lsb8
COUNT FOR 路数比='0:1:2' to lsb9
COUNT FOR 路数比='0:0:3' to lsb10
FOR i=1 TO 10
tt=ALLTRIM(STR(i))
thisform.pageframe1.page1.container4.label&tt..Caption=trans(eval('lsb'+ trans(i)))
thisform.pageframe1.page1.container4.label&tt..refresh
IF thisform.pageframe1.page1.container4.label&tt..Caption='0'
thisform.pageframe1.page1.container4.label&tt..visible=.f.
else
thisform.pageframe1.page1.container4.label&tt..visible=.T.
ENDIF
ENDFOR
我查询按钮里面有很多地方要用到这些代码,如果都去写一遍,太长了(这里我只列举了一部分,其实还有很多),也不利于程序的可读性,有没有好的办法
主要是下面这些方法:
FOR i=1 TO 10
tt=ALLTRIM(STR(i))
thisform.pageframe1.page1.container4.label&tt..Caption=trans(eval('lsb'+ trans(i)))
thisform.pageframe1.page1.container4.label&tt..refresh
IF thisform.pageframe1.page1.container4.label&tt..Caption='0'
thisform.pageframe1.page1.container4.label&tt..visible=.f.
else
thisform.pageframe1.page1.container4.label&tt..visible=.T.
ENDIF
ENDFOR
#29
sam_jiang2023-04-21 09:16
lsb没加引号是变量,加了引号是字符串,楼主还不知道错在哪?
#30
csyx2023-04-21 09:24
For ii = 1 TO 10
    cNo = Transform(ii)
    With GetPem(thisform.pageframe1.page1.container4, 'Label'+cNo) as Label
        .Caption = Transform(Evaluate('lsb'+cNo))
        .Refresh()
        .Visible = !(.Caption == '0')
    EndWith
EndFor
#31
hytizj0232023-04-21 10:53
以下是引用csyx在2023-4-21 09:24:17的发言:

For ii = 1 TO 10
    cNo = Transform(ii)
    With GetPem(thisform.pageframe1.page1.container4, 'Label'+cNo) as Label
        .Caption = Transform(Evaluate('lsb'+cNo))
        .Refresh()
        .Visible = !(.Caption == '0')
    EndWith
EndFor

看不太懂你这个,我大概理解为:和我的程序一样,好像是换了一种写法。不知道能不能这样理解。
我的意思,方法能不能像调用程序一样,do 统计,就完事了,不知道行不行
#32
csyx2023-04-21 11:05
是这个意思
要达到你的目的,新建表单方法,把上面需要变化的东西改成变量写到方法中,按钮中 Thisform.新建方法名(参数1,参数2, ...) 这样调用即可
例如,上面 container4 是可变的,方法内容就这么写:
Lparameters toCnt as Container
local ii, cNo
For ii = 1 TO 10
    cNo = Transform(ii)
    With GetPem(toCnt, 'Label'+cNo) as Label
        .Caption = Transform(Evaluate('lsb'+cNo))
        .Refresh()
        .Visible = !(.Caption == '0')
    EndWith
EndFor
按钮 click 调用此方法: Thisform.方法名(thisform.pageframe1.page1.container4)

*-- 上面这个实际无法运行,因为方法中访问不到你的局部变量 lsbXX,你可以把那些变量放入数组,同时作为参数传入,方法就这样定义:
Lparameters toCnt as Container, taLsb
...
    With GetPem(toCnt, 'Label'+cNo) as Label
        .Caption = Transform(Evaluate(taLsb[ii]))
...
click 调用时就改成:
Dimension aLsb[10]
aLsb[1] = lsb1
...
Thisform.方法名(thisform.pageframe1.page1.container4, @ aLsb)



[此贴子已经被作者于2023-4-21 11:14编辑过]

#33
hytizj0232023-04-21 11:26

FOR i=1 TO 10
tt=ALLTRIM(STR(i))
thisform.pageframe1.page1.container4.label&tt..Caption=trans(eval('lsb'+ trans(i)))
thisform.pageframe1.page1.container4.label&tt..refresh
IF thisform.pageframe1.page1.container4.label&tt..Caption='0'
thisform.pageframe1.page1.container4.label&tt..visible=.f.
else
thisform.pageframe1.page1.container4.label&tt..visible=.T.
ENDIF
根据值给标签换颜色
...............
ENDFOR
我想在加一个操作,就是获取到值大于等于5,显示为蓝色(0,0,255),大于等于10,显示为红色(255,0,0),请教怎么做。
我主要不知道怎么获取变量
我总不能这样写吧
if lsb1>=5
.........
endif
你说的新建方法我得研究一下,应该我能实现
#34
csyx2023-04-21 12:15
32楼的代码加几句呗:
...
For ii = 1 TO 10
    cNo = Transform(ii)
    nVal = Evaluate('lsb' + cNo)
    With GetPem(toCnt, 'Label'+cNo) as Label
        .Caption = Transform(nVal)
        .Refresh()
        .Visible = !(.Caption == '0')
        .BackColor = Icase(nVal > 10, 0xff0000, nVal > 5, 0xff, 0xc0c0c0)    && 根据值改背景色
    EndWith
EndFor
#35
csyx2023-04-21 12:26
算了,还就你现在的代码改吧
FOR i=1 TO 10
    tt = Ltrim(Str(i))
    nVal = eval('lsb' + trans(i))
    With thisform.pageframe1.page1.container4.label&tt as Label
        .Caption = trans((nVal)
        .refresh()
        .visible = !(.Caption='0')
        .backcolor = Icase(nVal>10,0xff, nVal>5,0xff0000, 0xc0c0c0)    && 根据值改背景色
    EndWith
ENDIF

[此贴子已经被作者于2023-4-21 12:29编辑过]

#36
hytizj0232023-04-21 13:33
以下是引用csyx在2023-4-21 12:26:04的发言:

算了,还就你现在的代码改吧
FOR i=1 TO 10
    tt = Ltrim(Str(i))
    nVal = eval('lsb' + trans(i))
    With thisform.pageframe1.page1.container4.label&tt as Label
        .Caption = trans((nVal)
        .refresh()
        .visible = !(.Caption='0')
        .backcolor = Icase(nVal>10,0xff, nVal>5,0xff0000, 0xc0c0c0)    && 根据值改背景色
    EndWith
ENDIF

我已经改好了感谢!
#37
东海ECS2023-04-21 22:06
您的程序里面定义的 lsb1,lsb2,lsb3 ... lsb10 只是局部变量,只能在程序执行的时候使用,不能在表单中直接引用。因此,如果您在表单中需要使用这些变量,您需要在程序中将这些变量声明为公共变量或者全局变量。声明方法如下:

PUBLIC lsb1, lsb2, lsb3, lsb4, lsb5, lsb6, lsb7, lsb8, lsb9, lsb10


或者:

GLOBAL lsb1, lsb2, lsb3, lsb4, lsb5, lsb6, lsb7, lsb8, lsb9, lsb10

如果您采用公共变量的方式声明变量,那么这些变量只能在同一应用程序中的不同对象之间共享。如果您采用全局变量的方式声明变量,那么这些变量可以在应用程序的任意对象中使用。

在表单中使用这些变量时,您可以使用下面这样的代码:

FOR i=1 TO 10
    strLsb = 'lsb' + ALLTRIM(STR(i))
    thisform.pageframe1.page1.container4.label&tt..Caption = &strLsb
ENDFOR

这样,您就可以在表单中使用局部变量 strLsb 引用程序中的全局变量了。



1