Visual FoxProは、マイクロソフトが開発したプログラミング言語です。データ中心の手続き型プログラミング言語であり、オブジェクト指向プログラミング(OOP)の機能も備えています。
これは、1984年からFox Softwareによって開発されたFoxPro (それ自体はFoxBASEから派生したもの)から派生したものです。Fox Technologiesは1992年にMicrosoftと合併し、その後、ソフトウェアはさらに多くの機能と「Visual」という接頭辞を獲得しました。 [ 5 ] FoxPro 2.6は、 Mac OS、DOS、Windows、およびUnixで動作しました。
Visual FoxPro 3.0(最初の「Visual」バージョン)では、プラットフォームのサポートがMac [ 6 ]とWindowsのみに縮小され、後のバージョン5、6、7、8、9はWindowsのみとなりました。現在のバージョンのVisual FoxProはCOMベースであり、MicrosoftはMicrosoft .NETバージョンを作成する予定はないと表明しています。
2004年12月にリリースされ、2007年10月にSP2パッチで更新されたバージョン9.0が、この製品の最終バージョンでした。サポートは2010年1月に終了し、延長サポートは2015年1月に終了しました。[ 7 ]
Visual FoxProは、 dBaseプログラミング言語をベースとした構文を持つ、一般に「 xBase 」言語と呼ばれる言語群の一員として誕生しました。xBase言語ファミリーには、 ClipperやRecital(データベース)なども含まれます。
Visual FoxPro(一般的にVFPと略される)は、独自のRDBMSエンジンと緊密に統合されており、FoxProのxBase機能を拡張してSQLクエリとデータ操作をサポートします。ほとんどのデータベース管理システムとは異なり、Visual FoxProは汎用プログラミング環境を別途必要としない、フル機能の動的プログラミング言語です。従来の「ファットクライアント」アプリケーションだけでなく、ミドルウェアやWebアプリケーションの開発にも使用できます。
2002年後半、Visual FoxProがWine Windows互換スイートの下でLinux上で動作することが実証されました。2003年、これに対しMicrosoftから苦情が出ました。Windows以外のマシンにFoxProランタイムコードを展開することはエンドユーザーライセンス契約に違反すると主張されたのです。[ 8 ]
Visual FoxProは、TIOBEプログラミングコミュニティインデックスで測定すると、人気が急上昇し、その後急落した。[ 9 ] 2005年12月、VFPは初めてトップ20入りを果たした。2006年6月には12位にピークを迎え、(当時)「B」言語となった。 2025年5月現在 Visual FoxProはTIOBEインデックスで29位にランクインしている。[ 10 ]
2007 年 3 月、マイクロソフトは VFP 10 はリリースされないことを発表し[ 11 ] 、 VFP9 (2004 年 12 月 17 日に製造にリリース) がマイクロソフトからの最後の商用 VFP リリースとなりました。Microsoft Visual FoxPro 9.0 のサービス パック 2 は 2007 年 10 月 16 日にリリースされました[ 12 ]バージョン 9 のサポートは 2015 年 1 月 13 日に終了しました[ 7 ]。
サポート終了の発表時点で、VFP9 コードベースをベースに構築された次期リリース「Sedna」(最近発見された準惑星にちなんで命名)の開発作業は既に始まっていた。「Sedna」は、 SQL Server 2005、.NET Framework、Windows Vista、Office 2007、Windows Search、Team Foundation Server (TFS)など、さまざまな Microsoft テクノロジーとの相互運用シナリオをサポートする xBase コンポーネントの VFP 9.0 用アドオンのセットである。Microsoftは、 CodePlexサイトで共有ソースライセンスの下で Sedna をリリースした。Microsoft は、VFP コアは引き続きクローズド ソースのままであると明言している。Sedna は 2008 年 1 月 25 日にリリースされた。[ 13 ] 2008 年 3 月現在、VFP 9 SP2 のすべての xBase コンポーネント (Sedna を含む) は、CodePlex でコミュニティ開発用に利用可能となっている。
2007 年 3 月下旬、スペイン語圏の FoxPro コミュニティが MásFoxPro [ 14 ] (英語では「MoreFoxPro」) で草の根運動を開始し、Microsoft に対して Visual FoxPro のアップデートを継続するか、オープンソースとしてコミュニティに公開するよう請願書に署名するよう呼びかけた。2007 年 4 月 3 日、この運動は技術系メディアで取り上げられた。[ 15 ]
2007年4月3日、マイクロソフトはアラン・グリバーによる以下の声明で請願に回答した。[ 15 ]
「私たちはFoxProコミュニティの存在を非常に意識しており、3月13日に発表した内容にもそれが大きく影響しています。製品の新たなバージョンをリリースしないという決定は決して容易なものではなく、非常に慎重に検討した上での決定です。」
「FoxProのサポート終了を発表するわけではありません。当然ながら、FoxProアプリケーションは引き続き動作します。社内の推定では、VFPよりもFoxPro 2.6で動作しているアプリケーションの方が多く、FoxPro 2.6は長年サポートされていません。Visual FoxPro 9は、Microsoftによって2015年までサポートされます。」
「マイクロソフトがFoxProの基盤を進化させ続けるためには、64ビット開発環境の構築を検討する必要があり、そのためにはコア製品のほぼ完全な書き直しが必要になります。また、無償で利用可能なSQL Server Express Editionを含む、スケーラブルなデータベースの構築にも投資してきました。サードパーティとの提携については、多くの大手FoxPro顧客から、承認ベンダーからの製品ではなくなるため、FoxProを使い続けることが不可能になるとの意見をいただいています。コミュニティと大手顧客双方のニーズのバランスを取るため、開発環境をCodePlexでオープンソース化することが最善の道だと考えました。」
記載されているバージョンはすべてWindows用です。[ 16 ]
FoxPro言語には、BASICなどの他のプログラミング言語と非常によく似たコマンドが含まれています。
基本的な構文例をいくつかご紹介します。
FOR i = 1 to 10 x = x + 6.5 NEXT && "NEXT" の代わりに "ENDFOR" を使用することもできますi = 25 の 場合、 i = i + 1 とし、それ以外の場合はi = i + 3 とする。x = 1 DO WHILE x < 50 x = x + 1 ENDDOx = 1 DO WHILE .T. x = x + 1 IF x < 50 LOOP ELSE EXIT ENDIF ENDDOnMonth = MONTH ( DATE ()) DO CASE CASE nMonth <= 3 MESSAGEBOX ( "Q1" ) CASE nMonth <= 6 MESSAGEBOX ( "Q2" ) CASE nMonth <= 9 MESSAGEBOX ( "Q3" ) それ以外の場合はメッセージボックス(「Q4」) ENDCASEFOR EACH o Control IN THISFORM .Controls MESSAGEBOX (o Control .Name ) ENDFORf = 階乗(10) 関数Factorial(n) ローカルi, r r = 1 FOR i = n TO 1 STEP -1 r = r * i NEXT && ここでは「NEXT」の代わりに「ENDFOR」を使用することもできますRETURN r ENDFUNC「Hello World」の例:
* 現在の場所での出力は ?「Hello World」* 指定された位置 @ 1,1に「Hello World」と出力します* 出力は別のウィンドウに表示され、入力時にクリアされます。WAIT WINDOW "Hello World"* 標準ダイアログボックスに出力され、OKでクリアされます。MESSAGEBOX ( "Hello World" ) 
* 指定されたウィンドウに出力loForm = CREATEOBJECT ( "HiForm" )loForm.Show ( 1 )クラスHiForm をFormとして定義しますAutoCenter = . T .キャプション=「こんにちは、世界」オブジェクトlblHi をラベルとして追加します。キャプション付き= 「こんにちは、世界!」ENDDEFINEloMine = CREATEOBJECT ( "MyClass" ) ? loMine.cProp1 && これは動作します。(二重アンパサンドは行末コメントを示します)? loMine.cProp2 && プログラムエラー: プロパティ CPROP2 は外部から隠されているため見つかりません。? loMine.MyMethod1() && これは動作します。? loMine.MyMethod2() && プログラムエラー: プロパティ MYMETHOD2 は外部から隠されているため見つかりません。クラス MyClass をCustomとして定義しますcProp1 = "私の所有物" && これは公共の所有物ですHIDDEN cProp2 && これは非公開(非表示)プロパティですdProp3 = {} && 別のパブリックプロパティプロシージャInit() && クラスコンストラクタこの.cProp2 = "これは非表示のプロパティです。"プロシージャdProp3_Access && プロパティゲッター返却日() PROCEDURE dProp3_As sign (vNewVal) && プロパティセッターはプロパティ名に「_assign」タグを使用しますIF VARTYPE (vNewVal) = "D"THIS .dProp3 = vNewVal ENDIFプロシージャMyMethod1() * これは公開メソッドであり、非公開メソッドを呼び出し、* 隠しプロパティの値。RETURN This.MyMethod2 () 隠しプロシージャ MyMethod2() && これはプライベート(隠し)メソッドですこの.cProp2 を返しますENDDEFINEこの言語には、データベース操作やインデックス作成のための豊富なコマンドも用意されています。VFP 9 の「help」コマンド一覧には、数百ものコマンドと関数が記載されています。以下の例では、テーブルの作成とインデックス作成をコードで記述する方法を示していますが、VFP には、コードを書かずにテーブルとインデックスを作成できるテーブルおよびデータベースビルダー画面も備わっています。

