2

首先让我说我对 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 ”语句,但它根本没有改变结果。

我不想对路径进行硬编码,所以我想我的问题是:

  1. 我对默认目录的假设是否正确?
  2. 如果 #1 为真,那么如何将默认目录设置为主程序文件所在的目录?
  3. 我是否正确调用该函数?(如果能找到当然)

更新Per Hank的问题
如下_ _在文件系统文件夹中。

在此处输入图像描述

在此处输入图像描述

我正在使用 Microsoft Visual FoxPro 9.0

任何和所有的帮助将不胜感激。

谢谢,
道格

4

5 回答 5

4

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 的帮助中有很好的记录 - 检查那里以获得更好的解释。

于 2012-05-02T17:26:13.583 回答
3

这里还有另一条评论。由于您是 VFP 的新手,因此您不妨从右脚开始。大多数 VFP 专家建议不要使用过程文件。将每个函数或过程放在一个单独的 PRG 文件中,以例程名称作为文件名。例如,您的 GetFieldValue 函数应位于 GetFieldValue.PRG 中。

SET PROCEDURE 可以追溯到早期的 Xbase 时代,当时还没有项目经理。

于 2012-05-02T20:21:27.907 回答
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 来引用打开文件。过去有太多次我的系统依赖于“SET PATH”,并且会阻塞,或者找到一个旧版本的文件,而不是预期的文件。我的方法是......如果我找不到它为什么。找到它,把它放在适当的位置,然后继续。

如数据所述,假设您在“数据”目录中有“客户”和“订单”表。您可以有一个变量并在查询或打开文件时引用它......

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

这样你就永远不会有一个模棱两可的表版本,它认为它试图从中获取数据。同样,如果它找不到该文件,那么您首先要解决一个更大的问题。

于 2012-05-03T01:52:33.500 回答
2

如果您希望您的应用程序在您想要放入程序和表格的任何地方运行。

你只需要添加这个...

SET DEFAULT TO SYS(5)+CURDIR()
SET PATH TO SYS(5)+CURDIR()

附言。请注意,这仅在项目仅在分布式 (.exe) 代码中时才会生效。您必须在程序的开发阶段设置路径和默认值。

于 2012-11-22T06:24:29.597 回答
1

使用 FoxPro,文件“必须”位于搜索路径中。因此,如果您正在构建项目,请将文件 publicfunctions.prg 添加到代码选项卡下的项目文件中,如果您不构建项目,请确保在选项中您有可以看到 prg 所在的文件夹。

如果我们知道您使用的是什么版本的 Fox,也会有所帮助。

于 2012-05-02T14:39:29.963 回答