Здравствуйте, 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" Роджерсона (можно найти в Сети) и почитать про диспетчеризацию и дуальные интерфейсы.