Сложный вопрос по UserControl-ам - VB

Узнай цену своей работы

Формулировка задачи:

Есть такая чудесная библиотека - TLBINF32.DLL, с помощью которой можно получить список всех свойств заданного элемента управления. Например:
Листинг программы
  1. Public Function CollectProperties(Target As Object) As Collection
  2. Dim oTLB As InterfaceInfo
  3. Dim sMemberName As String
  4. Dim sInvokeKind As String
  5. Dim i As Integer
  6. Dim kFuncReturn As Collection
  7. Dim o As clsMember
  8. Set kFuncReturn = New Collection
  9. Set oTLB = TLI.InterfaceInfoFromObject(Target)
  10. For i = 1 To oTLB.Members.Count
  11. sInvokeKind = ReturnInvokeKind(oTLB.Members(i).InvokeKind)
  12. If InStr(1, sInvokeKind, 'INVOKE_PROPERTY') > 0 Then
  13. sMemberName = oTLB.Members(i)
  14. If Left$(sMemberName, 1) <> '_' Then
  15. Set o = New clsMember
  16. o.MemberName = sMemberName
  17. o.MemberType = sInvokeKind
  18. kFuncReturn.Add o
  19. End If
  20. End If
  21. Next i
  22. Set CollectProperties = kFuncReturn
  23. End Function
И пример вызова:
Листинг программы
  1. Dim propList As Collection
  2. Dim propMember As clsMember
  3. Dim ct As Control
  4. Set ct = Me.Text1 ' << просто для примера
  5. ' получаем список свойств контрола ct в коллекцию propList:
  6. Set propList = CollectProperties(ct)
  7. ' заполняем комбобокс cboProps свойствами контрола ct:
  8. For Each propMember In propList
  9. cboProps.AddItem propMember.MemberName
  10. Next propMember
Примечание: класс clsMember описан так:
Листинг программы
  1. Public MemberName As String
  2. Public MemberType As String
В реальной моей ситуации контрол ct получается не прямым присваиванием (хотя и так тоже можно, конечно), а из перебора всех элементов Me.Controls. Таким образом можно составить список свойств для каждого контрола формы. Этот список получается полным - в нём будут действительно все свойства контрола, а не только те, что видны в окошке Property Browser. Например, для текстбокса мы увидим не только свойство Font, но и свойство FontBold, для комбобокса - не только List, но и ListIndex, и так далее. Итак, всё чудесно. А теперь усложняем ситуацию. Допустим, что приведённый выше 'Пример вызова' запускается не из формы, а из кода некоего нашего UserControl-а, размещённого на этой форме. Естественно, перебирать коллекцию Me.Controls уже нельзя; вместо неё нужно перебирать коллекцию ParentControls. И вот в этом случае в коллекцию propList попадут, увы, НЕ ВСЕ свойства контрола ct, - а именно, попадут лишь те, что видны в окошке Property Browser. Например, для комбобокса в коллекцию не попадёт свойство ListIndex, и т.д. Такое впечатление, что с точки зрения библиотеки 'TypeLib Information' (TLBINF32.DLL) свойства контролов имеют как бы 'ограниченную область видимости': с родительской формы они видны все, из UserControl-а (в моём случае - с его Property Page) - лишь их часть. Вопрос: как это можно обойти? Приходит в голову следующее: В коде property-странички UserControl-а получаем в переменную ct (объявленную As Control) очередной контрол с родительской формы (т.е. через коллекцию ParentControl). Динамически создаём на property-страничке контрол того же типа, и вот его уже и 'скармливаем' функции CollectProperties. После заполнения коллекции propList временный контрол со странички удаляем. Вроде просто, только вот непонятно, как создать контрол 'того же типа', что и 'сидящий' внутри переменной ct. Может, есть и другие решения?! PS: Список свойств нужно получать именно из UserControl-а! Т.е. 'на лету'. Вариант 'получить их в коде формы, куда-нибудь сохранить, а потом оттуда закачать в код UserControl-а' - не подходит.

Решение задачи: «Сложный вопрос по UserControl-ам»

textual
Листинг программы
  1. Friend Property Get parControls() As ParentControls
  2.     Set parControls = ParentControls
  3. End Property

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы