找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 327|回复: 0

[求助]:请帮忙看一下那里内存泄露了?

[复制链接]
发表于 2004-7-8 20:24:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
// 将快名称列表添加到树状控件中
void CDlgBlockList::AddBlocksToTree()
{
        // 添加根节点
        HTREEITEM hFather, hTreeItem;
        hFather = m_treBlock.InsertItem("BlockTable", NULL, TVI_LAST);
       
        // 遍历块表,如果一个块定义不包括嵌套的块,直接添加一个子节点;
        // 如果一个块定义包括嵌套的块,则同时添加一个次级子节点
        const char *blockName;
        AcDbBlockTable *pBlockTable;
        acdbHostApplicationServices()->workingDatabase()
                ->getBlockTable(pBlockTable, AcDb::kForRead);
       
        // 定义块表遍历器并获得指向遍历器的指针
        AcDbBlockTableIterator *pBlkTabIterator;
        pBlockTable->newIterator(pBlkTabIterator);
        // 遍历块表
        for (pBlkTabIterator->start(); !pBlkTabIterator->done(); pBlkTabIterator->step())
        {
                AcDbBlockTableRecord *pBlkTabRecord;
                pBlkTabIterator->getRecord(pBlkTabRecord, AcDb::kForRead);               
                pBlkTabRecord->getName(blockName);
               
                // 过滤掉ModelSpace和PaperSpace(在需要的时候可以去掉这个过滤器)
                if ((strcmp(blockName, "*Model_Space") == 0) | (strcmp(blockName, "*Paper_Space")== 0) |
                        (strcmp(blockName, "*Paper_Space0") == 0))
                {
                        pBlockTable->close();
                        continue;
                }

                hTreeItem = m_treBlock.InsertItem(blockName, hFather, TVI_LAST);
               
                // 如果块定义包含嵌套的块
                CStringArray strArray;
                int number;
                if (GetNestedBlocks(pBlkTabRecord, strArray, number) == Acad::eOk)
                {
                        // 将嵌套块的名称添加到本级的子节点中
                        for (int i = 0; i <= strArray.GetSize() - 1; i ++)
                        {
                                m_treBlock.InsertItem(strArray.GetAt(i), hTreeItem, TVI_LAST);
                        }
                }
                               
                pBlkTabRecord->close();
        }
       
        delete pBlkTabIterator;
       
        pBlockTable->close();
}

// 获得一个块中嵌套块的名称
// 如果一个块含有嵌套块,返回Acad::eOk,并且在参数中传出嵌套块名称的数组
// 如果不含嵌套块,直接返回Acad::eNotApplicable
Acad::ErrorStatus
CDlgBlockList::GetNestedBlocks(AcDbBlockTableRecord * pBlkTabRecord,
                                                           CStringArray &strArray, int &count)
{
        AcDbBlockTableRecordIterator *pBlockIterator;
        pBlkTabRecord->newIterator(pBlockIterator);
        int i = 1;
        // 遍历块表记录
        for (pBlockIterator->start(); !pBlockIterator->done(); pBlockIterator->step())
        {
                AcDbEntity *pEntity;
                pBlockIterator->getEntity(pEntity, AcDb::kForRead);
                // 获得实体的类名
                const char *pClassName = pEntity->isA()->name();
                if (strcmp(pClassName, "AcDbBlockReference") == 0)
                {
                        CString strName;
                        char *name;
                        AcDbBlockReference *pBlockReference;
                        AcDbBlockTableRecord *pBlockTableRecord;
                        pBlockReference = (AcDbBlockReference *)pEntity;
                        acdbOpenObject(pBlockTableRecord,
                                                        pBlockReference->blockTableRecord(), AcDb::kForRead);
                        Acad::ErrorStatus es;
                        es = pBlockTableRecord->getName(name);                       
                        if (es == Acad::eOk)
                        {
                                strName.Format("%s", name);
                                bool bEqual = false;
                                // 如果数组中已经存在相同的元素,就不再添加到数组中
                                for (int j = 0; j <= strArray.GetSize() - 1; j ++)
                                {
                                        if (strName == strArray.GetAt(j))
                                                bEqual = true;
                                }
                                if (!bEqual)
                                {
                                        strArray.Add(strName);
                                }
                        }
                       
                        pBlockReference->close();
                        pBlockTableRecord->close();
                }
                pEntity->close();
                i ++;
        }
       
        delete pBlockIterator;

        count = i;        // 返回块表记录中包含的实体数

        if (strArray.GetSize() != 0)
        {
                return Acad::eOk;
        }       
        else
        {
                return Acad::eNotApplicable;
        }
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 22:38 , Processed in 0.337533 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表