powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
25 сообщений из 108, страница 2 из 5
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376363
Emery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СторожVisual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
Не на самом Визуал ФокПро, но с использованием рантайм библиотеки vfp9t.dll / vfp9r.dll в связке с С++ проектом.

Главная мысль, FoxPro, начиная с ДОС-овской версии 2.6а (и ранее) и заканчивая графической версией 9.0 (под «Форточки») всегда был чрезвычайно хорош на уровне движка базы данных и весьма и весьма посредственен в части графического интерфейса. ДОС-овская версия была обманута Мелкософтом, который требовал использования графических функций приложения только через БИОС. Фирма Fox (тогда еще независимая от M$) попалась на эту удочку и проиграла. Приложения, которые писали непосредственно в графическую видеопамять, выиграли куда более. Достаточно вспомнить такой продукт, как ДОС-овсий Автокад, версии 10 и 11.

Плохая карма не позволила, по-видимому, VFP, уже под Windows, обрести полноценный интерфейс. Достаточно вспомнить «Парус», учетную систему, а-ля «1С77», написанную полностью на Visual FoxPro. По-моему, «семерка» и ныне куда более популярна, чем «Парус». И это притом, что «Парус» полностью декомпилируется на уровне исходных кодов VFP. Но кому он, однако, нужен?

Зато движок VFP великолепен! Легкий, шустрый, эффективный, мощный, просто сказка. И весит всего несколько мегабайт. Цепляй его к своему клиенту, написанному на С++ с фреймворками (wxWidgets или Qt) и будет тебе счастье.

Единственная загвоздка, не умеет народ правильно использовать runtime библиотеки VFP. Самые продвинутые создают COM-сервер средствами VFP, посредством которого получают доступ из клиента, например, на С++ к рантайму VFP. А затем применяют вариантные массивы для обмена данными в памяти между процессами С++ и VFP (не считая обмен через файлы). Спрашивается, а зачем нужна обёрточная dll, если vfp9t.dll / vfp9r.dll сами являются, официально, COM-серверами?

А ответ прост, как стандартные COM-сервера vfp9t.dll / vfp9r.dll использовать невозможно. По крайней мере, Интернет на эту тему молчит как рыба об лёд. По-моему, там стоит или имитация / заглушка на вход как стандартный COM-сервер или задействуются «секретные» GUID'ы. Однако кроме ненастоящего, сувенирного КОМ-входа в рантайм библиотеках VFP используется несколько реальных нестандартных входов.

