谁能调试通如下代码,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 ();
}
}
...全文
194 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的方法调用不对吧.
渭河流域位于中国黄河中游地区,是黄河的重要一级支流流域,地理范围主要涵盖陕西省中部、甘肃东部和宁夏部分地区。该流域自西向东延伸,总长约818公里,流域面积广阔,人口密集,是我国重要的农业与工业带,同时也是西北地区经济、文化与生态发展的核心区域之一。渭河流域水系发育完善,除干流外,还包括泾河、洛河、沣河、滈河等多条支流,构成了完整的河网体系,对黄河流域的水资源调配与生态安全具有重要意义。 本数据集提供了渭河流域矢量边界及河流分布的标准化shp文件,包含以下文件: (1)可编辑MXD文件:可直接在 ArcGIS 中打开,用户可进行二次编辑、专题制图及空间分析,方便科研、教学与管理应用。 (2)标准SHP文件:包含渭河流域边界矢量数据以及干流与主要支流的矢量化河流线条,属性表中附带河流名称、流域隶属等信息,便于查询与叠加分析。 (3)标准成图TIF文件:输高清、规范的地图成果,能够直观展示渭河流域整体边界与内部河流分布格局,可用于汇报、展示与版。 本资源可广泛应用于流域水资源管理、生态环境保护、土地利用研究、洪涝灾害评估等领域,同时也能为流域综合治理、生态修复规划、水文模拟与地理建模提供基础支撑。过与其他数据(如DEM、土地覆盖、气象数据)叠加使用,还能开展更加深入的多源数据分析,为黄河流域高质量发展与区域生态安全提供科学依据。

13,873

社区成员

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

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