注册 登录
编程论坛 VFP论坛

VFP9 combox 的BUG,CCB2000在VFP10中已修复。谁有简单的绕过这个BUG的方法?

kangss 发布于 2025-04-03 17:35, 2349 次点击
CCB2000在VFP10中剖析修复:https://

复现BUG例子:
只有本站会员才能查看附件,请 登录


BUG演示:
只有本站会员才能查看附件,请 登录


这个例子是简单的把dbf挂接到combox上

测试过程:点击小三角展开
滚动条拉到底,选择点击最后一个
滚动条拉到头,再选择点击第一个
反反复复,多试几次,有时候第一次第二次就会出现BUG

当点击list项目后,combox的值没有发生改变,BUG就呈现出来了,此时点击窗口,combox的值又更新了。
看看谁有简单有效绕过这个BUG的方法?
71 回复
#2
kangss2025-04-03 18:29
4. APPLIES TO:

     VFP 9.0.0.3504 (SP1)
     VFP 9.0.0.4611 (SP2)
     VFP 9.0.0.5015 (SP2)
     VFP 9.0.0.5411 (SP2)
     VFP 9.0.0.5721 (SP2)
     VFP 9.0.0.5815 (SP2)
     VFP 9.0.0.6303 (SP2)
     VFP 9.0.0.6602 (SP2)
     VFP 9.0.0.7423 (SP2)

     The bug has been fixed in VFP Advanced.

刚刚找了9.0 - 2412版测试,没有这个BUG
#3
schtg2025-04-04 06:50
回复 楼主 kangss
我刚测试了11次,都没有问题的哈,我的操作系统win10 64位。
#4
kangss2025-04-04 10:00
以下是引用schtg在2025-4-4 06:50:19的发言:

我刚测试了11次,都没有问题的哈,我的操作系统win10 64位。

9.0 - 2412:正常,之后的升级版包括 7423,都有这个BUG。你的VFP是哪个版本的?
#5
schtg2025-04-04 11:05
回复 4楼 kangss
我安装的是专业版2412,然后直接拷贝的7423的文件覆盖了2412的哈
#6
kangss2025-04-04 11:28
以下是引用schtg在2025-4-4 11:05:19的发言:

我安装的是专业版2412,然后直接拷贝的7423的文件覆盖了2412的哈

跟windows无关,只要不是2412,就有BUG。我用的就是7423,仔细看一下9.0的关于,你用的是不是7423
#7
schtg2025-04-04 16:47
回复 6楼 kangss
就是7423哈
只有本站会员才能查看附件,请 登录
#8
csyx2025-04-04 17:18
此bug肯定是存在的,不然ccb也找不到要修复的位置,且我和单位的其他人也多次碰到过选不上的情况

另:下拉列出项数较少时不大容易碰到选不上的情况,项数越多越容易碰上,把 Combo1.DisplayCount 设为 15 试试

#9
kangss2025-04-04 17:46
只有本站会员才能查看附件,请 登录

设置 20、奇数、偶数都没用
2412 的 PictureVal 不支持 png,7423 修正之前版本很多BUG
#10
kangss2025-04-04 17:49
以下是引用schtg在2025-4-4 16:47:13的发言:

就是7423哈

同样的 exe,运行有这个BUG,用 2412 版本的 vfp9r.dll、vfp9rchs.dll 替换掉,再运行就没有这个BUG
#11
csyx2025-04-04 18:15
以下是引用kangss在2025-4-4 17:46:30的发言:
设置 20、奇数、偶数都没用

理解错误,schtg 不是复现不了这 bug 嘛,把 DisplayCount 设置成大点的数。项数越多越容易出现选不上的情况,不是设成 15 就没这 bug 了

[此贴子已经被作者于2025-4-4 18:19编辑过]

#12
kangss2025-04-04 18:52
以下是引用csyx在2025-4-4 18:15:50的发言:
理解错误,schtg 不是复现不了这 bug 嘛,把 DisplayCount 设置成大点的数。项数越多越容易出现选不上的情况,不是设成 15 就没这 bug 了

list项目少,也会有这个BUG,包括下拉组合、下拉列表这 2 种模式。有绕过这个BUG的方法吗?
#13
kangss2025-04-04 19:04
展开 list 时,这个list是在一个带有句柄的窗口中,我在计时器中获取不到它的句柄,如果能获取到这个类“vfp994000002”的句柄,用消息激活它置顶,大概率能绕过这个BUG。
这个类的名称目前发现规律是“vfp + 9940 + 00002”:exe名 + 不同的exe中间4位不一样 + 4个0 + “2”
这个类的名称 = 所在窗口的类名称 + “2”

[此贴子已经被作者于2025-4-4 19:09编辑过]

#14
csyx2025-04-04 19:08
以下是引用kangss在2025-4-4 18:52:37的发言:
有绕过这个BUG的方法吗?

项数少到不出现滚动条就没问题。
我的方案是,基类中 DispalyCount 设置为 15,凡项数大于 15 的都用两或三级的弹出菜单替代(DropDown 里 NoDefault,然后在 Combobox 下弹出这个菜单)
#15
kangss2025-04-04 19:11
以下是引用csyx在2025-4-4 19:08:52的发言:


项数少到不出现滚动条就没问题。
我的方案是,基类中 DispalyCount 设置为 15,凡项数大于 15 的都用两或三级的弹出菜单替代(DropDown 里 NoDefault,然后在 Combobox 下弹出这个菜单)

你这个方法也是不错的,我在有输入需求自动展开list的combox中用 combox + list,2个控件组合成一个类库使用,可以绕过去。
现在是想看看单独使用combox时有没有办法绕过去。

[此贴子已经被作者于2025-4-4 19:13编辑过]

#16
csyx2025-04-04 19:23
实例截图是这样
只有本站会员才能查看附件,请 登录


我不想用 list,因为 list 的位置受限于当前表单位置和尺寸,除非表单最大化,上面截图中菜单高度就超出表单下边界
#17
kangss2025-04-04 19:42
以下是引用csyx在2025-4-4 19:23:54的发言:

实例截图是这样


我不想用 list,因为 list 的位置受限于当前表单位置和尺寸,除非表单最大化,上面截图中菜单高度就超出表单下边界

漂亮!
#18
easyppt2025-04-05 15:18
很好奇,CCB能在VFP10中修复,为何 VFP9-7423 就无法修复 ??
#19
kangss2025-04-05 19:17
以下是引用easyppt在2025-4-5 15:18:53的发言:

很好奇,CCB能在VFP10中修复,为何 VFP9-7423 就无法修复 ??

他的 VFP Advanced 是独立的
#20
丁春秋yxp2025-04-05 23:50
这个bug确实存在

#21
kangss2025-04-06 20:03
以下是引用丁春秋yxp在2025-4-5 23:50:51的发言:

这个bug确实存在

还是不能图省事,再用combo+listbox做一个下拉列表模式的
#22
星光悠蓝2025-04-06 22:26
我用的是7423,WIN7系统,组合框有100多项目,没看到有选择错误现象!
#23
kangss2025-04-07 19:36
以下是引用星光悠蓝在2025-4-6 22:26:44的发言:

我用的是7423,WIN7系统,组合框有100多项目,没看到有选择错误现象!


0-下拉组合框
2-下拉列表框
2种模式都有这个BUG

特别是 _screen.Visible = .F.,或编译成exe时,配置文件中 SCREEN = OFF,概率极高。
没有隐藏 _screen 时,“2-下拉列表框”方式问题不大。

#24
星光悠蓝2025-04-07 20:04
回复 23楼 kangss
VFP没落了!我们也一把年纪了!

[此贴子已经被作者于2025-4-7 20:06编辑过]

#25
cssnet2025-04-08 00:14
以下是引用kangss在2025-4-3 17:35:48的发言:
这个例子是简单的把dbf挂接到combox上


直觉你自己说的第一句话,可能就是问题的关键。
为什么不试试:
“不要简单的把dbf挂接到combox上,而是改用Scan...endscan将dbf数据手动填充到combox上呢?”
虽然这作法有点儿“脱裤子放屁”,不过,说不定就能解决此bug,亦未可知?
呵呵。


