Тема: События AcadDocument не хотят отслеживаться в Delphi

Я не знаю хотят ли события отслеживаться или нет, но у меня ничего не выходит.
Делаю я следующее: переношу на форму компонент AcadDocument и на вкладке Events выбираю что-нибудь типа OnBeginClose. В процедуре что-нибудь пишу (мне там особо много и не надо, только сообщение дать).
Когда же проверяю как оно работатет - то выясняется что никак.
Пробовал менять свойство AutoConnect. Если поставить True, то вообще приложение вылетает еще при запуске.
Пробовал писать AcadDocument1.Connect (правда не знаю зачем), но приложение также благополучно вылетает.
Читал "AutoCAD 2002 в подленнике". Там подключение идет через AutocadApplication, которого  у меня нет, но впрочем это и неважно, т.к. никакого намека на Connect я там не увидел.
Вообщем если кто знает - помогите разобраться. Запутался по уши.

Re: События AcadDocument не хотят отслеживаться в Delphi

Немного  уточню ситуацию.
1. Если свойства AutoConnect = False, ConnectKind = ckRunningOrNew, то при попытке послать в командную строку lisp-выражение - открывается новый документ (хотя мне нужен текущий) и в нем все работает (т.е. и alert появляется, и события отслеживаются и т.д.).
2. Если свойства AutoConnect = False, свойство ConnectKind = ckRunningInstanse, то выдается следующее:
Unable to retrieve a pointer to a running object registered with OLE for AutoCAD.Application.15/{...}
3. Если свойство AutoConnect = True, ConnectKind = ckRunningInstanse, то вылетает "Приложение ... Обнаружена ошибка ... будет закрыто ... отправлять отчет?". Затем вдобавок к сообщению из предыдущего пункта еще и вот это:
Exception EOLeSysError in module ... at ...
4. Если свойство AutoConnect = True, ConnectKind = ckRunningOrNew, то один раз даже так случилось: AutoCAD завис (пришлось через диспетчер задач вырубать), а когда вырубил появилось сообщение "ошибка удаленного вызова процедуры".
В общем, вот такая ситуация. Ни черта в ней не понимаю, и поэтому взываю о помощи.

Re: События AcadDocument не хотят отслеживаться в Delphi

Код приблизительно такой:

