Знатокам билдера: как получить доступ к VCL-элементу?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Ivan093
Сообщения: 54
Зарегистрирован: 28 июн 2007, 13:59
Откуда: Екатеринбург
Контактная информация:

21 авг 2007, 13:06

Есть activex компонента, созданная в билдере визардом на основе другого VCL-компонента Class. Визард создал файлы ClassControl.cpp, ClassControl_TLB.cpp и .h, ClassControl_ATL.cpp и .h, ClassImpl.cpp и .h
В файле ClassImpl есть переменная m_VclCtl, которая указывает на графический VCL-контрол, и через нее доступны все методы контрола. Эта переменная определена в файле atl\atlvcl.h если нажать Find Declaration на этой переменной.
Я добавил в проект файл cpp и h. И хочу получить доступ к m_VclCtl из нового файла.
Пробовал подключать все хедеры, которые подключаются в первых файлах -- все равно при сборке пишет, что m_VclCtl не определена.
Знатоки билдера, подскажите, плиз, как мне получить доступ к ней?!
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

25 ноя 2007, 02:36

Я не знаток билдера, но зная C++ могу предположить, что эта переменная расположена в каких-нибудь #ifdef'ах, если её не видно при явном подключении хеадера. Помести рядом с декларацией переменной строку:

Код: Выделить всё

#error "We are here"
Затем собери проект. Если ошибка компиляции "We are here" отсутствует, то я прав. Если присутствует, то тебе действительно понадобятся знатоки билдера :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ivan093
Сообщения: 54
Зарегистрирован: 28 июн 2007, 13:59
Откуда: Екатеринбург
Контактная информация:

27 ноя 2007, 07:48

Добрый день!

Спасибо. С последней проблемой я разобрался.
Возникла другая: как добраться до хендла окна, в котором работает мой activex элемент? Свойства Parent и Owner у моего элемента они равны NULL.
Аватара пользователя
WinMain
Сообщения: 913
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

27 ноя 2007, 10:47

Я когда-то пытался сделать ActiveX-контрол на C++ Builder 6.0, но ничего хорошего из этого не получилось. Я тоже столкнулся с проблемой, что визард C++ Builder'a генерит некорректный код, который потом не хочет компилироваться. Приходится ошибки вручную исправлять. Но и это ещё не всё. Попробовал полученный компонент вставить в визуальную форму. При запуске формы размер контрола становится не таким, который я его установил в дизайнере форм, а какой-то свой по умолчанию. Видимо у этого контрола с персистентностью проблемы. А файл atlvcl.h есть ни что иное как неудачная попытка адаптировать платформу VCL под библиотеку ATL от Microsoft. В итоге я отказался от C++ Builder и сделал ActiveX на Visual C++. Если уж делать ActiveX на базе VCL, то лучше тогда использовать Delphi в оригинале. На Delphi компоненты ActiveX нормальные получаются и работают правильно.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

27 ноя 2007, 10:51

Получи хендл окна твоего ActiveX, а потом воспользуйся API функцией GetParent. Свойства могут быть не всегда правильно выставлены.

Сорри, плохо знаю билдер, потому не знаю просто ли получить хендл твоего ActiveX. Думаю, проблем возникнуть не должно. Если столкнулся с ними, то тебе поможет безотказный вариант: опроси (QueryInterface) у твоего COM объекта интерфейс IOleWindow, затем воспользуйся методом GetWindow. По той причине, что у тебя ActiveX, этот интерфейс должен поддерживаться в любом случае.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

27 ноя 2007, 10:56

А, вообще, поддерживаю господина WinMain'а. Проще сделать это под Visual Studio - меньше боков будет. И помочь я тебе тогда смогу намного более качественно :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ivan093
Сообщения: 54
Зарегистрирован: 28 июн 2007, 13:59
Откуда: Екатеринбург
Контактная информация:

27 ноя 2007, 13:36

Да, проблему решил через GetParent. Спасибо, Romeo.
Эх, если бы сразу знать, что на билдере activex элементы писать не очень, то выбрал бы наверное вижуал си++, но сейчас большая часть пути пройдена -- от билдера уже не отказаться.
Да в целом больших проблем нету, т.к. пишу activex не с нуля, а делаю как-бы враппер (ну с добавление своего функционала ессесно) для движка географической карты (движок сторонний и купленный), чтобы его можно было встроить в 1с 8.1.

Сейчас по сути у меня одна проблема (вроде писал про нее) и то непонятно, косяк это движка карты или косяк в работе activex в среде 1с: если встраиваю карту в 1с, то при изменении размеров окна activex вместо карты черная область, т.е. карта не перерисовывается, хотя все события при изменении размеров отрабатывают. Не перерисовывается она только когда работает в режиме буферизации и в 1с (картинка строится в буфере, а потом выводится на экран). Пробовал встроить ее в excel -- там все ок при изменении размеров в любом режиме. Вот и пойми в чем косяк :confused:
Ответить