Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Закрыть все формы из процедуры в меню / 19 сообщений из 19, страница 1 из 1
25.01.2008, 16:27
    #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
26.01.2008, 22:56
    #35089814
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все формы из процедуры в меню
Скорее всего, модальность. Попробуй закрывать формы так:

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

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

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

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

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

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

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

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

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

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

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

вфп9сп2

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

запустить

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

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

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

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

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

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

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

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

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

код
...
Рейтинг: 0 / 0
30.01.2008, 17:44
    #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
30.01.2008, 17:44
    #35098469
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все формы из процедуры в меню
http://forum.foxclub.ru/read.php?29,296850,296850#msg-296850

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

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

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

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

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


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