| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 218 人关注过本帖
标题:do while...enddo好像比scan...endscan更好用哦!
只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:368
专家分:335
注 册:2013-10-4
结帖率:100%
收藏
 问题点数:0 回复次数:7 
do while...enddo好像比scan...endscan更好用哦!
印象中,VFP手册写道:scan...endscan比do while...enddo效率更高,建议使用前者。

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

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

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

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

2025-04-06 23:39
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:774
专家分:3010
注 册:2018-3-13
收藏
得分:0 
scan ... endscan 是原子操作? 这我倒是第一次听说
怎么感觉 ds 又成功忽悠瘸了一位呢,印象中我就有大量在 scan 中允许用户按键退出循环的代码

这家伙很懒,啥也没留下
2025-04-07 09:20
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:774
专家分:3010
注 册:2018-3-13
收藏
得分:0 
用 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 家的原子如汤圆般大小?


这家伙很懒,啥也没留下
2025-04-07 09:45
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:774
专家分:3010
注 册:2018-3-13
收藏
得分:0 
又想到两种键盘介入方式,但无一例外的都未见被阻塞。不知楼主说的“无法中途通过按键退出”是哪种情况
程序代码:
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 ...'

这家伙很懒,啥也没留下
2025-04-07 10:30
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:368
专家分:335
注 册:2013-10-4
收藏
得分:0 
以下是引用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艰深学问啊?

当玩具用用而已。
2025-04-07 12:10
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:774
专家分:3010
注 册:2018-3-13
收藏
得分:0 
做为成年人,只求结果、不讲过程,我完全可以理解

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


这家伙很懒,啥也没留下
2025-04-07 13:18
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:368
专家分:335
注 册:2013-10-4
收藏
得分:0 
这种交互式脚本,流行的作法是用Python来干。一开始也确实是让DeepSeek提供Python的实现思路。只是突发奇想:脚本需要遍历存取本地表数据,而这方面的操作,VFP似乎更简洁方便些,于是让DeepSeek转译成VFP代码。VFP恰好我还没丢,仍看得懂。一看之下,发现它写的VFP实现代码异常简洁,换我自己写恐怕得多出两三倍代码量!

这没什么的,也没必要对AI太过抵触、排斥、戒惧,毕竟它的“记忆力”比我们好不知多少倍!在它的“大脑”里填塞了截至2023年的绝大多数网上资源、信息与数据;就拿Windows API来说吧,它能“记得”几乎所有的API,写代码时,信手拈来,随意调用,完全不像我们,为了一个小问题就要搜索老半天,甚至纠结好多天!
2025-04-07 13:52
kangss
Rank: 8Rank: 8
等 级:贵宾
威 望:14
帖 子:321
专家分:732
注 册:2014-6-12
收藏
得分:0 
几个AI的VFP水平都不是很精通,经常给出不是VFP的命令,AI给出的代码只能参考
2025-04-07 19:38
快速回复:do while...enddo好像比scan...endscan更好用哦!
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030164 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved