Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.22;
Скачать: CL | DM;

Вниз

Delphi+MathCad   Найти похожие ветки 

 
arty   (2006-10-01 07:44) [0]

Доброго времени суток.
Возникла потребность работать с маткадом из под делфи(передавать данные, считать в маткаде без участия пользователя, принимать данные).
Если кто работал над данной проблемой - очень прошу поделиться опытом.


 
MBo ©   (2006-10-01 11:59) [1]

http://www.djpate.freeserve.co.uk/Mathcad.htm


 
arty   (2006-10-01 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 ©   (2006-10-02 10:39) [3]

смотрите справку по функциям
VarArrayDimCount, VarArrayLowBound, VarArrayHighBound


 
arty   (2006-10-03 01:55) [4]

спасибо
i:=length(t); заменен на i:= VarArrayHighBound(t,1);//одномерный массив, i=0                                                                          //вместо 150...
а где можно прочитать про интерфейс обмена(какие функции есть), а то я знаю только SetComplex и GetComplex , и помоему, с помощью этих функций с массивом ничего не выйдет - по крайней мере у меня ничего....
может кто работал раньше с этим или кто-нибудь ткните носом в описание(какие еще существуют функции для обмена инфой с маткадом), а то мочи уже нет биться лбом об стену....


 
arty   (2006-10-06 03:35) [5]

Я получил ссылку на Automation-объект (интерфейсный указатель IDispatch).
Как получить массив?


 
umbra ©   (2006-10-06 10:23) [6]

вам надо найти справку по объектной модели маткада (скорее всего, она есть в поставке). В ней описаны все свойства и методы Automation-объекта, которые Вы можете вызывать. Что касается максимального значения индекса (а не длины) массива, то получать его надо так:

i:= VarArrayHighBound(Er,1);

Кроме того, что Вам мешает обращаться к элементам массива и производить необходимые операции?


 
arty   (2006-10-06 13:37) [7]

после выполнения операции
i:= VarArrayHighBound(Er,1);
i = 0.....
а функция  VarType(Er) возвращает varDispatch $0009 -> (Er - это указатель IDispatch).
> что Вам мешает обращаться к элементам массива и производить необходимые операции?
Вы имеете в виду обозначить в Маткаде массив, как Er1,Er2,Er3,Er4....Er n и доставать каждый элемент отдельно?
Пока это единственное, что у меня получилось.... Вот, только боюсь, что время выполнения затянется..... :( Протещу - напишу.


 
cerber   (2006-10-17 21:46) [8]

Если найду исходник скину на мыло.
Но когда я ето делал, то создавал массив VarArray и его передавал в качестве аргумента в функции SetComplex, также забирал обратно.
Найду- покажу!
Насчет описания функций - смотри в Mathcad.TLB - там все наисано.


 
cerber   (2006-10-18 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;



Страницы: 1 вся ветка

Текущий архив: 2009.11.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
2-1255111640
Nub83
2009-10-09 22:07
2009.11.22
Перемещение мышкой двух кнопок


2-1255355336
timekiller
2009-10-12 17:48
2009.11.22
Глядеть PDF своей программой


15-1253523102
vrem
2009-09-21 12:51
2009.11.22
Совпадения сегодня?


15-1252405705
@!!ex
2009-09-08 14:28
2009.11.22
Подскажите хороший проигрыватель онлайн-радио


2-1255262251
relaxive
2009-10-11 15:57
2009.11.22
Как в режиме раельного времени работать с вводом/выводом консоли?