Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Закрыть все открытые экземпляры формы / 16 сообщений из 16, страница 1 из 1
05.06.2003, 17:02
    #32177686
BMP
BMP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Как закрыть все запущенные на выполнение экземпляры формы в проекте???
Заранее благодарен.
...
Рейтинг: 0 / 0
05.06.2003, 17:30
    #32177736
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Не проверял но вероятно что-то вроде того:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
FUNCTION CloseForms
lpar tcForm

tcForm = UPPER(tcForm)

local loFrm 
for each loFrm in _screen.forms
     if tcForm == UPPER(justfname(sys( 1271 ,loFrm)))
          loFrm.Release()
     endif 
endfor
...
Рейтинг: 0 / 0
05.06.2003, 18:18
    #32177818
РусланVFP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Пишет недопустимые значения при вызове функции ... что -то вроде этого..
По-моему ругается на:

UPPER(justfname(sys(1271,loFrm)))

Помогите ПЛИЗ
...
Рейтинг: 0 / 0
05.06.2003, 19:58
    #32177887
BMP
BMP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Видимо проблема в том, что sys(1271,loFrm) в какой-то момент возвращает .f.
так как в
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
FUNCTION CloseForms
lpar tcForm

tcForm = UPPER(tcForm)

local loFrm 
for each loFrm in _screen.forms
     if tcForm == UPPER(justfname(sys( 1271 ,loFrm)))
          loFrm.Release()
     endif 
endfor



loFrm не была инициализирована. А как с этим бороться?...
...
Рейтинг: 0 / 0
05.06.2003, 20:41
    #32177910
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Вообще-то, это крайне нетривиальная задача. В общем случае решения не имеет. В каждом конкретном приложении решается по своему. Ну а самый простой способ:

Код: plaintext
1.
2.
3.
4.
5.
6.
LOCAL lnI
FOR lnI= 1  TO _SCREEN.FormCount
WITH _SCREEN.Forms( 1 )
.Hide()
.Release()
ENDWITH
ENDFOR


Здесь не опечатка, выбирается всегда форма с индексом 1 (один), а не с номером счетчика.
...
Рейтинг: 0 / 0
05.06.2003, 21:03
    #32177919
BMP
BMP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Спасибо.
В принципе работает. Но закрывает не только формы, но и ToolBar'ы. Как бы это дело обойти? Чтобы ToolBar'ы не трогало.
...
Рейтинг: 0 / 0
05.06.2003, 21:16
    #32177923
karly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
2 ВладимирМ

А если так
Код: plaintext
1.
2.
3.
4.
5.
FOR lnI= _SCREEN.FormCount To  1 
WITH _SCREEN.Forms(lnI)
.Hide()
.Release()
ENDWITH
ENDFOR
...
Рейтинг: 0 / 0
05.06.2003, 21:26
    #32177929
BMP
BMP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Не так не работает. Вообще ничего закрывать не будет.
...
Рейтинг: 0 / 0
06.06.2003, 10:04
    #32178092
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Чтобы не закрывало тулбары добавь вот это
if _screen.forms(1).Baseclass == "Form" ( или наоборот "Toolbar")
...
Рейтинг: 0 / 0
06.06.2003, 13:03
    #32178339
РусланVFP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
>Чтобы не закрывало тулбары добавь вот это
>if _screen.forms(1).Baseclass == "Form" ( или наоборот "Toolbar")
Логично, но почему-то не работает :( (Ничего вобще не закрывает)
...
Рейтинг: 0 / 0
06.06.2003, 13:31
    #32178391
BMP
BMP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Спасибо. Действительно помогло.
...
Рейтинг: 0 / 0
06.06.2003, 13:32
    #32178393
РусланVFP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
LOCAL counter
counter= 1 
DO WHILE counter<_SCREEN.FormCount
 IF _SCREEN.Forms(counter).Baseclass ==  "Form" 
  _SCREEN.Forms(counter).Release()
 ELSE 
 counter=counter+ 1 
 ENDIF 
ENDDO 

Вот получилось :)
...
Рейтинг: 0 / 0
06.06.2003, 14:46
    #32178491
karly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
А так не проще?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Local loForm as Form

For Each loForm in _Screen.Forms

  IF loForm.BaseClass ==  "Form" 
    loForm.Release()
  EndIf 

EndFor
...
Рейтинг: 0 / 0
06.06.2003, 15:00
    #32178509
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Karly
При использовании коллеции форм _SCREEN.Forms следует иметь в виду, что формы добавляются в эту коллекцию "снизу". Т.е. новой форме присваивается индекс 1, а у всех остальных индекс увеличивается на 1.

Кроме того, существует правило, что если метод формы не закончил свою работу или на форму существует где-либо еще ссылка, то такая форма не может быть закрыта, пока не отработает ее метод и не будут уничтожены все ссылки на нее.

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

Метод HIDE() используется для модальных форм, поскольку его выполнение снимает точку останова на команде DO FORM и дает возможность закрыться методу родительской формы, вызвавшей эту модальную форму.

Это так сказать не влезая глубоко. А есть еще куча особенностей, которые могут быть использованы в приложении и что тоже повлияет на закрытие форм.
...
Рейтинг: 0 / 0
06.06.2003, 18:19
    #32178799
karly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
2 ВладимирМ

Прочитав такое нравоучение, я решил попробовать опубликованный код на деле,чего обычно не делаю ;) Вот результат.

> Т.е. новой форме присваивается индекс 1, а у всех остальных индекс увеличивается на 1.
Да, не знал. Учту.

Далее
Код: plaintext
1.
2.
3.
4.
5.
FOR lnI= _SCREEN.FormCount To  1  Step - 1 
WITH _SCREEN.Forms(lnI)
.Hide()
.Release()
ENDWITH
ENDFOR

В указанном коде была досадная ошибка - пропущен Step -1
;)))))))))

А наличие взаимных ссылок на формы (точнее, обращений к этим ссылкам)
способно запутать ситуацию до полного хаоса. Не то, чтобы формы нельзя
было закрыть. Но обращение к переменной, которая предполагает быть
объектом, но таковым уже не является, радует пользователя сообщением
Я бы просто поостерегся закрывать формы таким образом,
если логика работы приложения чуть сложнее простого запуска форм.
ВладимирМ привел код, который будет работать чаще других, хотя и его
тоже можно поставить в "неудобное положение".
...
Рейтинг: 0 / 0
19.06.2003, 09:49
    #32186122
JustDoIt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть все открытые экземпляры формы
Если нужно закрыть все экземпляры одной формы, то возможно использовать Name [переменная] Linked из Do Form. Если в качестве переменной указать массив, то при удалении массива из памяти автоматически будут уничтожены все экземпляры формы, связанные с ним. Переменная либо массив естественно должны быть инициированы до запуска формы. Таким же способом можно убивать все формы, связанные с родительской формой (запущеные из неё).
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Закрыть все открытые экземпляры формы / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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