C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как переделать код программы написаной на Делфи?
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;

Я пишу на С++
Как его переписать для С++???
ohmy.gif
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% ошибки smile.gif, надо смотреть хэлп по бэйсику акада. Сам постоянно с олей не работаю, каждый раз смотрю, щас лень smile.gif . А подсказать верное решение, не выполняя всю работу за вопрошающего, по моему правильно, ибо если он разберется сам, поймет как это сделано и аналогичные вопросы будут решаться на 1, 2.
klen
Отправлено: 03.03.2005, 18:28


Машинист паровоза

Группа: Участник
Сообщений: 239



Дык бывает что топчеся на месте и незнаешь в как забор перелазить и понять не можешт а надоли его перлазить — а есди увидишь как другой лезет , штаны рвет, с забора падает — тут уже мысль возникает предметная.
jeka_t
Отправлено: 03.03.2005, 19:07


Не зарегистрирован







Не могли бы вы хотя бы проверить код?
Потому как из того, что вы мне предлагаете ни чего не работает...
И почему в Делфях это так все просто а в С++ ну словно через...?
sad.gif
klen
Отправлено: 03.03.2005, 22:10


Машинист паровоза

Группа: Участник
Сообщений: 239



Потому что в С++ интерфейс это не тоже самое что интерфейс Pascale.
Проверить не могу потому что автокада нестоит.
jeka_t
Отправлено: 04.03.2005, 09:51


Не зарегистрирован







Тогда прийдётся переписывать в Делфях...
Мне очень понравился С++, он гибче чем Делфи (для меня), но из-за этой задачи всё рушится....
Не могу найти решения...
Я уже установил библиотеку и через компонент пробывал... Всеравно не выходит...
Запуск Акада я добился, но открыть файл методом Open не выходит...
Пишет ошибки...
Главное что в Делфях все выходит, а в С++ не может открыть файл...
Короче, прийдётся С++ забыть, а жаль...
Извените за беспокойство, всем спасибо... smile.gif
Admin
Отправлено: 04.03.2005, 10:15


Владимир

Группа: Администратор
Сообщений: 1190



Да .... тяжелый случай ....
если из-за такого придется забыть С++ sad.gif

Может лучше как следует изучить и понять технологию 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

Вернуться в Вопросы программирования в C++Builder