VFP9无端改变路径的怪现象!敬请高手解释

myubenben 靖西市林业局 2011-07-22 08:29:48
* 登录后
cd &DataPath
* 如:DataPath="D:\新建文件夹\"
......

JgCheckPath=getdir(DataPath+"待审数据\","请选择欲进行结构检查的数据路径:")
* 选择诸如:JgCheckPath="D:\测试\"
......

for iroll=1 to Nroll
cd &JgCheckPath
if iroll=1
do input_lstz
......
return

procedure input_lstz
PRIVATE DBF_Name,N_dbf
N_dbf=ADIR(A_dbf,"*.dbf")
if N_dbf>0
for Ri=1 to N_dbf
DBF_Name=left(A_dbf(Ri,1),len(A_dbf(Ri,1))-4)

WAIT STR(Ri,2)+"/"+STR(N_dbf,2)+chr(13)+SYS(5)+CURDIR()+CHR(13)+DBF_Name windows
* 这里的SYS(5)+CURDIR()显示:D:\测试\
* 是正确的!

Cur_JgRong=JgRong(DBF_Name)
......
return

procedure JgRong
parameters DBF_SubName
m_JgRong=.F.

WAIT "JgRong"+chr(13)+SYS(5)+CURDIR()+CHR(13)+"&DBF_SubName." windows
* 这里的SYS(5)+CURDIR()却显示:D:\新建文件夹\
* 显然是错误的!
* 这是为什么???????

......
return m_JgRong


我专门从项目中单独提取该程序代码进行调试却是正确的!
这又是为什么??????????

烦请高的们赐教!!
本人将不胜感激
因为急着要用,却只能干着急

...全文
110 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
myubenben 2011-07-25
谢谢您的建议
可以结帖了
回复
十豆三 2011-07-25
[Quote=引用 6 楼 myubenben 的回复:]
谢谢十豆三老师的建议
这个建议太好了,本人很乐意采纳

说到这里我的程序还有一个隐患:
表单Form1和其中的Combo1的Init过程都使用表purview
我在Combo1的Init使用:
SELECT 0
use purview

而在Form1的Init直接使用:
SELECT purview

虽然目前没发现程序错误
或许因时间差的问题以后会出现错误吧?!
如……
[/Quote]

表单的 Init 事件会在表单中控件的 Init 事件之后发生,所以正常不会有什么问题。

不过还是建议:
把 Combo1 的 Init 事件代码:
SELECT 0
use purview

改写到表单的 Load 事件:
Use purview In 0
回复
dfwxj 2011-07-24
仔细查看GETDIR函数的用法,有没有一个选项是禁止改变当前目录的。

如果使用通用对话框控件,是有这个选项的。

****************
你的代码中使用了CD命令
回复
十豆三 2011-07-23
检查 :
DBF_Name
DBF_SubName
JgCheckPath
DataPath
等有没有定义重复,或者有没有与字段重名的。

另外:

Cur_JgRong=JgRong(DBF_Name)
后的
Return
应该去掉
回复
myubenben 2011-07-23
谢谢十豆三老师的建议
这个建议太好了,本人很乐意采纳

说到这里我的程序还有一个隐患:
表单Form1和其中的Combo1的Init过程都使用表purview
我在Combo1的Init使用:
SELECT 0
use purview

而在Form1的Init直接使用:
SELECT purview

虽然目前没发现程序错误
或许因时间差的问题以后会出现错误吧?!
如何修改为好呢?
还烦请十豆三老师多多指教
在这里先谢了
回复
taohua300 2011-07-23
查查你的其他代码有没有诸如cd getfile,getdir类似的命令或函数

使用完这些命令或是函数后没有回复原来的路径
回复
十豆三 2011-07-23
在 Timer 中能否用其他变量名,而不用 DataPath 变量。

3000毫秒的事,建议:
Timer 控件的 Enabled 初始值为 .F.
然后在表单的 Init 事件的最后一行加代码:
Thisform.Timer控件名称.Enabled=.T.

这个3000毫秒的事,估计你的表单 Init 事件(或其他比 Timer 后触发的代码)有需要或占用时间稍长的地方吧。
回复
myubenben 2011-07-23
问题的症结终于找到:
为了实时扫描某文件夹及其子文件夹是否还有尚未处理的文件
在后来修改的Timer代码中增加了此功能
是Timer代码在改变路径

然而实现此功能时,忘记保存原路径,并恢复原路径
而Timer最后只是简单地执行:
cd &DataPath

谢谢各位的好心提醒

这也是在调试时尚未登录就出现
Timer找不到begin_already变量提醒的

这里又延伸出一个问题了:
我在Timer的Interval设置的间隔是3000毫秒
且第一个语句就是:
IF .not.begin_already
RETURN
ENDIF

而公共变量begin_already在表单的Init过程就赋值为
begin_already=.F.

是否说明了表单的Init过程比3000毫秒还长?

还烦请各位解释
回复
myubenben 2011-07-23
重复定义已经排除
去掉Cur_JgRong=JgRong(DBF_Name) 后的Return 也依然如故
况且:
cd &JgCheckPath 后就执行过程 do input_lstz
之后就直接调用函数Cur_JgRong=JgRong(DBF_Name)
语句是紧接着的,中间并没有改变过路径

几个疑点:
1、公共变量DataPath="D:\新建文件夹\"是调用登录表purview的path字段放在Text2文本框
 登录成功后赋值DataPath=alltrim(ThisForm.Text2.Value)
 而path是保留字,可否作为字段使用 (本人认为应该无碍)
2、原来程序是用VFP6编写的,后来换用VFP9,在VFP9修改,是否存在兼容问题
3、在VFP6运行一直正常,在VFP9运行有时正常,有时才出现上述怪现象
 而出现此现象多是在修改程序代码后才出现的,但是所修改的代码并不涉及这个过程
 也没有使用重复变量
回复
相关推荐
发帖
VFP
创建于2007-09-28

2491

社区成员

VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
申请成为版主
帖子事件
创建了帖子
2011-07-22 08:29
社区公告
暂无公告