冷暖自知。 发表于 2025-10-15 11:34:58

系统变量事件检测怎么没有用


我自定义了一个数据库反应器,监听了系统变量修改事件和对象删除事件。打断点,对象删除事件是能够被触发的,但是系统变量修改事件就触发不了。请问各路大神这个是怎么回事?

//继承自AcDbDatabaseReactor

void UserDatabaseReactor::headerSysVarChanged(const AcDbDatabase* database, const ACHAR* varName, bool bSuccess)
{
        if (varName != NULL)
        {
                acutPrintf(_T("\n系统变量已修改: %s"), varName);
        }
}

void UserDatabaseReactor::headerSysVarWillChange(const AcDbDatabase* database, const ACHAR* varName)
{
        if (varName != NULL)
        {
                acutPrintf(_T("\n系统变量已修改: %s"), varName);
        };//系统变量修改事件       
}

void UserDatabaseReactor::objectErased(const AcDbDatabase* database, const AcDbObject* obj, bool bErased) {
        acutPrintf(_T("\n删除对象了 %s"));
}

冷暖自知。 发表于 2025-10-15 11:44:47

本帖最后由 冷暖自知。 于 2025-10-15 11:46 编辑

又测试了一下,系统变量检测到了。但是我想检测工作空间修改事件,工作空间修改并没有触发系统变量修改事件,请问这是为什么?有大佬知道如何检测到工作空间修改事件吗

qifeifei 发表于 2025-10-15 13:20:39

遇到过同样得问题 求答案

冷暖自知。 发表于 2025-10-15 14:13:23

本帖最后由 冷暖自知。 于 2025-10-15 16:26 编辑

监听系统变量修改事件总结一下:
1、ed和database,分别有一个sysVarChanged事件。监听ed的系统变量事件如愿得到我想要的结果了。
2、database为什么没有监听到?惊佬:用户交互式第一位,ed劫持了数据库的sysVarChanged,所以走了ed的,就不走database的了。
3、database的系统变量还有一个奇怪的点就是,我修改完,并不是立即触发,而是修改好些个后,突然触发一堆。
   原因是:send不等于run,消息泵过去时候才执行System.Windows.Forms.Application.DoEvents()。
4、ed:为第一优先级,是因为这些不是变量,不属于数据库内容,而是界面内容.
5、ed已经做了这件事,为什么db还要重复做?因为下次打开需要。

综上:
editor使用界面变量√
db使用数据库变量√
二者不得混为一谈.
数据库为了下次打开展示需要不得不记录界面变量.
不要在数据库事件拦截界面变量.



冷暖自知。 发表于 2025-10-15 14:18:24

qifeifei 发表于 2025-10-15 13:20
遇到过同样得问题 求答案

用ed的sysVarChanged事件就解决了
页: [1]
查看完整版本: 系统变量事件检测怎么没有用