Вот ведь на какие извраты иногда приходится идти.
Собсна имеем форму Delphi. На ней компонент WebBrowser (ActiveX-компонент). В него подгружается другой ActiveX-компонент: DeepView -- для того, чтобы покрутить 3D-модельку. 3D-моделька тоже, само собой, лежит отдельно в файле в папке с проектом (*.rh). В модели расставлены контрольные точки и если компоненту DeepView говорят перейти в ту или иную точку -- моделька соответсвенно плавненько крутиться, масштабируется и т.п. Вызов этих функций описан во внешних JS-ках. Всё круто. Но возникает вопрос, как компоненты в этой матрёшке будут друг с другом разговаривать? Ибо нужно, к примеру, для каждой контрольной точки в модели создать по кнопке-ссылке. Для этого надо, как минимум, знать их количество. А еще очень неплохо было бы знать их по именам Схема обращений рисуется следующая: Pascal —> HTML —> JS —> DeepView API (С/С++). Нехило, на мой взгляд. Ну да ладно. Глаза боятся, а руки.. а руки кодят. Во.

Итак, раскапываем майкрософтовский MSDN На предмет API ихнего мастдайного браузера (именно его юзает TWebBrowser). Эта тут. Видим, что можем обращаться к загруженному в браузер документу и к его элементам и видим всё это для сишек и басиков. Ну не страшно, немного гугления и вот страничка, которая в лоб тыкает нас, как обратиться к документу и всем его вкусностям средствами дельфи: Тык. Собственно, строка



даёт нам любой объект типа IHTMLElement. Смотрим в код HTML-ины - хватаем нужное имя и дело в шляпе.

ОК. Что с этим делать дальше? А дальше нам нужно заставить этот объект сказать нам всё о контрольных точках загруженной в него модели. Очень тормозит процесс отсутствие документашек по DeepView API. Но на то воля его девелоперов. В общем, смотрим, как всё это делается в функциях JS (например, для получения количества точек):



И пробуем прямо в лоб по аналогии:



dvScene здесь имеет тип OleVariant. stepCount думаю и так понятно какой
И [о чудо]! Оно возвращает число. Причём то самое. Ну теперь уже совсем всё просто. По аналогии получаем имена точек, пробегаясь в цикле по их индексам:



И вешаем куда нам надо (у меня это были кнопки) события переводящие 3D-сцену в нужное состояние по его идексу. Я изначально зачем-то это сделал внешним вызовом соответствующей JS-функции примерно так:



Но видимо это были магнитные бури, или 2.40 ночи дали о себе знать
В общем утром дошло, что это лишняя прослойка и можно просто делать так:



Погнал рефакторить