注册 登录
编程论坛 VFP论坛

表格控件的使用时对组合框的影响,不知道怎么说,进来看

heibaochen 发布于 2023-06-08 13:52, 1057 次点击
点名器中的组合框,选择班级。
只有本站会员才能查看附件,请 登录


阅览器的组合框,选择班级。
只有本站会员才能查看附件,请 登录


以上两个控件代码在gotfoucs事件中,且基本一致。

阅览器的中选择好班级后,表格控件显示数据,数据源为select语句生成的游标。
只有本站会员才能查看附件,请 登录


问题来了,当表格显示数据后,再切到点名器时,发现点名器的组合框出现异常。
只有本站会员才能查看附件,请 登录

它显示的条目成了乱码,因此造成点名等无法正确识别班级名称而异常。


项目文件
只有本站会员才能查看附件,请 登录



基于热爱的学习,代码有很多的不规范,虽为练手,但肯求(不限于以上问题的)指导,感谢各位前辈。
10 回复
#2
吹水佬2023-06-08 14:16
试试表格控件和组合框的数据源都用SQL语句
表格变动后用SetFocus刷新
组合框变动后用Requery刷新
#3
laowan0012023-06-08 14:25
* 点名器和阅览器两个page中的combo1.gotfocus

USE classes IN 1

SELECT classes     && 加上这句试试

bjs = fcount()
xb = INT(bjs/7)

建议:此种应用中设置combo1的style=2


[此贴子已经被作者于2023-6-8 14:42编辑过]

#4
heibaochen2023-06-08 18:20
回复 2楼 吹水佬
吹版主好,有几个问题请教您:
1、这两个页面的组合框条目是对表结构按某种算法选择特定字段到数组中,再把数据做为数据源的,像这种“代码段”怎么做为数据源使用?
我一直以为,做为数据源的代码只能是一行,还有一个问题,组合框的数据源类型中的“SQL语句”和表格控件数据源类型的“SQL说明”,有什么区别?
2、“表格变动后用SetFocus刷新”,这里的“变动”包括从数据源里“引用数据”吗?因为我这里用表格只是为了显示数据,对数据不做任何处理,是不是会有(不用表格控件外的)更好的办法?
另外,SetFocus不是设置焦点吗,也会使控件数据刷新?
3、“组合框变动后用Requery刷新”,这个Requery跟Refresh有啥区别也?

