Delphi で Bricscad のイベントを取得 (2017/08/15)
Delphi からでも Bricscad のイベントが使えるというサンプルです。
Bricscad V17(x86) + Delphi 10.2 Tokyo で動作を確認しました。
参照しているユニット( BricscadApp_TLB, BricscadDb_TLB )は、タイプライブラリの取り込みで作成して下さい。
// --------------------------------------------- // BcadAppEvents.pas // --------------------------------------------- unit BcadAppEvents; interface Uses ComObj, BricscadApp_TLB, Classes, Windows, ActiveX, BricscadDb_TLB; Type // パラメータ付きのイベント TParamWideStringEvent = procedure(ASender: TObject; const Param: WideString) of object; TParamVarWideStringEvent = procedure(ASender: TObject; var Param: WideString) of object; TSysVarChangedEvent = procedure (ASender: TObject;const SysvarName: WideString; newVal: OleVariant) of object; TWindowMovedOrResizedEvent = procedure(ASender: TObject; HWNDFrame: Integer; bMoved: WordBool) of object; TWindowChangedEvent = procedure (ASender: TObject;WindowState: AcWindowState) of object; TBeginQuitEvent = procedure(ASender: TObject; var Cancel: WordBool) of object; TBeginFileDropEvent = procedure(ASender: TObject; const FileName: WideString; var Cancel: WordBool) of object; Type { イベントを処理できるようにするには,まずイベントシンクを定義しなければなりません。 イベントシンクとは,サーバーのタイプライブラリで定義されるイベントディスパッチ インターフェースを実装するクラスです。 } TAcadApplicationEventsSink = class(TInterfacedObject, IUnknown, IDispatch) private FOwner : TObject; FOnSysVarChanged : TSysVarChangedEvent; FOnNewDrawing : TNotifyEvent; FOnAppActivate : TNotifyEvent; FOnAppDeactivate : TNotifyEvent; FOnWindowMovedOrResized : TWindowMovedOrResizedEvent; FOnBeginModal : TNotifyEvent; FOnEndModal : TNotifyEvent; FOnBeginQuit : TBeginQuitEvent; FOnBeginFileDrop : TBeginFileDropEvent; FOnARXLoaded : TParamWideStringEvent; FOnARXUnloaded : TParamWideStringEvent; FOnBeginPlot : TParamWideStringEvent; FOnEndPlot : TParamWideStringEvent; FOnBeginLisp : TParamWideStringEvent; FOnEndLisp : TNotifyEvent; FOnBeginCommand : TParamWideStringEvent; FOnEndCommand : TParamWideStringEvent; FOnBeginSave : TParamWideStringEvent; FOnEndSave : TParamWideStringEvent; FOnBeginOpen : TParamVarWideStringEvent; FOnEndOpen : TParamWideStringEvent; FOnLispCancelled : TNotifyEvent; FOnWindowChanged : TWindowChangedEvent; FOnUnknownEvent : TNotifyEvent; protected { イベントシンククラスのインスタンスが用意できたら,このイベントシンクの存在を サーバーに知らせます。 これで,サーバーはイベントシンクを呼び出せるようになります。 サーバーにイベントシンクの存在を知らせるには,グローバル手続き InterfaceConnect を呼び出し,以下を渡します。 ・イベントを生成するサーバーとのインターフェース ・イベントシンクが処理するイベントインターフェースの GUID ・イベントシンクの IUnknown インターフェース ・サーバーとイベントシンクの接続を表す Longint 値を受け取る変数 } { IUnknown } function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; { IDispatch } function GetTypeInfoCount(out Count: Integer): HRESULT; virtual; stdcall; function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HRESULT; virtual; stdcall; function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HRESULT; virtual; stdcall; function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HRESULT; virtual; stdcall; public constructor Create(Owner:TObject); property OnSysVarChanged : TSysVarChangedEvent read FOnSysVarChanged write FOnSysVarChanged; property OnNewDrawing : TNotifyEvent read FOnNewDrawing write FOnNewDrawing; property OnAppActivate : TNotifyEvent read FOnAppActivate write FOnAppActivate; property OnAppDeactivate : TNotifyEvent read FOnAppDeactivate write FOnAppDeactivate; property OnWindowMovedOrResized : TWindowMovedOrResizedEvent read FOnWindowMovedOrResized write FOnWindowMovedOrResized; property OnBeginModal : TNotifyEvent read FOnBeginModal write FOnBeginModal; property OnEndModal : TNotifyEvent read FOnEndModal write FOnEndModal; property OnBeginQuit : TBeginQuitEvent read FOnBeginQuit write FOnBeginQuit; property OnBeginFileDrop : TBeginFileDropEvent read FOnBeginFileDrop write FOnBeginFileDrop; property OnARXLoaded : TParamWideStringEvent read FOnARXLoaded write FOnARXLoaded; property OnARXUnloaded : TParamWideStringEvent read FOnARXUnloaded write FOnARXUnloaded; property OnBeginPlot : TParamWideStringEvent read FOnBeginPlot write FOnBeginPlot; property OnEndPlot : TParamWideStringEvent read FOnEndPlot write FOnEndPlot; property OnBeginLisp : TParamWideStringEvent read FOnBeginLisp write FOnBeginLisp ; property OnEndLisp : TNotifyEvent read FOnEndLisp write FOnEndLisp; property OnBeginCommand : TParamWideStringEvent read FOnBeginCommand write FOnBeginCommand; property OnEndCommand : TParamWideStringEvent read FOnEndCommand write FOnEndCommand ; property OnBeginSave : TParamWideStringEvent read FOnBeginSave write FOnBeginSave ; property OnEndSave : TParamWideStringEvent read FOnEndSave write FOnEndSave ; property OnBeginOpen : TParamVarWideStringEvent read FOnBeginOpen write FOnBeginOpen; property OnEndOpen : TParamWideStringEvent read FOnEndOpen write FOnEndOpen; property OnLispCancelled : TNotifyEvent read FOnLispCancelled write FOnLispCancelled; property OnWindowChanged : TWindowChangedEvent read FOnWindowChanged write FOnWindowChanged; property OnUnknownEvent : TNotifyEvent read FOnUnknownEvent write FOnUnknownEvent; end; implementation { TAcadApplicationEvents } function TAcadApplicationEventsSink.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; begin Result := E_NOTIMPL; end; function TAcadApplicationEventsSink.QueryInterface(const IID: TGUID; out Obj): HResult; begin Result := E_NOINTERFACE; Pointer(Obj) := nil; if GetInterface(IID, Obj) then Result := S_OK; if IsEqualGUID(IID,_DAcadApplicationEvents) and GetInterface(IDispatch,Obj) then Result := S_OK; end; function TAcadApplicationEventsSink.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; begin Result := E_NOTIMPL; end; function TAcadApplicationEventsSink._AddRef: Integer; begin Result := 2; end; function TAcadApplicationEventsSink.GetTypeInfoCount(out Count: Integer): HRESULT; begin Count := 0; Result := S_OK; end; function TAcadApplicationEventsSink.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; var FParamWideString : Widestring; FData : TVariantArg; FVariant : OleVariant; FParamInteger : Integer; FParamWordBool : WordBool; FAcWindowState : integer; begin Case DispID of 1 : if Assigned(FOnSysVarChanged) then begin if TDispParams(Params).cArgs = 2 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[1]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; FVariant := OleVariant(FData); FOnSysVarChanged(FOwner,FParamWideString, FVariant); end; end; 2 : if Assigned(FOnNewDrawing) then FOnNewDrawing(FOwner); 3 : if Assigned(FOnAppActivate) then FOnAppActivate(FOwner); 4 : if Assigned(FOnAppDeactivate) then FOnAppDeactivate(FOwner); 5 : if Assigned(FOnWindowMovedOrResized) then begin if TDispParams(Params).cArgs = 2 then begin FParamInteger :=0; FParamWordBool :=false; FData := PVariantArgList(TDispParams(Params).rgvarg)^[1]; if FData.vt = VT_I4 then FParamInteger := FData.lVal; FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BOOL then FParamWordBool := FData.vbool; FOnWindowMovedOrResized(FOwner, FParamInteger, FParamWordBool); end; end; 6 : if Assigned(FOnBeginModal) then FOnBeginModal(FOwner); 7 : if Assigned(FOnEndModal) then FOnEndModal(FOwner); 8 : if Assigned(FOnBeginQuit) then begin if TDispParams(Params).cArgs = 1 then begin FParamWordBool :=false; FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BOOL then FParamWordBool := FData.vbool; FOnBeginQuit(FOwner, FParamWordBool); end; end; 10 : if Assigned(FOnBeginFileDrop) then begin if TDispParams(Params).cArgs = 2 then begin FParamWordBool :=false; FData := PVariantArgList(TDispParams(Params).rgvarg)^[1]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BOOL then FParamWordBool := FData.vbool; FOnBeginFileDrop(FOwner,FParamWideString,FParamWordBool); end; end; 11 : if Assigned(FOnARXLoaded) then begin if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FOnARXLoaded(FOwner,FParamWideString); end; end; 12 : if Assigned(FOnARXUnloaded) then begin if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FOnARXUnloaded(FOwner,FParamWidestring); end; end; 13 : if Assigned(FOnBeginPlot) then begin if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FOnBeginPlot(FOwner,FParamWideString); end; end; 14 : if Assigned(FOnEndPlot) then begin if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FOnEndPlot(FOwner,FParamWideString); end; end; 15 : if Assigned(FOnBeginLisp) then begin if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FOnBeginLisp(FOwner,FParamWideString); end; end; 16 : if Assigned(FOnEndLisp) then FOnEndLisp(FOwner); 17 : if Assigned(FOnBeginCommand) then begin if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FOnBeginCommand(FOwner,FParamWideString); end; end; 18 : if Assigned(FOnEndCommand) then begin if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FOnEndCommand(FOwner, FParamWideString); end; end; 19 : if Assigned(FOnBeginSave) then begin if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FOnBeginSave(FOwner,FParamWideString); end; end; 20 : if Assigned(FOnEndSave) then begin if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FOnEndSave(FOwner,FParamWideString); end; end; 21 : if Assigned(FOnBeginOpen) then begin if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FOnBeginOpen(FOwner,FParamWideString); end; end; 22 : if Assigned(FOnEndOpen) then begin if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_BSTR then FParamWideString := FData.bstrVal; FOnEndOpen(FOwner,FParamWideString); end; end; 24 : if Assigned(FOnLispCancelled) then FOnLispCancelled(FOwner); 25 : if Assigned(FOnWindowChanged) then begin FAcWindowState := 0; if TDispParams(Params).cArgs = 1 then begin FData := PVariantArgList(TDispParams(Params).rgvarg)^[0]; if FData.vt = VT_I4 then FAcWindowState := FData.lVal; FOnWindowChanged(FOwner,FAcWindowState); end; end; else if Assigned(FOnUnknownEvent) then FOnUnknownEvent(FOwner); end; Result := S_OK; end; function TAcadApplicationEventsSink._Release: Integer; begin Result := 1; end; constructor TAcadApplicationEventsSink.Create(Owner:TObject); begin inherited Create; FOwner := Owner; end; end. // --------------------------------------------- // BcadEventsMain.pas (メインフォーム) // --------------------------------------------- unit BcadEventsMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Comobj, BricscadApp_TLB, BcadAppEvents,ActiveX, BricscadDb_TLB, Vcl.StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormShow(Sender: TObject); private { Private 宣言 } FAcadApplication : IAcadApplication; EventChanel : TAcadApplicationEventsSink; CPC: IConnectionPointContainer; CP : IConnectionPoint; cookie : Integer; procedure BcadBeginCommand(Sender: TObject;const CommandName: WideString); procedure BcadBeginOpen(Sender: TObject;var FileName: WideString); procedure BcadEndOpen(Sender: TObject;const FileName: WideString); procedure BcadBeginSave(Sender: TObject;const FileName: WideString); procedure BcadEndSave(Sender: TObject;const FileName: WideString); procedure BcadEndCommand(Sender: TObject;const CommandName: WideString); procedure BcadNewDrawing(Sender: TObject); procedure BcadAppActivate(Sender: TObject); procedure BcadAppDeactivate(Sender: TObject); procedure BcadBeginModal(Sender: TObject); procedure BcadEndModal(Sender: TObject); procedure BcadSysVarChanged(Sender: TObject;const SysvarName: WideString; newVal: OleVariant); procedure BcadWindowMovedOrResized(Sender: TObject;HWNDFrame: Integer; bMoved: WordBool); procedure BcadWindowChanged(Sender: TObject; WindowState: AcWindowState); procedure BcadBeginQuit(Sender: TObject; var Cancel: WordBool); procedure BcadBeginFileDrop(Sender: TObject; const FileName: WideString; var Cancel: WordBool); procedure BcadARXLoaded(Sender: TObject; const AppName: WideString); procedure BcadARXUnloaded(Sender: TObject; const AppName: WideString); procedure BcadBeginPlot(Sender: TObject; const DrawingName: WideString); procedure BcadEndPlot(Sender: TObject; const DrawingName: WideString); procedure BcadBeginLisp(Sender: TObject; const FirstLine: WideString); procedure BcadEndLisp(Sender: TObject); procedure BcadLispCancelled(Sender: TObject); public { Public 宣言 } end; var Form1 : TForm1; BeCreateFlag : boolean; ActiveFlag : boolean; function IsBcadActive : boolean; implementation {$R *.dfm} // BricsCAD が起動されているか function IsBcadActive:boolean; const BcadClassName = 'BricscadApp.AcadApplication'; var ClassID : TGUID; UnKnown : IUnknown; begin ClassID := ProgIDtoClassID(BcadClassName); result := Succeeded(GetActiveObject(ClassID, nil, Unknown)); end; // BricsCAD Events procedure TForm1.BcadARXLoaded(Sender: TObject; const AppName: WideString); begin Memo1.Lines.Add('ARXLoaded : ' + AppName); end; procedure TForm1.BcadARXUnloaded(Sender: TObject; const AppName: WideString); begin Memo1.Lines.Add('ARXUnloaded : '+ AppName); end; procedure TForm1.BcadBeginPlot(Sender: TObject; const DrawingName: WideString); begin Memo1.Lines.Add('BeginPlot : ' + DrawingName); end; procedure TForm1.BcadEndPlot(Sender: TObject; const DrawingName: WideString); begin Memo1.Lines.Add('EndPlot : ' + DrawingName); end; procedure TForm1.BcadBeginLisp(Sender: TObject; const FirstLine: WideString); begin Memo1.Lines.Add('BeginLisp : '+ FirstLine); end; procedure TForm1.BcadEndLisp(Sender: TObject); begin Memo1.Lines.Add('EndLisp'); end; procedure TForm1.BcadLispCancelled(Sender: TObject); begin Memo1.Lines.Add('LispCancelled'); end; procedure TForm1.BcadBeginFileDrop(Sender: TObject; const FileName: WideString; var Cancel: WordBool); begin Memo1.Lines.Add('BeginFileDrop : ' + FileName); end; procedure TForm1.BcadBeginQuit(Sender: TObject; var Cancel: WordBool); begin Memo1.Lines.Add('BeginQuit'); end; procedure TForm1.BcadWindowChanged(Sender: TObject; WindowState: AcWindowState); var s:string; begin case WindowState of acNorm : s := 'acNorm'; acMin : s := 'acMin'; acMax : s := 'acMax'; else s := ''; end; Memo1.Lines.Add('WindowChanged : ' + s); end; procedure TForm1.BcadWindowMovedOrResized(Sender: TObject;HWNDFrame: Integer; bMoved: WordBool); begin Memo1.Lines.Add('WindowMovedOrResized : HWND = ' + IntToHex(HWNDFrame,8)); end; procedure TForm1.BcadSysVarChanged(Sender: TObject;const SysvarName: WideString; newVal: OleVariant); var vtype : TVarType; s : string; m : integer; begin vtype := VarType(newVal); case vtype of //SNAPMODE,GRIDMODE... varSmallint : s := '= '+ IntToStr(newVal) + ' > (varSmallInt)'; //DIMSCALE... //明示的にキャストする必要がある varDouble : s := '= ' + Format('%.3f', [Double(newVal)]) + ' > (varDouble)'; varString : s := '> (varString)'; varEmpty : s := '> (varEmpty)'; varNull : s := '> (varNull)'; varInteger : s := '> (varInteger)'; varSingle : s := '> (varSingle)'; varCurrency : s := '> (varCurrency)'; varDate : s := '> (varDate)'; //文字列 varOleStr : s := '= ' + newVal + ' > (varOleStr)'; varDispatch : s := '> (varDispatch)'; varError : s := '> (varError)'; varBoolean : s := '> (varBoolean)'; varVariant : s := '> (varVariant)'; varUnknown : s := '> (varUnknown)'; varShortInt : s := '> (varShortInt)'; varByte : s := '> (varByte)'; varWord : s := '> (varWord)'; varLongWord : s := '> (varLongWord)'; varInt64 : s := '> (varInt64)'; varStrArg : s := '> (varStrArg)'; else begin //座標はこれ if vtype = varArray or varDouble then begin m := VarArrayHighBound(newVal,1); //すべて 3D 座標 if m = 2 then s := Format('= %.3f, %.3f, %.3f > (varArrayDouble)', [Double(newVal[0]), Double(newVal[1]), Double(newVal[2])]); end else s := '> (vtype = ' + IntToHex(vtype, 8) + ' )'; end; end; Memo1.Lines.Add('SysVarChanged : < ' + SysvarName + ' ' + s); end; procedure TForm1.BcadBeginOpen(Sender: TObject;var FileName: WideString); begin Memo1.Lines.Add('BeginOpen : ' + FileName); end; procedure TForm1.BcadEndOpen(Sender: TObject;const FileName: WideString); begin Memo1.Lines.Add('EndOpen : ' + FileName); end; procedure TForm1.BcadBeginSave(Sender: TObject;const FileName: WideString); begin Memo1.Lines.Add('BeginSave : ' + FileName); end; procedure TForm1.BcadEndSave(Sender: TObject;const FileName: WideString); begin Memo1.Lines.Add('EndSave : ' + FileName); end; procedure TForm1.BcadBeginCommand(Sender: TObject;const CommandName: WideString); begin Form1.Memo1.Lines.Add('BeginCommand : ' + CommandName); end; procedure TForm1.BcadEndCommand(Sender: TObject;const CommandName: WideString); begin Memo1.Lines.Add('EndCommand : ' + CommandName); end; procedure TForm1.BcadNewDrawing(Sender: TObject); begin Memo1.Lines.Add('NewDrawing'); end; procedure TForm1.BcadAppActivate(Sender: TObject); begin Memo1.Lines.Add('AppActivate'); end; procedure TForm1.BcadAppDeactivate(Sender: TObject); begin Memo1.Lines.Add('AppDeactivate'); end; procedure TForm1.BcadBeginModal(Sender: TObject); begin Memo1.Lines.Add('BeginModal'); end; procedure TForm1.BcadEndModal(Sender: TObject); begin Memo1.Lines.Add('EndModal'); end; // フォームイベント procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin InterfaceDisconnect(FAcadApplication, _DAcadApplicationEvents, cookie); EventChanel.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Lines.Clear; BeCreateFlag := False; ActiveFlag := True; // 起動中の Bricscad を取得 { if IsBcadActive then begin FAcadApplication := GetActiveOleObject('BricscadApp.AcadApplication') as IACadApplication; end else begin MessageBox(Handle,PChar('BricsCADが起動されていません.'+#13+'起動しますか?'),'BcadAppEvents',MB_YESNO); end; } if BeCreateFlag then begin // Bricscad を新規に起動 FAcadApplication := CoAcadApplication.Create; FAcadApplication.Visible := true; //SetForegroundWindow(FAcadApplication.HWND); end; if ActiveFlag then begin // 起動中の Bricscad を取得 FAcadApplication := GetActiveOleObject('BricscadApp.AcadApplication') as IACadApplication; Memo1.Lines.Add('GetActiveOleObject: BricscadApp.AcadApplication'); end; if IsBcadActive and Assigned(FAcadApplication) then begin EventChanel := TAcadApplicationEventsSink.Create(self); FAcadApplication.QueryInterface(IConnectionPointContainer, CPC); CPC.FindConnectionPoint(_DAcadApplicationEvents, CP); CP.Advise(EventChanel, cookie); EventChanel.OnEndCommand := BcadEndCommand; EventChanel.OnBeginCommand := BcadBeginCommand; EventChanel.OnNewDrawing := BcadNewDrawing; EventChanel.OnBeginSave := BcadBeginSave; EventChanel.OnEndSave := BcadEndSave; EventChanel.OnBeginOpen := BcadBeginOpen; EventChanel.OnEndOpen := BcadEndOpen; EventChanel.OnAppActivate := BcadAppActivate; EventChanel.OnAppDeactivate := BcadAppDeactivate; EventChanel.OnBeginModal := BcadBeginModal; EventChanel.OnEndModal := BcadEndModal; EventChanel.OnSysVarChanged := BcadSysVarChanged; EventChanel.OnWindowMovedOrResized := BcadWindowMovedOrResized; EventChanel.OnWindowChanged := BcadWindowChanged; EventChanel.OnBeginQuit := BcadBeginQuit; EventChanel.OnBeginFileDrop := BcadBeginFileDrop; EventChanel.OnARXLoaded := BcadARXLoaded; EventChanel.OnARXUnloaded := BcadARXUnloaded; EventChanel.OnBeginPlot := BcadBeginPlot; EventChanel.OnEndPlot := BcadEndPlot; EventChanel.OnBeginLisp := BcadBeginLisp; EventChanel.OnEndLisp := BcadEndLisp; EventChanel.OnLispCancelled := BcadLispCancelled; end; end; procedure TForm1.FormShow(Sender: TObject); begin if Assigned(FAcadApplication) then SetForegroundWindow(FAcadApplication.HWND); end; end.