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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

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

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

Ivan093 » 27 ноя 2007, 13:36

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

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

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

Romeo » 27 ноя 2007, 10:56

А, вообще, поддерживаю господина WinMain'а. Проще сделать это под Visual Studio - меньше боков будет. И помочь я тебе тогда смогу намного более качественно :)

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

Romeo » 27 ноя 2007, 10:51

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

Сорри, плохо знаю билдер, потому не знаю просто ли получить хендл твоего ActiveX. Думаю, проблем возникнуть не должно. Если столкнулся с ними, то тебе поможет безотказный вариант: опроси (QueryInterface) у твоего COM объекта интерфейс IOleWindow, затем воспользуйся методом GetWindow. По той причине, что у тебя ActiveX, этот интерфейс должен поддерживаться в любом случае.

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

WinMain » 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 нормальные получаются и работают правильно.

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

Ivan093 » 27 ноя 2007, 07:48

Добрый день!

Спасибо. С последней проблемой я разобрался.
Возникла другая: как добраться до хендла окна, в котором работает мой activex элемент? Свойства Parent и Owner у моего элемента они равны NULL.

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

Romeo » 25 ноя 2007, 02:36

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

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

#error "We are here"
Затем собери проект. Если ошибка компиляции "We are here" отсутствует, то я прав. Если присутствует, то тебе действительно понадобятся знатоки билдера :)

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

Ivan093 » 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 не определена.
Знатоки билдера, подскажите, плиз, как мне получить доступ к ней?!

Вернуться к началу