Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Delphi+MathCad [Delphi, Windows]


arty ©   (2006-10-01 07:44:00) 

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


cerber   (2006-10-18 23:50:00) [1]

А вот и исходничичек:

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;


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

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


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

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


umbra   (2006-10-06 10:23:00) [4]

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

i:= VarArrayHighBound(Er,1);

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


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

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


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

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


umbra   (2006-10-02 10:39:00) [7]

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


arty   (2006-10-01 16:15:00) [8]

Спасибо получилось прередать и принять числа...
Хуже дело предстоит с векторами(массивы)

 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


MBo   (2006-10-01 11:59:00) [9]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо