Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.12.2014, 22:34
Аватар для Homo-Fantasmus
Homo-Fantasmus Homo-Fantasmus вне форума
Прохожий
 
Регистрация: 23.08.2011
Адрес: МО
Сообщения: 46
Версия Delphi: Delphi, Lazarus
Репутация: 10
По умолчанию Как реализовать запуск разных версий Автокада из Delphi ?

Всем привет!
Задачка такая...
На форме имеется ComboBox с списком версий автокада

AutoCAD 2012
AutoCAD 2015

И кнопка <Запустить Автокад>



Как реализовать запуск нужной версии ?

Как я понимаю основная проблема в подключении нужной библиотеки в реал тайм...

Пробовал в uses прописать все подключенные библиотеки

Код:
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ComObj, Vcl.StdCtrls, Vcl.OleServer, AutoCAD_2012_TLB,  AutoCAD_2015_TLB, Vcl.Menus;

Библиотеки AutoCAD_2012_TLB, AutoCAD_2015_TLB естественно были предварительно подключены



На машине на которой установлен только автокад 2015 всё заработало на ура.
Но стоит запустить на машине на которой установлен только 2012 автокад тут же появится сообщение о том что "ни чего дружочек у тебя не выйдет" т.е. Interface not supported ... хотя обе библиотеки прописаны в юзесах и AutoCAD_2012_TLB точно подключена, её компоненты присутствуют на инструментально палитре ...


Как решить эту задачку ?

Последний раз редактировалось Homo-Fantasmus, 15.12.2014 в 22:40.
Ответить с цитированием
  #2  
Старый 16.12.2014, 00:34
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Homo-Fantasmus
Как реализовать запуск нужной версии ?
А как он сейчас запускается?

Вангую, что если программа запускается на машине с 2012-м AutoCAD-ом, а падает только на попытке его запуска, в программе нужно через точку писать:
Код:
begin
  if ComboBox1.ItemIndex = 0 then
    AutoCAD_2012_TLB.Запустись
  else
    AutoCAD_2015_TLB.Запустись;
end;
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #3  
Старый 16.12.2014, 20:16
Аватар для Homo-Fantasmus
Homo-Fantasmus Homo-Fantasmus вне форума
Прохожий
 
Регистрация: 23.08.2011
Адрес: МО
Сообщения: 46
Версия Delphi: Delphi, Lazarus
Репутация: 10
По умолчанию

Цитата:
Сообщение от Freeman
А как он сейчас запускается?

Вангую, что если программа запускается на машине с 2012-м AutoCAD-ом, а падает только на попытке его запуска, в программе нужно через точку писать:
Код:
begin
  if ComboBox1.ItemIndex = 0 then
    AutoCAD_2012_TLB.Запустись
  else
    AutoCAD_2015_TLB.Запустись;
end;

Гениально ))

AutoCAD_2015_TLB.Запустись;

НАСМЕШИЛ
МАХАЛАЙ-БАХАЛАЙ АВТОКАДА ЗАПУСТИСЬ

TLB (англ. Type Library — библиотека типов) — иерархическое хранилище информации о возможностях ActiveX-сервера в OLE Automation.
Ответить с цитированием
  #4  
Старый 16.12.2014, 20:22
Аватар для Homo-Fantasmus
Homo-Fantasmus Homo-Fantasmus вне форума
Прохожий
 
Регистрация: 23.08.2011
Адрес: МО
Сообщения: 46
Версия Delphi: Delphi, Lazarus
Репутация: 10
По умолчанию

Забыл ; поставить
МАХАЛАЙ-БАХАЛАЙ АВТОКАДА ЗАПУСТИСЬ;

До конструкции IF - ELSE я бы как ни будь сам додумался ))
видишь ли тут всё немного сложнее ...
Ответить с цитированием
  #5  
Старый 16.12.2014, 20:52
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Не смеяться нужно, а на вопросы отвечать. Я не телепат и в отпуске не был. В прошлом сообщении подразумевались вопросы:
  • На машине с AutoCAD 2012 приложение запускается? Динамический вызов интерфейсов, стало быть?
  • Как конкретно выглядит код запуска?
Почему этого не было в первом же сообщении?
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #6  
Старый 18.12.2014, 21:40
Аватар для Homo-Fantasmus
Homo-Fantasmus Homo-Fantasmus вне форума
Прохожий
 
Регистрация: 23.08.2011
Адрес: МО
Сообщения: 46
Версия Delphi: Delphi, Lazarus
Репутация: 10
По умолчанию

Смотри второй скриншот, там справа в менеджере проекта подключены 2 библиотеки AutoCAD_2012_TLB и AutoCAD_2015_TLB

в uses они прописаны
Цитата:
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ComObj, Vcl.StdCtrls, Vcl.OleServer, AutoCAD_2012_TLB, AutoCAD_2015_TLB, Vcl.Menus;

вот в таком виде запускается только на машине где установлен Acad2015, на машине где установлен Acad2012 не запускается.

теперь если из uses убрать AutoCAD_2015_TLB, то будет запускаться на машине где установлен Acad2012.

Редактируя uses я пока и запускаю нужную версию, т.е. я пока не знаю как это реализовать нормально т.е. программно...
В этом и проблема я не пойму как это сделать ...
Запускается автокад по нажатию кнопки <Запустить Автокад>
но запускается только та версия библиотека которой прописана в uses

Теперь код запуска

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ComObj, Vcl.StdCtrls, Vcl.OleServer, AutoCAD_2012_TLB,  Vcl.Menus;


type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
 
  private
    { Private declarations }
     mess: TModalResult;
     AcadApp: IAcadApplication;


  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


Function GetAcadApplication(Visible: Boolean): IAcadApplication;

var
  v : OleVariant;
begin
  Try
// пытаемся присоединиться к уже запущенной копии AutoCad
    v := GetActiveOleObject('AutoCAD.Application');
  Except
// если не получилось присоединиться, то запускаем новую копию AutoCad
    v:= CreateOleObject('AutoCAD.Application');
  end;
// приводим переменную типа OleVariant к типу IAcadApplication
  Result := IDispatch(v) as IAcadApplication;
// далее проверяем, надо ли делать приложение AutoCad видимым
  if Visible then Result.Visible := True;
end;

....

//ЗАПУСК АВТОКАДА

procedure TForm1.Button1Click(Sender: TObject);
begin
// делаем так, что бы наша форма отображалась всегда поверх окна AutoCad
  FormStyle:= fsStayOnTop;

AcadApp:= GetAcadApplication(true);

end;

Как реализовать управление версиями ?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:43.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025