iumike 发表于 2009-5-12 12:47:08

使用DRX代码的选择错误?

你好
执行下面的代码会在Bricscad中产生错误:
我试图创建一个简单的对话框,设置一些参数,并在关闭该对话框后立即选择一些实体。按下OK对话框按钮后,我得到了一个错误
类CustomDialog:public OdStaticRxObject<ODDCommand><br>{<br>public:const OdString localName()const{return globalName();}
const-OdString-groupName()const{return-DD_T(“DRXGLOBAL”);}
const OdString globalName()const{return OdString(“test_dialog”);}
无效执行(OdEdCommandContext*pCmdCtx)
{
OdDbCommandContextPtr-pDbCmdCtx(pCmdCtx);//数据库访问的向下转换
ODBDatabasePtr-pDb=pDbCmdCtx->database();//当前数据库
OdDbUserIO*pDbIO=pDbCmdCtx->dbUserIO();
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDialog-TestDlg(CWnd::FromHandle(sds_gethwnd())));
/*sds_name:ssname
sds_ssget(NULL、NULL、NULL和ssname)
sds_ ssfree(ssname)*/
OdDbSelectionSetPtr pFirstSel=pDbIO->select(DD_T(“选择第一组对象”),OdEd::kSelSingleEntity/*,0,OdString::kEmpty,&filter*/)
}
}
我缺少什么
**** Hidden Message *****

iumike 发表于 2009-5-12 21:06:05

这可能是一个线程问题,AFX_MANAGE_STATE(AfxGetStaticModuleState());当它超出范围时应该停用
,所以一旦它到达你的选择调用,它可能仍然在范围内,你调试了吗?

iumike 发表于 2009-5-13 04:57:34

丹,你能发布一个工作程序吗?
谢谢您!
迈克

iumike 发表于 2009-5-13 05:09:37

我已经检查了调试!当它尝试开始选择时,线程仍在对话框创建范围内。谢谢丹尼尔!!
//...
try
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
      CMyDialog StockDlg(CWnd::FromHandle(sds_getmainhwnd()));
StockDlg.DoModal();
}
catch(...)
{
}

OdDbSelectionSetPtr pFirstSel = pDbIO->select(DD_T(“Select first set of objects”), OdEd::kSelSingleEntity/*, 0, OdString::kEmpty, &filter*/);
//...
话筒

iumike 发表于 2009-5-13 06:53:45

很好
另一种方法可能是添加一个方法,即代码0]

iumike 发表于 2009-5-13 12:41:07

对于常规dll,可以使用Bricscad DRX轻松添加MFC对话框,如上所述(再次感谢Daniel!)。
这可能是扩展dll的等效代码(创建一个对话框并在关闭它以选择某些内容后自动关闭它)?
AFX_MANAGE_STATE(AfxGetStaticModuleState())不允许使用扩展dll。
有什么想法吗?
Mike

iumike 发表于 2009-5-14 03:24:31

在这种情况下,您可以考虑放弃DRX并使用BRX,
BRX(希望是下一个版本)将具有处理从对话框中挑选和选择等操作的特殊控件。
I. e CAcUiSelectButton&CAcUiPickButton

iumike 发表于 2009-5-14 03:41:58

不幸的是,BRX不适用于Bricscad Classic,因此我不得不继续使用DRX
然后...
#pragma once
#include "MyDialog.h"
//++--
class CommandDoit : public OdStaticRxObject
{
public:
const OdString localName() const { return globalName(); }
const OdString groupName() const { return DD_T("DRXGLOBAL"); }
const OdString globalName() const { return OdString("doit"); }
void execute(OdEdCommandContext* pCmdCtx)
{
    OdDbCommandContextPtr pDbCmdCtx(pCmdCtx);
    OdDbDatabasePtr pDb = pDbCmdCtx->database();
    OdDbUserIO* pDbIO = pDbCmdCtx->dbUserIO();
    CMyDialog dlg(CWnd::FromHandle(sds_getmainhwnd()));
    if(dlg.DoModal() == IDOK)
    {
      OdDbSelectionSetPtr pFirstSel = pDbIO->select(DD_T("Select first set of objects"),
      OdEd::kSelSingleEntity);
    }
}
};

您甚至可以创建一个结构或类来保存实例,如果您需要调用AfxSetResourceHandle...
无论如何,我已经创建了一个示例项目,您可以看看。

iumike 发表于 2009-5-14 03:55:46

简直,简直完美!
我尝试测试这是否适用于可停靠对话框。正常情况下是应该的!
再次感谢您!
迈克

iumike 发表于 2009-5-14 07:38:02

应该没问题,它几乎和我在这个CDockBar中使用的设置一样
页: [1]
查看完整版本: 使用DRX代码的选择错误?