![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать что пользователь только-что закрыл AutoCAD [D7, WinXP]
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)