【问题标题】:Getting Error When Using SET PROCEDURE TO使用 SET PROCEDURE TO 时出错
【发布时间】:2012-05-02 14:07:59
【问题描述】:

首先让我说,我对 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. 我是否正确调用了该函数? (如果能找到当然)

更新
根据汉克的以下问题,我添加了以下附加信息: 使用项目管理器上的“New”按钮将文件“publicfunctions.prg”添加到项目中,物理文件位于“ Main.prg" 文件系统文件夹中的文件。

我使用的是 Microsoft Visual FoxPro 9.0

我们将不胜感激。

谢谢,
道格

【问题讨论】:

    标签: foxpro visual-foxpro


    【解决方案1】:

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

    【讨论】:

    • LAK 。 . .感谢您提供的出色信息。我肯定会经常使用它。有没有办法确定当前执行的程序文件所在的目录?如果我能得到它,那么我可以使用 SET PATH TO 语句来改变它。我运行了您提供的代码,列出的目录与正在执行的实际 PJX 或 PRG 文件相去甚远。
    • 我意识到这对于编译程序可能不是必需的,因为我可以将路径添加到选项中的“搜索路径”设置中,但在尝试打开表和其他文件时它可能非常有用。
    • 我刚刚弄清楚为什么我会得到我的价值观。 CURDIR() 函数返回相对于当前运行的可执行文件的值。从 FoxPro IDE 中运行代码时,该文件是 FoxPro.exe,而不是当前在调试器中运行的程序文件。当我将应用程序编译为 exe 时,它​​返回了适当的信息。感谢 LAK 提供的所有非常有用的信息。
    • 我很高兴能帮上忙。我实际上并没有使用 VFP 的“项目”(我们这里的应用程序是从 1988 年左右开始开发的,我们从未将它融入 VFP 更现代的做事方式),所以我没有提供关于它们与您的关系的具体建议问题。
    【解决方案2】:

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

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

    【讨论】:

    • 添马舰。 . .谢谢你提供的详情。我总是想知道在我使用的环境中普遍接受的良好形式规则。实际上,我只是想学习足够多的东西来保持几个(写得很糟糕的)FoxPro 应用程序,直到它们可以被替换。所以我实际上不会做任何“真正的”开发。但再次感谢。我喜欢尽可能多地了解。
    【解决方案3】:

    正如 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
    

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

    【讨论】:

    • DRapp,这个线程的优秀补充。很多非常有用的信息。我认为由于该线程中的所有 cmets 和答案,我在最后一天学到的知识比前三周在数万行代码中倾泻而出(我是否提到写得非常糟糕)构成的代码更多我突然支持这些计划。再次感谢所有提供见解的人。
    • @dscarr,我什至会为你提供一个... 作为 VFP 领域的新手,这是一个学习曲线,如果你愿意,我会提供给你我的个人电子邮件帮助指导/指导什么显然会成为一个清单的发现...告诉我,我会发布我的电子邮件并在你删除它后将其删除。
    • 我将不胜感激。我保证在与您联系之前会进行适当的尽职调查。我似乎发现自己处于支持大约 20 个最终用户编写的 VFP 程序的环境中,这些程序以前从未看过任何一行代码。我会尽我所能获得帮助。
    【解决方案4】:

    如果您希望您的应用程序在您想放入程序和表中的任何位置运行。

    你只需要添加这个...

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 汉克。 . .谢谢回复。正如我在帖子更新中指出的那样,该程序是通过任务管理器添加的,并且位于 Main.prg 旁边。我正在使用 VFP 9.0
      • 您可以通过在代码中使用 sys(2003) 找到当前工作目录,例如 lcWhereAmI=SYS(2003) 如果您想查看特定文件的位置,请使用 lcWhereAreDataFiles=FULLPATH('sysadmin .dbc',1) 这将为您提供该特定文件的完整路径在开发中设置搜索参数在 VFP 9 中转到工具-> 选项-> 文件位置单击“文件位置”选项卡,转到“搜索path' 并确保包含您的 prg 文件的文件夹在此处列出。点击 make default 然后每次你处于开发模式 Fox 都会为你找到它
      • 汉克。 . .再次感谢您提供更多有价值的信息。我在选项中找到了搜索路径设置,这让我的程序可以找到它需要的所有文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-22
      • 2022-12-27
      相关资源
      最近更新 更多