Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Связь математических пакетов с делфи


Автор: Agent_Smit 12.2.2007, 16:50
как мне связать MathCAD с Delphi ?

идея:

в маткаде идёт вся обработка... делать это удобнее именно там так как в делфи придётся писать для этого кучу ненужных математических функций, которые уже встроенны в mathCAD ... (как говорится  - зачем придумывать велосипед? smile )

изначально исходные данные передаются в MathCAD, в нём всё считается и затем по ButtonClick выводится на экран... (в виде таблицы или ещё чего, это не суть важно... )  
важно то что для обработки резуьльтатов не хотелось бы чтобы запускался MathCAD  ... чтобы был просто файл с шаблоном для расчётов... который бы лежал в папке с моей программой...  


можно ли так сделать.. и если можно -  то как ?? smile

Автор: Agent_Smit 4.5.2007, 23:28
никто не знает как это сделать?

Автор: Mannerghaim 4.7.2010, 17:15
Вопрос.
как реализовать связь Delphi с MathCAD ?
Вводим данные в Delphi , импортируем их в MathCAD, там идёт расчёт, после чего полученные результаты снова выводятся в Delphi
каким способом это можно сделать?

Автор: Keeper89 4.7.2010, 18:22
Если у Вас установлен MathCad в справке должно быть что-то вроде
http://www.ptc.com/WCMS/images/58876/58876en_sect_img_step_7.jpg
В 14 версии есть Developer's Reference, в котором есть информация по работе с объектами среды из сторонних приложений.

Автор: Mannerghaim 4.7.2010, 20:17
народ подскажите пожалуйста
почитал маткадовскую справку, понял кое чего

итак есть программа в маткаде которая считает выражение: A+B

пишем её так :

Код


A:=Re(in0)
B:=Re(in1)
C:=A+B
out0:=C



далее в делфи я кидаю компонент OleContainer1, присобачиваю туда этот файл маткадовский
кидаю 2 компонента Edit1 и Edit2
туда я буду вводить 2 слагаемых числа

кидаю кнопку и пишу в ней следующее

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
   with OleContainer1 do
      begin
      x1:=StrToInt(Edit1.text);
      y1:=StrToInt(Edit1.text);
        Run;
          OleObject.SetComplex('in0', x1, 0);
           OleObject.SetComplex('in1', y1, 0);
          OleObject.Recalculate;
          z2:=OleObject.GetComplex('out0', out_data, out_Buf);
          label1.Caption:=IntToStr(z2);
      end;

end;



вопрос
ввожу в едит1 и в едит2 числа: 2 и 3

результат вычислений в маткаде должен быть 5
но в метку label1 выдаёт результат 0 !!

почему он так считает?

Автор: Keeper89 5.7.2010, 11:21
Mannerghaim, прикрепите маткадовский файлик по сложению 2-х чисел.

Автор: Mannerghaim 5.7.2010, 18:45
Я же в коде вроде выше написал
в маткадовском файлике написано тока вот что:


Код

A:=Re(in0)
B:=Re(in1)
C:=A+B
out0:=C



На всякий пожарный , прикрепил сам маткадовский файлик, но этот форум не принимает формат mcd, я его запаковал раром.

P.s. оч.прошу помочь... диплом горит... :(

Автор: Keeper89 5.7.2010, 21:02
Вот тестовый код:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, ActiveX, Mathcad_TLB;

type
  TForm1 = class(TForm)
    edt1: TEdit;
    edt2: TEdit;
    btn1: TButton;
    edt3: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }

    MC: IMathcadApplication;
    WC: IMathcadWorksheets;
    WS: IMathcadWorksheet;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  a, b, c: Real;
begin

  a := StrToFloat(edt1.Text);
  b := StrToFloat(edt2.Text);

  MC := CreateOleObject('Mathcad.Application') as IMathcadApplication;
  WC := MC.Worksheets;
  WS := WC.Open(ExtractFilePath(ParamStr(0)) + 'test.xmcd');

  try
    try

      WS.SetValue('in0', a);
      WS.SetValue('in1', b);
      WS.Recalculate();

      c := (WS.GetValue('out0') as INumericValue).Real;
      edt3.Text := FloatToStr(c);

      ShowMessage('Готово!');

    except
      on E: Exception do
        ShowMessage(E.Message);
    end;

  finally
    WS.Close(mcDiscardChanges);
    MC.Quit(mcDiscardChanges);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OleInitialize(nil);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  OleUninitialize;
end;

end.

В прикреплении проект и файл MathCad'а.

Delphi 2010, MathCad 14.

Смотрите, если есть вопросы - обращайтесь. ;)

Автор: Begemot911 28.11.2013, 15:42
Цитата(Keeper89 @ 5.7.2010,  21:02)


Delphi 2010, MathCad 14.

Смотрите, если есть вопросы - обращайтесь. ;)

Огромное спасибо за выложенный пример! я столько времени потратил на его поиск, вы просто космос!

от себя добавлю, что при компиляции проекта выдало ошибку на Mathcad_TLB в Uses,
делаем вот что: 
Создаём модуль с описанием интерфейсов для работы с объектами Mathcad. Для этого нужно импортировать эти описания из библиотеки типов (automation.dll) и сохранить в виде .pas файла. Заходим в главное меню Project/Import Type Library... Откроется диалоговое окно. Ищем в нём строку Mathcad Automation 1.0 Type Library (Version 1.0). Если не находим, то жмём кнопку Add... и указываем файл automation.dll явно. Он находится в папке, там же где mathcad.exe. После этого появится нужная запись в окошке выбора. Жмём кнопку Create Unit. Сформируется файл с описанием интерфейсов на языке OPascal в вариации Delphi. Этот файл нужно сохранить в папке с будущим проектом. Имя файла можно оставить по умолчанию (Mathcad_TLB.pas).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)