Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как закрыть все формы на экране? / 25 сообщений из 33, страница 1 из 2
16.05.2005, 11:51
    #33066654
sanya_tir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
Подскажите кто знает, как красиво сделать чтобы закрылись все формы в программе... ток меню чтоб осталось...
Спасибо...
...
Рейтинг: 0 / 0
16.05.2005, 12:03
    #33066695
Burn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
Пройтись по колекции _SCREEN.Forms() или _VFP.Forms() и позакрывать все открытые формы
...
Рейтинг: 0 / 0
16.05.2005, 12:36
    #33066827
sanya_tir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
а по-подробнее?
...
Рейтинг: 0 / 0
16.05.2005, 13:23
    #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
16.05.2005, 13:43
    #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
16.05.2005, 13:54
    #33067111
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
Прошу прощение, ошибся...
Код: plaintext
1.
2.
3.
4.
5.
FOR EACH loForm IN _SCREEN.Forms
    IF loForm.QueryUnload()
         loForm.Release()
    ENDIF
ENDFOR
...
Рейтинг: 0 / 0
16.05.2005, 14:20
    #33067198
sanya_tir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
не работает.
Ошибка "Unknown member FORMS."
...
Рейтинг: 0 / 0
16.05.2005, 14:23
    #33067209
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
sanya_tirне работает.
Ошибка "Unknown member FORMS."
Не понял !!!
Как не работает ? В каком месте.
У меня этот код уже года 3 во всех проектах работает и без проблемм !
Какая версия у вас VFP ?
С уважением, Алексей.
...
Рейтинг: 0 / 0
16.05.2005, 14:24
    #33067211
sanya_tir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
простите за неточность...
Не работает вариант ВладимираM
...
Рейтинг: 0 / 0
16.05.2005, 14:27
    #33067230
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
sanya_tirпростите за неточность...
Не работает вариант ВладимираM
Тогда понятно. Я этот вариант когда-то тоже пробовал, но Владимир забыл поставить в цикле проверку типа:
IF TYPE("_SCREEN.Forms[1]") == "O"....
С уважением, Алексей.
...
Рейтинг: 0 / 0
16.05.2005, 16:39
    #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
16.05.2005, 16:53
    #33067751
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
Ну да, опечатка

Такого нет

_SCREEN.Forms.Count

но есть

_SCREEN.FormCount
...
Рейтинг: 0 / 0
16.05.2005, 16:55
    #33067765
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
2AleksMed
внесу лепту свою
do while _Screen.FormCount>1
_Screen.Forms(_Screen.FormCount).Release
enddo
...
Рейтинг: 0 / 0
16.05.2005, 16:59
    #33067787
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
2leaf
Поехали
...
Рейтинг: 0 / 0
16.05.2005, 17:45
    #33067970
sanya_tir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
Спасибо
...
Рейтинг: 0 / 0
16.05.2005, 19:09
    #33068178
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
Я бы все-таки рекомендовал проверять событие _Screen.Forms(i).QueryUnload на предмет возврата из него .T. перед закрытием формы.
Дело в том, что форма не "знает" в какой момент вы решите ее закрыть этим методом массового закрытия форм, а каждая ваша форма "обязана" в методе QueryUnload проверить, что она может корректно закрыться без потери данных(разумеется, с помощью вашего метода).
С уважением, Алексей.
...
Рейтинг: 0 / 0
17.05.2005, 01:18
    #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
17.05.2005, 09:15
    #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
17.05.2005, 10:25
    #33068783
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
2Aleksey-K
может я конечно бяка но насчет nodefault() это у кого как у меня в QueryUnload() записано thisform.release()
ну а тип конечно можно проверить тока лень писать было тем более выше уже написано
...
Рейтинг: 0 / 0
19.05.2005, 02:40
    #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
19.05.2005, 10:26
    #33073841
lenka123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
close all
do form ....
...
Рейтинг: 0 / 0
19.05.2005, 10:49
    #33073919
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть все формы на экране?
2Igor Korolyov
может Вы и правы насчет QueryUnload , но опять же это кто как работает мне например этот крестик только жить мешает ведь есть же кнопки а крестик я в большенстве случаев вообще отрубаю
но поскольку у меня в методе Release() выполняются протекают некоторые жизнено важные процесы при чем для любой формы , то это просто страховка и не более того
На мой взгляд он просто никогда не наступит крестика то немае ,хотя может я и не прав. И сделано это из соображений , что скобки лучше чем ошибки не более того!
Ну а насчет NODEFAULT спасибо но это чисто машинально слишком много методов упоминалось - редкий случай когда скобки - и есть ошибки
А так что получаеться пользователь жмет и жмет на крестик а форма то не закрывается пользователь в ужасе бежит к разработчику с большими глазами ... ну далее по Вашему тексту
Ну опять же кто как может. По мне крестик есть - форма должна закрываться , а так кому что нравиться
Кстате есть случаи когда return .f. - это совсем даже и не зло
...
Рейтинг: 0 / 0
19.05.2005, 13:38
    #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
19.05.2005, 15:41
    #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
20.05.2005, 02:42
    #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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как закрыть все формы на экране? / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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