powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с коллекцией открытых форм - Forms
8 сообщений из 8, страница 1 из 1
Проблема с коллекцией открытых форм - Forms
    #34382982
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.
В программе у меня проблема с коллекцией Forms.
В программе используются mdi-формы, и одну форму может вызвать другая форма, при этом родителем открытой форме будет открывашая ее форма. если же форма открыта обычным способом, то родителем будет главная mdi-форма.
При выгрузке любой формы на событии _QueryUnload поставил код, который перебирает все формы из коллекции Forms и если родителем является закрываемая форма, то она выгружает и эту форму, т.е. "убирает за собой мусор".
Если форму загрузила не главная форма, то явно указывается ее родитель, иначе по умолчанию 0.
У всех форм есть public переменная lngParentFormhWnd, вот код к-ый стоит на QueryUnload у всех форм
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Dim TempForm As Form
'Close all childforms
    For Each TempForm In Forms
        If (TempForm.hWnd <> mdiMain.hWnd) Then
            If (TempForm.lngParentFormhWnd = Me.hWnd) Then
                Unload TempForm
            End If
        End If
    Next
    Set TempForm = Nothing
End Sub
Так вот, проблема следующая. Допустим есть три формы A,B,C.
1. Загружается форма A (Forms.Count=2 - главная mdi форма+форма A).

2. Затем из этой формы загружается форма B (соответственно родителем для формы B становится форма A). (Forms.Count=3 - главная mdi форма+форма A+форма B).

3. Далее форма B вызывает форму C (родитель форма B). (Forms.Count=4 - главная mdi форма+форма A+форма B+форма C)

4. При закрытии формы A, вызывается код на QueryUnload, который перебирает и соотвественно находит форму B, для которой родителем является и закрывает ее, обычным Unload.

5. И для формы B, тоже выполняется своя процедура QueryUnload, который тоже перебирает и находит форму C и выгружает эту форму.

6. При выполнении QueryUnload для формы C, никаких дочерних форм не находится и форма спокойно выгружается.

7. После выгрузки формы C. Forms.Count=3 - главная mdi-форма+форма A+форма B

7. Далее выгружается форма B. Forms.Count=3 - главная mdi-форма+форма A

8. Далее выгружается форма A.
И здесь после выгрузки в коде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
For Each TempForm In Forms
If (TempForm.hWnd <> mdiMain.hWnd) Then
    If (TempForm.lngParentFormhWnd = Me.hWnd) Then
        Unload TempForm
'XXXX- здесь уже все формы касающиеся формы A выгружены
    End If
End If
Next
Set TempForm = Nothing
после выгрузки формы B, т.е. когда уже никаких форм нет (место где комментарий 'XXXX- ), цикл проходит еще раз и почему-то загружается форма C!!!!
Никак не пойму, или в этом цикле в коллекции Forms осталась ссылка на форму C?! И при попытке обратиться к этой ссылке загружается форма C.
Если да, то как обновить коллекцию? Requery, Refresh не работает
Или где ошибка?
Попробовал в каждой форме использовать
Код: plaintext
1.
Private WithEvents fParentForm As Form
И указывать Set'ом родительскую форму, и использовать код
Код: plaintext
1.
2.
3.
Private Sub fParentForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        Unload Me
End Sub
т.е. при выгрузке родительской формы, выгружать себя. В таком случае при загрузке форм A,B,C последовательно. Выгружаются формы A и B. А событие fParentForm_QueryUnload для C не доходит или как не знаю, короче не срабатывает этот вариант.
...
Рейтинг: 0 / 0
Проблема с коллекцией открытых форм - Forms
    #34383019
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekили в этом цикле в коллекции Forms осталась ссылка на форму C?! Другого варианта не вижу. Уверен, что если проверить TempForm.hwnd, то будет значение формы С. Однако предположений, почему она не выгружается до конца, нет. Внимательно посмотри, не остается ли в ней не убитых объектов. Попробуй создать проект, демонстрирующий этот глюк, посмотрим его все вместе).
...
Рейтинг: 0 / 0
Проблема с коллекцией открытых форм - Forms
    #34383513
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот проект демонстрирующий данный принцип и к-ый не выгружает форму C
Вот процесс по которому выполняется код (лог):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 1 .	Loading form A (handle: 3015628 ) parent handle: 0 
	Loading form A (handle: 3015628 ) parent form mdiMain

 2 .	Loading form B (handle: 394386 ) parent handle: 3015628 
	Loading form B (handle: 394386 ) parent form A

 3 .	Loading form C (handle: 328846 ) parent handle: 394386 
	Loading form C (handle: 328846 ) parent form B

 4 .	Unloading child form (handle: 394386 ) of form A)

 5 .	Unloading child form (handle: 328846 ) of form B)

 6 .	Unloading form B (handle: 394386 )

 7 .	Loading form C (handle: 394382 ) parent handle: 394386 

 8 .	Unloading form C (handle: 394382 )

 9 .	Loading form C (handle: 459922 ) parent handle: 394386 

 10 .	Unloading form A (handle: 3015628 )

...
Рейтинг: 0 / 0
Проблема с коллекцией открытых форм - Forms
    #34383699
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только имя проекта измените с Forms на другой скажем FormsTest
не то будет конфликтовать с коллекцией Forms
...
Рейтинг: 0 / 0
Проблема с коллекцией открытых форм - Forms
    #34383857
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все проблема решена
В каждой форме добавил:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private WithEvents fParentForm As Form

Public Sub SetParentForm(ByRef fPForm As Form)
    Set fParentForm = fPForm
    lngParentFormhWnd = fPForm.hWnd
End Sub

Private Sub fParentForm_Unload(Cancel As Integer)
    Unload Me
End Sub

Вот так вот всё нормально работает. Есть ли кто решал подобные задачи, и как решали эту проблему?
...
Рейтинг: 0 / 0
Проблема с коллекцией открытых форм - Forms
    #34384139
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да так и решали, только я не понял, почему с QueryUnload не работало, а с Unload работает. Может где-то Cancel ставился?
...
Рейтинг: 0 / 0
Проблема с коллекцией открытых форм - Forms
    #34384288
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В событии Form_Unload переменные уже уничтожены.
...
Рейтинг: 0 / 0
Проблема с коллекцией открытых форм - Forms
    #34384336
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДа так и решали, только я не понял, почему с QueryUnload не работало, а с Unload работает. Может где-то Cancel ставился?
нет, я поменял
Код: plaintext
1.
2.
3.
Public Property Set ParentForm(ByRef fPForm As Form)
    Set fParentForm = fPForm
End Property
на
Код: plaintext
1.
2.
3.
4.
Public Sub SetParentForm(ByRef fPForm As Form)
    Set fParentForm = fPForm
    lngParentFormhWnd = fPForm.hWnd
End Sub
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с коллекцией открытых форм - Forms
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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