Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать что пользователь только-что закрыл AutoCAD [D7, WinXP]


Страницы:   1 2

Calibr2 ©   (2006-07-11 06:37:00) 

У меня проблема в том, что нужно отловить момент, когда пользователь закроет приложение AutoCAD. Приложение AutoCAD у меня хранится в переменной типа IAcadApplication из модуля AutoCAD_TLB. Как это возможно сделать подскажите, буду очень признателен!!!


Elen   (2006-07-13 09:13:00) [1]


> Calibr2

Wellcome


Calibr2   (2006-07-13 08:14:00) [2]

Спасибо всем!!!! Вы меня очень выручили!!! Особенное спасибо Elen!!!:):):):)


Elen   (2006-07-12 15:55:00) [3]


> Calibr2

Задай этот вопрос на форум AutoCAD (по ссылке AbrosimovA)


Calibr2   (2006-07-12 11:46:00) [4]


> Elen


Я сохранил Макрос в формате *.dvb а как сделать чтоб он запускался вместе с Acadom, я пока сам его не запущу он не запускается


Calibr2   (2006-07-12 11:00:00) [5]


> Elen


А вот вроде получается я еще напишу.


Calibr2   (2006-07-12 10:50:00) [6]


> Elen


Я не знаком с VBA не могла бы ты по подробнее объяснить. И в Акаде такого меню у меня нет Assist -> Macro-> Macros. И VBA редактор не пойму где взять.


Elen   (2006-07-12 10:11:00) [7]


> Calibr2

Значит так : Вот тебе макрос-скрипт решающий твою задачу на VBA Acad

Public WithEvents ACADApp As AcadApplication    ' Use with Application Event Examples
Sub Example_AcadApplication_Events()
   Set ACADApp = GetObject(, "AutoCAD.Application")
End Sub
Private Sub ACADApp_BeginQuit(Cancel As Boolean)
   If MsgBox("AutoCAD Хочет закрыться Ладушки или нет?", vbYesNoCancel + vbQuestion) <> vbYes Then
       Cancel = True
   End If
End Sub

Запускаеш Акад в меню Assist->Macro->Macros создаеш макрос как Global и в редакторе VBA на ветке ThisDrawing вписываеш этот код.
и запускаеш его. Он должен срабатывать при каждом запуске Акада
Удачи и да простят меня Мастера за VBA мазню на этом чистейшем форуме!
если можно сообщи результат сюда же ;-)


Elen   (2006-07-12 09:50:00) [8]


> где можно ему научиться?

Методом тыка. Запускаеш акад и пробуеш написать скрипт сам. Недельку помучаешся зато с пользой т.к. в любом офиссе сможеш решать такие задачи без всяких хуков.


Calibr2   (2006-07-12 09:15:00) [9]


> Elen

VBA это вообще, что новый язык и вообще где можно ему научиться?


Elen   (2006-07-12 08:50:00) [10]


> AbrosimovA ©

Это не лучшее решение это пример

> Calibr2

Лучще все таки если ты напишеш скрипт на VBA для Акада


AbrosimovA   (2006-07-12 08:28:00) [11]


> Acad := GetActiveOleObject('AutoCAD.Application');


Зачем это делать в таймере?


Elen   (2006-07-12 08:17:00) [12]

P.S. При запуске из Делфи будет ругаться. Не обращай внимание и нажимай F9 в экзешнике все пойдет как по маслу


Elen   (2006-07-12 08:16:00) [13]


> Calibr2  

Значит слухай сюдыть : В твоей проге нет ошибки но в определенные моменты таймер не успевает за Акадом. Протестируй в дебугере и увидишь

Привожу тебе мое решение :

unit Unit1;

interface

uses       comobj,
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, OleServer, AutoCAD_TLB;

type
 TForm1 = class(TForm)
   AcadDocument1: TAcadDocument;
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var   Acad: OleVariant;
AcadApp: IAcadApplication;

 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
try
   Acad := GetActiveOleObject('AutoCAD.Application');
    Application.Title:='yes';
   //АКАД запущен
except
Application.Title:='no';
//Акад закрыт
end;
end;

end.


На будущее просьба Приводи код полностью от unit до последнего end
Неудобно тестировать.
Удачи! ;-)


AbrosimovA   (2006-07-12 08:14:00) [14]

Я бы вместо этого

> Acad := GetActiveOleObject('AutoCAD.Application');    AcadApp
> := IDispatch(Acad) as IAcadApplication;

написал бы так
AcadApp := GetActiveOleObject('AutoCAD.Application') as IAcadApplication;
тогда не требовалось бы создавать промежуточную переменную Acad, которая у тебя нигде не используется.


Calibr2   (2006-07-11 17:31:00) [15]


> Elen


Ты не могла бы протестировать мой пример несколько раз потому-что у меня сообщение иногда срабатывает иногда нет. Именно это меня и смущает. Я уже вывел свое окно наверх, все равно 1 раз из 5-10 не срабатывает.


AbrosimovA   (2006-07-11 14:51:00) [16]

Delphi: Search-> Find in files...


jack128   (2006-07-11 14:49:00) [17]

Calibr2   (11.07.06 14:00) [19]
Какой модуль нужно прописать в uses чтобы использовать тип IConnectionPointContainer или IConnectionPoint

Наверно для тебя это большая новость, но Explorer встроена возможность поиска по содержимому файла...


AbrosimovA   (2006-07-11 14:34:00) [18]

ActiveX


Calibr2   (2006-07-11 14:00:00) [19]


> AbrosimovA


Какой модуль нужно прописать в usesчтобы использовать тип IConnectionPointContainer или IConnectionPoint


AbrosimovA   (2006-07-11 13:24:00) [20]


> а где можно скачать компонент TAcadApplicationEvents?


Если ты внимательно смотрел по ссылке, там приведён юнит :

unit SinkAcadEvents;

interface
Uses
ComObj, AutoCAD_TLB, Classes;
Type
  TAcadApplicationEvents= class(TInterfacedObject, IUnknown, IDispatch)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо