передача двумерного массива в АсtiveX и обратно

Добрый день!
1. Необходимо передать двумерный массив из Террасофт 3.4 в ActiveX написанную на Builder C++ 6
2. Необходимо передать двумерный массив из ActiveX (Builder) в Террасофт.
Какой код нужен на стороне Террасофт и ActiveX для реализации данных задач.

Нравится

13 комментариев

Здравствуйте, Андрей!

Пример работы с ActiveX-компонентами можно посмотреть в разделе Проекты в скрипте работы с диаграммой Гантта (scr_ProjectGanttAreaUtils) либо же в скрипте формирования графика (wnd_GraphViewScript)

В данном случае для того, чтобы дать Вам конкретный пример, необходимо определиться со следующими моментами:

Вами запускается ActiveX компонент приложения, созданного Вами в С++ Builder? Или же COM-объект Terrasoft? В этих двух случаях обращаться следует по-разному.

При передаче двумерного массива из TS все зависит от того, в каком формате принимет его ActiveX-объект.

"Alimova Anna" написал:

Здравствуйте, Андрей!

Пример работы с ActiveX-компонентами можно посмотреть в разделе Проекты в скрипте работы с диаграммой Гантта (scr_ProjectGanttAreaUtils) либо же в скрипте формирования графика (wnd_GraphViewScript)

Мне нужна информация именно по двумерным массивам. А с работой с ActiveX компонентой я разобрался.

"Alimova Anna" написал:

В данном случае для того, чтобы дать Вам конкретный пример, необходимо определиться со следующими моментами:

Вами запускается ActiveX компонент приложения, созданного Вами в С++ Builder? Или же COM-объект Terrasoft? В этих двух случаях обращаться следует по-разному.

Мной запускается ActiveX компонент, созданный мной в Билдере. Запускается из скрипта Террасофта.

"Alimova Anna" написал:

При передаче двумерного массива из TS все зависит от того, в каком формате принимет его ActiveX-объект.

Вот и подскажите мне как передавать и принимать двумерные массивы. Поскольку код передачи и приема буду писать я сам, то покажите наиболее простой способ.

Здравствуйте.

Создайте свойство какого либо объекта Вашего ActiveX, и передавайте в него двумерный массив через обычное присвоение.
Обратно - можно через такой же механизм, либо через метод, которой будет возвращать массив:

var My2DArray = myActiveXObject.Get2DArray();

в javascript нет соответствия двумерному массиву activex. Двумерный массив javascript - это объект, каждый индекс которого содержит ссылку на другой массив-объект. Таким образом вернуть двумерный массив из AcitiveX в Террасофт можно только через возврат объекта из activex. Например, в ворде можно получить объект приложение, у этого объекта есть объект документ, у которого в свою очередь есть свои методы и свойства. И меня интересует как такую иерархическую структуру вернуть из ActiveX. Долго копался и интернете, но так ничего и не нашел.

Здравствуйте, Андрей.


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

Т.е. грубо говоря, используя ActiveX, вы можете интегрировать свое приложение, написанное на каком либо языке программирования, в Террасофт. Т.е. по сути - это дает Вам возможность использовать свойства и методы Вашего приложения. Таким образом передача каких либо данных (в т.ч. 2D массив) осуществляется обычным присвоением нужному свойству Вашего приложения, подключенного через ActiveX.

Возьмем частный случай. Мне надо вернуть из ActiveX на Билдер С данные в виде двумерного массива. Для этого я должен соблюсти определенный формат данных, чтобы javascipt на обратной стороне увидел эти данные в виде объекта. Так вот я и хочу знать что это за формат, желательно с примером. Как подготовить эти данные, чтобы java script увидел мой объект. Чтобы ответить на этот вопрос нужно уже конкретно понимать, как пишутся ActiveX на Билдер С и какой там надо задать формат данных, как эти данные сформировать и подготовить. Кто уже делал что-то подобное, отзовитесь пожалуйста. Хотя мне подойдет пример и на Delphi, и на Visual C++. Террасофт ведь тоже возвращает объекты в javascript. У этих объектов есть свойства и методы. Неужели нельзя выдрать кусочек из исходников Террасофт и поместить его здесь?

Ну вот, к примеру, в Террасофт используя JScript:

1

Здесь я обьявлял массив локально:

var ActiveXArray = new Array();
ActiveXArray.push('1', 'test');

в Вашем случае его нужно взять из приложения подключенного по ActiveX:

var MyObject = new ActiveX('myObject');
SomeObject.Array2D = MyObject.Array2D;

как получить массив в javascipt проблемы нет. Проблема сформировать сам объект массива внутри ActiveX.

Андрей, в Вашем приложении должно быть свойство с типом object, тогда туда можно будет передать массив - через простое присвоение.

в Builder С++ типа object не существует. Не все так просто, как кажется на первый взгляд. Помочь в решении этой проблемы может только человек, который хорошо разбирается в создании ActiveX компонент на С++. Наверняка в вашей компании такие люди есть. Почему бы их не подключить к разговору?

Андрей, доброе утро.

class Box
{
   public:
      double length;   
      double breadth;  
      double height;   
};
 
Box Box1;          // Declare Box1 of type Box

В данном случае, мы получаем объект(object) Box1 с типом Box. У него есть свойства с типом double.
Вот если бы у Вашего приложения был похожий класс, только плюс доп. свойство с типом array, Вы бы могли присвоить туда массив:

Box1.length = 1;

В любом случае, попробую привлечь к этой теме разработчиков, возможно Вы получите доп. рекомендации.

"Рябенко Андрей" написал:

в Builder С++ типа object не существует. Не все так просто, как кажется на первый взгляд. Помочь в решении этой проблемы может только человек, который хорошо разбирается в создании ActiveX компонент на С++. Наверняка в вашей компании такие люди есть. Почему бы их не подключить к разговору?

Террасофт CRM 3.4.0.132

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Build 2600: Service Pack 3)


Андрей, сделайте параметр с типом Variant и работайте с ним как и в террасофре.

Также, может это поможет?

http://forum.vingrad.ru/forum/topic-318585/kw-jscript-array-object-inet…

Во втором посте – примеры преобразования массива в обе стороны, как это реализовано в jscript. Ну и дальше комментарии полезно будет почитать.

Показать все комментарии