Здравствуйте!
Как можно динамически создать элемент управления,
предварительно не подключая его в компонентах.
Возможно ли вообще такое?
У меня есть скомпилированный .ocx, который имеет
пару свойств и один метод.
Можно ли, зная его программное имя, добавить его на форму?
Я пишу Set mucFoo = Me.Controls.Add(“FOO.ucFoo”, “FooControl”, Frame1)
объект создается, но определенные методы и свойства недоступны L.
Если его предварительно подключить в компонентах – все работает нормально.
Здравствуйте, КДА, Вы писали:
КДА>Здравствуйте! КДА>Как можно динамически создать элемент управления, КДА>предварительно не подключая его в компонентах. КДА>Возможно ли вообще такое? КДА>У меня есть скомпилированный .ocx, который имеет КДА>пару свойств и один метод. КДА>Можно ли, зная его программное имя, добавить его на форму? КДА>Я пишу Set mucFoo = Me.Controls.Add(“FOO.ucFoo”, “FooControl”, Frame1) КДА>объект создается, но определенные методы и свойства недоступны L. КДА>Если его предварительно подключить в компонентах – все работает нормально.
Компонент ОБЯЗАТЕЛЬНО! должен быть сначала проинициализирован. Для того чтобы в памяти появился его неимспэйс (пространство имен и методов), которое будет впоследствии дублироваться. Создание обычного указателя на объект говорит компилятору, что ты просто будешь обращаться к объекту данного типа, сама память под объект не выделяется. Так, что попытки вызвать динамическое создание подключенныого к проекту компонента ни к чему не приведут. Выпадет Object or With bloc not set ну или както там...
Другое дело когда ты динамичекси создаешь классы COM объектов (Recordset etc.) для классов можно вызвать оператор New который автоматом создаст еще один экземпляр этого класса в памяти и присвоит указатель на него твоей переменной.
С регардами.
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Перевожу на русский что сказал free stranger:
1) Через Components добавляешь свой ActiveX.
2) В свойствах проэкта убираешь галку "Remove info about unused ActiveX controls".
3) Компилируешь.
4) Наслаждаешься.
Это понятно и так!
Смысл в том, что на стадии разработке никто не знает какой контрол
захочет загрузить пользователь...
Есть ряд .ocx’ов, у них одинаковые методы и свойства. Этот ряд может бесконечно
пополняться…
Пользователь в настройках программы задает программное имя компонента.
Нужно по программному имени загрузит компонент на форму. Разумеется, это
происходить после компиляции J ….
Короче, вот как это делается. Сначала загружаем объект на форму, для этого пользуемся
методом add коллекции controls. Метод возвращает ссылку на созданный объект.
Объявляем переменную типа Object:
Dim objFoo as Object
в нужном месте пишем: set objFoo = me.controls.add (“Foo.ucFoo”,”NameFoo”,Me)
методы и свойства загруженного компонента можно использовать так:
objFoo.object.[метод | свойство].
Если во время разработки указать этот контрол в компонентах, то обращаться к
методам и свойствам можно так: objFoo.[метод | свойство].
Вот то что есть в MSDN’е:
Syntax
object.Object[.property | .method]
Returns a reference to a property or method of a control which has the same name as a property or method automatically extended to the control by Visual Basic.
Remarks
Note The Object property returns the object which is the basis for the control without the properties or methods automatically extended to the control by Visual Basic. Therefore, you can also reference the controls' "custom" properties and methods through the Object property
Тем не менее, большое СПАСИБО всем кто откликнулся.
Здравствуйте, КДА, Вы писали:
КДА>Тем не менее, большое СПАСИБО всем кто откликнулся.
Если проблема еще не решена то вот кусочек кода
...
...
...
Private Function DinCreateAXControl(ByRef ProgID As String, ByRef ComponentName As String) as Object'Лицензируем класс объекта
Licenses.Add ProgID
'Создаем екземпляр объекта по ProgID и возвращаем егоSet DinCreateAXControl = Me.Controls.Add(ProgID, ComponentName)
End Function
...
...
...
Созданные объекты лучше всего хранить в коллекции (проще присвоить имя да и удобнее при деинициализации и в работе)
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Здравствуйте, КДА, Вы писали:
КДА>Здравствуйте! КДА>Как можно динамически создать элемент управления, КДА>предварительно не подключая его в компонентах. КДА>Возможно ли вообще такое? КДА>У меня есть скомпилированный .ocx, который имеет КДА>пару свойств и один метод. КДА>Можно ли, зная его программное имя, добавить его на форму? КДА>Я пишу Set mucFoo = Me.Controls.Add(“FOO.ucFoo”, “FooControl”, Frame1) КДА>объект создается, но определенные методы и свойства недоступны L. КДА>Если его предварительно подключить в компонентах – все работает нормально.
Если описанным путём не получается достучаться до свойств, то можно попробовать написать враппер на бейсике, т.е. контрол на форме, а форма просто COM.dll или OCX c нужным интерфейсом.
Но если код весь свой, то лучше реализовать интерфейс и грузить просто COM объекты, а специализированный OCX использовать только если нужен пользовательский ввод, но и это можно через стандартные элементы реализовать.