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 が true の場合、デフォルト ディレクトリをメイン プログラム ファイルがあるディレクトリに設定するにはどうすればよいですか?
  3. 関数を正しく呼び出していますか? (もちろん見つけられればですが)

更新
以下のハンクの質問ごとに、この追加情報を追加しました。ファイル「publicfunctions.prg 」は、プロジェクトマネージャーの「新規」ボタンを使用してプロジェクトに追加され、物理ファイルは「 Main.prg」ファイルのすぐ隣にありますファイルシステムフォルダーにあります。

ここに画像の説明を入力

ここに画像の説明を入力

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

ここでもう1つのコメント。あなたは VFP に慣れていないので、右足から始めることもできます。ほとんどの VFP 専門家は、プロシージャ ファイルを使用しないことを推奨しています。各関数またはプロシージャを別の PRG ファイルに入れ、ルーチン名をファイル名として使用します。たとえば、GetFieldValue 関数は GetFieldValue.PRG にある必要があります。

SET PROCEDURE は、プロジェクト マネージャーが存在する以前の初期の Xbase にまでさかのぼります。

于 2012-05-02T20:21:27.907 に答える
2

アプリケーションをどこでも実行したい場合は、プログラムとテーブルに入れます。

これを追加するだけです...

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

PS。これは、プロジェクトが分散(.exe)コードの場合にのみ有効になることに注意してください。プログラムの開発段階でパスとデフォルトを設定する必要があります。

于 2012-11-22T06:24:29.597 に答える
2

このような「SET PROCEDURE」ファイルの使用を避けようとすることについて Tamar が述べたように、プロジェクトには適切に構造化されたディレクトリを用意することを強くお勧めします。すべてのファイルをすべて 1 か所にまとめるのは大変な作業です... 歴史的に、私は次のようなことをしてきました

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」を使用する代わりに、修飾パス + テーブル名に基づいてファイルを開くことを参照できます。過去に何度も「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 に答える
1

FoxPro では、ファイルは検索パスにある必要があります。したがって、プロジェクトをビルドする場合は、ファイル publicfunctions.prg をコード タブの下のプロジェクト ファイルに追加します。プロジェクトをビルドしない場合は、[オプション] で、prg が配置されているフォルダーが表示されることを確認してください。

また、使用している Fox のバージョンをお知らせいただけると助かります。

于 2012-05-02T14:39:29.963 に答える