unit doccl;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleServer, AutoCAD_TLB;
type
  TForm1 = class(TForm)
    Button1: TButton;
    AcadDocument1: TAcadDocument;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure AcadDocument1BeginClose(Sender: TObject);
    procedure AcadDocument1BeginLisp(ASender: TObject;
      const FirstLine: WideString);
    procedure Button2Click(Sender: TObject);
    procedure AcadDocument1EndLisp(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Close;
end;
procedure TForm1.AcadDocument1BeginClose(Sender: TObject);
begin
  MessageDlg('Документ закрывается !!!', mtWarning, [mbOK], 0);
end;
procedure TForm1.AcadDocument1BeginLisp(ASender: TObject;
  const FirstLine: WideString);
begin
  MessageDlg('Начался Lisp !!!', mtWarning, [mbOK], 0);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  AcadDocument1.SendCommand('(alert "Hello !!!")'+#13);
end;
procedure TForm1.AcadDocument1EndLisp(Sender: TObject);
begin
  MessageDlg('Закончился Lisp !!!', mtWarning, [mbOK], 0);
end;
end.

Delphi7, AutoCAD2002

Re: События AcadDocument не хотят отслеживаться в Delphi

Попробовал что-то вроде этого:

procedure TForm1.FormShow(Sender: TObject);
begin
  AcadApplication := GetActiveOleObject('AutoCAD.Application') as IAcadApplication;
  AcadApplication.ActiveDocument.Activate;
  AcadDocument1.ConnectTo(AcadApplication.ActiveDocument);
end;

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

procedure TForm1.AcadDocument1BeginClose(Sender: TObject);
begin
  AcadDocument1.Disconnect;
  AcadDocument1.Free;
  Form1.Close;
end;

В данном случае все проходит даже гладко. Но вот если хочу дать сообщение, то все (и AutoCAD и мое приложение) как бы "подвисает". Только если щелкнуть по окну приложения появляется искомое сообщение (да и то, если главное окно предварительно сдвинул с начального места, иначе сообщения не видно).
Вобщем такая странная, на первый взгляд, ситуация. Но что больше всего интересно, так это разве никто не сталкивался с подобной проблемой или собственной ошибкой? А то это уже на длинный бессмысленный монолог похоже...

Re: События AcadDocument не хотят отслеживаться в Delphi

В очередной раз рекомендую:
Пересматривайте принцип работы!
AutoCAD не такое приложение, которое позволяет себя беспокоить по пустякам.
Обычно гораздо удобнее основную программу писать на LISP, а на Delphi делать вызываемое из LISP приложение (DLL или EXE).  Особенно когда в Delphi после Disconnect сразу Close.
Иначе пробелм будет все больше, а нынешние покажутся мелочью.

Re: События AcadDocument не хотят отслеживаться в Delphi

> ShaggyDoc
Спасибо, что Вы откликнулись. Я ничуть не сомниваюсь в Вашей правоте. Только в данном случае все именно так и обстоит (на мой взгляд): все изменения, которые происходят в рисунке AutoCAD делаются на Lisp. А на Delphi только вносятся данные и при нажатии на кнопку "Выход" запускается Lisp-приложение с помощью метода SendCommand.
А события мне нужны для того хотябы, чтобы этот запуск Lisp-приложения не произошел в другом рисунке вместо нужного (т.е. того  в котором Delphi-приложение запускалось).
Хотя често говоря, меня не покидает ощущение, что я чего-то тут недопонимаю.

Re: События AcadDocument не хотят отслеживаться в Delphi

> GRF
В такой ситуации нужно делать программу именно на LISP. В момент ввода данных вызывать Delphi в "модальном" режиме. AutoCAD и LISP в это время приостанавливают работу и ждут завершения Delphi-приложения. Потом LISP-программы продолжается. Возможны многократные вызовы для уточнения или изменения данных.
Lisp-программа всегда запускается в нужном (то есть в текущем) рисунке.

Re: События AcadDocument не хотят отслеживаться в Delphi

> ShaggyDoc
Попробовал использовать функцию dos_exewait. Может я что неправильно сделал, но мне не очень понравилось.
Окно конечно запускается в модальном режиме, но если щелкнуть (даже случайно) вне окна, то AutoCAD сразу "не отвечает", а на месте окна приложения появляется белое пятно.
Потом получается, что "коннектиться" к документу вообщее нельзя, т.к. приложение не запускается совсем. Точнее запускается, но его не видно, или не отвечает. Если завершить его через Диспетчер задач, то появляется сообщение Windows об ошибке, а само приложение запускается опять но не в модальном режиме.
Пробовал использовать внутри приложения API-функцию SetWindowPos, но как и следовало наверное ожидать, запуск происходит поверх всех окон и мое окно  не перекрывается, но доступ к этим всем окнам сохраняется (пусть даже и неудобный).

Re: События AcadDocument не хотят отслеживаться в Delphi

> GRF
Надо делать свой COM-сервер в DLL

Re: События AcadDocument не хотят отслеживаться в Delphi

> ShaggyDoc
А что это в данном случае поможет решить?

Re: События AcadDocument не хотят отслеживаться в Delphi

Мне тоже нужно решить эту проблему. Интересно, а как можно получить доступ к метке окна AutoCAD'а, чтобы с помощью API-Функций заставить его . . . ну поменять свою активность что ли?

Re: События AcadDocument не хотят отслеживаться в Delphi

> GRF
> А что это в данном случае поможет решит …  11:55:59)
Точно так же, как и любого WIN-приложения. Если работать из VL, то можно передать и номер окна AutoCAD. Легко его получить и через COM и управлять им.