Форум: "Corba";
Текущий архив: 2009.11.22;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "Corba";
Текущий архив: 2009.11.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c