注册 登录
编程论坛 VFP论坛

do while...enddo好像比scan...endscan更好用哦!

cssnet 发布于 2025-04-06 23:39, 213 次点击
印象中,VFP手册写道:scan...endscan比do while...enddo效率更高,建议使用前者。

结果今天运行一个耗时的脚本,scan...endscan一旦开始循环,就无法中途通过按键退出了;要么静待循环结束,要么强制杀死VFP进程,丢失循环更新的数据,甚至有可能损坏表。

请教DeepSeek,说是“SCAN...ENDSCAN 是原子操作,默认不响应外部事件,其内部封装了记录指针移动,循环期间阻塞外部事件(包括按键和窗口关闭)。必须依赖外部 API 强制干预(如 GetAsyncKeyState)才能通过按键退出循环。”

而“do while...enddo通过简单添加 DOEVENTS 即可支持事件响应,是更优选的循环结构。”

试了一下,果真如此!TNND,微软欺骗了我的感情十多年哪,嘿嘿。

7 回复
#2
csyx7 天前 09:20
scan ... endscan 是原子操作? 这我倒是第一次听说
怎么感觉 ds 又成功忽悠瘸了一位呢,印象中我就有大量在 scan 中允许用户按键退出循环的代码
#3
csyx7 天前 09:45
用 code references 在整个项目中搜了一下 '按 Esc',毫不意外的找到几处
就简化成这样吧
程序代码:
Create Cursor ttt (f1 Int)
Insert into ttt Values (1)
Insert into ttt Values (2)

Set Escape Off
Wait window nowait '正在 xxxxxx,按 Esc 键取消'
Scan all
    ? Seconds()
    If Inkey() == 27
        Wait window nowait '已取消' noclear
        Exit
    EndIf
    Skip -1
EndScan
? 'End of ...'


说好的键盘阻塞&原子操作呢? 难不成 ds 家的原子如汤圆般大小?

#4
csyx7 天前 10:30
又想到两种键盘介入方式,但无一例外的都未见被阻塞。不知楼主说的“无法中途通过按键退出”是哪种情况
程序代码:
Create Cursor ttt (f1 I)
Insert into ttt Values (1)
Insert into ttt Values (2)

Wait window nowait '正在 xxxxxx,按【空格】键取消'
Scan all
    ? Seconds()
    Doevents
    If Lastkey() = 32
        Exit
    EndIf
    Skip -1
EndScan
? 'End of ...'

程序代码:
Create Cursor ttt (f1 I)
Insert into ttt Values (1)
Insert into ttt Values (2)

Wait window nowait '正在 xxxxxx,按【空格】键取消'
On Key Label SPACEBAR ExecScript('go bott'+0h0d0a+'skip')
Scan all
    ? Seconds()
    Skip -1
EndScan
On Key Label SPACEBAR
? 'End of ...'
#5
cssnet7 天前 12:10
以下是引用csyx在2025-4-7 09:20:58的发言:

scan ... endscan 是原子操作? 这我倒是第一次听说
怎么感觉 ds 又成功忽悠瘸了一位呢,印象中我就有大量在 scan 中允许用户按键退出循环的代码


哈哈,学到啦!非常感谢!

昨天在利用DeepSeek提供代码模拟“按键精灵”,让VFP脚本与其他软件交互。当中不得不插入了一大堆的inkey(1)延时,开始运行后才发觉:scan...endscan完至少需要一两个通宵。scan了一个多小时后,想中途暂停,看一下结果,有无bug,却根本无法暂停!一下子就慌了,折腾了好半天,最终不得不强行杀了VFP进程。

接着让DeepSeek解决这个问题,它就给出了上述解释,并给出修正后的代码。

修正后的代码,能够完美运行。我没考虑那么多,直接采纳了脚本Ver 2.0。

这重点,其实不在“忽悠瘸”还是“不瘸”。重点是:

凭我一己之力,想要写出这个脚本,起码需要好几天工夫,不停去查Windows API,不停去百度十几年前的VFP代码,不停去试错;而利用DeepSeek写,讲真,一上午喝着咖啡,吃着小甜饼,就轻轻松松解决了。

我要的只是结果,过程真的无意义!——试想,这年头,谁还乐意浪费时间去钻研什么VFP艰深学问啊?

当玩具用用而已。
#6
csyx7 天前 13:18
做为成年人,只求结果、不讲过程,我完全可以理解

前不久,儿子的班主任跟我唠了一会儿嗑,班上很多以前成绩不佳的同学,现在作业都做得无懈可击,根本不是这个年纪的孩子可预期的水平,原因大家都明白。教育部已下发了加强中小学人工智能教育的通知,据说北京已有部分学校开始实施,其实这事儿根本不需发文,孩子们精明着,尝过甜头后自己就会主动去用。老师忧虑的是,是人就有惰性,有个不需要努力就能获取结果的方法,大人都难以抗拒,何况未成年的孩子
我检查了孩子的手机,希望他主动卸载,然而我知道逆大势的行为大抵不会有结果,废泡就废泡吧,废泡也是一代人,谁也跑不了
脑海中浮现联想 > 资本 > 犹太财团 > 阳谋 > AI > 潜移默化,习惯性依赖,无脑 > 用 AI 控制全世界

#7
cssnet7 天前 13:52
这种交互式脚本,流行的作法是用Python来干。一开始也确实是让DeepSeek提供Python的实现思路。只是突发奇想:脚本需要遍历存取本地表数据,而这方面的操作,VFP似乎更简洁方便些,于是让DeepSeek转译成VFP代码。VFP恰好我还没丢,仍看得懂。一看之下,发现它写的VFP实现代码异常简洁,换我自己写恐怕得多出两三倍代码量!

这没什么的,也没必要对AI太过抵触、排斥、戒惧,毕竟它的“记忆力”比我们好不知多少倍!在它的“大脑”里填塞了截至2023年的绝大多数网上资源、信息与数据;就拿Windows API来说吧,它能“记得”几乎所有的API,写代码时,信手拈来,随意调用,完全不像我们,为了一个小问题就要搜索老半天,甚至纠结好多天!
#8
kangss7 天前 19:38
几个AI的VFP水平都不是很精通,经常给出不是VFP的命令,AI给出的代码只能参考
1