Почему FoxPro не выпускает мой файл APP? - PullRequest
1 голос
/ 14 марта 2012

Я портирую старое приложение FoxPro на Visual FoxPro.Старая программа, конечно, не использовала никаких классов, но я начал использовать их для определенных случаев.Это вызвало проблему в цикле разработки, о которой я нигде не упоминал.

По сути, если я создаю объект на основе класса, определенного в файле процедуры, то FoxPro никогда не отпустит мое приложение.,Я не могу удалить его или восстановить его, и мне приходится перезапускать VFP каждый раз, когда я делаю изменения.

Шаги для воспроизведения.Сделайте a.prg с

SET PROCEDURE TO b
m.test1 = CREATEOBJECT('TestClass')
RELEASE m.test1

и сделайте b.prg с

DEFINE CLASS TestClass AS Control
ENDDEFINE

Создайте проект с именем a:

MODIFY PROJECT a

И добавьте программуa.prg.Тогда

BUILD APP a FROM a
DO a.app
DELETE FILE a.app

Последняя строка даст

Application file 'c:\...\b.fxp' is not closed

Затем, если вы попробуете DELETE снова, он скажет

File access is denied c:\...\a.app

Я вижу вProcess Explorer, у которого vfp9.exe есть дескриптор файла APP, который никогда не исчезнет, ​​пока я не выйду из FoxPro, независимо от того, что я пытаюсь:

  • УСТАНОВИТЬ ПРОЦЕДУРУ
  • ЗАКРЫТЬ ВСЕ
  • RELEASE ALL
  • CANCEL
  • CLEAR ALL
  • до тошноты

Ответы [ 4 ]

1 голос
/ 14 марта 2012

Попробуйте команду ОТМЕНА .

Завершает выполнение текущего файла программы Visual FoxPro. контроль возвращается в окно команд при использовании Visual FoxPro в интерактивном режиме. Если запущено распределенное приложение времени выполнения, ОТМЕНА завершает работу приложения, и управление возвращается в Windows. Если программа выполняется в Visual FoxPro во время разработки, ОТМЕНА завершает программу, и управление возвращается в окно команд.
Выполнение CANCEL освобождает все частные переменные.

0 голосов
/ 16 марта 2012

Я сделал то, что у вас было почти дословно ... единственное изменение было в .prg

SET PROCEDURE TO b
m.test1 = CREATEOBJECT('TestClass')
RELEASE m.test1
SET PROCEDURE TO   <-- I Added this line

Кроме того, ваша попытка DELETE A.App не удалось бы ... Если только это не был упс.

DELETE - это команда для удаления записей из таблицы. Я думаю, ты имел в виду ERASE a.App Поскольку ни одна таблица не была доступна, она не могла действовать по команде DELETE и, возможно, давала вам неверно направленное сообщение. Но, поместив закрывающий «SET PROCEDURE TO» в конце «a.prg», он смог правильно закрыть и стереть файл a.app после завершения.

0 голосов
/ 15 марта 2012

Решение

CLEAR CLASS TestClass

(который, кстати, не проиндексирован в файле справки).

В реальном приложении мне пришлось тщательно составить сценарий процедуры выпуска, чтобы я мог выйти из этого состояния в случае ошибки. Но CLEAR CLASS было недостающим звеном.

0 голосов
/ 15 марта 2012

Я не вижу CLEAR ALL среди всего, что вы пробовали.Моя стандартная очистка:

CLOSE ALL
CLEAR ALL

Тамар

...