cbuilder高手请进!

gegegeg 2003-04-07 05:15:06
本人的一段程序,不屏蔽if(m_node)一句,则正常运行;若把if(m_node)这句屏蔽,
则出现EAccessViolation之类的异常,现附上这段程序,望高手指点:


void __fastcall TfrmMain::GetNodeStatus()
{
TTreeNode *MyNode;
MNODE *m_node;
TVITEMEX item;
AnsiString temp;

m_node=(MNODE *)NULL;
int numNodes = tveCode->Items->Count;
//ShowMessage(IntToStr(numNodes));

for (int i=0;i<numNodes;i++)
{
MyNode=tveCode->Items->Item[i];
m_node=(MNODE *)MyNode->Data;

item.hItem = (HTREEITEM)tveCode->Items->Item[i];
item.mask = TVIF_HANDLE | TVIF_STATE;
item.hItem = MyNode->ItemId;
item.stateMask = TVIS_STATEIMAGEMASK;

//if(m_node) //加上这个判断,则对;不加,则出错;Why?
{
ShowMessage(m_node->mStatus);
if(m_node->mStatus=="1")
{
item.state = INDEXTOSTATEIMAGEMASK(1? 2 : 1); //选中状态
}
else
{
item.state = INDEXTOSTATEIMAGEMASK(0? 2 : 1); //不选中状态
}
}
else
{
item.state = INDEXTOSTATEIMAGEMASK(0? 2 : 1); //不选中状态
}

TreeView_SetItem(tveCode->Handle, &item); //设置

m_node=(MNODE *)NULL;
}
}

...全文
88 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
efany 2003-04-09
  • 打赏
  • 举报
回复
Bingo
hnhhcj 2003-04-09
  • 打赏
  • 举报
回复
这是个内存访问异常,是因为N_NODE可能为一个空指针,加上IF当然就不会异常了。
Lewolf 2003-04-07
  • 打赏
  • 举报
回复
正如 sharkxie(tarzon) 说的,在使用一个对象的指针前,必须保证这个对象是有效的,在C++中无效指针可能会经常碰到,上面的代码中:

m_node=(MNODE *)NULL;

就是将m_node初始化,可以不要其中的类型转换过程,如果成功的从Data中获取该对象则进行后面的处理,否则,就不能进行处理。
sharkxie 2003-04-07
  • 打赏
  • 举报
回复
To Lewolf(李狼):
无言...
gegegeg 2003-04-07
  • 打赏
  • 举报
回复
确实是我写的代码,是权限管理系统里的一个函数。至于带checkbox的treeview的实现则参考了网上网友的做法。
Lewolf 2003-04-07
  • 打赏
  • 举报
回复
这是你写的代码吗?
sharkxie 2003-04-07
  • 打赏
  • 举报
回复
非法内存地址访问错误
如果不加判断,当m_node == NULL时,就会出现错误!

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