* テーブルを作成するCREATE TABLE randData (iData I) * xBaseとSQL DMLコマンドを使用してランダムなデータを入力するi = 1 から 50 まで 空白 を追加iData を ( RAND () * 100) に置き換えるINSERT INTO randData (iData) VALUES ( RAND () * 100) ENDFOR* データに構造インデックスを配置するiDataタグの インデックスiDataデータ を閉じます&& 開いているライブラリなどは閉じないでください* xBaseスタイルのコマンドを使用して順序付きデータを表示するrandData を使用するiDataに注文 を設定LOCATE && GO TOP の代わりに使用します。インデックスを使用して TOP を検索することを強制します。 次の10件 と最初の10件を表示底 へ行くスキップ-10 リストの残り && 最後の10データ を閉じる* SQL DMLコマンドを使用して、順序付けされたデータを参照します。SELECT * ;randDataから;iDataによる 降順PRIVATE cAuthorID, cAuthorName && プライベート変数は、同じ名前の以前のグローバル変数またはプライベート変数を上書きしますLOCAL nHnd, nResult && ローカル変数はここでのみ参照可能です* ODBCデータソースに接続するnHnd = SQLCONNECT ( "ODBCDSN " , "user " , "pwd " ) エラーが発生した場合に接続を閉じるコードに戻れるように、ループに入ります。DO WHILE .T.* SQLコマンドを実行するnResult = SQLEXEC (nHnd, "USE master" ) nResult < 0 の 場合メッセージボックス(「マスターデータベースが存在しません!」) EXIT && 接続を閉じるENDIFリモートサーバーからデータを取得し、ローカルデータカーソルに格納する。nResult = SQLEXEC (nHnd, "SELECT * FROM authors" , "QAUTHORS" ) nResult < 0 の 場合メッセージボックス(「リモートSQL SELECTコマンドを実行できません!」) EXIT && 接続を閉じるENDIF* パラメータを使用してリモートテーブルのレコードを更新するcAuthorID = "1001"cAuthorName = "新しい名前"nResult = SQLEXEC (nHnd, "UPDATE authors SET auth_name = ?cAuthorName WHERE auth_id = ?cAuthorID" ) nResult < 0 の 場合メッセージボックス(「リモートSQL UPDATEコマンドを実行できません!」) EXIT && 接続を閉じるENDIF* ここまで到達すれば、すべて正常に回収できたことになります。EXIT && 無条件に終了エンドド* 接続を閉じるSQLDISCONNECT (nHnd)