今天又看了看C#中的事件响应机制和delegate的概念,对此有了些理解,根据这些概念来写一些进行arc engine开发时对于arc object上的事件的响应。
在arc engine 开发中 arc object 是作为COM类引用到.net中的,对其上事件的响应也是通过委托delegate来实现,只是对于委托delegate和相应的事件已经在arc object中定义好了,我们只需实例化一个delegate对象将其加到事件的列表中去即可。具体步骤如下:
1。 Create a delegate 声明一个delegate用来响应事件。
IAppROTEvents_AppRemovedEventHandler m_appRemoved;
在arc object 的COM类中 委托的名字有四部分组成:事件接口名字,下划线,事件名字,EventHandler。
2。用我们自己定义的函数(即用来响应事件的方法)实例化这个委托,从而建立了一个委托的实例
//Create a delegate instance and add it to AppRemoved event
m_pAppRot = new AppROTClass();
m_pAppRot = new AppROTClass();
//用我们自己定义的方法实例化该委托。
m_appRemoved = new IAppROTEvents_AppRemovedEventHandler(AppRemoved);
3。将建立好的委托实例加到事件中去。 事件可以理解为在事件发布者(arc object)中定义好的一个委托链,该委托链(即事件)何时发生 也在事件发布者中进行了定义,我们要做的是把自己的方法通过委托实例加到这个委托链中去,该委托链(即事件)发生时一并加以执行。
// add the delegate to the event
((IAppROTEvents_Event)m_pAppRot).AppRemoved += m_appRemoved;
所需注意的是一点接口上的转换类的默认接口一般都不在事件类上,故要首先转到事件接口上才能访问到事件。(IAppROTEvents_Event)就是进行了一下转换。
define the method
private void QuitArcMap()
{
if (m_pDoc != null)
{
m_pApp.Shutdown(); //Quit ArcMap
m_pDoc = null; //Release m_pDoc
m_pApp = null; //Release m_pApp
cmdStartArcMap.Enabled = true;
cmdAddData.Enabled = false;
cmdQuitArcMap.Enabled = false;
}
}
{
if (m_pDoc != null)
{
m_pApp.Shutdown(); //Quit ArcMap
m_pDoc = null; //Release m_pDoc
m_pApp = null; //Release m_pApp
cmdStartArcMap.Enabled = true;
cmdAddData.Enabled = false;
cmdQuitArcMap.Enabled = false;
}
}
一点粗浅理解,供交流。