-
Доброго времени суток. Возникла потребность работать с маткадом из под делфи(передавать данные, считать в маткаде без участия пользователя, принимать данные). Если кто работал над данной проблемой - очень прошу поделиться опытом.
-
-
Спасибо получилось прередать и принять числа... Хуже дело предстоит с векторами(массивы)
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
-
смотрите справку по функциям VarArrayDimCount, VarArrayLowBound, VarArrayHighBound
-
спасибо i:=length(t); заменен на i:= VarArrayHighBound(t,1);//одномерный массив, i=0 //вместо 150... а где можно прочитать про интерфейс обмена(какие функции есть), а то я знаю только SetComplex и GetComplex , и помоему, с помощью этих функций с массивом ничего не выйдет - по крайней мере у меня ничего.... может кто работал раньше с этим или кто-нибудь ткните носом в описание(какие еще существуют функции для обмена инфой с маткадом), а то мочи уже нет биться лбом об стену....
-
Я получил ссылку на Automation-объект (интерфейсный указатель IDispatch). Как получить массив?
-
вам надо найти справку по объектной модели маткада (скорее всего, она есть в поставке). В ней описаны все свойства и методы Automation-объекта, которые Вы можете вызывать. Что касается максимального значения индекса (а не длины) массива, то получать его надо так: i:= VarArrayHighBound(Er,1); Кроме того, что Вам мешает обращаться к элементам массива и производить необходимые операции?
-
после выполнения операции i:= VarArrayHighBound(Er,1); i = 0..... а функция VarType(Er) возвращает varDispatch $0009 -> (Er - это указатель IDispatch). > что Вам мешает обращаться к элементам массива и производить необходимые операции? Вы имеете в виду обозначить в Маткаде массив, как Er1,Er2,Er3,Er4....Er n и доставать каждый элемент отдельно? Пока это единственное, что у меня получилось.... Вот, только боюсь, что время выполнения затянется..... :( Протещу - напишу.
-
Если найду исходник скину на мыло. Но когда я ето делал, то создавал массив VarArray и его передавал в качестве аргумента в функции SetComplex, также забирал обратно. Найду- покажу! Насчет описания функций - смотри в Mathcad.TLB - там все наисано.
-
А вот и исходничичек:
procedure TForm1.Button1Click(Sender: TObject);
var v0,v1,v2:olevariant;
d0:array of double;
i,j,k:integer;
tv0:tvardata;
mcddoc:variant;
begin
memo1.Clear;
v0:=VarArrayCreate([0,9],varVariant);
for i:=0 to 9 do
v0[i]:=i;
olecontainer1.CreateObjectFromFile('c:\test.mcd',false);
olecontainer1.DoVerb(ovprimary);
mcddoc:=olecontainer1.OleObject;
mcddoc.setcomplex('in0',v0,EmptyParam);
mcddoc.recalculate;
mcddoc.getcomplex('out0',v1,EmptyParam);
olecontainer1.Close;
if varisarray(v1)then
begin
tv0:=findvardata(v1)^;
k:=tv0.VArray^.DimCount-1;
j:=tv0.VArray^.Bounds[k].ElementCount;
setlength(d0,j);
d0:=tv0.VArray^.Data;
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;
|