Создание массива форм... Проверьте код, кому не трудно

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Создание массива форм... Проверьте код, кому не трудно

Сообщение Wolfie » 26.06.2008 (Чт) 4:43

Приветствую!
Есть некая форма forMsg с методом MsgWnd, который содержит Me.Show. Программа генерирует разные сообщения в ходе своей деятельности, и создает копии формы forMsg с разным текстом. Когда пользователь закрывает экземпляр формы, в нём вызывается Unload Me.

Я сделал сей код
Код: Выделить всё
Static NMID%

Dim NewMsg() As forMsg
ReDim NewMsg(NMID)
Set NewMsg(NMID) = New forMsg
       
NewMsg(NMID).MsgWnd Msg, Snd, "Message ID#" NMID & Chr$(32) & Time$

NMID = NMID + 1
Подскажите пожалуйста,
  1. Все ли в нем корреткно?
  2. Нужно ли обращать закрытые NMID в Nothing (не хотелось бы)
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.06.2008 (Чт) 8:09

А есть ли вообще нужда хранить ссылки на экземпляры forMsg?
И если да, я бы использовал коллекцию, а не массив.
В массиве сбрасывать ссылку в Nothing было бы желательно, но можно и обойтись.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 26.06.2008 (Чт) 8:58

2. Нужна. Форма, как и любой класс, не уничтожится, пока все ссылки, ссылающиеся на неё, не будут сброшены.

На форуме, в общем случае хранится две ссылки: в одноимённой переменной и в коллекции Forms. Из коллекции Forms ссылку удаляет фунция Unload, сбросинг одноимённой (или же "массивной" ссылки, как в этом случае) -- за тобой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 27.06.2008 (Пт) 20:17

вопрос alibek'a очень уместен - не нужно, в том-то и дело, а я совершенно об этом не подумал (программирование в 5 утра приводит к клиническому переклину программиста) - в моем случае, как мне кажется, достаточно
Код: Выделить всё
Static NMID%
Dim NewMsg As New forMsg
NewMsg.MsgWnd Msg, Snd, "Message ID#" NMID & Chr$(32) & Time$
NMID = NMID + 1
- Т.к. после отображения экземпляра формы с сообщением, связь сним не требуется, и оно будет висеть на экране хоть после закрытия основного окна программы, т.е. пока пользователь не прикроет его, всвязи с этим вопрос - а где сделать тогда Set ... Nothing?
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

HKEY_SUPER_MASHINE
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 78
Зарегистрирован: 02.07.2008 (Ср) 12:17
Откуда: Тольятти, школа, случайно

Сообщение HKEY_SUPER_MASHINE » 04.07.2008 (Пт) 10:30

Да. В данном случае используем For Each...Next в событии Form_Unload главной формы.

Код: Выделить всё
For NewMsg Each Forms
   Set NewMsg=Nothing
Next


Тогда все экземпляры формы NewMsg со 100%-ной вероятностью будут уничтожены при выгрузке главной формы.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.07.2008 (Пт) 12:53

HKEY_SUPER_MASHINE писал(а):Тогда все экземпляры формы NewMsg со 100%-ной вероятностью будут уничтожены при выгрузке главной формы.

Ерунда. Код делает совсем другое.
Lasciate ogni speranza, voi ch'entrate.

HKEY_SUPER_MASHINE
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 78
Зарегистрирован: 02.07.2008 (Ср) 12:17
Откуда: Тольятти, школа, случайно

Сообщение HKEY_SUPER_MASHINE » 04.07.2008 (Пт) 15:28

А что тогда?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.07.2008 (Пт) 16:27

Код: Выделить всё
For NewMsg Each Forms 'инициализируется цикл
   Set NewMsg=Nothing 'ссылка из переменной NewMsg удаляется
Next 'ссылка в переменную копируется
Лучший способ понять что-то самому — объяснить это другому.

HKEY_SUPER_MASHINE
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 78
Зарегистрирован: 02.07.2008 (Ср) 12:17
Откуда: Тольятти, школа, случайно

Сообщение HKEY_SUPER_MASHINE » 04.07.2008 (Пт) 16:32

И что? Я же написал то же самое (комментарии не в счёт)!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.07.2008 (Пт) 16:50

Смысл комментариев в том, что ты присваиваешь ссылку переменной, а потом удаляешь. И все. На сам объект это действо никакого влияния не оказывает.
Другими словами, этот код не делает ровным счетом ничего.
Лучший способ понять что-то самому — объяснить это другому.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 04.08.2008 (Пн) 13:53

Рискну предположить, что
Код: Выделить всё
For NewMsg Each Forms 'инициализируется цикл
   Unload NewMsg
Next 'ссылка в переменную копируется
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.08.2008 (Пн) 14:18

Денис, что это было?
З.Ы. Забавно, но ошибка кочует из поста в пост:
Код: Выделить всё
For NewMsg Each Forms
Должно быть
Код: Выделить всё
For Each NewMsg Forms
Весь мир матрица, а мы в нем потоки байтов!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.08.2008 (Пн) 15:25

:lol:
For Each NewMsg In Forms
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 47

    TopList