Re[7]: Как сделать персистентную связь с ImageList?
От: Бенедикт  
Дата: 27.04.06 07:41
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>>>Впрочем, все равно интересно насчет "тезиса". В каком это виде бейсиковские имена переменных существуют в рантайме? Где об этом можно почитать?


Б>>Почему речь пошла об именах переменных? Говорили же об элементах управления. До элементов управления на форме из методов UserControl-а можно добраться и в design-, и в run-time через UserControl.ParentControls, либо через .Controls последнего в цепочке Parent-ов UserControl.Extender-а. См. также справку по .ContainedControls, .Controls.Add и Q190670.


I>По индексу можно, а по имени — вопрос.


Да, у коллекций ParentControls и ContainedControls ключи только типа Long, но это не останавливает. Главное — добраться до формы. Проще всего, наверное, это сделать через ParentControls, в ней первым элементом идёт как раз она. Допустим, из модуля UserControl-а хотим добраться по имени до ImageList-а, лежащего на той же форме, что экземпляр UserControl-а. Тогда следующие обращения эквивалентны:
 Private m_ImageListName as String
 '... как-то получили имя ImageList-а и положили в m_ImageListName
 Dim iml As ImageList
 Set iml = UserControl.ParentControls(0)(m_ImageListName)                    '1
 Set iml = UserControl.ParentControls(0).Controls(m_ImageListName)           '2
 'или
 Dim frm As Form
 Set frm = UserControl.ParentControls(0)
 Set iml = frm(m_ImageListName)                                              '1a
 Set iml = frm.Controls(m_ImageListName)                                     '2a

Но это не всё...

I>Может быть я неясно выражаюсь вследствие того, что имею неправильное представление о предмете . У каждого контрола есть идентификатор (свойство (Name) в Properties). Этот идентификатор используется в коде программы как имя переменной. По аналогии с другими переменными (и другими языками программирования), имя переменной является информацией для программиста в исходном коде, а в скомпилированном коде имя исчезает, превращаясь в адрес в памяти. Соответственно, если я пытаюсь найти на форме ImageList по его имени (MyImageList) в скомпилированном контроле, то, как мне кажется, это не должно получиться, т.к. исходного кода уже как бы нет Укажите мне на ошибку в моих рассуждениях. Может быть контролы — это какие-то особенные переменные, которые сохраняют свои имена в рантайме, в виде свойства?


...потому что есть способ, явно раскрывающий сущность контролов:
 Set iml = CallByName(UserControl.ParentControls(0), m_ImageListName, VbGet) '3
 Set iml = CallByName(frm, m_ImageListName, VbGet)                           '3a

Т.е. контрол — это Property Get объекта-хозяина, которое возвращает ссылку на экземпляр контрола (или его Extender-а для не-intinsic-ов? Не соображу.) Это не переменная, а свойство. VB-шные объекты наследуют IDispatch, и обращение по имени свойства/метода приводит к вызову IDispatch::Invoke() — за что MS упорно и боролся, создавая Automation. В общем, надо взять книжку типа "Inside COM" Роджерсона (можно найти в Сети) и почитать про диспетчеризацию и дуальные интерфейсы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.