Visual FoxPro — язык программирования , разработанный корпорацией Microsoft . Это процедурный язык программирования, ориентированный на данные и обладающий функциями объектно-ориентированного программирования (ООП).
Он был получен из FoxPro (который, в свою очередь, произошел от FoxBASE), который разрабатывался Fox Software с 1984 года. Fox Technologies объединилась с Microsoft в 1992 году, после чего программное обеспечение приобрело дополнительные функции и префикс «Visual». [5] FoxPro 2.6 работал на Mac OS , DOS , Windows и Unix .
Visual FoxPro 3.0, первая «визуальная» версия, сократила поддержку платформ только до Mac [6] и Windows, а более поздние версии 5, 6, 7, 8 и 9 были только для Windows. Текущая версия Visual FoxPro основана на COM , и Microsoft заявила, что не намерена создавать версию Microsoft .NET .
Версия 9.0, выпущенная в декабре 2004 года и обновленная в октябре 2007 года патчем SP2, была финальной версией продукта. Поддержка закончилась в январе 2010 года и была продлена в январе 2015 года. [7]
Visual FoxPro возник как член класса языков, обычно называемых языками " xBase ", которые имеют синтаксис, основанный на языке программирования dBase . Другие члены семейства языков xBase включают Clipper и Recital (база данных).
Visual FoxPro, обычно сокращенно VFP, тесно интегрирован с собственным реляционным движком базы данных, который расширяет возможности FoxPro xBase для поддержки SQL- запросов и манипулирования данными. В отличие от большинства систем управления базами данных , Visual FoxPro является полнофункциональным, динамическим языком программирования , который не требует использования дополнительной среды программирования общего назначения. Его можно использовать для написания не только традиционных приложений " толстого клиента ", но также промежуточного программного обеспечения и веб-приложений .
В конце 2002 года было продемонстрировано, что Visual FoxPro может работать на Linux под управлением пакета совместимости Wine Windows. В 2003 году это привело к жалобам со стороны Microsoft: было заявлено, что развертывание кода FoxPro на машинах, отличных от Windows, нарушает лицензионное соглашение конечного пользователя . [8]
Visual FoxPro быстро рос и падал в популярности, согласно индексу сообщества программирования TIOBE . [9] В декабре 2005 года VFP впервые вошел в двадцатку лучших. В июне 2006 года он достиг пика на 12-й позиции, что сделало его (на тот момент) языком «B». По состоянию на январь 2023 года Visual FoxPro занимает 21-ю позицию в индексе TIOBE. [10]
В марте 2007 года Microsoft объявила, что VFP 10 не будет, [11] таким образом, VFP9 (выпущенный в производство 17 декабря 2004 года) стал последним коммерческим выпуском VFP от Microsoft. Пакет обновления 2 для Microsoft Visual FoxPro 9.0 был выпущен 16 октября 2007 года. [12] Поддержка версии 9 закончилась 13 января 2015 года. [7]
На момент объявления об окончании жизненного цикла работа над следующим релизом под кодовым названием Sedna (названным в честь недавно обнаруженной карликовой планеты ), который был построен поверх кодовой базы VFP9, уже началась. «Sedna» — это набор надстроек к VFP 9.0 компонентов xBase для поддержки ряда сценариев взаимодействия с различными технологиями Microsoft, включая SQL Server 2005, .NET Framework , Windows Vista, Office 2007, Windows Search и Team Foundation Server (TFS). Microsoft выпустила Sedna под лицензией Shared source на сайте CodePlex . Microsoft пояснила, что ядро VFP по-прежнему останется закрытым исходным кодом. Sedna была выпущена 25 января 2008 года. [13] По состоянию на март 2008 года все компоненты xBase VFP 9 SP2 (включая Sedna) были доступны для разработки сообществом на CodePlex.
В конце марта 2007 года испаноязычное сообщество FoxPro начало кампанию на MásFoxPro [14] («MoreFoxPro» на английском языке ) с целью подписать петицию в Microsoft с просьбой продолжить обновление Visual FoxPro или выпустить его для сообщества как open-source . 3 апреля 2007 года это движение было отмечено технической прессой. [15]
3 апреля 2007 года Microsoft ответила на петицию следующим заявлением Алана Гривера: [15]
«Мы прекрасно осведомлены о сообществе FoxPro, и это сыграло большую роль в том, что мы объявили 13 марта. Решение объявить о том, что мы не собираемся выпускать еще одну версию продукта, никогда не бывает легким, и мы очень тщательно его обдумываем.
«Мы не объявляем о конце FoxPro: очевидно, что приложения FoxPro продолжат работать. По некоторым нашим внутренним оценкам, в FoxPro 2.6 работает больше приложений, чем в VFP, а FoxPro 2.6 не поддерживается уже много лет. Visual FoxPro 9 будет поддерживаться Microsoft до 2015 года.
«Чтобы Microsoft могла продолжать развивать базу FoxPro, нам нужно будет рассмотреть возможность создания 64-разрядной среды разработки, а это потребует почти полной переписывания основного продукта. Мы также инвестировали в создание масштабируемой базы данных с SQL Server, включая свободно доступный 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 ДЕЛАТЬ ПОКА x < 50 x = x + 1 КОНЕЦДЕЛАТЬx = 1 DO WHILE .T. x = x + 1 IF x < 50 LOOP ELSE EXIT ENDIF ENDDOnMonth = МЕСЯЦ ( ДАТА ()) DO CASE CASE nMonth <= 3 MESSAGEBOX ( "Q1" ) СЛУЧАЙ nMonth <= 6 MESSAGEBOX ( "Q2" ) СЛУЧАЙ nMonth <= 9 MESSAGEBOX ( "Q3" ) В ПРОТИВНОМ СЛУЧАЕ ЯЩИК СООБЩЕНИЯ ( "Q4" ) КОНЕЦДЛЯ КАЖДОГО o Control В ЭТОЙ ФОРМЕ .Controls MESSAGEBOX (o Control .Name ) ENDFORf = Факториал(10)ФУНКЦИЯ Факториал(n) ЛОКАЛЬНАЯ i, r r = 1 FOR i = n TO 1 STEP -1 r = r * i NEXT && Здесь также можно использовать "ENDFOR" вместо "NEXT" RETURN r ENDFUNC
Примеры «Привет, мир»:
* Вывод в текущем местоположении
? "Hello World" * Вывод в указанном месте @ 1,1 SAY "Hello World" * Вывод в отдельном окне, очищается при вводе WAIT WINDOW "Hello World" * Вывод в стандартном диалоговом окне, очищается при нажатии OK MESSAGEBOX ( "Hello World" )
* Вывод в определенном окнеloForm = CREATEOBJECT ( "HiForm" ) loForm . Показать ( 1 )ОПРЕДЕЛИТЬ КЛАСС HiForm AS Форма Автоцентр = . Т . Подпись = «Привет, мир» ДОБАВИТЬ ОБЪЕКТ lblHi как метку ; С подписью = "Привет, мир!" КОНЕЦ ОПРЕДЕЛЕНИЯ
loMine = CREATEOBJECT ( "МойКласс" )? loMine.cProp1 && Это сработает. (Двойной амперсанд обозначает конец строки комментария)? loMine.cProp2 && Ошибка программы: Свойство CPROP2 не найдено, поскольку оно скрыто извне.? loMine.MyMethod1() && Это сработает.? loMine.MyMethod2() && Ошибка программы: Свойство MYMETHOD2 не найдено, поскольку оно скрыто извне.ОПРЕДЕЛИТЬ КЛАСС MyClass КАК Пользовательский cProp1 = "Моя собственность" && Это публичная собственность HIDDEN cProp2 && Это частная (скрытая) собственность dProp3 = {} && Другое публичное свойство ПРОЦЕДУРА Init() && Конструктор класса This .cProp2 = "Это скрытое свойство." ПРОЦЕДУРА dProp3_Access && Получатель свойств ДАТА ВОЗВРАТА () PROCEDURE dProp3_As sign (vNewVal) && Property Setter использует тег "_assign" в имени свойства ЕСЛИ VARTYPE (vNewVal) = "D" ЭТО .dProp3 = vNewVal КОНЕСЛИ ПРОЦЕДУРА МойМетод1() * Это открытый метод, вызывающий скрытый метод, который возвращает * значение скрытого свойства. ВОЗВРАТ Это .MyMethod2() СКРЫТАЯ ПРОЦЕДУРА MyMethod2() && Это закрытый (скрытый) метод ВОЗВРАТ Это .cProp2КОНЕЦ ОПРЕДЕЛЕНИЯ
Язык также имеет обширные команды для работы с базами данных и индексирования. Индекс команд "help" в VFP 9 содержит несколько сотен описанных команд и функций. В примерах ниже показано, как закодировать создание и индексирование таблиц, однако в VFP есть экраны конструктора таблиц и баз данных, которые создают таблицы и индексы без необходимости писать код.
* Создать таблицу СОЗДАТЬ ТАБЛИЦУ randData (iData I) * Заполнение случайными данными с помощью команд xBase и SQL DML ДЛЯ i = 1 ДО 50 ДОБАВИТЬ ПУСТОЕ ЗАМЕНИТЕ iData НА ( RAND () * 100) ВСТАВИТЬ В randData (iData) ЗНАЧЕНИЯ ( RAND () * 100) ЭНДФОР * Разместите структурный индекс на данных ИНДЕКС ПО ТЕГУ iData iData ЗАКРЫТЬ ДАННЫЕ && Не закрывать открытые библиотеки и т.п. * Отображение упорядоченных данных с использованием команд в стиле xBase ИСПОЛЬЗОВАТЬ randData УСТАНОВИТЬ ЗАКАЗ НА iData LOCATE && Вместо GO TOP. Обеспечивает использование индекса для поиска TOP СПИСОК СЛЕДУЮЩИХ 10 && Первые 10 ИДИ ВНИЗ ПРОПУСТИТЬ -10 СПИСОК ОСТАЛЬНЫХ && Последние 10 ЗАКРЫТЬ ДАННЫЕ * Просмотр упорядоченных данных с помощью команд SQL DML ВЫБИРАТЬ * ; ОТ randData ; УПОРЯДОЧИТЬ ПО iData ПО УБЫВАНИЮ
PRIVATE cAuthorID, cAuthorName && Частные переменные заменяют любую предыдущую глобальную или частную переменную с тем же именем. LOCAL nHnd, nResult && Локальные переменные видны только здесь * Подключение к источнику данных ODBC nHnd = SQLCONNECT ( "ODBCDSN" , "пользователь" , "пароль" ) * Введите цикл, чтобы мы могли выйти к коду закрытия соединения в случае ошибки ДЕЛАЙТЕ ПОКА .Т. * Выполнить команду SQL nResult = SQLEXEC (nHnd, "USE master" ) ЕСЛИ nResult < 0 MESSAGEBOX ( «База данных MASTER не существует!» ) EXIT && Чтобы закрыть соединение КОНЕСЛИ * Извлечение данных с удаленного сервера и сохранение их в локальном курсоре данных nResult = SQLEXEC (nHnd, "SELECT * FROM authors" , "QAUTHORS" ) ЕСЛИ nResult < 0 MESSAGEBOX ( "Невозможно выполнить удаленную команду SQL SELECT!" ) EXIT && Чтобы закрыть соединение КОНЕСЛИ * Обновить запись в удаленной таблице, используя параметры cAuthorID = "1001" cAuthorName = "Новое имя" nResult = SQLEXEC (nHnd, "ОБНОВЛЕНИЕ авторов SET auth_name = ?cAuthorName WHERE auth_id = ?cAuthorID" ) ЕСЛИ nResult < 0 MESSAGEBOX ( «Невозможно выполнить удаленную команду SQL UPDATE!» ) EXIT && Чтобы закрыть соединение КОНЕСЛИ * Если мы сюда попали, значит мы все успешно извлекли EXIT && Выйти без условий КОНЕЦ * Закрыть соединение SQLDISCONNECT (nHnd)