注册 登录
编程论坛 VFP论坛

高手帮忙看一下代码中绝对地址的写法可以改为相对地址吗?

hszxgb 发布于 2020-10-28 23:03, 3110 次点击
如下代码中刷红绝对地址的写法,能不能改成相对地址比如&&后的写法。


*根据运动员号码查询比赛成绩
ydybm=ALLTRIM(thisform.text1.Value)                           &&待查询运动员号码
*判断运动员号码是否存在
SELECT COUNT(*) FROM e:\学习\运动会管理系统\data\运动员 WHERE 运动员号码==ydybm INTO ARRAY shu
IF shu=0                                                      &&不存在该编号
   MESSAGEBOX(ydybm+"号码不存在!",0+48,"提示")
   RETURN                                                     &&结束查询
ELSE
   *查询姓名、性别、单位名称
   SELECT 姓名,性别,单位名称;
   FROM e:\学习\运动会管理系统\data\运动员,;                  &&data\运动员
   e:\学习\运动会管理系统\data\参赛单位;                      &&data\参赛单位
   WHERE 运动员.单位编码=参赛单位.单位编码 AND 运动员号码==ydybm INTO ARRAY xm
   *在文本框中显示姓名、性别、单位名称
   thisform.txtXM.Value=xm(1)
   thisform.txtXB.Value=xm(2)
   thisform.txtDW.Value=xm(3)
   *查询该运动员的参赛项目、名次、得分
   SELECT 项目名称,名次,得分;
   FROM e:\学习\运动会管理系统\data\运动项目,;               &&绝对地址e:\学习\运动会管理系统\data\运动项目
   e:\学习\运动会管理系统\data\个人得分;                    &&绝对地址e:\学习\运动会管理系统\data\个人得分
   WHERE 运动项目.项目编码=个人得分.项目编码 AND 运动员号码==ydybm INTO CURSOR grxx
   *设置表格数据源显示该运动员的参赛项目、名次、得分
   thisform.grid1.RecordSource="grxx"
ENDIF
15 回复
#2
schtg2020-10-29 05:23
请你自己试一下不就知道了吗?
#3
wengjl2020-10-29 07:55
  PUBLIC mypath
  cCurrentProcedure = SYS(16,1)
  nPathStart = AT(":",cCurrentProcedure)- 1
  nLenOfPath = RAT("\", cCurrentProcedure) - (nPathStart)
  mypath=SUBSTR(cCurrentProcedure, nPathStart, nLenofPath)
  SET DEFAULT TO (mypath)

#4
gs25367856782020-10-29 08:26
***核心主程序位置
PUBLIC mypath
mypath=sys(5)+sys(2003)+"\"
#5
hszxgb2020-10-29 09:52
回复 2楼 schtg
我试了不行啊!有什么办法可以不用绝对地址,绝对地址应该会在文件整体搬家后影响使用吧!
#6
吹水佬2020-10-29 10:14
用别名
#7
hszxgb2020-10-29 10:23
回复 4楼 gs2536785678
PUBLIC mypath
mypath=sys(5)+sys(2003)+"\"
你好 你这个全局变量名mypath有特定含义吗?
#8
吹水佬2020-10-29 10:45
用相对路径可以
示例:
程序代码:
cDefaultPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefaultPath)
cDir = cDefaultPath + "data"
MD (cDir)
cDBF = cDefaultPath + "data\tmp.dbf"
CREATE TABLE (cDBF) (f1 I)
INSERT INTO tmp VALUES (1)
INSERT INTO tmp VALUES (2)
INSERT INTO tmp VALUES (3)
USE
SELECT * FROM data\tmp
CLOSE DATABASES ALL
DELETE FILE (cDBF)
RD (cDir)
#9
hszxgb2020-10-29 11:02
回复 3楼 wengjl
PUBLIC mypath
  cCurrentProcedure = SYS(16,1)
  nPathStart = AT(":",cCurrentProcedure)- 1
  nLenOfPath = RAT("\", cCurrentProcedure) - (nPathStart)
  mypath=SUBSTR(cCurrentProcedure, nPathStart, nLenofPath)
  SET DEFAULT TO (mypath)
你好 你这个代码改成这样有什么区别?
PUBLIC mypath
  cCurrentProcedure = SYS(16,1)
  nPathStart = 1
  nLenOfPath = RAT("\", cCurrentProcedure) - 1
  mypath=SUBSTR(cCurrentProcedure, nPathStart, nLenofPath)
  SET DEFAULT TO (mypath)
或者这样
PUBLIC mypath
  cCurrentProcedure = SYS(16,1)
  nLenOfPath = RAT("\", cCurrentProcedure) - 1
  mypath=SUBSTR(cCurrentProcedure,1, nLenofPath)
  SET DEFAULT TO (mypath)

[此贴子已经被作者于2020-10-29 11:04编辑过]

#10
hszxgb2020-10-29 11:11
回复 8楼 吹水佬
cDefaultPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefaultPath)
cDir = cDefaultPath + "data"
MD (cDir)
cDBF = cDefaultPath + "data\tmp.dbf"
CREATE TABLE (cDBF) (f1 I)
INSERT INTO tmp VALUES (1)
INSERT INTO tmp VALUES (2)
INSERT INTO tmp VALUES (3)
USE
SELECT * FROM data\tmp
CLOSE DATABASES ALL
DELETE FILE (cDBF)
RD (cDir)
你这个中第一行这样写有什么区别?cDefaultPath = ADDBS(JUSTPATH(SYS(16,1)))
#11
吹水佬2020-10-29 11:11
回复 9楼 hszxgb
差别:SYS(16)在SCX或PRG里调用返回的结果不同
#12
吹水佬2020-10-29 11:15
回复 10楼 hszxgb
写法有差别:SYS(16)与SYS(16,1),详细参阅VFP帮助
#13
hszxgb2020-10-29 11:30
回复 12楼 吹水佬
sys(16)帮助中提示返回正在执行的程序文件名
sys(16,1)帮助中没有,我好像在哪里看是返回正在执行的程序文件名(包含完整路径)
不知道sys(16)返回中有完整路径不
#14
吹水佬2020-10-29 11:45
回复 13楼 hszxgb
语法:SYS(16 [, nProgramLevel])
VFP帮助了解一下参数 nProgramLevel
随便观察一下返回的结果就好了,如:MESSAGEBOX(SYS(16))
#15
hszxgb2020-10-30 08:59
回复 14楼 吹水佬
好的,谢谢了
#16
whinda2020-11-01 23:02
Sys(16)返回当前执行文件路径,但包含文件名,justpath(cString)只返回路径,裁掉文件名,但是在Form中执行时情况又不同会加个前缀"procedure formname.eventname"。为得到统一的结果我们可以使用aStackInfo(ArrayName),在表单或过程中结果是一致的,它返回一个数组,第2行即是当前执行文件所在的具体位置。

astackinfo(aPath)
?justpath(aPath[2])
1