Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Delphi и MathCad


Автор: Homer 10.8.2006, 19:55
   Можно ли в Delphi как-нибудь использовать возможности Маткада, например, вывод графиков по формулам или хотя бы расчет интегралов и т.п.?
   Собственно мне необходимо по исходным данным построить ряд графиков по определенным функциям, причем в большинстве своем эти функции довольно-таки сложные с интегралами, с комплексными числами. Один график вообще в полярной системе координат smile 
   В delphi я новичек, но мне кажется, что в силу его популярности, должны быть разработаны какие-нить компоненты математические. Если кто сталкивался с такой проблемой, то пжл помогите советом или подскажите полезные ссылочки.
   Заранее благодарен.

Автор: Snowy 10.8.2006, 20:40
Не думаю, что с маткадом можно подружиться.
Лучше копать в сторону решения твоих интегралов и т.д средствами дельфи.
Полярная система далеко не страшна, а с комплексными числами дельфи легко справится.

Автор: jack128 10.8.2006, 22:54
а почему бы не использовать собственно MathCad ??

Автор: Snowy 10.8.2006, 23:25
Цитата(jack128 @  10.8.2006,  22:54 Найти цитируемый пост)
а почему бы не использовать собственно MathCad ??
Встречный вопрос "А как?". Есть примеры?

Автор: Alexeis 10.8.2006, 23:55
Ну это зависит от производителей MatCad, если они предусмотрели межпрограмный обмен, OLE, DDE - то возможно, а если нет то трудновато будет реализовать обмен.

Автор: Alex 11.8.2006, 00:04
Цитата(Snowy @  11.8.2006,  00:25 Найти цитируемый пост)
Встречный вопрос "А как?". Есть примеры? 

Хотя бы как ole объект, он не запрещает себя так использовать smile 

Автор: Snowy 11.8.2006, 00:31
Цитата(Alex @  11.8.2006,  00:04 Найти цитируемый пост)
Хотя бы как ole объект, он не запрещает себя так использовать
smile Тогда покажите мне пальцем человека, который бы хотя бы сказал, что у него хоть что-то получилось smile
Мне даже примера не надо. Просто скажите - хоть у кого-нить получалось?

Автор: Alexeis 11.8.2006, 00:48
Цитата(Snowy @  11.8.2006,  00:31 Найти цитируемый пост)
Мне даже примера не надо. Просто скажите - хоть у кого-нить получалось? 

Код

unit Unit1;
{MathCad Automation Controller
OLE Automation Controller example for MathCad
Requires:
      MathCad 7.02 or later.
      Two MathCad doc's named TEST1.MCS and Test2.MCD,
          with out0 out1 and out2 vars computed from in0 in1 in2.
          All of them are complex numbers.

Instructions:
      1.- Uses Unit OLE2, where OLE constants such as VT_Dispatch=9 are defined.
          Also uses other OLE units (see Uses clause):

      2.- Define variables of Variant type in the VAR section
          VAR MCadObject,
          in0Re, in0Im, outRe0, outIm0,
          in1Re, in1Im, outRe1, outIm1,
          in2Re, in2Im, outRe2, outIm2 : Variant;

      3.- MathCad object can be inserted in the OLE container interactively
          or by program by sending the TOleContainer message :
          CreateObjectFromFile(const FileName: string; Iconic: Boolean) with
          FileName = FullPathName of MathCad file and
          Iconic = False, to display the file contents and not the icon.
          oleContainer1.CreateObjectFromFile('c:\TestDir\Test1.mcd',False);

      4.- The MathCad object can be interactively activated by Double Clicking
          on it or by program by setting to aaManual the TOleContainer property
          AutoActivate oleContainer1.AutoActivate = aaManual and executing the
          verb oleContainer1.DoVerb(ovShow) to display the object.
          Another way of doing this is by executing
          oleContainer1.DoVerb(ovPrimary)

      5.- Asign the object in OleContainer to a Variant type var;
          MCadObject := OleContainer1.OleObject;

      6.- Check that the object returned is of VT_DISPATCH type (9)
          If VarType(McadObject) = VT_DISPATCH then
             label1.Caption := 'OK: Type returned VT_DISPATCH'
          Else
             Label1.Caption :=  'Error: Type returned ' +
                            IntToStr(VarType(MCadObject));

      7.- Set the values of input vars and send the messages to pass input vars,
          recalculate the doc and retrieve the out vars.
          SetComplex( varName, realPart, imagPart)
          Recalculate
          GetComplex( varName, realPart, imagPart)
          to MCad object.
          Display the values of the output vars.
         }

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   OleCtnrs, StdCtrls, ComCtrls, comobj, OleCtrls, OLE2;

type
  TMCadAutomationController = class(TForm)
    OleContainer1       : TOleContainer;
    InsertDoc1          : TButton;
    InsertDoc2          : TButton;
    CalculateDoc        : TButton;
    Re                  : TLabel;
    Im                  : TLabel;
    Edit1               : TEdit;
    Edit2               : TEdit;
    Edit3               : TEdit;
    Edit4               : TEdit;
    Edit5               : TEdit;
    Edit6               : TEdit;
    Edit7               : TEdit;
    Edit8               : TEdit;
    Edit9               : TEdit;
    Edit10              : TEdit;
    Edit11              : TEdit;
    Edit12              : TEdit;
    Label1              : TLabel;
    Label2              : TLabel;
    Label3              : TLabel;
    Label4              : TLabel;
    Label5              : TLabel;
    Label6              : TLabel;
    Label7              : TLabel;
    Label8              : TLabel;
    Label9              : TLabel;

    procedure CalculateDocClick(Sender: TObject);
    procedure InsertDoc1Click(Sender: TObject);
    procedure InsertDoc2Click(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }

  end;

var
  MCadAutomationController                         : TMCadAutomationController;
  MCadObject                                       : Variant;
  in0Re, in0Im, in1Re, in1Im, in2Re, in2Im         : Variant;
  outRe0, outIm0, outRe1, outIm1, outRe2, outIm2   : Variant;

implementation

{$R *.DFM}

procedure TMCadAutomationController.CalculateDocClick(Sender: TObject);
begin
     {Set the real and imaginary parts of in0, in1 and in2 vars}
     in0Re := StrToFloat (Edit1.text);
     in0Im := StrToFloat (Edit4.text);
     in1Re := StrToFloat (Edit2.text);
     in1Im := StrToFloat (Edit5.text);
     in2Re := StrToFloat (Edit3.text);
     in2Im := StrToFloat (Edit6.text);
     {Pass the values of input vars to MCad object}
     MCadObject.SetComplex('in0',in0Re,in0Im);
     MCadObject.SetComplex('in1',in1Re,in1Im);
     MCadObject.SetComplex('in2',in2Re,in2Im);
     {Recalculate the MCad doc}
     MCadObject.Recalculate;
     {Retrieve the values calculated of output vars out0, put1 and out2}
     MCadObject.GetComplex('out0',outRe0,outIm0);
     MCadObject.GetComplex('out1',outRe1,outIm1);
     MCadObject.GetComplex('out2',outRe2,outIm2);
     {Display the values of output vars}
     Edit7.text    := FloatToStr(outRe0);
     Edit10.text   := FloatToStr(outIm0);
     Edit8.text    := FloatToStr(outRe1);
     Edit11.text   := FloatToStr(outIm1);
     Edit9.text    := FloatToStr(outRe2);
     Edit12.text   := FloatToStr(outIm2);
end;

procedure TMCadAutomationController.InsertDoc1Click(Sender: TObject);
begin
     Label9.Caption := 'Wait: Inserting Doc';
     oleContainer1.CreateObjectFromFile('i:Test1.mcd',False);
     oleContainer1.AutoActivate := aaManual;
     oleContainer1.DoVerb(ovShow);
     MCadObject := OleContainer1.OleObject;
     If VarType(McadObject) = VT_DISPATCH then
       {OK. Object returned is of IDispatch or dispinterface type}
       Label9.Caption := 'OK: Type returned VT_DISPATCH'
     Else
       {Error. Failure to connect to OLE Automation Server}
       Label9.Caption :=  'Error: Type returned '
                      + IntToStr (VarType (MCadObject));
end;

procedure TMCadAutomationController.InsertDoc2Click(Sender: TObject);
begin
     Label9.Caption := 'Wait: Inserting Doc';
     oleContainer1.CreateObjectFromFile('i:Test2.mcd',False);
     oleContainer1.AutoActivate := aaManual;
     oleContainer1.DoVerb(ovShow);
     MCadObject := OleContainer1.OleObject;
     If VarType(McadObject) = VT_DISPATCH then
       {OK. Object returned is of IDispatch or dispinterface type}
       Label9.Caption := 'OK: Type returned VT_DISPATCH'
     Else
       {Error. Failure to connect to OLE Automation Server}
       Label9.Caption :=  'Error: Type returned '
                      + IntToStr (VarType (MCadObject));
end;

end.



Взято отсюда
http://delphi.about.com/gi/dynamic/offsite.htm?zi=1/XJ&sdn=delphi&zu=http%3A%2F%2Fwww.djpate.freeserve.co.uk%2FAutomation.htm

Автор: Alex 11.8.2006, 07:34
Цитата(Snowy @  11.8.2006,  01:31 Найти цитируемый пост)
smile Тогда покажите мне пальцем человека, который бы хотя бы сказал, что у него хоть что-то получилось smile
Мне даже примера не надо. Просто скажите - хоть у кого-нить получалось? 

Как говорится, а хоть кто нибудь пытался? smile 

Автор: jack128 11.8.2006, 10:41
Цитата(Snowy @  10.8.2006,  23:25 Найти цитируемый пост)
Встречный вопрос "А как?". Есть примеры?

ты не понял.  Я вообще не говорю о написании программы на дельфи.  Если мне нужно будет посчитать интеграл - я не буду для этого дельфи использовать вообще, я запущу MathCAD и посчитаю интерграл. Дельфи для этой задачи вообще не нужен.

Автор: drkot 11.8.2006, 11:16
Цитата(jack128 @  11.8.2006,  10:41 Найти цитируемый пост)
я запущу MathCAD и посчитаю интерграл

это чтоб злазами посмотреть и в блокнотик записать, а для маломальской автоматизации или передачи данных, нестандартных методов и прочей надобности маткад идет лесом тут как раз программка и пригодилась

Автор: Alexeis 11.8.2006, 11:36
Цитата(drkot @  11.8.2006,  11:16 Найти цитируемый пост)
 для маломальской автоматизации или передачи данных, нестандартных методов и прочей надобности маткад идет лесом тут как раз программка и пригодилась

тем боле что если хорошо порыскать, то можно фортрановские библы к делфям прикрутить, тогда уж вообще скорость даже лучше чем у MathCad


Автор: jack128 11.8.2006, 11:58
Цитата(drkot @  11.8.2006,  11:16 Найти цитируемый пост)
а для маломальской автоматизации или передачи данных, нестандартных методов и прочей надобности маткад идет лесом тут как раз программка и пригодилась 


Читаем что нужно человеку:

Цитата(Homer @  10.8.2006,  19:55 Найти цитируемый пост)
 Собственно мне необходимо по исходным данным построить ряд графиков по определенным функциям, причем в большинстве своем эти функции довольно-таки сложные с интегралами, с комплексными числами. Один график вообще в полярной системе координат  


С какой из задач не справится MathCAD ?

Цитата(alexeis1 @  11.8.2006,  11:36 Найти цитируемый пост)
тем боле что если хорошо порыскать,

вот-вот.  Именно это мне и не понятно.  Зачем рыскать, зачем искать, зачем изучать если всё уже есть.  Запусти и решай свои интегралы, рисуй свои графики и не парься. Я конечно понимаю. что изобретение своего велосипеда - это архиважная и полезная задача, но обычно требуется дело делать, а не херней страдать.

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