VFP有106个SYS函数,从SYS(0)到SYS(3101),数字密密麻麻看得人头晕。但说实话,日常开发真正高频使用的也就十来个——剩下的要么是遗留兼容,要么是底层调试用的。
今天按使用频率分类整理,帮你快速定位需要的函数,不用再翻文档翻到眼花。
一、路径与文件类(最常用TOP 3)
SYS(5) — 默认驱动器
? SYS(5) && 返回如 "C:"SYS(2003) — 当前目录
? SYS(2003) && 返回如 "\Users\Admin"黄金搭档:SYS(5) + SYS(2003) = 完整当前路径
cFullPath = SYS(5) + SYS(2003) && "C:\Users\Admin"SYS(2023) — 临时文件路径
? SYS(2023) && 返回如 "C:\Users\ADMINI~1\AppData\Local\Temp"实用场景:生成临时文件时,确保放到系统临时目录
cTempFile = SYS(2023) + "\" + SYS(2015) + ".tmp"二、唯一标识类(每个项目必用)
SYS(2015) — 唯一过程名
? SYS(2015) && 返回如 "_1GJ0D9B2R"(10字符,下划线开头)实战技巧:生成临时表名、文件名、变量名
*-- 生成易读的临时表名
cTempAlias = "tmp" + SUBSTR(SYS(2015), 4, 3) && 如 "tmpD9B"
CREATECURSOR (cTempAlias) (id I, name C(20))
*-- 生成唯一文件名
cUniqueFile = "rpt_" + SUBSTR(SYS(2015), 2) + ".xml"SYS(3) — 合法文件名
? SYS(3) && 返回如 "293857"注意:SYS(3)基于系统时钟,高并发下可能重复。推荐用SYS(2015)替代。
三、程序调试类(排错神器)
SYS(16) — 正在执行的程序名
? SYS(16) && 当前程序名(含路径)
? SYS(16, 1) && 主程序名
? SYS(16, 2) && 上一层调用者实战场景:错误处理中定位出错位置
ON ERROR DO ErrorHandler WITH ERROR(), MESSAGE(), SYS(16)
PROCEDURE ErrorHandler(nError, cMsg, cProg)
LOGSTRING("错误#" + TRANSFORM(nError) + ;
" 在 " + cProg + ;
" : " + cMsg)
ENDPROCSYS(2018) — 错误信息参数
*-- 当出现"文件不存在"错误时
? SYS(2018) && 返回找不到的文件名与ERROR()、MESSAGE()组合构成完整的错误信息链:
? ERROR() && 错误编号,如 1
? MESSAGE() && 错误信息,如 "文件 不存在"
? SYS(2018) && 错误参数,如 具体的文件名四、环境检测类(部署必备)
SYS(2029) — 数据表类型
USE mytable
? SYS(2029)
*-- "48" = VFP表(有/无备注)
*-- "49" = VFP8+表(有AutoInc字段)
*-- "50" = VFP9表(有Varchar/Varbinary/Blob字段)
*-- "3" = 旧版FoxPro/dBASE表实战场景:升级前检测表版本,判断是否支持新字段类型
IFSYS(2029) = "50"
*-- 可以使用Varchar、Blob等VFP9新字段类型
ELSE
*-- 需要先转换表结构
ENDIFSYS(17) — 使用的处理器
? SYS(17) && 返回如 "x86" 或 "AMD64"SYS(0) — 网络机器信息
? SYS(0) && 返回 "机器名 # 用户名"(网络环境)
&& 或 "1" (单机环境)五、数据校验类(接口对接常用)
SYS(2007) — 校验和值
*-- CRC16(默认)
? SYS(2007, "Hello VFP") && 返回16位校验和
*-- CRC32(推荐,更大值更精确)
? SYS(2007, "Hello VFP", 0, 1) && nFlags=1启用CRC32实战场景:校验数据传输完整性
*-- 发送端
cData = "重要数据内容"
cChecksum = SYS(2007, cData, 0, 1) && CRC32校验
*-- 接收端验证
IFSYS(2007, cReceived, 0, 1) != cChecksum
? "数据校验失败!"
ENDIF六、界面与性能类
SYS(2700) — Windows主题支持
SYS(2700, 1) && 启用XP主题(控件有圆角、渐变效果)
SYS(2700, 0) && 禁用主题(经典样式)
? SYS(2700) && 返回当前设置实战建议:在主程序开头设置,界面加载后再改不会自动刷新
*-- main.prg 开头
SYS(2700, 1) && 启用主题,让VFP程序不再像Win98风格SYS(1104) — 清理内存缓存
SYS(1104) && 清理所有缓存
SYS(1104, "myTable") && 只清理指定表的缓存实战场景:大数据量操作后释放内存
*-- 批量处理后清理
SELECT * FROM bigtable INTO CURSOR tmpResult
SYS(1104) && 释放缓存,改善后续操作性能七、完整速查表(按编号排序)
函数 | 用途 | 使用频率 |
|---|---|---|
SYS(0) | 网络机器信息 | ★★ |
SYS(3) | 合法文件名 | ★★ |
SYS(5) | 默认驱动器 | ★★★★★ |
SYS(16) | 执行程序名 | ★★★★ |
SYS(2001) | SET命令状态 | ★★★ |
SYS(2003) | 当前目录 | ★★★★★ |
SYS(2007) | 校验和值 | ★★★ |
SYS(2015) | 唯一过程名 | ★★★★★ |
SYS(2018) | 错误信息参数 | ★★★★ |
SYS(2023) | 临时文件路径 | ★★★★ |
SYS(2029) | 数据表类型 | ★★★ |
SYS(2600) | 内存指针操作 | ★(高级) |
SYS(2700) | Windows主题 | ★★★ |
SYS(2801) | 事件跟踪 | ★★ |
SYS(3050) | 缓冲内存大小 | ★★ |
八、避坑指南
- SYS(3)并发重复
:多用户环境下SYS(3)可能返回相同值,用SYS(2015)替代
- SYS(2700)时机
:必须在界面呈现之前设置,否则已绘制的控件不会自动刷新
- SYS(2007)精度
:默认CRC16只有65536种可能值,数据量大时建议用CRC32(nFlags=1)
- SYS(2600)危险
:直接操作内存指针,用错会崩溃,仅限高级场景
- SYS(12)已过时
:VFP中始终返回655360,用MEMORY()替代
总结
106个SYS函数,日常开发记住这几个就够:
- 路径三剑客
:SYS(5) + SYS(2003) + SYS(2023)
- 唯一标识
:SYS(2015)
- 调试排错
:SYS(16) + SYS(2018)
- 数据校验
:SYS(2007)
- 表类型检测
:SYS(2029)
- 界面美化
:SYS(2700)
其余的,用到时再查即可。收藏本文,下次需要SYS函数时直接翻!

221

被折叠的 条评论
为什么被折叠?



