![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Всем привет!
Задачка такая... На форме имеется 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
|
||||
|
||||
|
Цитата:
Вангую, что если программа запускается на машине с 2012-м AutoCAD-ом, а падает только на попытке его запуска, в программе нужно через точку писать: Код:
begin
if ComboBox1.ItemIndex = 0 then
AutoCAD_2012_TLB.Запустись
else
AutoCAD_2015_TLB.Запустись;
end; |
|
#3
|
||||
|
||||
|
Цитата:
Гениально )) AutoCAD_2015_TLB.Запустись; НАСМЕШИЛ МАХАЛАЙ-БАХАЛАЙ АВТОКАДА ЗАПУСТИСЬ TLB (англ. Type Library — библиотека типов) — иерархическое хранилище информации о возможностях ActiveX-сервера в OLE Automation. |
|
#4
|
||||
|
||||
|
Забыл ; поставить
МАХАЛАЙ-БАХАЛАЙ АВТОКАДА ЗАПУСТИСЬ; До конструкции IF - ELSE я бы как ни будь сам додумался )) видишь ли тут всё немного сложнее ... |
|
#5
|
||||
|
||||
|
Не смеяться нужно, а на вопросы отвечать. Я не телепат и в отпуске не был. В прошлом сообщении подразумевались вопросы:
![]() |
|
#6
|
||||
|
||||
|
Смотри второй скриншот, там справа в менеджере проекта подключены 2 библиотеки AutoCAD_2012_TLB и AutoCAD_2015_TLB
в uses они прописаны Цитата:
вот в таком виде запускается только на машине где установлен 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;
Как реализовать управление версиями ? |
|
#7
|
||||
|
||||
|
Для VB есть решение:
GetObject("AutoCAD.Application.18") для запуска 2012 версии GetObject("AutoCAD.Application.20") должен по логике запускать 2015 Кто ни будь знает для Delphi есть какой ни будь подобный инструмент ? |
|
#8
|
||||
|
||||
|
Пробовал подобным образом запустить Acad 2012
Код:
Function GetAcadApplication(Visible: Boolean): IAcadApplication;
var
v1 : OleVariant;
begin
Try
// пытаемся присоединиться к уже запущенной копии AutoCad
v1 := GetActiveOleObject('AutoCAD.Application.18');
Except
// если не получилось присоединиться, то запускаем новую копию AutoCad
v1:= CreateOleObject('AutoCAD.Application.18');
end;
// приводим переменную типа OleVariant к типу IAcadApplication
Result := IDispatch(v1) as IAcadApplication;
// далее проверяем, надо ли делать приложение AutoCad видимым
if Visible then Result.Visible := True;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FormStyle:= fsStayOnTop;
AcadApp:= GetAcadApplication(true);
end;но в ответ Interface NOT Supported! или "Недопустимая строка с указанием класса" |
|
#9
|
||||
|
||||
|
Цитата:
Код:
begin CreateOleObject'Excel.Application.10'); // работает CreateOleObject'Excel.Application.11'); // ошибка end; Код:
Result := v1 as AutoCAD_2012_TLB.IAcadApplication; |
|
#10
|
|||
|
|||
|
Например, считать в реестре
HKEY_CLASSES_ROOT\AutoCAD.Application\CurVer там будет что-то вроде AutoCAD.Application.18 Затем последовательно искать в реестре наличие версий HKEY_CLASSES_ROOT\AutoCAD.Application.18 HKEY_CLASSES_ROOT\AutoCAD.Application.17 HKEY_CLASSES_ROOT\AutoCAD.Application.16 и.т.д HKEY_CLASSES_ROOT\AutoCAD.Application.1 |
|
#11
|
||||
|
||||
|
Цитата:
|
|
#12
|
||||
|
||||
|
А вот таким способом пробовали?
Код:
uses
ComObj, ActiveX;
resourcestring
rsAcadNotFound = 'AutoCAD не найден!';
var
Acad: OleVariant;
procedure AcConnect(const acClassName: String; const acNewInstance: Boolean;
const acVisible: Boolean);
var
IU: IUnknown;
ClassID: TCLSID;
IsCreate: Boolean;
ErrorCode: HResult;
begin
if VarIsClear(Acad) then // если еще не присоединились…
begin
// если AutoCAD не установлен — произойдет ошибка
ErrorCode:= CLSIDFromProgID(PWideChar(WideString(acClassName)), ClassID);
if not Succeeded(ErrorCode) then
raise EOleSysError.Create(rsAcadNotFound, ErrorCode, 0);
// пытаемся присоединиться к уже запущенному экземпляру AutoCAD
IsCreate:= acNewInstance or (not Succeeded(GetActiveObject(ClassID, nil, IU)));
if IsCreate then
try
// запускаем новый экземпляр AutoCAD
Acad:= CreateComObject(ClassID) as IDispatch;
except
raise EOleSysError.Create(rsAcadNotFound, ErrorCode, 0);
end
else
Acad:= IU as IDispatch;
// управляем видимостью AutoCAD
if not VarIsClear(Acad) then Acad.Visible:= acVisible;
end;
end;
Где-то в программе:
AcConnect('AutoCAD.Application', True, False); |
|
#13
|
||||
|
||||
|
Спасибо, буду пробовать, разбираться.
|
|
#14
|
||||
|
||||
|
Кажется я всё слишком усложнил ...
Прописывать в коде - AutoCAD.Application.18 *.19 *.20 - это всё не нужно ... Нужно только подцепить библиотеку для последней версии ACada например для 2015 И можно будет работать с Автокадами версий 2014, 2013, 2012; будут ли работать версии ниже 2012 не знаю, но мне это и не нужно... Код:
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_TLB,
Vcl.Menus;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
AcadApp: IAcadApplication;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Function GetAcadApplication(Visible: Boolean): IAcadApplication;
var
v : OleVariant;
begin
Try v := GetActiveOleObject('AutoCAD.Application');
Except
AutoCad
v:= CreateOleObject('AutoCAD.Application');
end;
Result := IDispatch(v) as IAcadApplication;
if Visible then Result.Visible := True;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
AutoCad
FormStyle:= fsStayOnTop;
AcadApp:= GetAcadApplication(true);
end;
end.
|