谁能调试通如下代码,100分相送,我调式总是出问题

Javpp 2005-02-10 12:30:41
在for (aNode = TreeView->Items->GetFirstNode (); aNode != NULL ;)里出问题,ndata = (NODEDATA*) (aNode->Data);这一句,

代码如下:数据表里就3个字段,一个ID,一个父ID:PID,一个是名字,根据这些初始化一棵树,一看就明白,忘记从哪里看到的这段代码了


void __fastcall TfrmMain::FillTree ()
{
struct NODEDATA *ndata = NULL;
TStringList *ss = NULL;

TTreeNode *aNode = NULL;
TTreeNode *bNode = NULL;
TTreeNode *pNode = NULL;

ADOQuery1->Close ();
ADOQuery1->SQL->Clear ();
ADOQuery1->SQL->Add ("SELECT ID, PID, Name FROM Infor");
ADOQuery1->Open ();

try
{
ss = new TStringList ();
TreeView->Items->BeginUpdate ();
ndata = new NODEDATA ();
ADOQuery1->First ();
while (!ADOQuery1->Eof)
{
ndata->id = ADOQuery1->FieldByName ("id")->AsInteger;
ndata->pid = ADOQuery1->FieldByName ("id")->AsInteger;
ndata->name = ADOQuery1->FieldByName ("name")->AsString;

aNode = TreeView->Items->AddObject (NULL, ndata->name, ndata);

ss->AddObject (AnsiString (ndata->id), aNode);
ADOQuery1->Next ();
}
ADOQuery1->Close ();
ndata = NULL;

int idx;
for (aNode = TreeView->Items->GetFirstNode (); aNode != NULL ;)
{
ndata = (NODEDATA*) (aNode->Data);
if (-1 == (idx = ss->IndexOf (AnsiString (ndata->pid))))
{
aNode = aNode->getNextSibling ();
continue;
}
else
{
pNode = (TTreeNode*)(ss->Objects[idx]);
bNode = aNode;
aNode = aNode->getNextSibling();
bNode->MoveTo (pNode, naAddChild);
}
}
//delete ndata;
}
__finally
{
delete ss;
ss = NULL;
delete ndata;
ndata = NULL;
ADOQuery1->Close ();
TreeView->Items->EndUpdate ();
}
}
...全文
185 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
samchoy 2005-02-13
  • 打赏
  • 举报
回复
改成这样试试

void __fastcall TfrmMain::FillTree ()
{
struct NODEDATA *ndata = NULL;
TStringList *ss = NULL;

TTreeNode *aNode = NULL;
TTreeNode *bNode = NULL;
TTreeNode *pNode = NULL;

ADOQuery1->Close ();
ADOQuery1->SQL->Clear ();
ADOQuery1->SQL->Add ("SELECT ID, PID, Name FROM Infor");
ADOQuery1->Open ();

try
{
ss = new TStringList ();
TreeView->Items->BeginUpdate ();
ADOQuery1->First ();
while (!ADOQuery1->Eof)
{
ndata = new NODEDATA ();
ndata->id = ADOQuery1->FieldByName ("id")->AsInteger;
ndata->pid = ADOQuery1->FieldByName ("pid")->AsInteger; // 这里取的应该是pid
ndata->name = ADOQuery1->FieldByName ("name")->AsString;

aNode = TreeView->Items->AddObject (NULL, ndata->name, ndata);

ss->AddObject (AnsiString (ndata->id), aNode);
ADOQuery1->Next ();
}
ADOQuery1->Close ();
ndata = NULL;

int idx;
for (aNode = TreeView->Items->GetFirstNode (); aNode != NULL ;)
{
ndata = (NODEDATA*) (aNode->Data);
if (-1 == (idx = ss->IndexOf (AnsiString (ndata->pid))))
{
aNode = aNode->getNextSibling ();
continue;
}
else
{
pNode = (TTreeNode*)(ss->Objects[idx]);
bNode = aNode;
aNode = aNode->getNextSibling();
bNode->MoveTo (pNode, naAddChild);
}
}
//delete ndata;
}
__finally
{
delete ss;
ss = NULL;
delete ndata; // 这里要改用循环释放各个TreeNode的Data
ndata = NULL;
ADOQuery1->Close ();
TreeView->Items->EndUpdate ();
}
}

samchoy 2005-02-13
  • 打赏
  • 举报
回复
对了,还要把 ndata = new NODEDATA ();
放在 while (!ADOQuery1->Eof) 循环中,要不然只是对同一个地址不断赋值
Javpp 2005-02-12
  • 打赏
  • 举报
回复
我是COPY来的,但不是原来的,我也改过了
Javpp 2005-02-12
  • 打赏
  • 举报
回复
不是,首先
aNode = TreeView->Items->AddObject (NULL, ndata->name, ndata);

但是在ndata = (NODEDATA*) (aNode->Data);
的时候并不能得到,除了TREEVIEW中最后一个可以,别的都是NULL
samchoy 2005-02-12
  • 打赏
  • 举报
回复
如果你这段程序是直接复制过来的,那可能是这里错了:

void __fastcall TfrmMain::FillTree ()
{
struct NODEDATA *ndata = NULL;
TStringList *ss = NULL;

TTreeNode *aNode = NULL;
TTreeNode *bNode = NULL;
TTreeNode *pNode = NULL;

ADOQuery1->Close ();
ADOQuery1->SQL->Clear ();
ADOQuery1->SQL->Add ("SELECT ID, PID, Name FROM Infor");
ADOQuery1->Open ();

try
{
ss = new TStringList ();
TreeView->Items->BeginUpdate ();
ndata = new NODEDATA ();
ADOQuery1->First ();
while (!ADOQuery1->Eof)
{
ndata->id = ADOQuery1->FieldByName ("id")->AsInteger;

/////////////////////////////////////////////////////////////////////////
// 这里错了,应该是 ndata->pid = ADOQuery1->FieldByName ("pid")->AsInteger;
ndata->pid = ADOQuery1->FieldByName ("id")->AsInteger;
/////////////////////////////////////////////////////////////////////////

ndata->name = ADOQuery1->FieldByName ("name")->AsString;

aNode = TreeView->Items->AddObject (NULL, ndata->name, ndata);

ss->AddObject (AnsiString (ndata->id), aNode);
ADOQuery1->Next ();
}
ADOQuery1->Close ();
ndata = NULL;

int idx;
for (aNode = TreeView->Items->GetFirstNode (); aNode != NULL ;)
{
ndata = (NODEDATA*) (aNode->Data);
if (-1 == (idx = ss->IndexOf (AnsiString (ndata->pid))))
{
aNode = aNode->getNextSibling ();
continue;
}
else
{
pNode = (TTreeNode*)(ss->Objects[idx]);
bNode = aNode;
aNode = aNode->getNextSibling();
bNode->MoveTo (pNode, naAddChild);
}
}
//delete ndata;
}
__finally
{
delete ss;
ss = NULL;
delete ndata;
ndata = NULL;
ADOQuery1->Close ();
TreeView->Items->EndUpdate ();
}
}
Javpp 2005-02-12
  • 打赏
  • 举报
回复
运行没问题,但是结果不对,
geochway 2005-02-12
  • 打赏
  • 举报
回复
语法没问题,感觉还是TTreeView的方法调用不对吧.

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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