C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
TreeView + BD, Gluk
Maxim
Отправлено: 25.02.2005, 06:01


Не зарегистрирован







Имеется бд в формате mdb, в ней поле Level от 1 до 3 для отображения вложенности и поле Otdel соответсвенно наименование отдела.
Пишу код в OnCreate формы:

AnsiString Str;
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT [Level], Otdel FROM tel");
Query1->Open();
Query1->First();
while (!Query1->Eof)
{
if (Query1->FieldByName("Level")->AsInteger==1)
{
Str=Query1->FieldByName("Otdel")->AsString;
TreeView1->Items->Add(NULL,Str);
}
if (Query1->FieldByName("Level")->AsInteger==2)
{
Str=Query1->FieldByName("Otdel")->AsString;
TreeView1->Items->AddChild(TreeView1->Items->Item[0],Str);
}
Query1->Next();
}
TreeView1->Update();

Так вот если в базе количество Level со значением 2 становится больше 7 то вылетает ошибка: Invalid Index... В чем может быть глюк?
Bond
Отправлено: 25.02.2005, 10:44


Станционный диспетчер

Группа: Участник
Сообщений: 142



А можно посмотреть результат данного запроса в простом табличном виде?
Например выведи таким же макаром, только в Мемо.
Maxim
Отправлено: 25.02.2005, 11:12


Не зарегистрирован







В Мемо Нормально выводится....
AVC
Отправлено: 25.02.2005, 11:19


Ветеран

Группа: Модератор
Сообщений: 1583



Это что-то чисто ваше. smile.gif
Вот попробовал простенький загрузчик — глюков нет.
CODE

void __fastcall TForm1::Bt_LoadClick(TObject *Sender)
{
TADOQuery *qry = Qry_Main;

TTreeView *tv = TreeView1;
tv->Items->Clear();

if (qry->Active) { qry->First(); qry->Active = false; }
//if (qry->Active) qry->Active = false;
qry->SQL->Text = AnsiString("") + "\
Select                   \n\
 AE.ParentID            \n\
,AE.AppEtrID as ID      \n\
,AE.AppEtr_Name as Name \n\
From HHC.AppEtr AE       \n\
-- \n\
Start with AE.ParentID is Null \n\
Connect by prior AE.AppEtrID = AE.ParentID \n\
-- \n\
Order By Level, ParentID, AE.Ord \n\
";

qry->Active = true;
TField *fldID       = qry->FieldByName("ID");
TField *fldParentID = qry->FieldByName("ParentID");
TField *fldName     = qry->FieldByName("Name");

TTreeNodes *tvi = tv->Items;
TTreeNode  *parentnode;

AnsiString name;
int        parentid;

for (qry->First(); !qry->Eof; qry->Next())
{  name     = fldName->AsString;
   parentid = fldParentID->AsInteger;
   parentnode = NULL;
   for (int i=0; i < tvi->Count; i++)
    {  if (int(tvi->Item[i]->Data) == parentid)
        {  parentnode = tvi->Item[i];
           break;
        }
    } // поиск родителя
   tvi->AddChildObject(parentnode, name, (void*)(fldID->AsInteger));
} // проход по записям

//if (qry->Active) { qry->First(); qry->Active = false; }

}
Bond
Отправлено: 25.02.2005, 11:24


Станционный диспетчер

Группа: Участник
Сообщений: 142



Наверняка ты пытаешся вставить отдел второго уровня когда у тебя пустое дерево.
CODE
...
if (Query1->FieldByName("Level")->AsInteger==2)
{
Str=Query1->FieldByName("Otdel")->AsString;
TreeView1->Items->AddChild(TreeView1->Items->Item[0],Str);
}
...

Думаю данная ошибка может быть только в этом месте
Maxim
Отправлено: 28.02.2005, 06:04


Не зарегистрирован







Bond в точку smile.gif)
Одна голова хорошо, а форум лучше...

Вернуться в Вопросы программирования в C++Builder