powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Закрыть все формы из процедуры в меню
19 сообщений из 19, страница 1 из 1
Закрыть все формы из процедуры в меню
    #35088369
s_gonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для выполнения некой служебной операции надо закрыть все открытые формы.
Чаще всего, она одна :-), да еще тулбар.
В меню создал процедуру с таким кодом:

LOCAL lnrez,lni

lnrez=_screen.FormCount
FOR lni=1 TO lnrez
IF TYPE("_screen.Forms[lni]")!="O" OR ISNULL(_screen.Forms[lni])
EXIT
ELSE
IF UPPER(_screen.Forms[lni].name)!="MTOOLBAR"
_screen.Forms[lni].release()
ENDIF
ENDIF
ENDFOR
lnrez=MESSAGEBOX("Выполнить некую операцию ?",4+32+256,'Внимание')
IF lnrez=6
do myprog.prg
ELSE
WAIT WINDOW 'Ну и не надо!' TIMEOUT 1
ENDIF

Однако форма закрывается только после завершения этой процедуры.
Что ей мешает закрыться тогда, когда мне надо, _до_ вызова myprog.prg ?
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35089814
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего, модальность. Попробуй закрывать формы так:

Код: plaintext
1.
2.
3.
loForm = _screen.Forms[lni]
loForm.Hide()
loForm.Release()

Предварительное сокрытие формы через метод Hide() отменяет модальность формы и позволяет ей себя закрыть.

Хотя, в общем случае, процесс закрытия всех открытых форм это не такая простая задача как может показаться. Попробуй сделать поиск по данному форуму. Проблема уже обсуждалась.
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35094959
s_gonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМСкорее всего, модальность. Попробуй закрывать формы так:

Код: plaintext
1.
2.
3.
loForm = _screen.Forms[lni]
loForm.Hide()
loForm.Release()

Предварительное сокрытие формы через метод Hide() отменяет модальность формы и позволяет ей себя закрыть.

Хотя, в общем случае, процесс закрытия всех открытых форм это не такая простая задача как может показаться. Попробуй сделать поиск по данному форуму. Проблема уже обсуждалась.

ТАК все, что надо, закрывается. Спасибо.
Однако, форма не была модальной. Что-то другое мешало...
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35095000
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может ActiveX "болтался" на ней ?
С уважением, Алексей
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35095368
s_gonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KМожет ActiveX "болтался" на ней ?
С уважением, Алексей
С предыдущим сообщением я поспешил :-(
На самом деле, форма только "прячется", но не убивается.
ActiveX в проекте не используется. Тут что-то иное, даже интересно стало.
Опытным путем обнаружил, что не убивается форма при определенных условиях.
Добавил в проект пример.
Простая немодальная форма, в ДЕ открыта 1 таблица. Буферизация отключена.
На форме грид, который отображает данные таблицы, и кнопка.
Все на основе базовых классов, никакие методы не переопределялись (кнопка тоже).
Так вот, если фокус у грида, форма не закрывется, если у кнопки - закрывается
программкой из первого сообщения этой ветки без проблем.
Что бы это значило?
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35095385
s_gonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KМожет ActiveX "болтался" на ней ?
С уважением, Алексей
Могу добавить, что используется VFP9 SP2, если это имеет значение.
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35095786
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оч.
настораживает Ваше сообщение ...

сам только как вчера 4 часа вчера форму

с ума сошел ...

ухожу на кнопку - ок
или увожу фокус с формы на другую - ок

фокус на гриде - не рушится - не выполняется метод дестрой формы
извращения с фокусировкой, дерганьем формы,
убивание всех объектов в релизе .... и другие шам-ва рез-та не дали

вфп9сп2

возможно простое совпадение ....
но у меня ответа нет - сам под столом
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35097958
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот без классов

запустить

нажать - Закрыть все

метод формы дестрой вып-ся
после того как закончится вып-е проц-ры закр-я форм

Ваши соображения?
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35098277
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подергайте пример

на др.версиях (кроме 9сп2) повторяется?
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35098340
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFP9SP1

Запускаю start.prg
В меню "Закрыть все"
форма с экрана исчезает
потом сообщение "Exit"
потом "Destroy"
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35098407
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрал TRY ... CATCH из start.prg попробовал в VFP6SP5 - тоже самое

Думаю проблема в следующем:
Код меню выполняется в контексте активной формы, поэтому Destroy() не отрабатывает пока код не выполнится.

Другой тест:
Запускаю start.prg
Мышкой кликаю в окно фокса (форма становится не активной)
В меню "Закрыть все"
форма с экрана исчезает
потом "Destroy"
потом сообщение "Exit"

в этом тесте меню отрабатывает в контексте окна фокса.
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35098428
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок

прошу решения проблемы

код
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35098468
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно через таймер порешать. Таймер не начнет работать пока весь остальной код не отработает, если DOEVENT не будет.

Код: 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.
****************
procedure myexit
****************
if type('_screen.tmrExit') != 'O'
	_screen.AddObject('tmrExit', 'tmrExit')
endif
_screen.tmrExit.Interval =  1 
return


DEFINE CLASS tmrExit AS timer
	PROCEDURE Timer
		local lnFormCount, lnNum, loForm
		if this.Interval =  0 
			return
		endif
		this.Interval =  0 
		lnFormCount	= _SCREEN.FORMCOUNT
		FOR lnNum=lnFormCount TO  1  STEP - 1 
			loForm = _SCREEN.FORMS(lnNum)
			if vartype(loForm)="O"
				with loForm
					.hide()
					.RELEASE()
				endwith
			endif
		endfor
		messagebox('exit')
	ENDPROC
ENDDEFINE
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35098469
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://forum.foxclub.ru/read.php?29,296850,296850#msg-296850

нечто оч.похожее

попробуйте увести фокус ....
в прнципе можно увести мышь и кликнуть, но это не решение ...
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35098493
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимопопробуйте увести фокус ....
в прнципе можно увести мышь и кликнуть, но это не решение ...
Это должно быть непрограмно :) иначе код увода фокуса или мыши начнет работать все равно в контексте формы.

Кроме варианта с таймером мыслей больше нет.
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35098501
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подождем др.решения
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35098514
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимоподождем др.решения
А таймер чем не понравился?
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35100028
s_gonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T прошелмимоподождем др.решения
А таймер чем не понравился?
Я тоже сразу о таймере подумал... Это, конечно, решение, но вопрос остался...
Почему есть разница, у кого фокус - у кнопки или у грида?
...
Рейтинг: 0 / 0
Закрыть все формы из процедуры в меню
    #35100595
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s_gonchЯ тоже сразу о таймере подумал... Это, конечно, решение, но вопрос остался...
Почему есть разница, у кого фокус - у кнопки или у грида?

Не знаю - грид фокса вообще очень капризный контрол. Это контейнер, а фокс, например, не вызывает Destroy() формы до тех пор, пока есть ссылки на контролы формы. Может с этим как-то связано.
Я свое предположение объясняющее такое поведение высказал:
Dima TДумаю проблема в следующем:
Код меню выполняется в контексте активной формы, поэтому Destroy() не отрабатывает пока код не выполнится.
Только это не активной формы касается, а грида на ней. Тут похожее предположение сделано:
прошелмимоhttp://forum.foxclub.ru/read.php?29,296850,296850#msg-296850
А исходя из таких предположений - думаю в этой ситуации в фоксе какие-то внутренние события откладываются, и обойти их порядок (дать им выполнится) можно только таймером.

В данной ситуации точный ответ о причине такого поведения могут дать только разработчики VFP, а нам только гадать остается и обходные пути изобретать.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Закрыть все формы из процедуры в меню
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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