首先让我说我对FoxPro非常非常新,并且只是找到了一些基本的学习曲线。
我正在尝试创建一个程序文件(.prg),它有一些我可以从主代码调用的公共函数。我添加了程序文件“ publicfunctions.prg ”并包含一个简单的函数,它返回一个硬编码的文字(只是试图使机制工作)
*!* This function is in the publicfunctions.prg file
FUNCTION GetFieldValue
RETURN 'This is the value'
ENDFUNC
然后在我的主程序中我尝试使用它,但我收到文件不存在的错误。以下是主程序中的全部代码
*!* This is the main program logic
SET PROCEDURE TO publicfunctions.prg
PRIVATE sFieldValue = ''
sFieldValue = GetFieldValue()
我得到的错误是在' SET PROCEDURE TO publicfunctions.prg '语句中。它是:“文件'publicfunctions.prg”不存在。“
我猜它无法找到它,因为默认目录未设置为文件所在的路径。我尝试在“ SET PROCEDURE TO ”语句之前添加“ SET DEFAULT TO ”语句,但它根本没有改变结果。
我不想对路径进行硬编码,所以我想我的问题是这些:
更新
Per Hank的问题如下,我添加了以下附加信息:
使用项目管理器上的“新”按钮将文件“ publicfunctions.prg ”添加到项目中,物理文件就位于“旁边Main.prg “文件系统文件夹中的文件。
我正在使用Microsoft Visual FoxPro 9.0
任何和所有帮助都将得到真正的赞赏。
谢谢,
道格
答案 0 :(得分:3)
VFP维护一个搜索路径(与Windows / DOS搜索路径分开),它将搜索您在代码中引用的任何PRG,DBF等。
您可以使用SET('PATH')功能检查其当前设置,并使用SET PATH TO进行设置。除了当前的默认目录(您可以使用SET('DEFAULT')和CURDIR()函数验证)之外,还会搜索这些位置。
这将显示目前的情况:
WAIT WINDOW 'Path: ' + SET('PATH') + CHR(13)+CHR(10) + 'Default drive: ' + SET('Default') + CHR(13)+CHR(10) + 'Current directory: ' + CURDIR()
这些都在VFP的帮助中得到了很好的记录 - 请在那里查看更好的解释。
答案 1 :(得分:3)
另有一条评论。既然你是VFP的新手,你也可以从右脚开始。大多数VFP专家建议不要使用过程文件。将每个函数或过程放在一个单独的PRG文件中,并将例程名称作为文件名。例如,您的GetFieldValue函数应该在GetFieldValue.PRG。
中SET PROCEDURE可以追溯到有一个项目经理之前的Xbase早期。
答案 2 :(得分:2)
正如Tamar提到的那样,试图避免使用这种“SET PROCEDURE”文件,我强烈建议为你的项目提供一个结构良好的目录。将所有文件放在一个地方可能会让人痛苦不堪......从历史上看,我已经做过像
这样的事情了C:\SomeFolder\MyProject
C:\SomeFolder\MyProject\classes
C:\SomeFolder\MyProject\data
C:\SomeFolder\MyProject\forms
C:\SomeFolder\MyProject\graphics
C:\SomeFolder\MyProject\prgs
C:\SomeFolder\MyProject\reports
然后,分别将您的文件放在各自的位置。您以相同的方式将它们添加到项目管理器中,并保留文件的“相对”路径。
如上所述,将应用程序的“数据”分开,可以在需要时轻松复制/粘贴备份,模拟,调试数据集的测试。尝试打开文件时,可以根据使用“SET PATH”的限定路径+表名INSTEAD引用打开文件。在过去太多次我有系统依赖于“设置路径”,并会窒息,或找到一个旧版本的文件,而不是预期的文件。我的方法是...如果我找不到为什么。找到它,把它放在适当的位置,然后继续。
如数据所述,假设您在“data”目录中有“customers”和“orders”表。你可以有一个变量,并在查询或打开文件中引用它......
PUBLIC myDataPath as String
myDataPath = "Data\"
use ( myDataPath + "Customers" )
select 0
use ( myDataPath + "Orders" )
如果尝试查询,您可以执行类似
的操作select ;
c.FirstName, ;
c.LastName, ;
o.OrderID, ;
o.OrderDate ;
from ;
( myDataPath + "Customers" ) c ;
JOIN ( myDataPath + "Orders" ) o ;
on c.CustomerID = o.CustomerID ;
into ;
cursor C_SomeSampleResult READWRITE
通过这种方式,你永远不会有一个模糊的WHICH表版本认为它试图从中获取数据。同样,如果找不到该文件,则首先需要解决更大的问题。
答案 3 :(得分:2)
如果您希望应用程序在您希望放入程序和表格的任何位置运行。
你只需添加这个......
SET DEFAULT TO SYS(5)+CURDIR()
SET PATH TO SYS(5)+CURDIR()
<强> PS 即可。请注意,这仅在项目仅处于分布式(.exe)代码时才会生效。您必须在程序的开发阶段设置路径和默认值。
答案 4 :(得分:1)
使用FoxPro,文件“必须”在搜索路径中。因此,如果您构建项目,请将文件publicfunctions.prg添加到代码选项卡下的项目文件中,如果您没有构建项目,请确保在Options中有可以看到prg所在的文件夹。
如果我们知道您正在使用的Fox版本,也会有所帮助。