Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вызов MathCAD из C#

7.5K
07 ноября 2008 года
khasya
17 / / 06.02.2005
Вызов MathCAD из C#
От: alexx14
Дата: 06.11.08 03:38

Вызываю MathCAD из своей программы.
Вызов из Дельфи проходит без проблем:
 
Код:
OleInitialize( nil );
    OleContainer1.CreateObjectFromFile(  ExtractFilePath(Application.ExeName)+'\tasks\test1.mcd', False );
    OleContainer1.AutoActivate := aaManual;
    OleContainer1.DoVerb(ovShow);
    MCadObject := OleContainer1.OleObject;
    MCadObject.Recalculate;
    OleUninitialize;

Вызов из .NET (Framework 1.1) постоянно приводит к ошибкам.
Замечу, что пробовал с разными Com-объектами.

Объект MathCad 2001:
Код:
Mathcad.MathcadApplication app = new Mathcad.MathcadApplication();        
    try
    {
        Object filename = @"C:\Tasks\test1.mcd";
        Object password = "";
   
        app.Documents.Open( filename.ToString(), Type.Missing );
           
            >>Exception<<
            {"Object reference not set to an instance of an object." }

        app.Documents.Item(1).Recalculate();
    }
    catch
    {
        app.Quit();
    }


Объект MathCad 14:
Код:
Mathcad.Application app = new Mathcad.Application();
    Mathcad.Worksheet ws = new Mathcad.Worksheet();
   
    ws = app.Worksheets.Open( @"C:\Tasks\task1.xmcd" );

    >>Exception<<
    An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in TestGenApp.exe
    Additional information: Неверная попытка доступа к адресу памяти.

    ws.Recalculate();

    ws.Close( Mathcad.MCSaveOption.mcDiscardChanges );
    app.Quit( Mathcad.MCSaveOption.mcDiscardChanges );

Ошибка в обоих случаях на одном и том же месте - при открытии файла.
Файл существует, проверено тысячу раз. Содержимое файла также нареканий не вызывает.
Подскажите плиз, в чем тут дело?!!!
Заранее спасибо за помощь!

ЗЫ. А работающий код - лучшая помощь ))
241
08 ноября 2008 года
Sanila_san
1.6K / / 07.06.2005
В создании работающего кода удивительно хорошо помогает отладчик.;) А в создании форматированного кода в посте помогают теги. Не забывайте про форматирование.
5
09 ноября 2008 года
hardcase
4.5K / / 09.08.2005
А из Fw 2.0?
1.1, мягко говоря, устаревшая версия.
6.0K
21 ноября 2008 года
Tramp
71 / / 25.07.2006
Код:
Object filename = @"C:\Temp\1.mcd";
            Object password = "";
            try
            {

                Mathcad.Application app = new Mathcad.Application();
                Mathcad.Worksheet ws = new Mathcad.Worksheet();
                ws = app.Worksheets.Open(@"C:\Temp\1.mcd");
                ws.Recalculate();
                //app.ActiveWindow.Activate();
            }
            catch
                {
                    MessageBox.Show("Ошибка!");
                }

Matcad 11
вот этот код выполняется и не выдаёт ошибки.
у меня следующие вопросы.
1)Как показать окно Matcad'а ?
2)Как передать переменную в маткад?
на сколько я знаю в самом документе маткада нужно написать примерно следующее:
 
Код:
i:=in0
j:=i+2
out0:=j
6.0K
24 ноября 2008 года
Tramp
71 / / 25.07.2006
Код:
Object filename = @"C:\Temp\2.mcd";
            Object t;
            double i = 10.1;
            double j;
            Mathcad.Application app = new Mathcad.Application();
            Mathcad.Worksheet ws = new Mathcad.Worksheet();
            try
            {
                ws = app.Worksheets.Open(@"C:\Temp\2.mcd");
                ws.SetValue("in0", i);
                ws.Recalculate();
                t = ws.GetValue("out0");
                if (t is double)
                {
                    j = (double)ws.GetValue("out0");
                    MessageBox.Show("Ок");
                }
                else
                {
                    MessageBox.Show(t.ToString());
                    MessageBox.Show("Ошибка!");
                }
}
            catch
                {
                    MessageBox.Show("Ошибка!");
                }    
                ws.Close(Mathcad.MCSaveOption.mcDiscardChanges);

бьюсь над элементарной задачей третий день
как преобразовать object в double ?
t.ToString() возвращает System.__ComObject
:(
241
30 ноября 2008 года
Sanila_san
1.6K / / 07.06.2005
Цитата:
как преобразовать object в double ?


Ответ на этот вопрос - поиск в MSDN по ключевому слову cast. Конечно, сработает только если этот объект вообще может быть преобразован к типу double.

Цитата:
t.ToString() возвращает System.__ComObject


Ничего удивительного. :)

6.0K
15 февраля 2010 года
Tramp
71 / / 25.07.2006
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Mathcad;

namespace MathcadCsharp
{
    public partial class Form1 : Form
    {
        Mathcad.Application MC;
        Mathcad.Worksheet WS;
        Mathcad.Worksheets WK;

        //object g = 1;
        int F;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
           
            string Path;
            double R;
           
            Path = textBox1.Text;

            MC = new Mathcad.Application();
            if (MC == null)
            {
               
                //
            }

            MC.Visible = true;
            WK = MC.Worksheets;
            WS = WK.Open(Path);

            switch (comboBox1.SelectedIndex)
            {
                case 0: F = 10; break;
                case 1: F = 15; break;
                case 2: F = 20; break;
                case 3: F = 25; break;
                case 4: F = 30; break;
            }

            //g = F;

            WS.SetValue("in0", F);
            OutputBox1.Enabled = true;

            WS.Recalculate();

            R = (WS.GetValue("out0") as NumericValue).Real;
            OutputBox1.Text = R.ToString();
           
        }

        private void Cleanup()
        {
            WS.Close(Mathcad.MCSaveOption.mcDiscardChanges);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(WK);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(WS);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(MC);
        }


        private void Exit_Click(object sender, EventArgs e)
        {
            if (MC != null) Cleanup();
            Close();
        }
    }
}
43K
09 марта 2010 года
bobikUA
2 / / 23.09.2008
Цитата: Tramp
 
Код:
using Mathcad;


Можно поподробнее о подключении Mathcad - это какаято библиотека стандартная или как?:eek:
И возможно ли это реализовать на C++Builder?
Спасибо.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог