系统变量事件检测怎么没有用
我自定义了一个数据库反应器,监听了系统变量修改事件和对象删除事件。打断点,对象删除事件是能够被触发的,但是系统变量修改事件就触发不了。请问各路大神这个是怎么回事?
//继承自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:46 编辑
又测试了一下,系统变量检测到了。但是我想检测工作空间修改事件,工作空间修改并没有触发系统变量修改事件,请问这是为什么?有大佬知道如何检测到工作空间修改事件吗 遇到过同样得问题 求答案 本帖最后由 冷暖自知。 于 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使用数据库变量√
二者不得混为一谈.
数据库为了下次打开展示需要不得不记录界面变量.
不要在数据库事件拦截界面变量.
qifeifei 发表于 2025-10-15 13:20
遇到过同样得问题 求答案
用ed的sysVarChanged事件就解决了
页:
[1]