Тема: Передача массива из TDMS в ActiveX

Здравствуйте!)

Ни как не получается передать массив строк из TDMS в свой ActiveX написанный на C#

Сам Ах правильно регистрируется в системе, добавляется на форму TDMS, с этим никаких проблем нет.

В Ах есть функция обработки массива:

public void AddSotr(string[] TasksArray, int count)
        {
            int i;
            int j;
            for (i=0;i<count;i++)
            {
                dataGridView1.Rows.Add();
                dataGridView1.Rows[i].Cells[0].Value = TasksArray[i];
            }

        }

В TDMS есть вызов этой функции:

Sub BUTTON1_OnClick()
   set Grid = thisform.Controls("GRID").ActiveX
   dim b(3)
   b(0) = "1"
   b(1) = "2"
   b(2) = "3"
   
   Grid.AddSotr b, 3
End Sub

В итоге ошибка: Недопустимый вызов или аргумент процедуры Grid.AddSotr

Помогите разобраться как правильно передавать массивы данных из TDMS в ActiveX на С#

Передача массива из TDMS в ActiveX

Re: Передача массива из TDMS в ActiveX

alexander_8901 пишет:

Здравствуйте!)

Ни как не получается передать массив строк из TDMS в свой ActiveX написанный на C#

В итоге ошибка: Недопустимый вызов или аргумент процедуры Grid.AddSotr

Помогите разобраться как правильно передовать массивы данных из TDMS в ActiveX на С#

Имхо. Массивы в VBScript - это SAFEARRAY
Вам необходимо определить массив в шарпе с этим типом, и уже потом выдергивать из него строку

Я сам никогда так не делал, если не получится, пишите   :blink:

Re: Передача массива из TDMS в ActiveX

McZag пишет:

Имхо. Массивы в VBScript - это SAFEARRAY
Вам необходимо определить массив в шарпе с этим типом, и уже потом выдергивать из него строку

Я сам никогда так не делал, если не получится, пишите   :blink:



public void AddSotr(SAFEARRAY TasksArray, int count)
        {
            int i;
            int j;
            for (i=0;i<count;i++)
            {
                dataGridView1.Rows.Add();
              
            }

        }

Таже ошибка

Re: Передача массива из TDMS в ActiveX

http://support.microsoft.com/kb/207931/ru
Возможно, "Сценарий 3" - то, что нужно.  ;)

Re: Передача массива из TDMS в ActiveX

McZag пишет:

Имхо. Массивы в VBScript - это SAFEARRAY
Вам необходимо определить массив в шарпе с этим типом, и уже потом выдергивать из него строку

Я сам никогда так не делал, если не получится, пишите   :blink:

точно SAFEARRAY !?!??

Я уже кучу вариантов объявления метода перебрал с SAFEARRAY, ничего не помогло(
  :(

Re: Передача массива из TDMS в ActiveX

Вот значит до чего я дошел..))
интерфейс:

 public interface GridProperties
    {   [DispId(1)]
        void AddSotr([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_INT)] ref int[] Array, int count);
       
    }

сам метод:

 public void AddSotr(ref int[] Array, int count)
        {
            MessageBox.Show("ololo");
            int i;
            for (i=0;i<count;i++)
            {
                dataGridView1.Rows.Add();

            }

        }

VBS:

Sub BUTTON1_OnClick()

   set Grid = thisform.Controls("GRID").ActiveX
   dim c(2)
   c(0)=1
   c(1)=2
   c(2)=3
   Grid.AddSotr c, 3

End Sub

В итоге картинка ниже

Передача массива из TDMS в ActiveX

(изменено: alexander_8901, 27 августа 2012г. 15:50:25)

Re: Передача массива из TDMS в ActiveX

И вот ссылка на эту штуку
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_INT)]
http://msdn.microsoft.com/en-us/library/z6....80).aspx#Y1560
http://msdn.microsoft.com/ru-ru/library/sy...es.varenum.aspx

Понемногу схожу с ума   :blink:

Re: Передача массива из TDMS в ActiveX

alexander_8901 пишет:

Понемногу схожу с ума   :blink:

Не надо. Попробуйте использовать методы ThisApplication.Utility.VariantToArray и обратный ему (в справке по API TDMS есть описание с примерами). Может быть это преобразование поможет?

Re: Передача массива из TDMS в ActiveX

McZag пишет:

Не надо. Попробуйте использовать методы ThisApplication.Utility.VariantToArray и обратный ему (в справке по API TDMS есть описание с примерами). Может быть это преобразование поможет?


Уже давно попробовал, результата нет.

Re: Передача массива из TDMS в ActiveX

alexander_8901 пишет:

Уже давно попробовал, результата нет.

Еще одно предложение. Извините, что просто советую, но повторить вашу ситуацию "вчистую" сложно, у меня нет контрола.
Возможно, "некто" превращает ваш массив в объект
Попробуйте принять данные через

public void AddSotr(object TasksArray, int count)

А дальше смотрите в отладчике и преобразуйте эту загадочную сущность в нужный вам тип данных.

Спасибо сказали: KudrjashovAI1

(изменено: alexander_8901, 28 августа 2012г. 13:18:28)

Re: Передача массива из TDMS в ActiveX

McZag пишет:

Еще одно предложение. Извините, что просто советую, но повторить вашу ситуацию "вчистую" сложно, у меня нет контрола.
Возможно, "некто" превращает ваш массив в объект
Попробуйте принять данные через

public void AddSotr(object TasksArray, int count)

А дальше смотрите в отладчике и преобразуйте эту загадочную сущность в нужный вам тип данных.


Огромное спасибо, Вам!!=)

[DispId(5)]
        void getob(object ob);
public void getob(object ob)
        {
            MessageBox.Show("ololo");
                MessageBox.Show(((object[])ob)[1].ToString());
        }
Sub BUTTON1_OnClick()
set Grid=thisform.Controls("GRID").ActiveX
dim c(3)
c(0) = 1
c(1) = 2
c(2) = 3
Grid.getob c
End Sub

работает!)))   :rolleyes:  :  :rolleyes:

можно тему закрывать)

Re: Передача массива из TDMS в ActiveX

alexander_8901 пишет:

Огромное спасибо, Вам!!=)

работает!)))   :rolleyes:  :  :rolleyes:

можно тему закрывать)

И вам спасибо за настойчивость

Re: Передача массива из TDMS в ActiveX

А у меня не прокатило такое решение, хотя делаю 1:1 вроде. Может в старших версиях чего-то поменялось... Пишет ошибку "Переменная использует не поддерживаемый в VBScript тип программирования объектов".
Пока в голову приходит костыль по передачи отдельной функцией массива из TDMS в компонент ActiveX...

(изменено: Shoorup, 27 декабря 2016г. 12:32:20)

Re: Передача массива из TDMS в ActiveX

Ну в общем получилось у меня. Затык был в типе массива.
Мой компонент для работы с PDF файлами. Функция которую я сделал нужна для объединения файлов PDF в один. Использовал библиотеку itextsharp.

Set PDFworker = CreateObject("ShWinForms.PDFworker")
Dim arrPathPDFs, Count
arrPathPDFs = Array() 'Создаем массив типа Variant
Count = ThisObject.Content.Count
ReDim arrPathPDFs (Count)' Перераспределяем массив

'Заполняем массив
For i=0 To ThisObject.Content.Count-1
  arrPathPDFs(i) = ThisObject.Content.Item(i).Files.Main.WorkFileName
Next
  DestinationPathMergePDF = ThisObject.WorkFolder + "\" ' Путь для нового объединенного файла
  MergeFileName = ThisObject.Description ' Имя нового объединенного файла
Call PDFworker.MergePDFfiles (arrPathPDFs, Count, DestinationPathMergePDF, MergeFileName)

ThisObject.CheckIn
Set PDFworker = Nothing

Массив мне нужен был для списка путей файлов PDF которые нужно объединять.
Для того чтобы передать массив из TDMS в ActiveX, его нужно было сделать типа Variant

В компоненте массив передается как тип object и затем конвертируется в массив типа string

public void MergePDFfiles(object arrPathPDFs, int Count, string DestinationPathMergePDF, string MergeFileName)
        {
            ...
            string[] filepath = new string[Count];
            filepath = Array.ConvertAll((object[])arrPathPDFs, Convert.ToString);
            ....
        }

Сам бы тыкался долго, если бы не эта тема. Всем спасибо!  :)

Re: Передача массива из TDMS в ActiveX

Shoorup пишет:

Ну в общем получилось у меня. Затык был в типе массива.
Сам бы тыкался долго, если бы не эта тема. Всем спасибо!  :)

Рад слышать, с наступающим Новым годом!
Успехов и процветания!