Первый нестандартный вход обеспечивает функция DllWinMain. Она в качестве первого параметра использует имя файла с объектным кодом VFP (т.е. app, fxp или exe-файлы). Второй параметр это флаг отображения, типа SW_SHOWDEFAULT. Для t-версии, может принимать любое значение, т.к., в мультитредовой версии рантайма графика практически не отображается (если не считать MESSAGEBOX'а). Это самый крутой способ, который позволяет перевести VFP в состояние простого сервера (безо всяких КОМов, реестров и гуидов) и общаться с ним из С++ по любому протоколу. Например, runtime VFP можно задействовать как in-proc сервер по протоколу DDE, который может быть эффективнее любого СОМ'овского маршалинга при двустороннем обмене данными. Если не нравиться DDE, например, по «религиозным» причинам, можно использовать любой другой способ межпроцессного взаимодействия. Достаточно просто иметь в виду, что VFP поддерживает WinAPI.

Второй нестандартный вход, это пара функций DllOleInit / VFPDllGetClassObject. Первая просто делает ОЛЕ-инициализацию, а вторая (аналог стандартной функции DllGetClassObject) позволяет получить нужный указатель, скармливая ей в качестве CLASID'a гуид обёрточной КОМ-dll'ки, а в качестве IID'а гуид стандартного интерфейса фабрики классов (либо IUnknown). При этом VFPDllGetClassObject обрабатывает объектный модуль VFP обёрточной dll'ки, может быть даже по аналогии с функцией DllWinMain. Хотя, не исключено, что использует «секретные» гуиды и стандартную КОМ-овскую технологию. Этот метод тяжело применять без обёрточной dll'ки, поскольку, информации по его использованию недостаточно. Проще уж задействовать «обёртку» и не париться.

Третий нестандартный вход дает Static data OCXAPIInit:: . Однако информации по этому поводу нигде нет, а разбираться самому влом. Скорее всего, это как-то задействует технологию ActiveX.

Меня лично привлекает первый вариант, где графика, в т.ч. грид (в виртуальном режиме) берется из wxWidgets (хотя можно и Qt). При этом навигация и модификация по dbf-файлам осуществляется непосредственно средствами С++ с использованием MMF (Memory Mapped Files) технологии. У меня на эту тему есть даже статья на моем сайте и на codeproject.com. А runtime VFP я собираюсь использовать для построения индексов, поиска, выборки данных (select sql) и т.п. Приложение обещает быть интересным, тем более, что его можно, по технологии внешних компонент внедрить в 1С («семерку» или «восьмерку»).
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376375
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Emery, ИМХУ в скрещивании ужей с ежами ты достиг небывалых высот. Есть SQLite, он заточен как раз на то что ты делаешь. VFP не заточен, отсюда все описанные тобой проблемы.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376379
Emery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TEmery, ИМХУ в скрещивании ужей с ежами ты достиг небывалых высот. Есть SQLite, он заточен как раз на то что ты делаешь. VFP не заточен, отсюда все описанные тобой проблемы.
Позвольте с вами не согласиться! «VFP заточен», только нужной информации вы нигде не найдете. Поэтому я и поделился кратко своими соображениями. SQLite ничуть не лучше Visual FoxPro, иначе мы бы спорили в ветке по SQLite.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376392
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Emery«VFP заточен», только нужной информации вы нигде не найдете.
ИМХУ VFP вещь в себе, т.е. замкнутая самодостаточная среда. Именно этим он хорош. То что к нему можно обратиться через COM это побочный эффект заложенный МС, они везде COM внедряли, 99% разработчиков на фоксе даже не знают об этом, т.к. это ненужные знания. Фишка фокса в том что прога на фоксе запустится после простого копирования, а COM-сервер надо регистрировать под админом.

То что ты находишь то что никто никогда не искал - похвально, молодец что нашел, но я бы посоветовал забыть и забить, т.к. тут ничего не отлажено, потому что никто так не использует фокс, можешь запросто наступить на грабли, которые никто никогда уже не исправит, увы.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376407
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EmeryТретий нестандартный вход дает Static data OCXAPIInit:: . Однако информации по этому поводу нигде нет, а разбираться самому влом. Скорее всего, это как-то задействует технологию ActiveX.Поможем ...
В архиве idl, содержащие данные об интерфейсах предоставляемых VFP9.

Проще всего /без всяких извратов/ их можно использовать в 1С 7.7 или 1С 8.x.
Также выбирайте на вкус: VB, C# ... /и в том же духе/.

Имеется ли у вас документация с описание COM интерфейсов /типа документации к примеру объектной модели Excel для VBA/?
Мне любопытно было бы попробовать поработать с VFP9 с использованием OLE.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376423
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Имеется ли у вас документация с описание COM интерфейсов /типа документации к примеру объектной модели Excel для VBA/?В dv_foxhelp.chm много чего полезного /как с C++ работать с VFP и использовании ActiveX/
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376431
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012В dv_foxhelp.chm много чего полезного /как с C++ работать с VFP и использовании ActiveX/"Чего тут думать? Прыгать надо"

Код: sql
1.
2.
3.
4.
5.
 гл_oVFP9 = СоздатьОбъект( "VisualFoxPro.Application" );
	     
 VpName     = гл_oVFP9.Name;                                // Returns the application object's name.
 VpFullName = гл_oVFP9.FullName;                            // Returns the application object's full name.
 VpVersion  = гл_oVFP9.Version;                             // Returns the version of the automation server



Работает!
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376442
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  гл_oVFP9 = СоздатьОбъект( "VisualFoxPro.Application" );
	     
  VpName     = гл_oVFP9.Name;                                // Returns the application object's name.
  VpFullName = гл_oVFP9.FullName;                            // Returns the application object's full name.
  VpVersion  = гл_oVFP9.Version;                             // Returns the version of the automation server

  гл_oVFP9.Visible = 1;                                      // Если желаем лицезреть main window VFP 
  гл_oVFP9.Caption = "Привет от 1С";                         // Меняем заголовок main window VFP 

  гл_oVFP9.DefaultFilePath = C:\Temp VFP\";                  // Устанавливаем default directory for VP  
  
  гл_oVFP9.StatusBar       =                                 // Выводим в статус бар main window VFP 
   "Дата и текущее время " + ТекущаяДата() + " " + 
                             ТекущееВремя();
                             "
  гл_oVFP9.DoCmd = "USE  Example.dbf";                       // Открываем таблицу
  
  гл_oVFP9.Quit();                                           // Закрываем VFP



PS: "Чем мог, тем помог"
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376456
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рабочий код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 гл_oVFP9 = СоздатьОбъект( "VisualFoxPro.Application" );
	     
  VpName     = гл_oVFP9.Name;                                // Returns the application object's name.
  VpFullName = гл_oVFP9.FullName;                            // Returns the application object's full name.
  VpVersion  = гл_oVFP9.Version;                             // Returns the version of the automation server

  гл_oVFP9.Visible = 1;                                      // Если желаем лицезреть main window VFP 
  гл_oVFP9.Caption = "Привет от 1С";                         // Меняем заголовок main window VFP 

  гл_oVFP9.DefaultFilePath = "C:\temp";                      // Устанавливаем default directory for VP  
  
  гл_oVFP9.StatusBar       =                                 // Выводим в статус бар main window VFP 
   "Дата и текущее время " + ТекущаяДата() + " " + 
                             ТекущееВремя();

  гл_oVFP9.DoCmd(                                            // Открываем таблицу
   "USE examples.dbf"
  );
  
  гл_oVFP9.Quit();                                           // Закрываем VFP
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376518
Emery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИМХУ VFP вещь в себе, т.е. замкнутая самодостаточная среда. Именно этим он хорош.
Как известно, политика M$ состоит в том, что ни один их продукт не должен быть по настоящему «самодостаточен». По принципу Гоголя: «Вот если бы нос взять от Ивана Петровича, уши от Петра Спиридоновича, глаза от Кондратия Дорминдонтовича, то глядишь и жених был бы что надо». При использовании любой программы от Мелкософта, всегда остается впечатления, что ей для полного счастья не хватает чуть-чуть чего-то еще. В данном случае, для самодостаточности, у VFP маловато графических возможностей. Слишком уж убога его графика по современным меркам. Пример «Паруса» в этом смысле более чем показателен. Зато возможности движка VFP исключительно хороши. Видимо, используемая там технология Rushmore действительно стоящая.

Dima TТо что к нему можно обратиться через COM это побочный эффект заложенный МС, они везде COM внедряли, 99% разработчиков на фоксе даже не знают об этом, т.к. это ненужные знания. Фишка фокса в том что прога на фоксе запустится после простого копирования, а COM-сервер надо регистрировать под админом.
Естественно, если ограничиваться только средой VFP, то КОМ не нужен. Но если применять ФоксПро в связке с другой программой, предоставляющий нормальный интерфейс (тот же C++ с wxWidgets / Qt и много чего еще), то нужны средства доступа к нему. Для этого официально можно использовать только COM и OLE (посредством истинно КОМовской обёрточной dll, генерируемой средой VFP или саму программу vfp9.exe с опцией /automation либо /regserver). Можно еще задействовать ехе-шник, генерируемый VFP для запуска как внешнее приложение в другой программе. Именно так у меня работает учет зарплаты на 1C77. Из «семерки» вызывается внешнее приложение VFP, которая работает с 1С как с DDE-сервером. А то, что для этого нужно регистрироваться под админом нет никакой проблемы. Я сам админ, поэтому лично меня это совершенно не ограничивает. Другое дело, что COM / OLE / ActiveX слишком изощренная технология и нужна скорее такому монстру как M$, чем простому программисту. Зачем мне использовать окружной путь GUID или ProgId / Реестр / exe или dll, если кроме моей программы никто с КОМ-серверами работать не будет? Мне проще использовать dll-ку непосредственно, статически прилинкованную к моему проекту. Для vfp9t.dll / vfp9r.dll для этих целей удобно использовать не документируемую функцию DllWinMain, что я и делаю.

Dima TТо что ты находишь то что никто никогда не искал - похвально, молодец что нашел, но я бы посоветовал забыть и забить, т.к. тут ничего не отлажено, потому что никто так не использует фокс, можешь запросто наступить на грабли, которые никто никогда уже не исправит, увы.
На самом деле эту информацию искали многие, но мало кто находил. Я знаю только один открытый источник по примеру использования DllWinMain на каком-то японском или китайском сайте. Мне это было известно еще за два года до них. Многие задавали вопросы на форумах, но не находили удовлетворительных ответов. Я до недавнего времени делал акцент на DllOleInit / VFPDllGetClassObject, в крайнем случае, легкую обёртку для них, пока не пришел к выводу, что если использовать VFP как простой сервер, который можно получить через DllWinMain(SomeObjectVFPFile, SW_HIDE), то смогу решить все свои проблемы. Здесь SomeObjectVFPFile это некоторый app / fxp / exe файл, который переводит VFP в состояние простого DDE-сервера. Также можно использовать VFP для связи через порты, сокеты и т.п., что угодно, на любой вкус. Однако DDE это самый эффективный способ для организации двустороннего обмена данными.

Так что я не разделяю твой пессимизм. Мне этот путь нравиться и я попытаюсь довести свою программу до ума. Ну а будут или нет другие использовать рантаймные библиотеки ФоксПро, для меня не слишком актуально. Я ведь никому не навязываю свою мнение, просто делюсь информацией, которую сам долго искал.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376523
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Boban5Vik_Fix Как может инструмент устареть? от того что он давно не обновляется, разве стал хуже работать?
Время вокруг необновляемого инструмента может уйти вперед. Вместе с запросами клиентов.Это суждение "типичное" и оно часто многими высказывается по разным поводам для разных программных продуктов и операционных системам.

В чем же "анатомия" данного типа суждений.
А вот в чем.

Плохому танцору то левое яйцо мешает, то правое, то оба сразу.

В чем проблема прикрутить к VFP хоть QT, хоть .Net /.Net вообще не сложно прикрутить и использовать native код к примеру C# из VFP/ ...?

Ответ прост.
Яйца мешают.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376531
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EmeryИз «семерки» вызывается внешнее приложение VFP, которая работает с 1С как с DDE-серверомDDE не использовал.
Просьба привести исходный код /или часть кода/ демонстрирующий использование DDE из 1С.

Гм.
Ностальжи.

Уже ранее рассказывал про свой подход при разработке проектов с использованием Foxpro.
Так вот 90% кода в проектах - код полученный программно на основе мета данных.
Надеюсь в 2017 в разрабатываемой мной технологической платформе этот код "оживет" /по крайней мере конвертацию диалоговых форм уже сделал .../.
Не забуду в платформе и VFP ... /позже расскажу о чем речь/.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376542
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EmeryДругое дело, что COM / OLE / ActiveX слишком изощренная технология и нужна скорее такому монстру как M$, чем простому программисту. Вы уж извините за резкость суждений.
Многие говорят о том что они знают и понимают COM / OLE / ActiveX технологии, а на поверку - увы.
И как правило от незнания их рассказывают об супер сложности, запутанности, нецелесообразности ...

Ладно предположим на C++ действительно нужно месяца два "попотеть", чтобы разобраться как использовать COM / OLE / ActiveX, но
тот же VB /к примеру/ прекрасно прячет все премудрости /правда не на 100%/, которые нужно знать для того, чтобы разрабатывать к
примеру ActiveX.

Кому нужно тот использует и не придумывает "отмазки".
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376556
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EmeryМне этот путь нравиться и я попытаюсь довести свою программу до ума. Ну а будут или нет другие использовать рантаймные библиотеки ФоксПро, для меня не слишком актуально. Я ведь никому не навязываю свою мнение, просто делюсь информацией, которую сам долго искал.Здесь вам респект.
Читал топики в которых вы объясняли как напрямую можно использовать dll-s VFP.
Просьба обновить ваши посты и поведать всем об новых ваших изысканиях ...
Просьба опубликовать примеры исходников демонстрирующих использование dll-s VFP /желательно с комментариями/.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376560
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EmeryDima TИМХУ VFP вещь в себе, т.е. замкнутая самодостаточная среда. Именно этим он хорош.
Как известно, политика M$ состоит в том, что ни один их продукт не должен быть по настоящему «самодостаточен».
ИМХУ может МС похоронил фокс именно потому что не вписался он в эту общую концепцию.

EmeryВ данном случае, для самодостаточности, у VFP маловато графических возможностей. Слишком уж убога его графика по современным меркам.
Кому как. Мне хватает. Правда пришлось наваять ряд самодельных контролов для замены штатных (исключительно средствами фокса).
Наверно от решаемых задач зависит. В учете чего-нибудь дизайн не самое главное.

Невизуальная часть отлично расширяется написанием собственных DLL на С/С++ и использование их из фокса.

EmeryЕстественно, если ограничиваться только средой VFP, то КОМ не нужен. Но если применять ФоксПро в связке с другой программой, предоставляющий нормальный интерфейс (тот же C++ с wxWidgets / Qt и много чего еще), то нужны средства доступа к нему.
На фоксе можно СОМ-сервер написать
Код: sql
1.
DEFINE CLASS MyObject AS Custom OLEPUBLIC


и использовать его извне, из той же 1С
Код: sql
1.
 = СоздатьОбъект( "MyProg.MyObject" );


Как-то делал для связки 1С с софтом на фоксе. Как делать в книгах расписано, сложностей не возникло.

Если код на фоксе запускать не нужно, а только работа с данными в фоксовой БД, то есть VFPOLEDB .
EmeryА то, что для этого нужно регистрироваться под админом нет никакой проблемы. Я сам админ, поэтому лично меня это совершенно не ограничивает.
У меня админы чужие, поэтому иногда установка может превратиться в гимор с поиском админа. А так закинул папку с прогой, ярлык вытащил и все работает.
EmeryЗдесь SomeObjectVFPFile это некоторый app / fxp / exe файл, который переводит VFP в состояние простого DDE-сервера. Также можно использовать VFP для связи через порты, сокеты и т.п., что угодно, на любой вкус. Однако DDE это самый эффективный способ для организации двустороннего обмена данными.
DDE ни разу не использовал, а общаться с прогой на фоксе через порты, сокеты и т.п. можно просто запустив эту прогу. Можно обмен вынести в DLL. Вот мой пример через mailslot. Непонятно зачем тут усложнять прямой работой с vfp9t.dll / vfp9r.dll.

ИМХУ разобрался - молодец, но какой-то сложный у тебя путь получился.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376656
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"У Mocrosoft давно родилась елочка.
С ActiveX она росла.
И много, много радости программистам VFP она принесла!"

PS: С наступающим Рождеством Христовым!
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376752
Emery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Поможем ...
В архиве idl, содержащие данные об интерфейсах предоставляемых VFP9.
Ну, эту и подобную информацию, например, оберточные классы vfp9t.h / vfp9t.cpp получить не проблема средствами Visual C++ v.6 и выше. Только к OCXAPIInit это не имеет никакого отношения.

Владимир2012Проще всего /без всяких извратов/ их можно использовать в 1С 7.7 или 1С 8.x.
Также выбирайте на вкус: VB, C# ... /и в том же духе/.
Я уже выбрал C++ with frameworks wxWidgets / Qt. Для меня этого более, чем достаточно.

Владимир2012Имеется ли у вас документация с описание COM интерфейсов /типа документации к примеру объектной модели Excel для VBA/?
Документации у меня нет, но генерируемой Visual C++ typelib информации vfp9.tlh / vfp9.tli (например, с помощью директивы #import "vfp9t.dll") либо оберточных классов vfp9t.h / vfp9t.cpp (MFC Class Wizard \ Add Class \ Import from Time Library \ vfp9t.dll \ OK) вполне достаточно.

Владимир2012Мне любопытно было бы попробовать поработать с VFP9 с использованием OLE.
Для этого регистрируем VFP OLE-сервер, командой vfp9.exe с опцией /automation либо /regserver. Затем, если мы хотим использовать С++, пишем программу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
//======================================================================
// VfpOle.cpp : Defines the entry point for the application
//======================================================================

#include "StdAfx.h"

// Здесь можно оставить один заголовок
#include "vfp9.tlh"
#include "vfp9.h"


//======================================================================
// CheckHR()
//======================================================================
BOOL CheckHR(HRESULT hr) {
	if(FAILED(hr)) {
		_com_error er(hr);
		MessageBox(NULL, er.ErrorMessage(), _T("Error"), MB_OK);

		return FALSE;
	}

	return TRUE;
}  // CheckHR()

//======================================================================
// WinMain()
//======================================================================
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	CoInitialize(NULL);

{  // Блок безопасности COM

	// Для #include "vfp9.tlh"

	Application Vfp9;

	if(!CheckHR(Vfp9.CreateDispatch(_T("VisualFoxpro.Application.9")))) {  // CLSCTX_LOCAL_SERVER
		return -1;
	}

	Vfp9.DoCmd(_T("SET SAFETY OFF"));
	Vfp9.DoCmd(_T("SET DATE GERMAN"));
	Vfp9.DoCmd(_T("SET CENTURY ON"));
	Vfp9.DoCmd(_T("CREATE TABLE D:\\MyDocs\\Emery1.dbf (Code N(5), Line C(50), CurDate D(10))"));
	Vfp9.DoCmd(_T("INSERT INTO Emery1 (Code, Line, CurDate) VALUES (2, 'Привет, Emery из Visual FoxPro!', DATE(2016, 12, 28))"));
	Vfp9.DoCmd(_T("INSERT INTO Emery1 (Code, Line, CurDate) VALUES (3, 'Как твои дела?', DATE(2017, 1, 1))"));
	Vfp9.DoCmd(_T("INSERT INTO Emery1 (Code, Line, CurDate) VALUES (1, 'С Новым 2017 годом!', DATE(2016, 12, 31))"));
	Vfp9.DoCmd(_T("SELECT * FROM Emery1 ORDER BY Code INTO TABLE D:\\MyDocs\\Emery2.dbf"));
	Vfp9.DoCmd(_T("CLOSE ALL"));

	Vfp9.Quit();

	// Для #include "vfp9.h"
	
	VisualFoxpro::ApplicationPtr pVfp9;	

	if(!CheckHR(pVfp9.CreateInstance(_T("VisualFoxpro.Application.9")))) {  // CLSCTX_LOCAL_SERVER
		return -1;
	}

	pVfp9->DoCmd(_T("SET SAFETY OFF"));
	pVfp9->DoCmd(_T("SET DATE GERMAN"));
	pVfp9->DoCmd(_T("SET CENTURY ON"));
	pVfp9->DoCmd(_T("USE D:\\MyDocs\\Emery1"));
	pVfp9->DoCmd(_T("SELECT * FROM Emery1 ORDER BY CurDate INTO TABLE D:\\MyDocs\\Emery3.dbf"));
	pVfp9->DoCmd(_T("CLOSE ALL"));

	pVfp9->Quit();

}  // Блок безопасности COM

	CoUninitialize();

	return 0;
}  // WinMain()

//======================================================================
//======================================================================


Причем это далеко не единственный вариант использования.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376755
Emery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь представлены исходники примера.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376791
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EmeryМожно еще задействовать ехе-шник, генерируемый VFP для запуска как внешнее приложение в другой программе. Именно так у меня работает учет зарплаты на 1C77. Из «семерки» вызывается внешнее приложение VFP, которая работает с 1С как с DDE-сервером.Вот этот момент не понятен.
Зачем их С++ вызывать собранный VFP exe если можно напрямую работать с использование интерфейсов предоставляемых VFP?

Все же повторю просьбу о публикации исходного текста с использованием DDE для обмена данными с VFP.

За пример работы из C++ по OLE с VFP - спасибо!
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376796
Emery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012EmeryИз «семерки» вызывается внешнее приложение VFP, которая работает с 1С как с DDE-серверомDDE не использовал.
Просьба привести исходный код /или часть кода/ демонстрирующий использование DDE из 1С.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
//******************************************************************************
// Выполнить()
//
// Параметры:
//
// Возвращаемое значение:
//
// Описание:
//
Процедура Выполнить()               
	Если МонопольныйРежим() = 1 Тогда
		Предупреждение("Для расчета данных необходимо выйти из монопольного режима!");
		Возврат;
	КонецЕсли;
	
	глНачВремя = _GetPerformanceCounter();

	q = Симв(34);
	qq = q+Симв(32)+q;	
	
	//----------------------------------------------------------------------------
	// Удедиться, что имеются необходимые исходные данные
	Если ПустоеЗначение(ГруппаТабелей) = 1 Тогда
		Если ПустоеЗначение(ПодрСотр) = 1 Тогда
		  Предупреждение("Неопределенно подразделение сотрудника!");
		  Возврат;
		КонецЕсли;
	КонецЕсли;
		    
	Если ПустоеЗначение(ОтчДата) = 1 Тогда
	  Предупреждение("Неопределенна отчетная дата!");
	  Возврат;
	КонецЕсли;       
		
	Если (ПустоеЗначение(ПолнКод) = 1) И (СохранятьРасчет = 1) Тогда
	  Предупреждение("Неопределен полный код группы для результатов расчета!");
	  Возврат;
	КонецЕсли;       
	
	Если ПустоеЗначение(глПланДней) = 1 Тогда
	  Предупреждение("Неопределенно количество плановых дней!");
	  Возврат;
	КонецЕсли;       
	
	Если ПустоеЗначение(глПланЧасов) = 1 Тогда
	  Предупреждение("Неопределенно количество плановых часов!");
	  Возврат;
	КонецЕсли;       
	
	//----------------------------------------------------------------------------
	// Провести расчет с помощью внешнего приложения VFP 7.0 LionUZP.exe
	СтрОтчДата = Формат(ОтчДата, "DDDMMYYYY");
	СтрПризнГруппы = СокрЛП(Строка(ГруппаТабелей.ЭтоГруппа()));
	
	Если ПустоеЗначение(ГруппаТабелей) = 0 Тогда
		Если СтрПризнГруппы = "1" Тогда  // Это группа
			КодГруппы = ГруппаТабелей.ПолныйКод();          
			PersId = "''";
			LgKatId = "''";
		Иначе  // Это конечный элемент                    
			КодГруппы = "''";
			PersId = _IdToStr(СокрЛП(Лев(Прав(ЗначениеВСтрокуВнутр(ГруппаТабелей.ПодрСотр.Владелец),11),9)));
			LgKatId = _IdToStr(СокрЛП(Лев(Прав(ЗначениеВСтрокуВнутр(ГруппаТабелей.ПодрСотр.ЛьготаКатегории),11),9)));
		КонецЕсли;                              
	Иначе
		КодГруппы = "''";
		PersId = _IdToStr(СокрЛП(Лев(Прав(ЗначениеВСтрокуВнутр(ПодрСотр.Владелец),11),9)));
		LgKatId = _IdToStr(СокрЛП(Лев(Прав(ЗначениеВСтрокуВнутр(ПодрСотр.ЛьготаКатегории),11),9)));
	                         
		//глПланЧасыСотр = глПолучитьПланЧасыСотр(ПодрСотр, ОтчДата, КонМесяца(ОтчДата));
  КонецЕсли;		

	//Сообщить(PersId);
	
	ЗапуститьПриложение(КаталогПрограммы()+"LionUZP.exe "+q+СтрОтчДата+qq+КодГруппы+qq+СтрПризнГруппы+qq+PersId+qq+LgKatId+qq+КаталогИБ()+q);
	
	Возврат;
КонецПроцедуры  // Выполнить()



Здесь LionUZP.exe это внешнее приложение на VisualFoxPro.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376811
Emery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример расчета по одному человеку.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376816
Emery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот часть расчета по инициализации DDE в VFP:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
    && DDE КАНАЛ

    PUBLIC gn_DDEChanNum        && Номер DDE канала для обмена данными с "1С"
    gn_DDEChanNum = DDEINITIATE("1CV7", "DDE")

    PUBLIC gs_FullDescr1C
    PUBLIC gn_PlanDays1C
    PUBLIC gn_PlanHours1C
    PUBLIC gs_FullSaveGroupCode1C
    PUBLIC gs_SaveCalc1C
    PUBLIC gs_CalcProtocol1C
    PUBLIC gl_IsCalcZPInLog
    PUBLIC gn_KolZnOkrInRates
    PUBLIC gn_KolZnOkrInRBolnL
    PUBLIC gn_KolZnOkrInROtpusk
    PUBLIC gn_RazmOsnSocLg
    PUBLIC gn_WorkLifeMin
    PUBLIC gn_MinZarplata
    PUBLIC gn_MaxVwslLetZaGod
    PUBLIC gn_MaxVwslLetZaMes
    PUBLIC gn_MaxBaseSocNals
    PUBLIC gs_UchitObyazSborsForAliments
    PUBLIC gs_VklPochtSbNaAlimVSumAlim
    PUBLIC gs_CalcProfVznosInOtherPeriods
    PUBLIC gs_CalcBolnListByHours
    PUBLIC gs_IspolzTekMesForCalcBL
    PUBLIC gs_NotDaysBLNotSumma
    PUBLIC gs_UchitIndPlanWorks
*    PUBLIC gs_KoefIndSrednOtp
    PUBLIC gn_KoefIndSrednOtp
    PUBLIC gn_KoefIndSrednBL
    PUBLIC gd_MaxDateKoefIndOtp
    PUBLIC gd_MaxDateKoefIndBL
    PUBLIC gd_DateNachDeystvBL
    PUBLIC gd_DateNachDeystvOtp
    PUBLIC ARRAY gan_KoefIndSrednih[12]
    PUBLIC gn_PlanDays
    PUBLIC gn_PlanHours
    PUBLIC gn_WorkDays
    PUBLIC gn_WorkHours
    
    PUBLIC s_DateNachDeystvBL
    PUBLIC s_DateNachDeystvOtp
    
    PUBLIC _DayRate_
    _DayRate_ = 0

    IF gn_DDEChanNum > -1 
        gs_FullDescr1C = ALLTRIM(DDEREQUEST(gn_DDEChanNum, "глПолнНаим"))
        gn_PlanDays1C = VAL(DDEREQUEST(gn_DDEChanNum, "глПланДней"))
        gn_PlanHours1C = VAL(DDEREQUEST(gn_DDEChanNum, "глПланЧасов"))
        gs_FullSaveGroupCode1C = ALLTRIM(DDEREQUEST(gn_DDEChanNum, "глПолныйКод"))
        gs_SaveCalc1C = DDEREQUEST(gn_DDEChanNum, "глСохранятьРасчет")
        gs_CalcProtocol1C = DDEREQUEST(gn_DDEChanNum, "глПротоколРасчета")
        gl_IsCalcZPInLog = IIF(gs_CalcProtocol1C == "1", .T., .F.)        && Писать в файл протокола (LogFile)?    
        gn_KolZnOkrInRates = VAL(Get1CConst("КолЗнаковОкрВРасценках", gs_NachOtchPer))
        gn_KolZnOkrInRBolnL = VAL(Get1CConst("КолЗнаковОкрВСрДнБолЛ", gs_NachOtchPer))
        gn_KolZnOkrInROtpusk = VAL(Get1CConst("КолЗнаковОкрВСрДнОтпуск", gs_NachOtchPer))
        gn_RazmOsnSocLg = VAL(Get1CConst("РазмерОснСоцЛьг", gs_NachOtchPer))
        gn_WorkLifeMin = VAL(Get1CConst("ПрожитМинДляРабот", gs_NachOtchPer))
        gn_MinZarplata = VAL(Get1CConst("МинЗарплата", gs_NachOtchPer))
        gn_MaxVwslLetZaGod = VAL(Get1CConst("МаксВыслЛетЗаГод", gs_NachOtchPer))
        gn_MaxBaseSocNals = VAL(Get1CConst("МаксЗарплДляСоцНалогов", gs_NachOtchPer))
        gs_UchitObyazSborsForAliments = Get1CConst("УчитыватьОбязСборыДляАлим", gs_NachOtchPer)
        gs_VklPochtSbNaAlimVSumAlim = Get1CConst("ВключатьПочтСборНаАлимВСумАлим", gs_NachOtchPer)
        gs_CalcProfVznosInOtherPeriods = Get1CConst("СчитатьПрофВзносВДругихПериод", gs_NachOtchPer)
        gs_CalcBolnListByHours = Get1CConst("РасчетБольничныхПоЧасам", gs_NachOtchPer)
        gs_IspolzTekMesForCalcBL = Get1CConst("ИсполТекущМесДляРасчБЛ", gs_NachOtchPer)
        gs_NotDaysBLNotSumma = Get1CConst("НетДнейБЛНетСуммы", gs_NachOtchPer)
        gs_UchitIndPlanWorks = Get1CConst("УчитыватьПланЧасыПоИндГраф", gs_NachOtchPer)
        
*        gs_KoefIndSrednOtp = Get1CConst("КоэфИндРасчСреднихОтпуска", gs_NachOtchPer)
*        gn_KoefIndSrednOtp = VAL(gs_KoefIndSrednOtp)
        gn_KoefIndSrednOtp = VAL(Get1CConst("КоэфИндРасчСреднихОтпуска", gs_NachOtchPer))
        gn_KoefIndSrednBL = VAL(Get1CConst("КоэфИндРасчСреднихБЛ", gs_NachOtchPer))

        s_MaxDateKoefIndOtp = ALLTRIM(Get1CConst("МаксДатаДействКоэфИндОтп", gs_NachOtchPer))
        yyyy = VAL(RIGHT(s_MaxDateKoefIndOtp, 4))
        mm = VAL(SUBSTR(s_MaxDateKoefIndOtp, 4, 2))
        dd = VAL(LEFT(s_MaxDateKoefIndOtp, 2))
        gd_MaxDateKoefIndOtp = DATE(yyyy, mm, dd)

        s_MaxDateKoefIndBL = ALLTRIM(Get1CConst("МаксДатаДействКоэфИндБЛ", gs_NachOtchPer))
        yyyy = VAL(RIGHT(s_MaxDateKoefIndBL, 4))
        mm = VAL(SUBSTR(s_MaxDateKoefIndBL, 4, 2))
        dd = VAL(LEFT(s_MaxDateKoefIndBL, 2))
        gd_MaxDateKoefIndBL = DATE(yyyy, mm, dd)
        
        TRY
            s_DateNachDeystvBL = ALLTRIM(DDEREQUEST(gn_DDEChanNum, "глДатаНачДействияБЛ"))            
            yyyy = VAL(RIGHT(s_DateNachDeystvBL, 4))
            mm = VAL(SUBSTR(s_DateNachDeystvBL, 4, 2))
            dd = VAL(LEFT(s_DateNachDeystvBL, 2))
            gd_DateNachDeystvBL = DATE(yyyy, mm, dd)
        CATCH
            s_DateNachDeystvBL = "01.01.1900"
            gd_DateNachDeystvBL = DATE(1900, 1, 1)
        ENDTRY
        
        TRY
            s_DateNachDeystvOtp = ALLTRIM(DDEREQUEST(gn_DDEChanNum, "глДатаНачДействияОтп"))            
            yyyy = VAL(RIGHT(s_DateNachDeystvOtp, 4))
            mm = VAL(SUBSTR(s_DateNachDeystvOtp, 4, 2))
            dd = VAL(LEFT(s_DateNachDeystvOtp, 2))
            gd_DateNachDeystvOtp = DATE(yyyy, mm, dd)
        CATCH
            s_DateNachDeystvOtp = "01.01.1900"
            gd_DateNachDeystvOtp = DATE(1900, 1, 1)
        ENDTRY
    ELSE
        DO ErrorMessage WITH "Не могу открыть канал DDE для обмена данными!" IN Errors
    ENDIF

* MESSAGEBOX(s_DateNachDeystvBL)
* MESSAGEBOX(s_DateNachDeystvOtp)

    gn_KolZnOkrInRates = IIF(EMPTY(gn_KolZnOkrInRates), 5, gn_KolZnOkrInRates)
    gn_KolZnOkrInRBolnL = IIF(EMPTY(gn_KolZnOkrInRBolnL), gn_KolZnOkrInRates, gn_KolZnOkrInRBolnL)
    gn_KolZnOkrInROtpusk = IIF(EMPTY(gn_KolZnOkrInROtpusk), gn_KolZnOkrInRates, gn_KolZnOkrInROtpusk)
    gn_MaxVwslLetZaMes = ROUND(gn_MaxVwslLetZaGod/12, 2)
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376835
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EmeryА вот часть расчета по инициализации DDE в VFP:Спасибо!
Получает задача "Учет труда и заработной платы" /моя любимая/ у вас разработана на VFP.
Когда ее разработал и внедрял в разного типа предприятий /разве, что рыбсовхозах ее небыло/.
Потом 1С подоспела, конкуренты ..., но users говорили, что на Foxpro все было на много удобней ...
Зачем тогда понадобилась с ней работать из 1С?
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376857
Emery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012EmeryДругое дело, что COM / OLE / ActiveX слишком изощренная технология и нужна скорее такому монстру как M$, чем простому программисту.
Вы уж извините за резкость суждений.
Многие говорят о том что они знают и понимают COM / OLE / ActiveX технологии, а на поверку - увы.
И как правило от незнания их рассказывают об супер сложности, запутанности, нецелесообразности ...

Ладно предположим на C++ действительно нужно месяца два "попотеть", чтобы разобраться как использовать COM / OLE / ActiveX, но
тот же VB /к примеру/ прекрасно прячет все премудрости /правда не на 100%/, которые нужно знать для того, чтобы разрабатывать к
примеру ActiveX.

Кому нужно тот использует и не придумывает "отмазки".
Еще непонятно у кого больше заблуждений. Вот попробуйте дать определение COM / OLE / ActiveX в одном предложении, тогда и посмотрим.

Если использовать мастера в Visual C++, то сгенерировать рабочие примеры для этих технологий не составит никакого труда. С пониманием этого кода трудности будут у многих. Многие авторы толстых книжек по КОМ любят рассказывать, как устроено КОМ, но не любят объяснять, почему оно так устроено и какую конкретно пользу она дает простым программистам. Тем более что сам M$ сплошь и рядом применяет нестандартные вариации КОМ. В мире Линукс прекрасно обходятся без КОМ, используя вместо этого технологию CORBA.

Как по мне COM не намного лучше других подобных технологий, но иногда приходится пользоваться ею, чтобы достичь нужных целей. Если этих же целей можно достичь без COM, то тем лучше.

Что касается Бейсика, то он может получать доступ только Dispatch-интерфейсам. В С++ мы имеем доступ к дуальному интерфейсу (если он реализован), т.е. и к Dispatch и VTable. А Dispatch гораздо медленнее, чем VTable. Кроме того, Бейсику недоступны HRESULT коды возврата работы интерфейсов, а в С++ доступны. А это большой минус в COM-технологии для Бейсико-подобных языков программирования.

И чего вы решили, что речь идет об «отмазках», в данном случае это всего лишь констатация факта. Работаем, не с тем, что хотим, а с тем, что имеем.
...
Рейтинг: 0 / 0
Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
    #39376859
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавить в VFP пяток 1С-их объектов, связанных с бухгалтерий и вот вам супер бухгалтерская платформа.
Что касается архитектуры VFP она безусловно лучше 1С /хотя нужно отдать должное 1С - хорошая технологическая платформа/.
...
Рейтинг: 0 / 0
25 сообщений из 108, страница 2 из 5
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Visual Foxpro устарело. Кто нибудь ещё пишет проекты на Visual Foxpro?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]