#26
kangss2025-04-08 11:16
以下是引用cssnet在2025-4-8 00:14:09的发言:
直觉你自己说的第一句话,可能就是问题的关键。
为什么不试试:
“不要简单的把dbf挂接到combox上,而是改用Scan...endscan将dbf数据手动填充到combox上呢?”
虽然这作法有点儿“脱裤子放屁”,不过,说不定就能解决此bug,亦未可知?
呵呵。

你说的这种,试过了,无效。N年前突然发现这个现象,以为自己用的方式不对,反反复复调整了很久,发现不是自己用的不对,最后报给CCB2000确认的。
简单挂上,是为了更直观的复现BUG。
采用“2-下拉列表框”模式,_screen不隐藏使用,也就是在VFP环境中使用,没啥问题。编译成exe,不想看见_screen,就隐藏了它,问题就尤为明显。

[此贴子已经被作者于2025-4-8 11:19编辑过]

#27
kangss2025-04-08 11:21
CCB2000的分析原因解决方案估计大部分人都看不懂,如果能看懂,做个补丁啥的,也许能解决
#28
cssnet2025-04-08 11:37
以下是引用kangss在2025-4-8 11:16:45的发言:
N年前突然发现这个现象,以为自己用的方式不对,反反复复调整了很久,发现不是自己用的不对


我没试,只是灵光一现,随口那么一说,嘿嘿。

回过头来我也测试了一下自己N年前制作的软件,敢情我做的那些也存在这个bug!只是软件当中的ComboBox不太起眼,用的机会也不多,N年以来从不曾收到过用户针对这个问题的反馈,惭愧惭愧!

那就值得探讨一下子了:

据你侦测的结果,当用户点击下拉列表,并选中第一项时,ComboBox并未发生任何click或MouseDown事件;那么,鼠标点击事件,究竟被哪一个父对象给私吞了去?能否侦测出来?感觉上,Click事件不像是被Form拦截了。可,既然下拉列表能被收回,下方先前被遮盖的Form部分能够被refresh,这意味着,肯定有什么事件曾经发生过——虽然事件最终不一定被ComboBox正确识别到。

那么,找到这个事件的owner,以及这一个事件本身,然后在它的事件代码中刷新ComboBox的值,估计就能成功了。

好吧,现在拷问灵魂的问题来了:

他是谁(owner)?发生了什么(event)?

你再仔细侦测一下下??

[此贴子已经被作者于2025-4-8 11:39编辑过]

#29
csyx2025-04-08 14:12
以下是引用kangss在2025-4-3 17:35:48的发言:
此时点击窗口,combox的值又更新了。

才注意到这,我好像有了一个 idea ...,待验证
#30
cssnet2025-04-08 14:15
以下是引用csyx在2025-4-8 14:12:30的发言:
才注意到这,我好像有了一个 idea ...,待验证


我敢打赌,你的所谓idea,无非是四处乱加:

thisForm.click

那玩意儿不灵光的。我其实在上边已给出了答案。只是我的解决方案,在我们许多软件当中用过,不太方便暴露马甲……
#31
csyx2025-04-08 14:48
以下是引用cssnet在2025-4-8 14:15:58的发言:
我敢打赌,你的所谓idea,无非是四处乱加:

不要轻易怀疑他人的能力,话说死了赌输会很没面子的
#32
星光悠蓝2025-04-08 14:59
用AddOJect()方式添加控件,感觉出现错误概率大大降低。
#33
cssnet2025-04-08 15:06
以下是引用csyx在2025-4-8 14:48:54的发言:

不要轻易怀疑他人的能力,话说死了赌输会很没面子的




为避免我老人家打赌输了会“很没面子”,这样子吧,折中一下,我删掉当中带私人标志的“独门秘笈”,只发一个解决方案的残缺版“半成品”上来;至于如何将它完善一下,弄得流畅妥帖,那就是你们年轻气盛的小伙儿们的事啦——

Good luck!

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


#34
csyx2025-04-08 16:09
以下是引用cssnet在2025-4-8 15:06:45的发言:
发一个解决方案的残缺版“半成品”

不错的方案
#35
csyx2025-04-08 16:13
这是我前面说的模拟点击方案。我测试了几次好像没问题,尚待多方测试才知是否真能解决问题
只有本站会员才能查看附件,请 登录


又多测试了几次,点击表单的方法不太可靠,我把计时器的间隔频率改成 500ms,有时能看到组合框的值停顿了一下才变(鼠标点击起了作用),也有几次没更新(鼠标点击没起作用)
cssnet 33楼给出的方案应该更可靠,就是要处理的情形有点多,不同的 RowSourceType、BoundColumn ... 都要考虑
上面这个 ctls.cbo 类中唯一可用的是 CloseUp 事件,例如:把 cssnet 在表单 Paint 事件中的代码转到这,Paint 的系统开销较大



[此贴子已经被作者于2025-4-8 18:01编辑过]

#36
凝聚双眼2025-04-08 16:44
以下是引用csyx在2025-4-4 19:23:54的发言:

实例截图是这样


我不想用 list,因为 list 的位置受限于当前表单位置和尺寸,除非表单最大化,上面截图中菜单高度就超出表单下边界


这个下拉好漂亮,还有 对勾 ,能否分享个简单的示例。
#37
csyx2025-04-08 17:13
以下是引用凝聚双眼在2025-4-8 16:44:48的发言:
能否分享个简单的示例。

这个弹出菜单是很久以前倦猫发布的一个开源类,去这里下载:https://

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


[此贴子已经被作者于2025-4-8 17:18编辑过]

#38
kangss2025-04-08 17:42
以下是引用cssnet在2025-4-8 15:06:45的发言:





为避免我老人家打赌输了会“很没面子”,这样子吧,折中一下,我删掉当中带私人标志的“独门秘笈”,只发一个解决方案的残缺版“半成品”上来;至于如何将它完善一下,弄得流畅妥帖,那就是你们年轻气盛的小伙儿们的事啦——

Good luck!


刚刚测试这种方案:再放上一个下拉列表框的combo2,数据源用“值”,如果不在thisform.pait里面增加 = 的话,点击 combo2 展开的list选项时,值不会变。
增加 thisform.refresh,可以解决
但是 thisform.pait 里面增加哪一行代码,当前 VFP9 的CPU占用直接上升到 20% 以上,不会停止。在这里写代码,需要特别注意。
#39
cssnet2025-04-08 17:46
以下是引用csyx在2025-4-8 16:13:26的发言:
这是我前面说的模拟点击方案。我测试了几次好像没问题,尚待多方测试才知是否真能解决问题


这个方案相当漂亮!之前我随手加的那一行代码,就是嫌它会卡顿,不太流畅。
只是,下拉选单弹出后,启动定时器一直侦测,可能较占用系统资源,能否再折中一下:

在thisform.paint事件中,加一个判断:if 下拉选单已收起,then 给comboBox赋值, else do nothing。那样可能就不会卡顿,而且,可能也不需要Timer。

#40
kangss2025-04-08 17:51
以下是引用csyx在2025-4-8 16:13:26的发言:

这是我前面说的模拟点击方案。我测试了几次好像没问题,尚待多方测试才知是否真能解决问题

这个方案,初测可以,我再详细测试测试,之前做个的给窗口发送鼠标点击消息必须是顶层表单才会有效放弃了。
不知道编译成exe后效果如何。
#41
csyx2025-04-08 18:02
以下是引用csyx在2025-4-8 16:13:26的发言:
又多测试了几次,点击表单的方法不太可靠,我把计时器的间隔频率改成 500ms,有时能看到组合框的值停顿了一下才变(鼠标点击起了作用),也有几次没更新(鼠标点击没起作用)
cssnet 33楼给出的方案应该更可靠,就是要处理的情形有点多,不同的 RowSourceType、BoundColumn ... 都要考虑
上面这个 ctls.cbo 类中唯一可用的是 CloseUp 事件,例如:把 cssnet 在表单 Paint 事件中的代码转到这,Paint 的系统开销较大

#42
kangss2025-04-08 19:00
以下是引用csyx在2025-4-8 18:02:55的发言:

鼠标点击有一个副作用,就是list展开时,它下边有其它控件时,鼠标会点击下边的控件

CloseUp 确实不错,不理想的地方是,列表模式下第二次点击编辑框,或第二次点击小三角combo不会折叠

改成:
DECLARE LONG SendMessage IN WIN32API LONG,LONG,LONG,LONG
SendMessage(THISFORM.HWND, 0x0201, 0, 0)
SendMessage(THISFORM.HWND, 0x0202, 0, 0)
向窗口发送点击消息,效果也不理想,同样会出现不灵现象

#43
csyx2025-04-08 20:50
以下是引用kangss在2025-4-8 19:00:00的发言:
鼠标点击有一个副作用,就是list展开时,它下边有其它控件时,鼠标会点击下边的控件
这个可以处理的,mouse_event 指定一个没有控件的坐标即可,例如 (0,0)
以下是引用kangss在2025-4-8 19:00:00的发言:
不理想的地方是,列表模式下第二次点击编辑框,或第二次点击小三角combo不会折叠
这个也可以处理,有 DropDown / CloseUp 这两事件对,容易判断要做什么

仅仅是先做个验证,看看点击表单是否总能得到正确值,没完善的地方多了去了,像 Timer 销毁机制等等都是。既然已发现不可靠就没必要做进一步的工作了
到目前为止,我用到的组合框都不需要显示多列,所以一个弹出菜单足以,没需求也就没动力

以前也想过用 listbox,基于前面说到原因直接放弃了,其实放弃还有个更重要的原因,下拉时焦点转到 listbox 会触发 combobox.lostfocus,已完成的很多组合框在 lostfocus 里有相应的代码,这就太特么讨厌了
也想过 DropDown 时弹出一个带 listbox 的窗口来选择,虽然可以不触发 lostfocus 事件,但当前窗口又会 Deactive,单是表单标题变成不活动状态就显得太不专业
另外还试过弹出一个带 listbox 的 Toolbar,Toolbar 中的控件不抢焦点虽然满足了要求,还没到裁剪窗口这步,就发现 listbox 的滚动条定位不对劲,呵呵 ...

#44
ccb20002025-04-09 09:31
可以运行以下代码修复VFP 9.0.0.7423 (SP2)中的这个bug:

SET TALK OFF

x1=FILETOSTR("vfp9.exe")
IF SUBS(x1,0x4c7570+1,5)=CHR(0xba)+CHR(0x01)+CHR(0x00)+CHR(0x00)+CHR(0x00)
   x1=STUFF(x1,0x4c7570+1,5,CHR(0xe9)+CHR(0x6f)+CHR(0x00)+CHR(0x00)+CHR(0x00))
   =STRTOFILE(x1,"vfp9.exe")
ENDI

x1=FILETOSTR("vfp9r.dll")
IF SUBS(x1,0x3bdf3e+1,5)=CHR(0xba)+CHR(0x01)+CHR(0x00)+CHR(0x00)+CHR(0x00)
   x1=STUFF(x1,0x3bdf3e+1,5,CHR(0xe9)+CHR(0x6f)+CHR(0x00)+CHR(0x00)+CHR(0x00))
   =STRTOFILE(x1,"vfp9r.dll")
ENDI

x1=FILETOSTR("vfp9t.dll")
IF SUBS(x1,0x2f2e43+1,5)=CHR(0xba)+CHR(0x01)+CHR(0x00)+CHR(0x00)+CHR(0x00)
   x1=STUFF(x1,0x2f2e43+1,5,CHR(0xe9)+CHR(0x6f)+CHR(0x00)+CHR(0x00)+CHR(0x00))
   =STRTOFILE(x1,"vfp9t.dll")
ENDI

也可以下载VFP Advanced 2022免费版。

#45
kangss2025-04-09 10:04
以下是引用ccb2000在2025-4-9 09:31:32的发言:

可以运行以下代码修复VFP 9.0.0.7423 (SP2)中的这个bug:

SET TALK OFF

x1=FILETOSTR("vfp9.exe")
IF SUBS(x1,0x4c7570+1,5)=CHR(0xba)+CHR(0x01)+CHR(0x00)+CHR(0x00)+CHR(0x00)
   x1=STUFF(x1,0x4c7570+1,5,CHR(0xe9)+CHR(0x6f)+CHR(0x00)+CHR(0x00)+CHR(0x00))
   =STRTOFILE(x1,"vfp9.exe")
ENDI

x1=FILETOSTR("vfp9r.dll")
IF SUBS(x1,0x3bdf3e+1,5)=CHR(0xba)+CHR(0x01)+CHR(0x00)+CHR(0x00)+CHR(0x00)
   x1=STUFF(x1,0x3bdf3e+1,5,CHR(0xe9)+CHR(0x6f)+CHR(0x00)+CHR(0x00)+CHR(0x00))
   =STRTOFILE(x1,"vfp9r.dll")
ENDI

x1=FILETOSTR("vfp9t.dll")
IF SUBS(x1,0x2f2e43+1,5)=CHR(0xba)+CHR(0x01)+CHR(0x00)+CHR(0x00)+CHR(0x00)
   x1=STUFF(x1,0x2f2e43+1,5,CHR(0xe9)+CHR(0x6f)+CHR(0x00)+CHR(0x00)+CHR(0x00))
   =STRTOFILE(x1,"vfp9t.dll")
ENDI

也可以下载VFP Advanced 2022免费版。
#46
sych2025-04-09 10:09
谢谢大佬的分享
#47
cssnet2025-04-09 11:25
弱弱问一下,我硬盘中的VFP是N年前的版本,一直也没动过,请问,你们说的VFP 9.0.0.7423 (SP2)是最新汉化版吗?还是直接从官网下载SP2?能否发个链接我更新一下?
非常感谢帮助!

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


#48
kangss2025-04-09 11:50
感谢CCB2000提供造福vfper的修复办法。这里提醒一下vfper:还得在 combo 的 InteractiveChange 中增加少量代码才能彻底解决 Style = 2 时的BUG:
https://

For the Drop-down list box (ComboBox.Style=2),
recommend to add the following code to the ComboBox.InteractiveChange() event to refresh the selected item:
IF THIS.STYLE=2
    THIS.VALUE=THIS.VALUE
    THIS.REFRESH
ENDIF

#49
kangss2025-04-09 11:52
以下是引用cssnet在2025-4-9 11:25:18的发言:
弱弱问一下,我硬盘中的VFP是N年前的版本,一直也没动过,请问,你们说的VFP 9.0.0.7423 (SP2)是最新汉化版吗?还是直接从官网下载SP2?能否发个链接我更新一下?
非常感谢帮助!


论坛置顶贴,标题尽管写的是 sp1,里面有 sp2 最新版下载链接
#50
csyx2025-04-09 12:23
一直用 5815 版,ccb 发的这个修复我用不了。
找了一个 7423,取出修复位置后的特征串在 5815 中共找到 880 处,显然长度不足以定位 5815 中对应位置,然后每次多取一个特征字节,结果发现长度=8时共有39处,增加到9时就一个都找不到了 唉,我是无缘用这个简单的修复了

另:
初步确定 vfp9.exe(5815) 的修改位置是 0x4c7421(0x4c7420+1),只是不知这个 e9 6f 00 的 6f 是否适用于 5815 (简单测试了一下好像没问题)
vfp9r.dll(5815) 修改位置是 0x3bdecf(0x3bdece+1)
9t 一般用不到懒得改了,应该也不会用到吧,9t 不是用于多线程 com 的吗,com 还能有 UI ?

[此贴子已经被作者于2025-4-9 13:56编辑过]

#51
VFPRafer2025-04-09 12:41
以下是引用kangss在2025-4-4 17:49:24的发言:


同样的 exe,运行有这个BUG,用 2412 版本的 vfp9r.dll、vfp9rchs.dll 替换掉,再运行就没有这个BUG



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


我用的这个版本,没点问题
12