Тема: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

Если АКАД загружен, то всё хорошо, но если нет, то на это строчке:
try
ACAD:=GetActiveOleObject('AutoCAD.Aplication');
пишет "Операция не доступна".
Помогите, кто может, пожалуйста....

Re: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

Во-первых, в слове APLICATION - два P, т.е. APPLICATION (шутка).
Во вторых надо писать так

ACAD := GetActiveOleObject('Autocad.Application') as IAcadApplication;

При этом желательно еще версию указывать.
В-третьих, GetActiveOleObject дословно переводится с английского как "Взять активный(запущенный) OLE-объект". Если AutoCAD не запущен, то соответственно ничего не выйдет.
Поэтому всю эту баланду необходимо заключить в защищенный блок try..except...
Чтобы запустить AutoCAD нужно написать:

ACAD := CreateOleObject('Autocad.Application') as IAcadApplication;

Вобщем попробуй. Хотя без особой необходимости такими вещами лучше не заниматься, а следует обращаться из AutoCAD к Delphi-программе.

Re: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

Задача стоит из Delphi.
То что вы мне предлагаете у меня есть, но пишет ошибку при выполнении на той самой строчке. Напишу больше кода:
  try
    //Проверка запуска АКАДА
    Acad:=GetActiveOleObject('AutoCAD.Application') as IAcadApplication;
  except
    //При False запуск АКАДА
    Acad:=CreateOleObject('AutoCAD.Application') as IAcadApplication;
  end;
Она работает, если АКАД загружен, но зачем мне ёще раз загружать его? Здесь что-то не так. Вот я и хочу выяснить что именно?

Re: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

Вот работающий пример:

unit LA;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, AutoCAD_TLB, OleServer, ComObj;
type
  TMainForm = class(TForm)
    LaunchButton: TBitBtn;
    ExitButton: TBitBtn;
    ResultLabel: TLabel;
    procedure LaunchButtonClick(Sender: TObject);
    procedure ExitButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  MainForm: TMainForm;
  AutoCAD : IAcadApplication;
implementation
{$R *.dfm}
procedure TMainForm.LaunchButtonClick(Sender: TObject);
begin
  try
    AutoCAD := GetActiveOleObject('Autocad.Application.15') as IAcadApplication;
    ResultLabel.Caption := 'AutoCAD15 уже запущен';
  except
    try
      AutoCAD := CreateOleObject('Autocad.Application.15') as IAcadApplication;
      AutoCAD.Visible := True;
      ResultLabel.Caption := 'AutoCAD15 запустился';
    except
      ResultLabel.Caption := 'AutoCAD15 нету...';
    end;
  end;
end;
procedure TMainForm.ExitButtonClick(Sender: TObject);
begin
  MainForm.Close;
end;
end.

Если без AutoCAD_TLB, то меняем

AutoCAD : IAcadApplication;

на

AutoCAD : OleVariant;

а

as IAcadApplication

убираем вообще.
Ты вообще откуда запускаешь свою прогу. Если прямо из среды Delphi, то Exception будет по любому.

Re: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

Если прямо из среды Delphi, то Exception будет по любому

Вот ответ на вопрос.
Только почему в книгах это не указано? Ну ладно, спасибо огромное...

Re: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

> Tigra
При запуске из среды идет детальная проработка каждого шага программы. Поэтому и "возникает" Exception не зависимо от того предусмотрена его обработка или нет. После его возникновения можно пошагово продолжить выполнение программы и, в данном случае, увидеть, что AutoCAD преспокойно запускается.

Re: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

Как запустить AutoCAD 2004. Программа, составленная GRF, при изменении с 15 на 16, AutoCAD 2004 не запускает.

Re: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

Николай пишет:

при изменении с 15 на 16

А библиотеку типов поменял?
Если поменял и не работает - значит глюк.
Вообще библиотекой типов пользоваться не надо, а надо общаться с AutoCAD через OleVariant. Тогда запустится без проблем.

Re: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

Я ее не использую по мойму, если имеется в виду AutoCAD_TLB. Запускаю AutoCAD следующим образом:
try
   AutoCAD := GetActiveOleObject('Autocad.Application.15');
   if MessageDlg('Предупреждение'+#13+'AutoCAD уже запущен.'+#13+'Запустить вторую копию AutoCAD',mtWarning,[mbYes, mbNo], 0)=idYes then
    begin
    try
      AutoCAD := CreateOleObject('Autocad.Application.15');
      AutoCAD.Visible := True;
      autocadexec:=true;
    except
      MessageDlg('Ошибка запуска второй копии AutoCAD',mtError,[mbOk], 0);
    end;
...

Re: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

Причина в компеляторе.
Если запускать программу в компиляторе, то он обрабатывая ошибку наличия запущенного автокада выдает сообщение.
Если же продолжить выполнение, то прога работает в норме...
Спасибо за обсуждение.

Re: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

> Николай
Если причина в том, что сказал Tigra, то по-моему эта тема здесь же и обсуждалась чуть ранее (> GRF (2004-03-04 11:48:06)).

Re: Почему в Delphi при GetActiveOleObject('AutoCAD.Aplication') пишет ошибку?

Помогите разобраться с заливкой в AutoCad 2004 из Delphi 7.
Имею на чертеже круг, который необходимо закрасить. Вроде бы нужно использовать команду "ACad.ActiveDocument.ModelSpace.AddHatch(.........)", но не знаю, что писать в скобках. Как указать объект заливки? не понимаю.