:: Visual Foxpro, Foxpro for DOS
Скачал релиз 9, начались проблемы.
Пашок

Сообщений: 706
Дата регистрации: 14.11.2001
Причем в том месте, в котором я совсем не ждал. На 8 все работает. Понять, что происходит, не могу, возможно изменили режим работы read events .

Суть проблемы:

Запускаю приложение, которое имеет главное окно, в нем форма, где запрашиваю пароль пользователя, форма модальная, desktop = .t., обработчик событий (read event) уже включен. На форме стоит кнопка "ОТМЕНА" , у нее в click происходит вызов метода этой формы, который вызывает prg c таким содержанием:

On shut quit
Clear event
quit

8 версия выходила из приложения, 9 тка, вообще ничего не делает, хотя PRG вызывает, но не выходит. Самое странно, что если в тот момент, когда висит это окно нажать на кресстик (прав. верх. угол) выход из приложения тоже не происходит, просиходит закрытия моего модального окна (это вообще странно), а при повторном клике, уже выходит из приложения.
Честно говоря, я вообще ничего не понимаю, что это такое.




------------------
Ratings: 0 negative/0 positive
Re: Скачал релиз 9, начались проблемы.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Пашок!

Законченный пример pls дай, а то не понятно что там и когда и после чего
выполняется. Начнём с того что не видно где уничтожается эта модальная
форма...




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Скачал релиз 9, начались проблемы.
Пашок

Сообщений: 706
Дата регистрации: 14.11.2001
Попробую :

Событие click кнопки, на модальной форме :

thisform.logon_false


метод logon_false этой формы :

DO exit_proc


процедура DO exit_proc :

On shut quit

Clear event
quit


Вот и все.




------------------
Ratings: 0 negative/0 positive
Re: Скачал релиз 9, начались проблемы.
Владимир Максимов
Автор

Сообщений: 14165
Откуда: Москва
Дата регистрации: 02.09.2000
Я сильно удивляюсь, что такое работало в 8. Не должно было!

Quit - команда для ленивых. Вот ты и напоролся на ситуацию, когда видимо сделали более строгое отслеживание событий.

У тебя нигде нет явного закрытия твоей модальной формы (ThisForm.Release()) - как следствие, приложение не может быть закрыто, поскольку висит не уничтоженный объект. Модальная форма ведь не находится под управлением READ EVENTS, поэтому CLEAR EVENTS не оказывает на нее никакого действия.

Кстати, весьма странно выглядит настройка

ON SHUTDOWN QUIT

С последующей командой QUIT, которая должна вызвать срабатывание ON SHUTDOWN. Даже не понятно, что в этом случае должно произойти:

Команда QUIT вызывает срабатывание ON SHUTDOWN
ON SHUTDOWN вызывает команду QUIT
Команда QUIT вызывает срабатывание ON SHUTDOWN
...

Короче, "у попа была собака". Надеюсь, что Fox просто не обработает повторный ON SHUTDOWN. По хорошему, перед выходом надо сбросить настройку ON SHUTDOWN

процедура DO exit_proc :

* Закрытие всех открытых форм
ON SHUTDOWN
CLEAR EVENTS




------------------
Ratings: 0 negative/0 positive
Re: Скачал релиз 9, начались проблемы.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Пашок!

Пример подразумевает и вызывающий код.
И ещё раз:
Цитата:
Начнём с того что не видно где уничтожается эта модальная
форма...




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Скачал релиз 9, начались проблемы.
Пашок

Сообщений: 706
Дата регистрации: 14.11.2001
Как лучше сделать ?

ON SHUTDOWN QUIT
это у меня ошибка, перекинул из другой программы, там была процедура quit

Я попробовал в методе формы написать thisform.release , потом вызвать процедуру с

Clear event
quit

фокс пишет, невозможно выйти из visualfoxpro, вот раньше как хорошо было, дал quit и все вылетело




------------------
Ratings: 0 negative/0 positive
Re: Скачал релиз 9, начались проблемы.
Пашок

Сообщений: 706
Дата регистрации: 14.11.2001
Немного разобрался с особенность проблемы, попробую точнее сформулировать.

Приложение имеет главное окно, включен read event, запущено модальное окно. Задача: нажав на кнопку на этой форме, выйти из фокса.

1 вариант: в событии click кнопки этой формы пишу :
thisform.release
quit

Результат: форма и фокс закрывается, результат получен !

2 вариант: в событии click этой формы вызываю метод этой формы в нем пишу (тоже самое):
thisform.release
quit

Результат: модальная форма закрылась, фокс стоит (если сделать в этот момент clear even, то закроется, проверял)

Мысли: что-то у него с очередью на события не все в порядке




------------------
Ratings: 0 negative/0 positive
Re: Скачал релиз 9, начались проблемы.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Пашок!

Не мудри, напиши в твоей кнопке ThisForm.Release(), а в Form.Unload напиши
CLEAR EVENTS.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Скачал релиз 9, начались проблемы.
Владимир Максимов
Автор

Сообщений: 14165
Откуда: Москва
Дата регистрации: 02.09.2000
Вот невнимательно ты прочитал мою попытку написать статью о главном (стартовом) файле (если вообще читал)

forum.foxclub.ru

Попробую по пунктам:

Команда CLEAR EVENTS работает примерно также как и команда RETURN TO MASTER. Т.е. кроме того, что она отменяет действие команды READ EVENTS она еще и немедленно передает управление в ту процедуру или метод, где собственно и была дана команда READ EVENTS.

Как следствие, все то, что стоит следом за командой CLEAR EVENTS просто никогда не выполняется.

Но! Это то, как должно бы было все работать, если бы речь не шла о модальной форме. С модальной формой все несколько по другому. Насколько я понимаю, твоя главная прога выглядит примерно так:

DO FORM MyModalForm.scx
READ EVENTS

Так вот. Когда ты запускаешь свою модальную форму, то на этом процес выполнения главного файла останавливается. Т.е. до команды READ EVENTS дело вообще не доходит! Сама модальная форма становиться такой точкой останова! Поэтому команда CLEAR EVENTS будет просто проигнорирована. Нет активной команды READ EVENTS.

Если теперь ты закроешь свою модальную форму (ThisForm.Release()), то выполнение главного файла будет продолжено и наконец выполниться команда READ EVENTS. Но теперь у тебя вообще не отображено никакой формы! FoxPro - завис.

Как надо "штатно" закрыть приложение?

Для начала, надо определиться с идеологией главного файла:

-) только модальная форма без READ EVENTS
-) не модальная форма с READ EVENTS
-) и модальная форма, и READ EVENTS

Каждая из этих идеологий требует своего собственного подхода к закрытию FoxPro

-) только модальная форма без READ EVENTS

Для закрытия приложения FoxPro достаточно закрыть саму форму (ThisForm.Release()). Команду QUIT если очень хочется следует давать вне самой формы. Можно сразу за командой DO FORM. Хотя необходимости в ней нет.

-) не модальная форма с READ EVENTS

Сама форма закрывается стандартным способом (ThisForm.Release()). В методе UNLOAD-формы надо дать команду CLEAR EVENTS. Команду QUIT если очень хочется следует давать вне самой формы. Можно сразу за командой READ EVENTS. Хотя необходимости в ней нет.

-) и модальная форма, и READ EVENTS

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

В этом случае необходимо передать во вне формы некий признак, по значению которого мы и будет принимать решение о выходе из программы. Т.е. ни в коем случае не надо выходить из приложения FoxPro в самой модальной форме!

Простейший вариант такого решения это примерно такая схема:

LOCAL IsExit
IsExit = .F.
DO MyMenu.mpr
DO FORM MyModalForm.scx TO IsExit
IF m.IsExit = .F.
READ EVENTS
ENDIF

Т.е. в данном случае модальная форма просто закрывается (ThisForm.Release()), а в методе UNLOAD дается команда

RETURN .T.
или
RETURN .F.

По результатам диалога с пользователем. Следует только помнить, что к моменту выполнения метода UNLOAD все объекты формы уже уничтожены. Т.е. результат диалога с пользователм надо записать в проперти формы. Они еще существую к этому моменту.

Ну, и опять же, команду QUIT если очень хочется следует давать вне самой формы. Можно сразу за командой READ EVENTS. Хотя необходимости в ней нет.




------------------
Ratings: 0 negative/0 positive


Эта тема закрыта.

On-line: 32 chunihin-df  (Гостей: 31)

© 2000-2025 Fox Club 
Яндекс.Метрика