Конференция "Corba" » Delphi+MathCad [Delphi, Windows]
 
  • arty (01.10.06 07:44) [0]
    Доброго времени суток.
    Возникла потребность работать с маткадом из под делфи(передавать данные, считать в маткаде без участия пользователя, принимать данные).
    Если кто работал над данной проблемой - очень прошу поделиться опытом.
  • MBo © (01.10.06 11:59) [1]
  • arty (01.10.06 16:15) [2]
    Спасибо получилось прередать и принять числа...
    Хуже дело предстоит с векторами(массивы)

     oleContainer1.CreateObjectFromFile('D:\doks\mathcad\predict.mcd',False);
     oleContainer1.DoVerb(ovPrimary);
     MCadObject := OleContainer1.OleObject;
     MCadObject.SetComplex('N', 53, 0);
     MCadObject.Recalculate;
     Er := MCadObject.GetComplex( 'E', t, 0);//Е - это в маткаде матрица[n,1]
     i:=length(t);// - здесь crash - пишет Could not convert variant of type (Array                     //Double)into type (String)
                     // t определена как variant
  • umbra © (02.10.06 10:39) [3]
    смотрите справку по функциям
    VarArrayDimCount, VarArrayLowBound, VarArrayHighBound

  • arty (03.10.06 01:55) [4]
    спасибо
    i:=length(t); заменен на i:= VarArrayHighBound(t,1);//одномерный массив, i=0                                                                          //вместо 150...
    а где можно прочитать про интерфейс обмена(какие функции есть), а то я знаю только SetComplex и GetComplex , и помоему, с помощью этих функций с массивом ничего не выйдет - по крайней мере у меня ничего....
    может кто работал раньше с этим или кто-нибудь ткните носом в описание(какие еще существуют функции для обмена инфой с маткадом), а то мочи уже нет биться лбом об стену....
  • arty (06.10.06 03:35) [5]
    Я получил ссылку на Automation-объект (интерфейсный указатель IDispatch).
    Как получить массив?
  • umbra © (06.10.06 10:23) [6]
    вам надо найти справку по объектной модели маткада (скорее всего, она есть в поставке). В ней описаны все свойства и методы Automation-объекта, которые Вы можете вызывать. Что касается максимального значения индекса (а не длины) массива, то получать его надо так:

    i:= VarArrayHighBound(Er,1);



    Кроме того, что Вам мешает обращаться к элементам массива и производить необходимые операции?
  • arty (06.10.06 13:37) [7]
    после выполнения операции
    i:= VarArrayHighBound(Er,1);
    i = 0.....
    а функция  VarType(Er) возвращает varDispatch $0009 -> (Er - это указатель IDispatch).
    > что Вам мешает обращаться к элементам массива и производить необходимые операции?
    Вы имеете в виду обозначить в Маткаде массив, как Er1,Er2,Er3,Er4....Er n и доставать каждый элемент отдельно?
    Пока это единственное, что у меня получилось.... Вот, только боюсь, что время выполнения затянется..... :( Протещу - напишу.
  • cerber (17.10.06 21:46) [8]
    Если найду исходник скину на мыло.
    Но когда я ето делал, то создавал массив VarArray и его передавал в качестве аргумента в функции SetComplex, также забирал обратно.
    Найду- покажу!
    Насчет описания функций - смотри в Mathcad.TLB - там все наисано.
  • cerber (18.10.06 23:50) [9]
    А вот и исходничичек:

    procedure TForm1.Button1Click(Sender: TObject);
    var v0,v1,v2:olevariant;
       d0:array of double;
       i,j,k:integer;
       tv0:tvardata;
       mcddoc:variant;
    begin
       //очищаем Memo
       memo1.Clear;
       //создаем масив входных данных
       v0:=VarArrayCreate([0,9],varVariant);
       //заполняем массив

       for i:=0 to 9 do
           v0[i]:=i;

       //создаем и инициалазируем объект Маткад на основе файла
       //файл Маткад содержит единственную строку: out0:=sin(in0)
        olecontainer1.CreateObjectFromFile('c:\test.mcd',false);
        olecontainer1.DoVerb(ovprimary);
       //передаем управление объектом Маткад переменной mcddoc
        mcddoc:=olecontainer1.OleObject;
       //передаем переменную v0 в переменную in0 документа Маткад
        mcddoc.setcomplex('in0',v0,EmptyParam);
       //производим перерасчет
        mcddoc.recalculate;
       //забираем значение v1 из переменной out0 документа Маткад
        mcddoc.getcomplex('out0',v1,EmptyParam);
       //закрываем Маткад
        olecontainer1.Close;

       //проверяем переменную v1 на принадлежность к массиву
        if varisarray(v1)then
         begin
           //получаем указатель на структуру содержащую информацию о переменную v1
           tv0:=findvardata(v1)^;
           //получаем значение размерности массива
           //= 1 - для таблицы с 1 столбцoм; = 2 - для таблицы с 2 столбцами т.д.
           k:=tv0.VArray^.DimCount-1;
           //получаем значение количества елементов в массиве
           j:=tv0.VArray^.Bounds[k].ElementCount;
           //устанавливаем размер массива d0
           setlength(d0,j);
           //заполняем массив d0 данными из массива v1
           d0:=tv0.VArray^.Data;
           //обрезаем массив d0 от разного мусора???
           setlength(d0,j);
           //формируем вывод
           for i:=0 to j-1 do
               memo1.Lines.Add('sin( '+floattostr(v0[i])+' ) = '+floattostr(d0[i]));
          end
        else
           memo1.Text:=v1;

        //ощищаем массивы
          setlength(d0,0);
          v0:=emptyparam;
          v1:=emptyparam;

    end;

 
Конференция "Corba" » Delphi+MathCad [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0.003]