jeka_t |
Отправлено: 03.03.2005, 14:46 |
|
Не зарегистрирован
|
Вот исходник на Delpi:
try
//Проверка запуска АКАДА
Acad:=GetActiveOleObject('AutoCAD.Application') as IAcadApplication;
except
//При False запуск АКАДА
Acad:=CreateOleObject('AutoCAD.Application') as IAcadApplication;
end;
//Видимость АКАДА
Acad.visible:=true;
//Создание модели в документе
Acad.Documents.Open(OpenDialog1.FileName, 1);
ADoc:=Acad.ActiveDocument;
Я пишу на С++
Как его переписать для С++???
|
|
Gedeon |
Отправлено: 03.03.2005, 15:01 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Почитайте в уроках как работать с эксель через оле и точно так же с автокадом.
|
|
Bond |
Отправлено: 03.03.2005, 15:03 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 142
|
Здесь есть уроки работы с MS Excel. Должно помочь
|
|
klen |
Отправлено: 03.03.2005, 18:01 |
|
Машинист паровоза
Группа: Участник
Сообщений: 239
|
Мужики, да чевы его посылаете на ... Онже конкретно спросил про этот код а не как с олей работать.
Предупреждаю сразу — с OLE не работал, считаю тупиковой технологией.
Отработаю тупым переводчиком ObjPascal -> C++:
CODE |
_di_IAcadApplication Acad;
//Проверка запуска АКАДА
Acad=(_di_IAcadApplication )GetActiveOleObject("AutoCAD.Application") ;
if ( !Acad)
//При False запуск АКАДА
Acad=(_di_IAcadApplication)CreateOleObject("AutoCAD.Application");
//Видимость АКАДА
Acad->visible=true;
//Создание модели в документе
Acad->Documents->Open(OpenDialog1->FileName, 1);
ADoc=Acad->ActiveDocument;
|
Всего лишь тупой перевод, наверно есть ошибки |
|
Gedeon |
Отправлено: 03.03.2005, 18:11 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
99% есть, потому и посылали вот тут
CODE |
Acad->Documents->Open(OpenDialog1->FileName, 1); |
скорее всего д.б. так
CODE |
Acad->OlePropertyGet("Documents").OleProcedure("Open", OpenDialog1->FileName, 1); |
Вот чет такое, хотя тут 100% ошибки , надо смотреть хэлп по бэйсику акада. Сам постоянно с олей не работаю, каждый раз смотрю, щас лень . А подсказать верное решение, не выполняя всю работу за вопрошающего, по моему правильно, ибо если он разберется сам, поймет как это сделано и аналогичные вопросы будут решаться на 1, 2.
|
|
klen |
Отправлено: 03.03.2005, 18:28 |
|
Машинист паровоза
Группа: Участник
Сообщений: 239
|
Дык бывает что топчеся на месте и незнаешь в как забор перелазить и понять не можешт а надоли его перлазить — а есди увидишь как другой лезет , штаны рвет, с забора падает — тут уже мысль возникает предметная. |
|
jeka_t |
Отправлено: 03.03.2005, 19:07 |
|
Не зарегистрирован
|
Не могли бы вы хотя бы проверить код?
Потому как из того, что вы мне предлагаете ни чего не работает...
И почему в Делфях это так все просто а в С++ ну словно через...?
|
|
klen |
Отправлено: 03.03.2005, 22:10 |
|
Машинист паровоза
Группа: Участник
Сообщений: 239
|
Потому что в С++ интерфейс это не тоже самое что интерфейс Pascale.
Проверить не могу потому что автокада нестоит. |
|
jeka_t |
Отправлено: 04.03.2005, 09:51 |
|
Не зарегистрирован
|
Тогда прийдётся переписывать в Делфях...
Мне очень понравился С++, он гибче чем Делфи (для меня), но из-за этой задачи всё рушится....
Не могу найти решения...
Я уже установил библиотеку и через компонент пробывал... Всеравно не выходит...
Запуск Акада я добился, но открыть файл методом Open не выходит...
Пишет ошибки...
Главное что в Делфях все выходит, а в С++ не может открыть файл...
Короче, прийдётся С++ забыть, а жаль...
Извените за беспокойство, всем спасибо... |
|
Admin |
Отправлено: 04.03.2005, 10:15 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Да .... тяжелый случай ....
если из-за такого придется забыть С++
Может лучше как следует изучить и понять технологию OLE ?
А что будет в следующий раз, когда нигде не найдете
"как это сделать на Delphi" ? Забыть Delphi и перейти на Basic ?
Сложного-то наверняка ничего нет, неужели нигде в нете
не нашли примера ??????????????????????????????????????
|
|
jeka_t |
Отправлено: 04.03.2005, 12:38 |
|
Не зарегистрирован
|
Делфи забыть не получается... Уж слишком там просто...
Такими решениями толком ни кто не занимался...
Все разработки в этой области велись и ведуться с помощью Делфи... Я был на форумах по Автокаду, но ни кто из них не владеет практикой на С++. Говорят "возможно" но практически "не делал"...
Зато на Делфи примеров хоть отбавляй... У меня эта задача на Делфи решена... Ole-технология не сложная... Но на С++ не получается...
Вот и приходится забывать С++ как "сладкий сон"...
Надеюсь, что когда-нибудь разработчики Борланда решат проблему разницы в подходе между Делфи и С++...
Конечно, хотелось бы решить её самому, но видно пока не судьба...
Материала нет на эту тему... |
|
olegenty |
Отправлено: 04.03.2005, 14:06 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
на С++ технология также легко реализуема, другое дело, что генерируемые C++ Builder'ом оболочки получаются кривоватыми. так что узнавай о работе с библиотеками типов на уровне указателей на интерфейсы (IUnknown или IDispatch) и вперёд...
|
|
olegenty |
Отправлено: 04.03.2005, 14:15 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
да, а самый простой способ (вдруг повезёт и импортируется не "криво") импортировать библиотеку типа, и работать с ней, как с классом-оболочкой.
|
|
jeka_t |
Отправлено: 04.03.2005, 14:47 |
|
Не зарегистрирован
|
Вот пример:
Я вначале импортировал библиотеку:
ACAD.TLB, поставляемая фирмой AutoDesk а Делфи и в С++
Затем поставил компонент (TAcadDocument) на форму и написал код на Делфи:
procedure TForm1.FormShow(Sender: TObject);
begin
if (OpenDialog1.Execute) then
AcadDocument1.Application.Documents.Open(OpenDialog1.FileName, 1);
end;
Теперь на С++:
void __fastcall TForm1::FormShow(TObject *Sender)
{
if (OpenDialog1->Execute())
{
wchar_t FileName[256];
OpenDialog1->FileName.WideChar(FileName, 256);
AcadDocument1->Application->Documents->Open(FileName, 1);
}
}
Но пишет ошибку:
E2285 Could not find a match for 'IAcadDocuments::Open(wchar_t *,int)'
Почему в Делфи работает, а в С++ нет? |
|
jeka_t |
Отправлено: 04.03.2005, 14:54 |
|
Не зарегистрирован
|
Забыл сказать, что импорт прошёл успешно... |
|
Gedeon |
Отправлено: 04.03.2005, 15:11 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Он Вам пишет, что нету у него метода с такими параметрами, откройте нрр файл и посмотрите какие параметры ему нужны, а что справки нету к компоненту?
|
|
jeka_t |
Отправлено: 04.03.2005, 15:16 |
|
Не зарегистрирован
|
// [-1] Открытие файла рисунка (DWG) и установка его в качестве активного документа.
virtual HRESULT STDMETHODCALLTYPE Open(BSTR Name/*[in]*/, VARIANT ReadOnly/*[in,opt]*/,
Autocad_tlb::IAcadDocument** pDispDoc/*[out,retval]*/) = 0;
|
|
jeka_t |
Отправлено: 04.03.2005, 15:18 |
|
Не зарегистрирован
|
Почему то есть такой метод с такими параметрами...
Но почему он их не воспринемает? |
|
jeka_t |
Отправлено: 04.03.2005, 15:21 |
|
Не зарегистрирован
|
А справки есть только они для Делфи... |
|
olegenty |
Отправлено: 04.03.2005, 16:31 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
Дома поразбираюсь, завтра скажу. Свои последний враппер я оч. давно писал, общие черты помню, конкретику — нет...
|
|
jeka_t |
Отправлено: 04.03.2005, 17:57 |
|
Не зарегистрирован
|
Могу выслать ACAD.TLB
|
|