powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Закрыть все открытые экземпляры формы
16 сообщений из 16, страница 1 из 1
Закрыть все открытые экземпляры формы
    #32177686
BMP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BMP
Гость
Как закрыть все запущенные на выполнение экземпляры формы в проекте???
Заранее благодарен.
...
Рейтинг: 0 / 0
Закрыть все открытые экземпляры формы
    #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
Закрыть все открытые экземпляры формы
    #32177818
РусланVFP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишет недопустимые значения при вызове функции ... что -то вроде этого..
По-моему ругается на:

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

Помогите ПЛИЗ
...
Рейтинг: 0 / 0
Закрыть все открытые экземпляры формы
    #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
Закрыть все открытые экземпляры формы
    #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
Закрыть все открытые экземпляры формы
    #32177919
BMP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BMP
Гость
Спасибо.
В принципе работает. Но закрывает не только формы, но и ToolBar'ы. Как бы это дело обойти? Чтобы ToolBar'ы не трогало.
...
Рейтинг: 0 / 0
Закрыть все открытые экземпляры формы
    #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
Закрыть все открытые экземпляры формы
    #32177929
BMP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BMP
Гость
Не так не работает. Вообще ничего закрывать не будет.
...
Рейтинг: 0 / 0
Закрыть все открытые экземпляры формы
    #32178092
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы не закрывало тулбары добавь вот это
if _screen.forms(1).Baseclass == "Form" ( или наоборот "Toolbar")
...
Рейтинг: 0 / 0
Закрыть все открытые экземпляры формы
    #32178339
РусланVFP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Чтобы не закрывало тулбары добавь вот это
>if _screen.forms(1).Baseclass == "Form" ( или наоборот "Toolbar")
Логично, но почему-то не работает :( (Ничего вобще не закрывает)
...
Рейтинг: 0 / 0
Закрыть все открытые экземпляры формы
    #32178391
BMP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BMP
Гость
Спасибо. Действительно помогло.
...
Рейтинг: 0 / 0
Закрыть все открытые экземпляры формы
    #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
Закрыть все открытые экземпляры формы
    #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
Закрыть все открытые экземпляры формы
    #32178509
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Karly
При использовании коллеции форм _SCREEN.Forms следует иметь в виду, что формы добавляются в эту коллекцию "снизу". Т.е. новой форме присваивается индекс 1, а у всех остальных индекс увеличивается на 1.

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

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

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

Это так сказать не влезая глубоко. А есть еще куча особенностей, которые могут быть использованы в приложении и что тоже повлияет на закрытие форм.
...
Рейтинг: 0 / 0
Закрыть все открытые экземпляры формы
    #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
Закрыть все открытые экземпляры формы
    #32186122
JustDoIt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если нужно закрыть все экземпляры одной формы, то возможно использовать Name [переменная] Linked из Do Form. Если в качестве переменной указать массив, то при удалении массива из памяти автоматически будут уничтожены все экземпляры формы, связанные с ним. Переменная либо массив естественно должны быть инициированы до запуска формы. Таким же способом можно убивать все формы, связанные с родительской формой (запущеные из неё).
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Закрыть все открытые экземпляры формы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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