明察秋毫,很多情况下是非常需要的,例如,如果我们完善了一套系统,能够将四川赈灾的款项的筹集、采购、分发等步骤都能明察秋毫,相信整个世界会安静很多。同样,对于一个使用Visio进行二次开发的程序来说,背后你需要知道用户增加了那些设备,删除了那些设备,修改了那些设备,这样你才能对整个系统的数据进行有效的控制,否则“赈灾”款项就可能丢失了,呵呵。那我们应该如何做才能有效的处理这些事件,达到对设备的变更明察秋毫呢?我前面介绍了一篇文章《C#进行Visio开发的事件处理 》,其中也介绍了各种事件侦听,我们要对设备进行跟踪的话,基本上只需要侦听这几个事件,并对之进行处理即可。
const string sink =
"";

Event newEvent =
null;


EventList applicationEvents = eventApplication.EventList;

EventList documentEvents = eventDocument.EventList;


newEvent = documentEvents.AddAdvise(

(
unchecked((
short)VisEventCodes.visEvtAdd) + (
short)VisEventCodes.visEvtShape),

(IVisEventProc)
this, sink,
"ShapeAdd");


newEvent = documentEvents.AddAdvise(

(
short)VisEventCodes.visEvtDel + (
short)VisEventCodes.visEvtShape,

(IVisEventProc)
this, sink,
"ShapeDelete");


newEvent = documentEvents.AddAdvise(

(
short)VisEventCodes.visEvtMod + (
short)VisEventCodes.visEvtCell,

(IVisEventProc)
this, sink,
"CellChanged");
以上是对几个特别事件的侦听,我们要实现设备的跟踪,需要在这几个事件中处理相关的设备信息。为了跟踪好设备的相关信息,我们需要定义一个实体类ShapeLogInfo类放置相关的设备信息,如Shape的GUID,Shape的ID,设备状态(添加、修改、删除),Shape的Name,还有就是我们自定义的一个属性“设备类型”。
为了更好的管理ShapeLogInfo的相关信息,我们把相同设备类型(ShapeType)的放到一起管理,于是,我们再创建一个ShapeTypeLogInfo类来装载相关的日志信息,具体如下:
为了判断是否有相应的ShapeTypeLogInfo和ShapeLogInfo,需要定义几个函数用来维护相关的集合信息,如下所示:
完成这些函数后,最后需要做的就是在添加、删除、修改Shape的侦听事件中加入相关的日志就可以了,如在删除设备的时候,我们是这样记录相关信息的
其中if (shape.Application.IsUndoingOrRedoing)是为了判断该操作是否为Undo或者Redo导致的操作,如果是,我们获取它之前Shape的GUID即可。
记录了设备的这些修改信息,我们就可以在保存数据的时候,根据这些信息移除相关的关系,添加或者删除相关的设备信息了,而且这些信息,对于我们记录用户的图纸修订记录也是必须要做的事情。
本文转自博客园伍华聪的博客,原文链接:C#进行Visio二次开发之设备状态跟踪,如需转载请自行联系原博主。