powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как закрыть все формы на экране?
25 сообщений из 33, страница 1 из 2
Как закрыть все формы на экране?
    #33066654
sanya_tir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите кто знает, как красиво сделать чтобы закрылись все формы в программе... ток меню чтоб осталось...
Спасибо...
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33066695
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пройтись по колекции _SCREEN.Forms() или _VFP.Forms() и позакрывать все открытые формы
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33066827
sanya_tir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а по-подробнее?
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067020
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А поподробнее - это очень не тривиальная задача. Т.е. в теории все просто:

Код: plaintext
1.
2.
3.
4.
LOCAL lnI
FOR lnI= 1  TO _SCREEN.Forms.Count
	_SCREEN.Forms( 1 ).Hide()
	_SCREEN.Forms( 1 ).Release()
ENDFOR

Это не опечатка, надо всегда использовать именно индекс 1, а не значение счетчика m.lnI, поскольку при закрытии формы общее количество форм в коллекции Forms уменьшается.

Но это теория. А на практике есть масса тонкостей, в результате которых этот код может не сработать или же его надо будет прервать.

Ну, например, если пользователь редактировал данные но еще их не сохранил следует ли его переспросить? А если он попросит подождать?

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

А как быть с модальными формами? А с системными окнами, вроде MessageBox()?
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067079
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно и так, через коллекции
Код: plaintext
1.
2.
3.
4.
5.
FOR EACH loForm IN _SCREEN.Forms
    IF !loForm.QueryUnload()
         loForm.Release()
    ENDIF
ENDFOR
Правда, не все версии VFP нормально работают с коллекциями, но с VFP8 + SP1 и VFP9 все работает нормально.
В зависимости от целей закрытия всех форм, можно поменять реакцию на событие QueryUnload: Прервать закрытие всех форм, если хоть одна не дает себя закрыть или продолжить цикл FOR EACH.
С уваженим, Алексей.
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067111
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощение, ошибся...
Код: plaintext
1.
2.
3.
4.
5.
FOR EACH loForm IN _SCREEN.Forms
    IF loForm.QueryUnload()
         loForm.Release()
    ENDIF
ENDFOR
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067198
sanya_tir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не работает.
Ошибка "Unknown member FORMS."
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067209
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanya_tirне работает.
Ошибка "Unknown member FORMS."
Не понял !!!
Как не работает ? В каком месте.
У меня этот код уже года 3 во всех проектах работает и без проблемм !
Какая версия у вас VFP ?
С уважением, Алексей.
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067211
sanya_tir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простите за неточность...
Не работает вариант ВладимираM
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067230
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanya_tirпростите за неточность...
Не работает вариант ВладимираM
Тогда понятно. Я этот вариант когда-то тоже пробовал, но Владимир забыл поставить в цикле проверку типа:
IF TYPE("_SCREEN.Forms[1]") == "O"....
С уважением, Алексей.
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067694
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код схожий с кодом ВладимираМ , но не совсем :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
local nFormCount

nFormCount = _Screen.FormCount

for i = nFormCount to  1  step - 1 
	_Screen.Forms(i).QueryUnload
	_Screen.Forms(i).Release
next i
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067751
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, опечатка

Такого нет

_SCREEN.Forms.Count

но есть

_SCREEN.FormCount
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067765
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2AleksMed
внесу лепту свою
do while _Screen.FormCount>1
_Screen.Forms(_Screen.FormCount).Release
enddo
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067787
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2leaf
Поехали
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33067970
sanya_tir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33068178
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы все-таки рекомендовал проверять событие _Screen.Forms(i).QueryUnload на предмет возврата из него .T. перед закрытием формы.
Дело в том, что форма не "знает" в какой момент вы решите ее закрыть этим методом массового закрытия форм, а каждая ваша форма "обязана" в методе QueryUnload проверить, что она может корректно закрыться без потери данных(разумеется, с помощью вашего метода).
С уважением, Алексей.
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33068493
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Aleksey-K!

1) Если уж явно вызывать QueryUnload(), то его нужно и писать специальным образом - т.к. штатно там совсем не нужно RETURN .T./.F. делать - ибо фоксу на это глубоко наплевать - там NODEFAULT рулит...
2) Цикл FOR EACH с _SCREEN.Forms обычно не проходит - т.к. по сути он трансформируется в FOR ln1 = 1 TO _SCREEN.FormCount - а это некорректно - если в ходе выполнения цикла формы будут закрываться - нумерация собъётся. Нужно либо цикл FOR ln1 = _SCREEN.FormCount TO 1 STEP -1 крутить, либо закрывать всегда первую форму с циклом DO WHILE. Ну и конечно проверка на TYPE("ссылка_на_форму_полученная_любым_способом.Name") = "C" никогда не помешает :)

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33068650
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
Hi Aleksey-K!
1) Если уж явно вызывать QueryUnload(), то его нужно и писать специальным образом - т.к. штатно там совсем не нужно RETURN .T./.F. делать - ибо фоксу на это глубоко наплевать - там NODEFAULT рулит...

Так я об этом и говорю. Каждая ваша форма должна иметь свой прегруженный метод QueryUnload(), который будет проверять возможность сакрытия "себя", но вызывать его явно необходимо, т.к. Release() сам это не делает
Igor Korolyov
2) Цикл FOR EACH с _SCREEN.Forms обычно не проходит - т.к. по сути он трансформируется в FOR ln1 = 1 TO _SCREEN.FormCount - а это некорректно - если в ходе выполнения цикла формы будут закрываться - нумерация собъётся. Нужно либо цикл FOR ln1 = _SCREEN.FormCount TO 1 STEP -1 крутить, либо закрывать всегда первую форму с циклом DO WHILE.

Вот тут вы не правы, состав коллекции корректируется при каждом изменении ее состава при работе цикла FOR EACH... (во всяком случае в VFP8.0 + SP1).
Это проверенно неоднократно и работает.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33068783
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Aleksey-K
может я конечно бяка но насчет nodefault() это у кого как у меня в QueryUnload() записано thisform.release()
ну а тип конечно можно проверить тока лень писать было тем более выше уже написано
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33073467
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Aleksey-K!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
PUBLIC o1,o2,o3,o4
o1 = CREATEOBJECT("form")
o2 = CREATEOBJECT("form")
o3 = CREATEOBJECT("form")
o4 = CREATEOBJECT("form")
o1.Show()
o2.Show()
o3.Show()
o4.Show()
FOR EACH oFrm IN _SCREEN.Forms
   oFrm.Release()
ENDFOR
Как я и говорил - остаются 2 "лишние" формы. Хорошо ещё что он не валится по ошибке :)

2 leaf
Release() в QueryUnload это конечно совершенно неправильно и безрассудно, тем более что в QueryUnload требуется обычно "предотвратить закрытие" а не продублировать его. Кроме того NODEFAULT это не функция - её без скобок пишут.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33073841
lenka123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
close all
do form ....
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33073919
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Igor Korolyov
может Вы и правы насчет QueryUnload , но опять же это кто как работает мне например этот крестик только жить мешает ведь есть же кнопки а крестик я в большенстве случаев вообще отрубаю
но поскольку у меня в методе Release() выполняются протекают некоторые жизнено важные процесы при чем для любой формы , то это просто страховка и не более того
На мой взгляд он просто никогда не наступит крестика то немае ,хотя может я и не прав. И сделано это из соображений , что скобки лучше чем ошибки не более того!
Ну а насчет NODEFAULT спасибо но это чисто машинально слишком много методов упоминалось - редкий случай когда скобки - и есть ошибки
А так что получаеться пользователь жмет и жмет на крестик а форма то не закрывается пользователь в ужасе бежит к разработчику с большими глазами ... ну далее по Вашему тексту
Ну опять же кто как может. По мне крестик есть - форма должна закрываться , а так кому что нравиться
Кстате есть случаи когда return .f. - это совсем даже и не зло
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33074545
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще свой вариант до кучи :)
Код: plaintext
1.
2.
3.
4.
5.
6.
for i = _Screen.FormCount To  1  Step - 1 
   _Screen.Forms(i).Hide()
   if pemstatus(_Screen.Forms(i),"WindowType", 5 )
      _Screen.Forms(i).WindowType =  0 
   endif
   _Screen.Forms(i).Release()
endfor
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33075007
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
Hi Aleksey-K!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
PUBLIC o1,o2,o3,o4
o1 = CREATEOBJECT("form")
o2 = CREATEOBJECT("form")
o3 = CREATEOBJECT("form")
o4 = CREATEOBJECT("form")
o1.Show()
o2.Show()
o3.Show()
o4.Show()
FOR EACH oFrm IN _SCREEN.Forms
   oFrm.Release()
ENDFOR
Как я и говорил - остаются 2 "лишние" формы. Хорошо ещё что он не валится по ошибке :)

2 leaf
Release() в QueryUnload это конечно совершенно неправильно и безрассудно, тем более что в QueryUnload требуется обычно "предотвратить закрытие" а не продублировать его. Кроме того NODEFAULT это не функция - её без скобок пишут.


Да.. точно так... Век живи, век учись.. 2 формы остаются.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33076007
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi XAndy!

А зачем менять WindowType??? IMHO это не нужно - он вообще-то при спрятанной форме не имеет ровно никакого значения...

2 leaf
1) Есть понятие оконного пользовательского интерфейса, вот уже который год насаждаемого "маленькой но мягкой" корпорацией - и твои потуги "переучить" пользователей IMHO скорее тебе аукнуться, нежели им :) Тем паче что разумно и управляемо использовать "крестик" ну совсем не трудно :)
2) Если у тебя есть код который нужно исполнить при закрытии - то НЕ НАДО его писать в Release() - сделай свой метод и его и вызывай когда надо - в т.ч. и из QueryUnload и из твоей кнопки закрытия... Твой метод выполнит ТОЛЬКО твои действия - вызов же Release() может выполнить и системные и твои, и вообще получается каша. Ты бы ещё в Hide это прописал :(
3) насчёт NODEFAULT - почитай хелп, там однозначно описан синтаксис. В VFP9 уже будет ругаться... Это как с LOCAL - были оригиналы, которые не ставили запятых между перечисленными именами :) Эта экономия сильно по ним ударила в VFP7...

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как закрыть все формы на экране?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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