事件处理程序的原则

AutoCAD ActiveX/VBA

 
事件处理程序的原则
 
 
 

请记住,事件只是提供了 AutoCAD 内部的状态或动作信息。虽然可以编写事件处理程序来响应这些事件,但触发事件处理程序时,AutoCAD 通常都在处理命令。因此,如果要使事件处理程序在涉及 AutoCAD 及其数据库时提供安全的操作,则需要对事件处理程序进行一些限制。

  • 不要依赖事件发生的顺序。

    编写事件处理程序时,请不要依赖用户所认为的事件发生顺序。例如,如果用户发出 OPEN 命令,则将全体触发事件 BeginCommand、BeginOpen、EndOpen 和 EndCommand。但它们的发生顺序可能并不是这样。唯一可以确定的顺序是 Begin 事件发生在对应的 End 事件之前。上一样例中,事件可能是按以下顺序触发的:BeginCommand、BeginOpen、EndCommand 和 EndOpen,或 BeginCommand、EndCommand、BeginOpen 和 EndOpen。

  • 不要依赖操作的顺序。

    如果用户删除 object1,然后再删除 object2,这时请不要依赖这样的事实,即先收到 object1 的 ObjectErased 事件,然后收到 object2 的事件。实际上用户可能会先收到 object2 的 ObjectErased 事件。

  • 不要试图从事件处理程序中执行任何交互式函数。

    试图从事件处理程序中执行交互式函数可能会造成严重问题,因为触发事件时 AutoCAD 可能仍在处理命令。因此,应始终在事件处理程序中避免使用输入获取方法,例如 GetPoint、GetEntity、GetKeyword 等,也不要使用选择集操作和 SendCommand 方法。

  • 不要从事件处理程序中启动对话框。

    对话框和交互式函数一样,也会干涉 AutoCAD 的当前操作。消息框和警告框不会交互考虑,因而可以安全地发出;但在事件处理程序中发出 BeginModal、EndModal、Activate、Deactivate 和 BeginRightClick 事件的消息框则会导致顺序混乱。

  • 可以向数据库中的任何对象写入数据,但发出事件的对象除外。

    显然,导致触发事件的任何对象可能仍在 AutoCAD 中处于打开状态,并用于当前正在执行的操作。因此,要避免从对象的事件处理程序将任何信息再写入到该对象。然后,用户可以安全地从触发事件的对象读取信息。例如,假设一个铺满瓷砖的地板,用户创建的事件处理程序附着到该地板的边框。如果更改地板的大小,事件处理程序将自动添加或减少瓷砖,以铺满新的区域。事件处理程序可以读取新的边框区域,但不能试图修改边框本身。

  • 不要从事件处理程序中执行任何触发相同事件的操作。

    如果在事件处理程序中执行触发该相同事件的相同操作,会导致无限循环。例如,用户不该尝试从 BeginOpen 事件中打开图形;否则,AutoCAD 将不断打开更多图形,直到打开的图形数量达到最大值。

  • 请记住,AutoCAD 显示模式对话框时,不会触发任何事件。