![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#21 |
Дружите с Linq ;)
Форумчанин
Регистрация: 15.10.2008
Сообщений: 823
|
![]()
Так,написал dll в С#,вот её код:
Код:
Код:
Не давай организму поблажки, каждый день тренируй его в шашки..
![]() |
![]() |
![]() |
![]() |
#22 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
![]()
А Вы точно, в dll, экспортируете ф-цию Create() именно с таким именем?(при чём со скобками)
|
![]() |
![]() |
![]() |
#23 | |
Дружите с Linq ;)
Форумчанин
Регистрация: 15.10.2008
Сообщений: 823
|
![]() Цитата:
Код:
Код:
З.Ы. Сделал через cmd .tlb файла теперь он его подключает с ошибкой,думаю дальше.
Не давай организму поблажки, каждый день тренируй его в шашки..
![]() Последний раз редактировалось Скарам; 01.03.2010 в 08:50. |
|
![]() |
![]() |
![]() |
#24 |
Регистрация: 23.09.2009
Сообщений: 3
|
![]()
Скарам, у тебя появился коллега...
![]() Мне тоже нужно передавать(с C++ Builder) в MathCad значения, вести расчет и обратно в прогу получать результат. Вот сегодня попал на эту тему и буду пробовать что-то делать, если получицо - делись и я поделюсь ![]() |
![]() |
![]() |
![]() |
#25 |
Пользователь
Регистрация: 01.12.2009
Сообщений: 14
|
![]()
что-нибудь получилось?
![]() ![]() |
![]() |
![]() |
![]() |
#26 |
Дружите с Linq ;)
Форумчанин
Регистрация: 15.10.2008
Сообщений: 823
|
![]()
А что конкретно Вас интересует?...Получилось ли обращаться к Маткаду из своей программы? Да,на С#. Устраивает ли МЕНЯ это достижение? Нет,т.к. программа замедляется в разы,либо Маткад тупит,либо обращение к Маткаду осуществляется слишком долго. В любом случае применять Маткад к любому численному методу (с построением графика и тд) неоправданно.
Не давай организму поблажки, каждый день тренируй его в шашки..
![]() |
![]() |
![]() |
![]() |
#27 |
Пользователь
Регистрация: 01.12.2009
Сообщений: 14
|
![]()
Понятно, спасибо. Просто у меня есть интерфейс сделанный с C++ Builder 2007 и довольно много листов расчетов маткада (Расчет умножителелей частоты на ДНЗ и транзисторных усилителей с расчетом всех цепей, вплоть до конструктивной реализации). Вот и хотел начальные данные для расчета отправлять с программы в маткад и получать результат обратно.
|
![]() |
![]() |
![]() |
#28 |
Дружите с Linq ;)
Форумчанин
Регистрация: 15.10.2008
Сообщений: 823
|
![]()
Возможно в Вашей задаче и есть смысл применять маткад,но вот с++ у меня подключить не получилось.Возможно я чего-то не понял или не разобрался. Почитайте посты,которые писал и ссылки посмотрите,что я тут выкладывал,думаю,что все делается просто,только надо понять подход. Если у Вас имеются мысли на сей счет-милости просим,обсудим,поможем.
Не давай организму поблажки, каждый день тренируй его в шашки..
![]() |
![]() |
![]() |
![]() |
#29 |
Пользователь
Регистрация: 01.12.2009
Сообщений: 14
|
![]()
Значит к чему я пришел. Добавил библиотеку типов через Component->Import Component-> Mathcad 12 Automation API. Подключил файлы Mathcad_TLB.h и Mathcad_OCX.h. Пользуюсь ObjectBrowser'ом изучал свойства, методы и классы маткада. Задачу поставил тривиальную для начала - интерфейс программы 3 окошечка ( два для ввода данных, одно для отображения результата), две кнопки ( расчет и закрытие формы-выход). В маткадовском файле формула k:=a+b k:=.. .В итоге путём проб и ошибок и долгих манипуляций получил следующий код:
#include <vcl.h> #pragma hdrstop #include "Mathcad_TLB.h" #include "Mathcad_OCX.h" #include <OleCtnrs.hpp>//на каком то форуме увидел, зачем не знаю #include <ComObj.hpp>// аналогично #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; Variant m; Variant k; Variant l; Variant t; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { m=CreateOleObject("Mathcad.Applicat ion"); //m.OlePropertySet("Visible",(Variant )true); - делал видимым для контроля k=CreateOleObject("Mathcad.Workshee t"); l=m.OlePropertyGet("Worksheets"); k=l.OleFunction("Open","c:\\Temp\\f ile1.mcd"); float i=StrToFloat(Form1->Edit2->Text); float j=StrToFloat(Form1->Edit3->Text); k.OleFunction("SetValue","a",i); k.OleFunction("SetValue","b",j); k.OleFunction("Recalculate"); t=k.OleFunction("GetValue","k"); Form1->Edit1->Text=t; //k.OleFunction("Close",2); m.OleFunction("CloseAll",2); m.OleFunction("Quit",2); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { Form1->Close(); } //---------------------------------------------------------------------------- Вообщем то все заработало на ура, как мне показалось сначал ![]() 1.не могу передать в маткад нецелое число (12.54, 123.25e-4 и т.д.) (отрицательные целые передаются и считаются спокойно). в ручную в маткаде сделал так чтобы результат был нецелым, в программу получил его спокойно. пошарил в инете, поглядел в других языках, вроде бы используют тип double. Попробовав его применить выскакивать ошибка и с меня требуют указать файл "ComObj.pas". где его брать и что это я не понял. 2.При переносе программы на другую машину, mathcad почему то не хочет закрываться, продолжает висеть в процессах и жрать ресурсы компа после закрытия программы. И через какое время вылазит ошибка "An unknown runtime error occuried. и маткадовский процесс завершается. У меня есть подозрения что это из того что стоят разные версии маткада. На ноуте где писал программу Mathcad 13, на другом компе Mathcad 14. 3.Хотелось бы автоматически указывать месторасположения файла маткада.Дошёл до такой штуки: TCHAR buffer[MAX_PATH]; GetCurrentDirectory(sizeof(buffer), buffer); char s*="\\file2.mcd"; strcat(buffer,s) buffer - содержит путь с указание на файл mcd, но беда в том что он в виде "C:\Temp\file2.mcd", а чтобы использовать его в функции нужен двойной слэш - \\. Которой я не знаю как получить. Интересно было бы узнать ваше мнение. Спасибо. |
![]() |
![]() |
![]() |
#30 |
Дружите с Linq ;)
Форумчанин
Регистрация: 15.10.2008
Сообщений: 823
|
![]()
Не очень понял почему у меня не работало,ибо с Оле я мучился дольше всего...Прям одно расстройство.
Начну с 3-го: Надо написать цикл,который перебирает массив символов, когда он встречает / в массив записывается ещё один /.А вообще,если Вы берете текущую папку программы,тогда все проще,если вы просто указываете имя файла,то оно ищет в первую очередь в папке,в которой находиться ехе, потом в папке виндовс. Второе: Тоже такое было,там надо дописать одну команду,сейчас нет времени,потом посмотрю в своем проекте-скажу. Первое: Тут надо трассировать и смотреть пошагово. Вообще Mathcad сам распознает типы,т.е. когда ему пихают вариант он должен сам подумать какое это число. Вообще попробуй передать ему double,float и получить тоже double,float,если пройдет,тогда проблема с преобразованием из Variant->Double
Не давай организму поблажки, каждый день тренируй его в шашки..
![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
MathCad | werser | Помощь студентам | 1 | 14.12.2009 18:01 |
MathCAD+интерфейс | e-bosh | Помощь студентам | 0 | 01.12.2009 17:07 |
MATHCAD | HECTOR.A. | Помощь студентам | 3 | 08.03.2009 20:21 |
MathCad | madshizik | Microsoft Office Excel | 2 | 10.10.2008 18:36 |