powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как закрыть все формы на экране?
33 сообщений из 33, показаны все 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
Как закрыть все формы на экране?
    #33076461
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Igor Korolyov
ну что Вам сказать кому что нравиться , хотя конечно Ваша увернность в своих силах и своих силах и возможностях подталкивает ввязаться в перепалку, но пожалуй не буду у каждого свой стиль у Вас просто свой
Я же Вам намекал что QueryUnload нужен мне тока на тот случай если я забуду кнопкУ закрытия на форму кинуть . В этом случае на этапе тестирования и разработки будут некоторые трудности особенно если форма модальная склероз однако
Ну не нужен мне ни этот метод ни этот крестик когда программа готова
Хотя может Вы приведете пример обратного ? А так это всё просто голословно хотя и выглядит очень умно. Так как насчет контрпримера ? И народ поучиться.
В каком месте это мне аукнется особенно если крести на форме серого цвета а ?
На кой ляд мне отдельный метод если выход из формы один?
Про стандарты microsoft скажу что они довольно неплохи, но к сожалению в фокспро их приходиться дорабатывать
Я люблю разработчиков своей среды разработки, А Вы похоже нет. Конечно у всех есть свои недоработки и у них и у меня и у Вас уверен тоже
Ну а про nodefault далось оно вам сказал же описка. Вы наверное давно им не пользовались раз так категоричны. Дело в том, что даже в 7.0 Вам не удасться закрыть окно метода если скобочки навесить автопроверка однако это напоминаю если забыли
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33077716
Glyba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
крестика то немае


А Ctrl-F4?
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33077770
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот тогда если метод сработает и будет выход эквивалинтный нажатию кнопки "отмена" страховка то стоит
Для меня форма типичное окно диалога в стиле виндоус из него возможно два пути выхода либо ОК либо Отмена . Вот крестик та самая отмена и есть. Такая у меня вот идеология. Готов послушать критику.
Если не делать окно формы главным окном, что я не приемлю алергия знаете ли наэксперементировался уже, то крестик как таковой не очень то и нужен.
А как у Вас организовано?

з.ы. если пользователь достаточно умен что бы нажать Ctrl-F4 - это его проблемы получит выход без сохранения он же знал что нажимал как Вы думаете?
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33077879
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а я делаю ВСЕ на ТОП-левел формах.. плохо это или хорошо = не знаю, мне нравится...
Крестик отключаю, но правда из-за того, что на формы вешаю скины (заказчик часто так хочет) а копать как они действуют нету ни времени ни желания (чужой код), соответственно есть кнопка выхода на каждой форме..
хотя.. недавно заказчик все пытался на крестик закрыть, возможно придется переделать

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

1) Закрой ЦЕЛИКОМ приложение, или ради прикола попробуй ShutDown сделать при работающей программе. И не надо только говорить что "никто так не поступает" - это ТВОЯ проблема как разработчика.
2) Ты никогда не задумывался, почему даже у MESSAGEBOX() есть крестик закрытия?
P.S. Не в обиду будь сказано, но лично для меня наличие "задизейбленного" крестика в программе (если это конечно не игрушка какая, коим простителен нестандартный интерфейс) признак недостаточного профессионализма разработчика - если он такую простую вещь победить не может, то что можно ожидать от всего остального :(

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #33079556
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
могу как раз и не дисэблить крестик просто при его нажатии будет выход из формы без сохранения изменений и больше ничего, но разве это страшно ? На мой взляд естественное развите событий разве не так. Естественно там кроме thisform.release есть небольшая приписка типа признак что это выход по escape
По поводу первого пункта не совсем понял проблему?
Если объясните может и пойму что Вам ответить
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как закрыть все формы на экране?
    #34140163
Alex-ZZZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
CLEAR WINDOW
Все окна закрываются.
...
Рейтинг: 0 / 0
Как закрыть все формы на экране?
    #34140268
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex-ZZZ
Код: plaintext
CLEAR WINDOW
Все окна закрываются.
Гениально Ты думаешь за полтора года автор ответа не нашел на столь сложный вопрос?
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как закрыть все формы на экране?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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