|
|
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
Подскажите кто знает, как красиво сделать чтобы закрылись все формы в программе... ток меню чтоб осталось... Спасибо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 11:51 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
Пройтись по колекции _SCREEN.Forms() или _VFP.Forms() и позакрывать все открытые формы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 12:03 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
а по-подробнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 12:36 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
А поподробнее - это очень не тривиальная задача. Т.е. в теории все просто: Код: plaintext 1. 2. 3. 4. Это не опечатка, надо всегда использовать именно индекс 1, а не значение счетчика m.lnI, поскольку при закрытии формы общее количество форм в коллекции Forms уменьшается. Но это теория. А на практике есть масса тонкостей, в результате которых этот код может не сработать или же его надо будет прервать. Ну, например, если пользователь редактировал данные но еще их не сохранил следует ли его переспросить? А если он попросит подождать? Кроме того, такой код не годиться для FormSet. А как быть с модальными формами? А с системными окнами, вроде MessageBox()? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 13:23 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
А можно и так, через коллекции Код: plaintext 1. 2. 3. 4. 5. В зависимости от целей закрытия всех форм, можно поменять реакцию на событие QueryUnload: Прервать закрытие всех форм, если хоть одна не дает себя закрыть или продолжить цикл FOR EACH. С уваженим, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 13:43 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
Прошу прощение, ошибся... Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 13:54 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
не работает. Ошибка "Unknown member FORMS." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 14:20 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
sanya_tirне работает. Ошибка "Unknown member FORMS." Не понял !!! Как не работает ? В каком месте. У меня этот код уже года 3 во всех проектах работает и без проблемм ! Какая версия у вас VFP ? С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 14:23 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
простите за неточность... Не работает вариант ВладимираM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 14:24 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
sanya_tirпростите за неточность... Не работает вариант ВладимираM Тогда понятно. Я этот вариант когда-то тоже пробовал, но Владимир забыл поставить в цикле проверку типа: IF TYPE("_SCREEN.Forms[1]") == "O".... С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 14:27 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
Код схожий с кодом ВладимираМ , но не совсем :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 16:39 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
Ну да, опечатка Такого нет _SCREEN.Forms.Count но есть _SCREEN.FormCount ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 16:53 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
2AleksMed внесу лепту свою do while _Screen.FormCount>1 _Screen.Forms(_Screen.FormCount).Release enddo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 16:55 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
2leaf Поехали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 16:59 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 17:45 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
Я бы все-таки рекомендовал проверять событие _Screen.Forms(i).QueryUnload на предмет возврата из него .T. перед закрытием формы. Дело в том, что форма не "знает" в какой момент вы решите ее закрыть этим методом массового закрытия форм, а каждая ваша форма "обязана" в методе QueryUnload проверить, что она может корректно закрыться без потери данных(разумеется, с помощью вашего метода). С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2005, 19:09 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2005, 01:18 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
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). Это проверенно неоднократно и работает. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2005, 09:15 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
2Aleksey-K может я конечно бяка но насчет nodefault() это у кого как у меня в QueryUnload() записано thisform.release() ну а тип конечно можно проверить тока лень писать было тем более выше уже написано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2005, 10:25 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
Hi Aleksey-K! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 2 leaf Release() в QueryUnload это конечно совершенно неправильно и безрассудно, тем более что в QueryUnload требуется обычно "предотвратить закрытие" а не продублировать его. Кроме того NODEFAULT это не функция - её без скобок пишут. Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 02:40 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
close all do form .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 10:26 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
2Igor Korolyov может Вы и правы насчет QueryUnload , но опять же это кто как работает мне например этот крестик только жить мешает ведь есть же кнопки а крестик я в большенстве случаев вообще отрубаю но поскольку у меня в методе Release() выполняются протекают некоторые жизнено важные процесы при чем для любой формы , то это просто страховка и не более того На мой взгляд он просто никогда не наступит крестика то немае ,хотя может я и не прав. И сделано это из соображений , что скобки лучше чем ошибки не более того! Ну а насчет NODEFAULT спасибо но это чисто машинально слишком много методов упоминалось - редкий случай когда скобки - и есть ошибки А так что получаеться пользователь жмет и жмет на крестик а форма то не закрывается пользователь в ужасе бежит к разработчику с большими глазами ... ну далее по Вашему тексту Ну опять же кто как может. По мне крестик есть - форма должна закрываться , а так кому что нравиться Кстате есть случаи когда return .f. - это совсем даже и не зло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 10:49 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
Еще свой вариант до кучи :) Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 13:38 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi Aleksey-K! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 2 leaf Release() в QueryUnload это конечно совершенно неправильно и безрассудно, тем более что в QueryUnload требуется обычно "предотвратить закрытие" а не продублировать его. Кроме того NODEFAULT это не функция - её без скобок пишут. Да.. точно так... Век живи, век учись.. 2 формы остаются. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 15:41 |
|
||
|
Как закрыть все формы на экране?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 02:42 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=224&tid=1590355]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
22ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 307ms |

| 0 / 0 |
