Получение ссылки на родителя при инициализации класса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Получение ссылки на родителя при инициализации класса

Сообщение Денис » 15.07.2009 (Ср) 8:50

Подскажите, как осуществить subj?
Сейчас я делаю так:
Создаю в классе переменную Public Parent as Form, в нее записывается ссылка на себя из формы при создании экземпляра, например:

Код: Выделить всё
Sub Form_Load()
    Dim cMyClass as clsMyClass
    Set cMyClass = new clsMyClass
    Set cMyClass.Parent = Me
end sub


Но этот вариант не устраивает по ряду причин, хотелось бы чтобы ссылка на объект-родитель создавалась в момент инициализации класса:

Код: Выделить всё
Private Parent as Form

Sub Class_Initialize()
    Parent = Class.Parent 'как-то так...
end sub


Есть хитрые способы?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

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

Re: Получение ссылки на родителя при инициализации класса

Сообщение Хакер » 15.07.2009 (Ср) 8:53

Нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: Получение ссылки на родителя при инициализации класса

Сообщение alibek » 15.07.2009 (Ср) 9:06

Создай конструктор — Friend-процедуру вида Create(Parent As Object).
Можно также создать и деструктор, процедуру Dispose, которая будет очищать ссылку.
Lasciate ogni speranza, voi ch'entrate.

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

Re: Получение ссылки на родителя при инициализации класса

Сообщение Денис » 15.07.2009 (Ср) 12:24

alibek писал(а):Создай конструктор — Friend-процедуру вида Create(Parent As Object).
Можно также создать и деструктор, процедуру Dispose, которая будет очищать ссылку.


Весь код из Class_Initialize() при этом перемещается в Create(Parent As Object), я правильно понимаю?
И после этого мне всего лишь нужно после инициализации класса вызвать этот конструктор:

Код: Выделить всё
Set cMyClass = New clsMyClass
cMyClass.Create Me

'вместо
'Set cMyClass = New clsMyClass
'Set cMyClass.Parent = Me


Я сделал, работает, спасибо.
Жаль только что нельзя сделать, чтобы процедура инициализации могла принимать параметры (типа Class_Initialize(Parent as Object)), тогда можно было бы обойтись одной строкой:

Код: Выделить всё
Set cMyClass = New clsMyClass(Me)
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

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

Re: Получение ссылки на родителя при инициализации класса

Сообщение alibek » 15.07.2009 (Ср) 12:33

Денис писал(а):Жаль только что нельзя сделать, чтобы процедура инициализации могла принимать параметры (типа Class_Initialize(Parent as Object)), тогда можно было бы обойтись одной строкой:

Код: Выделить всё
Set cMyClass = New clsMyClass(Me)

Пиши на других языках, где есть конструкторы.
В VB6 напрямую так не напишешь.
Lasciate ogni speranza, voi ch'entrate.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Получение ссылки на родителя при инициализации класса

Сообщение arthur2 » 15.07.2009 (Ср) 18:01

хм-м
А чем принципиально отличается:
Код: Выделить всё
cMyClass.Create Me
от
Код: Выделить всё
Set cMyClass.Parent = Me
И чем таким замечательным первый вариант хуже, а второй лучше?
:shock:
Единственное, что метод можно сделать функцией, чтобы значение возвращал, а свойство не сделаешь. Но здесь, вроде, такой задачи не стояло
Артур
 
   

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

Re: Получение ссылки на родителя при инициализации класса

Сообщение alibek » 16.07.2009 (Чт) 7:40

Эстетикой.
Lasciate ogni speranza, voi ch'entrate.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Получение ссылки на родителя при инициализации класса

Сообщение Mikle » 16.07.2009 (Чт) 8:26

Не только эстетикой. Во втором случае можно создать экземпляр, не указывая родителя (контейнер?). Предположим, что это недопустимо, однако ошибка выплывет позднее.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Получение ссылки на родителя при инициализации класса

Сообщение arthur2 » 16.07.2009 (Чт) 8:44

ну в общем да, согласен - убедил :)
alibek писал(а):Можно также создать и деструктор, процедуру Dispose, которая будет очищать ссылку.
А можно, чтобы после этого ещё и nothing присваивать не надо было? Типа, чтобы объект внутри деструктора сам себя уничтожил?

Mikle писал(а):Во втором случае можно создать экземпляр, не указывая родителя (контейнер?)
В первом тоже можно - если Parent не переменная, а процедура-свойство.
Артур
 
   

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

Re: Получение ссылки на родителя при инициализации класса

Сообщение Хакер » 16.07.2009 (Чт) 10:08

arthur2 писал(а):можно, чтобы после этого ещё и nothing присваивать не надо было? Типа, чтобы объект внутри деструктора сам себя уничтожил?

Угу. А то, что на объект и после могут остаться ссылки, это ничего. Пусть приложение рухнет, да?
Бред это. В COM подсчёт ссылок — одна из основ. Объект уничтожится тольк когда не будет ссылок, и ни при каких иных обстоятельствах.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: Получение ссылки на родителя при инициализации класса

Сообщение Денис » 16.07.2009 (Чт) 10:24

Чем второй вариант лучше?


Дело в том, что у меня класс создает контролы у класса-родителя (методом .Controls.Add()), В том числе и таймеры, которые внутри моего класса становятся WithEvents, можно было бы заюзать Usercontrol, чтобы не выделываться, но меня заинтересовала сама возможность манипулирования родительским классом из дочернего. Каковы пределы?
Вот тот факт, что таймеры на форме, а их события в дочерних классах - меня весьма поразил. Причем самое поразительное то, что создается один таймер, ссылку на него получает массив из ста экземпляров моего класса, и в каждый квант времени (тик таймера) запускается сто событий и сто экземпляров выполняют свои действия. И все это довольно шустро, я думал, тормозить будет, ан нет.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.


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

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

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

    TopList