![]() |
【转帖】多文档范例的问题
多文档范例的问题
多文档范例的问题 exam11.cpp #include "rxobject.h" #include "rxregsvc.h" #include "rxdlinkr.h" #include "rxditer.h" #include "aced.h" #include "dbmain.h" #include "dbdict.h" #include "dbidmap.h" #include "dbapserv.h" #include "adslib.h" #include "acdocman.h" /* void assoclines(); void addtomodelspace(acdbobjectid&,acdbentity *); void initapp(void); void unloadapp(void); void printdbevent(const acdbobject *pobj, const char *pevent); extern "c" acrx::appretcode acrxentrypoint(acrx::appmsgcode,void *); */ long gentacc=0; void printdbevent(const acdbobject *,const char * eventstr); void printobj(const acdbobject * pobj); void watchdb(); void clearreactors(); extern "c" acrx::appretcode acrxentrypoint(acrx::appmsgcode ,void *); class mydbreactor; class mydocreactor:public acapdocmanagerreactor { public: virtual void documenttobeactivated(acapdocument * pdoc); virtual void documentcreated(acapdocument * pdoc); virtual void documenttobedestroyed(acapdocument * pdoc); }; class myperdocdata { friend class myappdocglobals; public: myperdocdata(acapdocument * pdoc); private: acapdocument * m_pdoc; myperdocdata * m_pnext; long m_entacc; mydbreactor * m_pdbr; }; class myappdocglobals { public: myappdocglobals(acapdocument *pdoc); void setglobals(acapdocument *pdoc); void removedocglobals(acapdocument * pdoc); void removealldocglobals(myperdocdata * ptarget); void unload(); long &entitycount(); void incremententitycount(); void decremententitycount(); mydbreactor * gpreactor(); void setdbreactor(mydbreactor *pdb); private: myperdocdata *m_phead; myperdocdata *m_pdata; mydocreactor *m_pdocreactor; }; myappdocglobals *gpmyappdocglobals; class mydbreactor:public acdbdatabasereactor { public: virtual void objectappended(const acdbdatabase * dwg, const acdbobject *dbobj); virtual void objectmodified(const acdbdatabase * dwg, const acdbobject * dbobj); virtual void objecterased(const acdbdatabase *dwg, const acdbobject *dbobj, adesk::boolean perased); }; void mydbreactor::objectappended(const acdbdatabase * db, const acdbobject *pobj) { printdbevent(pobj,"objectappended"); acutprintf("db==%lx\n",(long)db); gentacc++; acutprintf("entity count=%d\n",gentacc); } void mydbreactor::objectmodified(const acdbdatabase * db, const acdbobject *pobj) { printdbevent(pobj,"objectmodified"); acutprintf("db==%ls\n",(long)db); } void mydbreactor::objecterased(const acdbdatabase *db, const acdbobject *pobj, adesk::boolean perased) { if(perased) { printdbevent(pobj,"objecterased"); gentacc--; } else { printdbevent(pobj,"object(un)erased"); gentacc++; } acutprintf("db==%lx\n",(long)db); acutprintf("entity count=%d\n",gentacc); } void printdbevent(const acdbobject *pobj, const char *pevent) { acutprintf("event:acdbdatabasereactor::%s",pevent); printobj(pobj); } void printobj(const acdbobject *pobj) { if(pobj==null) { acutprintf("(null)"); return; } acdbhandle objhand; char handbuf[17]; pobj->getacdbhandle(objhand); objhand.getintoasciibuffer(handbuf); acutprintf("\n (class==%s,handle==%s,id=%lx,db==%lx)", pobj->isa()->name(),handbuf, pobj->objectid().asoldid(),pobj->database()); } void mydocreactor::documenttobeactivated(acapdocument *pdoc) { gpmyappdocglobals->setglobals(pdoc); } void mydocreactor::documenttobedestroyed(acapdocument *pdoc) { gpmyappdocglobals->removedocglobals(pdoc); } void mydocreactor::documentcreated(acapdocument *pdoc) { gpmyappdocglobals->setglobals(pdoc); } myperdocdata::myperdocdata(acapdocument *pdoc) { m_pdoc=pdoc; m_pnext=null; m_entacc=0; m_pdbr=null; } myappdocglobals::myappdocglobals(acapdocument *pdoc) { m_pdata=m_phead=null; m_pdocreactor=new mydocreactor(); acdocmanager->addreactor(m_pdocreactor); } void myappdocglobals::setglobals(acapdocument *pdoc) { myperdocdata *p_data=m_phead,*prev_data=m_phead; while(p_data!=null) { if(p_data->m_pdoc==pdoc) { m_pdata=p_data; break; } prev_data=p_data; p_data=p_data->m_pnext ; } if(p_data==null) { if(m_phead==null) { m_phead=m_pdata=new myperdocdata(pdoc); } else { prev_data->m_pnext=m_pdata=new myperdocdata(pdoc); } } } void myappdocglobals::removedocglobals(acapdocument * pdoc) { myperdocdata *p_data=m_phead,*prev_data=m_phead; while(p_data!=null) { if(p_data->m_pdoc=pdoc) { if(p_data==m_phead) { m_phead=p_data->m_pnext; } else { prev_data->m_pnext=p_data->m_pnext; } if(m_pdata==p_data) { m_pdata=m_phead; } delete p_data; break; } prev_data=p_data; p_data=p_data->m_pnext; } } void myappdocglobals::removealldocglobals (myperdocdata * p_target) { if(p_target==null) { return; } if(p_target->m_pnext!=null) { removealldocglobals(p_target->m_pnext ); } if(p_target->m_pdbr!=null) { acdbhostapplicationservices()->workingdatabase() ->removereactor(p_target->m_pdbr ); delete p_target->m_pdbr; p_target->m_pdbr=null; } delete p_target; } void myappdocglobals::unload() { acdocmanager->removereactor(m_pdocreactor); delete m_pdocreactor; removealldocglobals(m_phead); m_phead=m_pdata=null; } long & myappdocglobals::entitycount() { return m_pdata->m_entacc; } void myappdocglobals::incremententitycount() { m_pdata->m_entacc++; } void myappdocglobals::decremententitycount() { m_pdata->m_entacc--; } mydbreactor * myappdocglobals::gpreactor() { return m_pdata->m_pdbr; } void myappdocglobals::setdbreactor(mydbreactor *pdb) { m_pdata->m_pdbr=pdb; } void watchdb() { mydbreactor *pdbr; if(gpmyappdocglobals->gpreactor()==null) { pdbr=new mydbreactor(); gpmyappdocglobals->setdbreactor(pdbr); acdbhostapplicationservices()->workingdatabase() ->addreactor(pdbr); acutprintf("added database reactor to " "acdbhostapplicationservices()->workingdatabase()\n"); } } void clearreactors() { mydbreactor *pdbr; if((pdbr=gpmyappdocglobals->gpreactor())!=null) { acdbhostapplicationservices()->workingdatabase() ->removereactor(pdbr); delete pdbr; gpmyappdocglobals->setdbreactor(null); } } acrx::appretcode acrxentrypoint(acrx::appmsgcode msg,void *appid) { switch(msg) { case acrx::kinitappmsg: acrxunlockapplication(appid); acrxregisterappmdiaware(appid); gpmyappdocglobals=new myappdocglobals(curdoc()); gpmyappdocglobals->setglobals(curdoc()); acedregcmds->addcommand("exam11", "watch", "watch", acrx_cmd_modal, watchdb); acedregcmds->addcommand("exam11", "clear", "clear", acrx_cmd_modal, clearreactors); break; case acrx::kunloadappmsg: if(gpmyappdocglobals!=null) { gpmyappdocglobals->unload(); delete gpmyappdocglobals; gpmyappdocglobals=null; } acedregcmds->removegroup("exam11"); break; } return acrx::kretok; } 提示: e:\hulei\test\exam11\exam11.cpp(326) : error c2664: '__thiscall myappdocglobals::myappdocglobals(const class myappdocglobals &)' : cannot convert parameter 1 from 'class acapdocument *' to 'const class myappdocglobals &' reason: cannot convert from 'class acapdocument *' to 'const class myappdocglobals' no constructor could take the source type, or constructor overload resolution was ambiguous 可能是 gpmyappdocglobals=new myappdocglobals(curdoc()); 参数类型不正确,不知道怎么该? myappdocglobals *gpmyappdocglobals; 这是一个全局变量。 myappdocglobals是我定义的一个类, curdoc()是一个函数,返回acapdocument类型。 myappdocglobals是我定义的一个类, curdoc()是一个函数,返回acapdocument * 类型。 |
所有的时间均为北京时间。 现在的时间是 11:53 PM. |