新手事多,万望赐教解惑,再次感谢!
#5
heibaochen2023-06-08 18:46
回复 3楼 laowan001
按您的办法,解决了问题,感谢。做为学习,我想弄明白为什么这样,您看我的理解有啥问题不:
select语句生成的游标,它不会自动关闭(在例子中我试过在阅览器组合框的interachtivechange事件中代码最后加 close tables ,但加上后发现表格控件无法显示数据。)
也因此,会对两个页面的组合框的数据源造成误读,组合框会将它的数据源连接到这个游标里去,会拿游标里字段去提取数据,从而造成了乱码(因为组合框的数据处理中用到了取子串函数,正好取到了汉字的半个内码)。
但我也很疑惑哎,因为我在最开始用了 use classes in 1这样的代码,这句不就是指定了数据表吗,而且我觉得use有排他性呀(1号区里如果有其他正在打开的表会报错的,但它没报呀。
所以是不是这样理解,虽然1号区里打开了数据表,但1号区并不做为当前工作区,而用select classes 就是为了将阅览器组合框的interachtivechange事件中生成的游标切换为classes做为组合框的数据源。

以上理解是否,诚肯指正。
#6
吹水佬2023-06-08 20:09
回复 4楼 heibaochen
1、看了一下提供的代码,用数组就可以,如3楼说的选定当前工作表。最好不要每次点击都要打开表,无必要就不用频繁打开关闭表。
“SQL语句”数据源类型,RowSource属性是一句SQL语句表达式,SELECT ... INTO一个临时表作为控件数据源。
2、通常表格获得焦点后会刷新某些与数据相关的属性,SetFocus就当是数据源数据变动时显示刷新,屏幕也比较安静。
3、组合框Requery是刷新数据源,Refresh是重新绘制显示。
#7
laowan0012023-06-08 21:05
回复 5楼 heibaochen
你的理解是对的!
USE classes IN 1    && (1)这句在工作区1打开了表,但这个表不一定是当前工作区

SELECT classes     && (3)这句是保证下面fcount()能取到预想的表的字段数量

bjs = fcount()    && (2)fcount()字段数量,此函数仅表示当前工作区的表的字段数量
xb = INT(bjs/7)

原来的程序,问题是在page切换后出现的,也就是说,切换page后,当前的工作区改变了

* 建议打开的方式:
use 表 in 0    && 由VFP选定一个空闲的工作区
select 表

另:建议,养成使用local 定义变量的习惯,如果是public变量,建议在表单init里定义
#8
heibaochen2023-06-08 23:11
回复 7楼 laowan001
又有新问题啦,求助求助
管理器班级列表
只有本站会员才能查看附件,请 登录


阅览器里也有这个班级,正常显示。
只有本站会员才能查看附件,请 登录


表格控件也正常显示。
只有本站会员才能查看附件,请 登录


从管理器中将班级删除。
只有本站会员才能查看附件,请 登录


在阅览器里点组合框列表,因为班级字段被删除了,gotfoucs事件报提示语,没有可用班级,正常。
只有本站会员才能查看附件,请 登录


点提示窗口的确定按钮后,组合框竞然又出现刚删除的班级名称了,我去……。
只有本站会员才能查看附件,请 登录


如果点班级名称,出现提示,找不到字段……
只有本站会员才能查看附件,请 登录

弹出调试器,阅览器组合框的interachtivechange事件的代码……
只有本站会员才能查看附件,请 登录

当然找不到了,因为刚在管理器中删掉了呀。

问题1:在管理器中被删除的班级名称为什么会出现在阅览器的组合框内,组合框gotfoucs事件中已经检测到无可用班级了。
问题2:有没有办法在gotfoucs中屏蔽掉 interachtivechange事件的响应,或者说,能控制interachtivechange事件是否响应用户操作。
#9
laowan0012023-06-09 08:27

修改了一下,也同样修改,这样就不报错了

USE classes IN 1
SELECT classes
bjs = fcount()
xb = INT(bjs/7)

this.Clear

IF bjs >=2

*    PUBLIC liebiao1(xb)
   
    FOR  i=1 TO xb
*        liebiao1(i)=SUBSTR(ALLTRIM(field((i*7)-5)),2)
        this.AddItem(SUBSTR(ALLTRIM(field((i*7)-5)),2))
    ENDFOR

*    thisform.pageframe1. = 5
*    thisform.pageframe1. = "liebiao1"
ELSE

    thisform.pageframe1. = ""
    thisform.pageframe1.page1.label1.forecolor = RGB(192,192,192)
    thisform.pageframe1.page1.label1.Caption = "陈保国"
   

    thisform.pageframe1.page3.SetFocus
    thisform.pageframe1.
   
    MESSAGEBOX("没有可用的班级名单,请在管理器里增加班级名单!",0+64,"重要提醒")
   
ENDIF

CLOSE TABLES

this.ListIndex = 1

PUBLIC Fcolor



[此贴子已经被作者于2023-6-9 08:29编辑过]

#10
heibaochen2023-06-09 18:33
回复 9楼 laowan001
按您的办法,代码已修改,现阶段程序功能正常。

通过您的示范,我总结如下:
在管理器中有班级存在的时候(数据表中字段不小于2),会重建组合框数据源绑定的那个数组数据,这个时候是正常的,数组里是有班级名称的(至少1个)。
但当在管理器中删除完所有班级后,数据表里只剩一个pict1字段(表中字段已小于2),按程序流程,此时组合框的gotfoucs事件里就不再执行重建数组数据的代码,而是直接提示无可用班级,而此时的数组数据未做任何重写,它里面还是之前的班级名称(至少1个),所以就造成了虽然提示了无可用班级,但事实上却有班级名称在下拉列表里出现的异常。
按您的办法,不再使用数组做为组合框的数据源,而是按每次实际检索到的班级名即时添加到组合框的列表中,避开了用数组做数据源时的异常情况。

还想问一个事:
只有本站会员才能查看附件,请 登录

这是数据表结构,在一开始设计的时候考虑不周,想着把所有班级的数据都弄一个表里,增加班级时就增加字段,当时未考虑学生作答对错的事,后来有了此需求,不得已在每个班级字段后面增加了6个字段来分别记录日、月、年的作答数据,现在我想导出数据,我试过copy to …… type xl5的办法,但数据表的结构信息不能做修改,如何能在导出时将作答数据的字段名改为更直接的名字,就像在阅览器里表格控件里看到的那样?
只有本站会员才能查看附件,请 登录



感谢您的悉心指导,在如此浮躁和功利的社会里,您的无私帮助真是难能可贵,再次感谢!

[此贴子已经被作者于2023-6-9 18:44编辑过]

#11
laowan0012023-06-10 08:33
如果用copy to ... type xls的话,可以通过下面的语句把字段名改成你希望的   
select _2021职高班 姓名,_dt2021职高班 当日对,_df2021职高班 当日错,... from classes into cursor 临时表名
select 临时表名
copy to ...

或者用导出函数,见下面链接
https://bbs.bccn.net/viewthread.php?tid=508154&highlight=%B7%D6%CF%ED
1