VB.NET: Как в ActiveX контроле получить доступ к Ambient?
От: Wrangler  
Дата: 15.07.05 13:18
Оценка:
В VB6 из UserControl к его контейнеру доступ осуществлялся просто через Ambient. Т.е. в UserControl_InitProperties, например, можно было написать что-то вроде:

Dim objMyObject as MyObject
Set objMyObject = Ambient.ContainersSpecialObject


и всё прекрасно возвращалось.

Как сделать подобное в VB.NET? Получить надо объект, выставленный контейнером как Ambient-свойство. В VB6 пробовал — работает. Контейнер контрола — не VB-приложение.

Спасибо!
Re: VB.NET: Как в ActiveX контроле получить доступ к Ambient
От: Peter Fleischer Германия www.informtoools.de
Дата: 15.07.05 19:28
Оценка:
"Wrangler" <43800@users.rsdn.ru> schrieb im Newsbeitrag news:1275557@news.rsdn.ru...
>В VB6 из UserControl к его контейнеру доступ осуществлялся просто через Ambient. Т.е. в UserControl_InitProperties, например, можно было написать что-то вроде:
>
>
> Dim objMyObject as MyObject
> Set objMyObject = Ambient.ContainersSpecialObject
>

>
> и всё прекрасно возвращалось.
>
> Как сделать подобное в VB.NET? Получить надо объект, выставленный контейнером как Ambient-свойство. В VB6 пробовал — работает. Контейнер контрола — не VB-приложение.

Бери Parent:

Trace.WriteLine(Me.Parent.Name)

Peter
Posted via RSDN NNTP Server 1.9
Re[2]: VB.NET: Как в ActiveX контроле получить доступ к Ambi
От: Wrangler  
Дата: 16.07.05 07:00
Оценка:
Здравствуйте, Peter Fleischer, Вы писали:

PF>Бери Parent:


PF>Trace.WriteLine(Me.Parent.Name)


Спасибо, но того, что надо не получается. Т.е. возвращается Nothing. Я ещё не со всем этим разобрался, но, видимо, дело в том, что мой ActiveX контрол встраивается в контейнер не в Design-time, а при запуске программы, содержащей контейнер. Происходит это так.
После сборки контрола в его Implemented categories в реестре добавляется ClassID категории, являющейся его контейнером, т.е. получается так:
\\HKCR\CLSID\{my-ActiveX-control-clsid}\Implemented Categories\{container-category-classid}

После запуска, как я понял, программа находит в реестре своего клиента, создаёт для него контейнер, помещает клиента туда и запускает его.

Например, если нужное свойство контейнер а называется NeedsObject, то в VB6 у меня был следующий код:

Private m_objMyObject as NeedsObject

Private Sub UserControl_InitProperties()

    On Error GoTo PROC_ERR

    ' Control Properties initialization
    m_BackColor = LNG_BACKCOLOR
    ' ...

    Set m_objMyObject = UserControl.Ambient.NeedsObject

    lblMyText.Caption = m_objMyObject.Caption
    ' etc.

    Exit Sub
PROC_ERR:
    MsgBox "UserControl_InitProperties error: """ & Err.Description & """."
End Sub


При этом во время сборки проекта ни о каких ошибках VB не сообщал. Если же я пытаюсь сделать в VB.NET что-то вроде

Private m_objMyObject as NeedsObject

Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

        m_objMyObject = Me.Parent.NeedsObject
End Sub


то сразу получаю ошибку. ЧТо я делаю не так? И как надо?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.