Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с коллекцией открытых форм - Forms / 8 сообщений из 8, страница 1 из 1
11.03.2007, 20:39
    #34382982
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с коллекцией открытых форм - Forms
Привет всем.
В программе у меня проблема с коллекцией 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
11.03.2007, 21:25
    #34383019
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с коллекцией открытых форм - Forms
orunbekили в этом цикле в коллекции Forms осталась ссылка на форму C?! Другого варианта не вижу. Уверен, что если проверить TempForm.hwnd, то будет значение формы С. Однако предположений, почему она не выгружается до конца, нет. Внимательно посмотри, не остается ли в ней не убитых объектов. Попробуй создать проект, демонстрирующий этот глюк, посмотрим его все вместе).
...
Рейтинг: 0 / 0
12.03.2007, 10:43
    #34383513
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с коллекцией открытых форм - Forms
Вот проект демонстрирующий данный принцип и к-ый не выгружает форму 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
12.03.2007, 11:40
    #34383699
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с коллекцией открытых форм - Forms
Только имя проекта измените с Forms на другой скажем FormsTest
не то будет конфликтовать с коллекцией Forms
...
Рейтинг: 0 / 0
12.03.2007, 12:17
    #34383857
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с коллекцией открытых форм - Forms
Все проблема решена
В каждой форме добавил:

Код: 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
12.03.2007, 13:22
    #34384139
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с коллекцией открытых форм - Forms
Да так и решали, только я не понял, почему с QueryUnload не работало, а с Unload работает. Может где-то Cancel ставился?
...
Рейтинг: 0 / 0
12.03.2007, 13:50
    #34384288
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с коллекцией открытых форм - Forms
В событии Form_Unload переменные уже уничтожены.
...
Рейтинг: 0 / 0
12.03.2007, 13:57
    #34384336
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с коллекцией открытых форм - Forms
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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с коллекцией открытых форм - Forms / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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