OleInitialize( nil );
OleContainer1.CreateObjectFromFile( ExtractFilePath(Application.ExeName)+'\tasks\test1.mcd', False );
OleContainer1.AutoActivate := aaManual;
OleContainer1.DoVerb(ovShow);
MCadObject := OleContainer1.OleObject;
MCadObject.Recalculate;
OleUninitialize;
Вызов MathCAD из C#
От: alexx14
Дата: 06.11.08 03:38
Вызываю MathCAD из своей программы.
Вызов из Дельфи проходит без проблем:
Код:
Вызов из .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();
}
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 );
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 );
Ошибка в обоих случаях на одном и том же месте - при открытии файла.
Файл существует, проверено тысячу раз. Содержимое файла также нареканий не вызывает.
Подскажите плиз, в чем тут дело?!!!
Заранее спасибо за помощь!
ЗЫ. А работающий код - лучшая помощь ))
В создании работающего кода удивительно хорошо помогает отладчик.;) А в создании форматированного кода в посте помогают теги. Не забывайте про форматирование.
1.1, мягко говоря, устаревшая версия.
Код:
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("Ошибка!");
}
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
j:=i+2
out0:=j
Код:
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 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
:(
Цитата:
как преобразовать object в double ?
Ответ на этот вопрос - поиск в MSDN по ключевому слову cast. Конечно, сработает только если этот объект вообще может быть преобразован к типу double.
Цитата:
t.ToString() возвращает System.__ComObject
Ничего удивительного. :)
Код:
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();
}
}
}
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();
}
}
}
Цитата: Tramp
Код:
using Mathcad;
Можно поподробнее о подключении Mathcad - это какаято библиотека стандартная или как?:eek:
И возможно ли это реализовать на C++Builder?
Спасибо.