Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1225455345
DelphiLexx
2008-10-31 15:15
2009.11.22
Заставить Application.ProcessMessages работать в чужом потоке


11-1199016802
jabu
2007-12-30 15:13
2009.11.22
Form.ActiveControl not work


15-1254123674
cwl
2009-09-28 11:41
2009.11.22
вопрос админам о скриптах


2-1254834543
GeoShot
2009-10-06 17:09
2009.11.22
Пробелы задолбали


15-1250101749
alvonen
2009-08-12 22:29
2009.11.22
Кодовые страницы символов и Юникод





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский