Как вытащить обьект из узла???
TField *Field;
TTreeNode *Node;
...->AddObject(Node,"Узел1",Field)
А как вытащить???
Что то типа: Node->Data ????
Как поместить, вроде просто:
TField *Field;
TTreeNode *Node;
...->AddObject(Node,"Узел1",Field)
А как вытащить???
Что то типа: Node->Data ????
TField *Field = GetFieldOfInterest();
TTreeNode *RootNode = GetRootNode();
YourTreeView->Items->AddObject(RootNode,"Узел1",Field);
//.....................................
//несколько позже, например, в другой процедуре
//.....................................
TField* storedField = dynamic_cast<TField*>(CurrentNode->Data);
Можно, конечно, сделать явное приведение типа (TField*)CurrentNode->Data, но я предпочитаю dynamic_cast из-за того, что он возвратит или корректный указатель на TField (если там действительно указатель на TField или его производный класс), или 0, использовать который в качестве указателя нельзя (если там что-либо к TField* не относящееся).
TField *Field = GetFieldOfInterest();
TTreeNode *RootNode = GetRootNode();
YourTreeView->Items->AddObject(RootNode,"Узел1",Field);
//.....................................
//несколько позже, например, в другой процедуре
//.....................................
TField* storedField = dynamic_cast<TField*>(CurrentNode->Data);
Можно, конечно, сделать явное приведение типа (TField*)CurrentNode->Data, но я предпочитаю dynamic_cast из-за того, что он возвратит или корректный указатель на TField (если там действительно указатель на TField или его производный класс), или 0, использовать который в качестве указателя нельзя (если там что-либо к TField* не относящееся).
Что то не получается, пишу все как ты говорил.
Вместо TField пробовал поместить TEdit, тоже не работает.
Ыот эта хрень работает:
TEdit *MyField = (TEdit *)ComboBox1->Items->Objects[ComboBox1->ItemIndex];
Label1->Caption = MyField->Text;
Но у меня В TreeView1 содержаться имена таблиц а дочернии к ним узлы - их поля. ComboBox - мне не подходит :((((
А что именно не работает? Возвращается нулевой указатель, или объект, на который указывает указатель, недействителен и не понимает вызова функции? Действительно ли Вы правильно заполняете поле Data у подчиненного узла и считываете из поля Data того же самого узла?
Вроде он пишет, что обращается к неопределенному участку памяти
На счет узлов там все нормально, обьект вызывается при наведении на нужный узел
Вот Код :)))
//-- Программа заполнения узлов дерева ---
void __fastcall TForm2::FillTreeView(TComboBox *ListTable)
{
//ListTable - список имен таблиц
TStringList *StrListFieldsName = new TStringList;
TTreeView *Tree_tmp = Form1->TreeView1;
TTreeNode *Node_tmp;// Узлы таблиц
TTreeNode *Node_ch_tmp;// Узлы полей таблиц
TTreeNode *Node_ch_ch_tmp;//Еще какая-нибудь
//хрень к полям таблиц
int i = 0;
int i_field;
while(i <ListTable->Items->Count)
{
DM1->IBDatabase1->GetFieldNames(ListTable->Items->Strings,StrListFieldsName);
DM1->IBTable1->Active = false;
DM1->IBTable1->TableName = ListTable->Items->Strings;
DM1->IBTable1->Active = true;
TEdit *TableName = newTEdit(this);
TableName->Text = ListTable->Items->Strings;
Node_tmp = Tree_tmp->Items->AddChildObject(Tree_tmp->Items->GetFirstNode(),ListTable->Items->Strings,TableName);
i_field = 0;
while(i_field < StrListFieldsName->Count)
{
TEdit *FieldName = new TEdit(this);
FieldName->Text = StrListFieldsName->Strings[i_field];
Form1->ComboBox1->Items->AddObject(StrListFieldsName->Strings[i_field],FieldName);
Node_ch_tmp = Tree_tmp->Items->AddChildObject(Node_tmp,StrListFieldsName->Strings[i_field],FieldName);
Node_ch_tmp->ImageIndex = 2;
Node_ch_tmp->SelectedIndex = 2;
Node_ch_ch_tmp = Tree_tmp->Items->AddChild(Node_ch_tmp,FieldName->Text);
Node_ch_ch_tmp->ImageIndex = 3;
Node_ch_ch_tmp->SelectedIndex = 3;
i_field++;
}//while
i++;
Node_tmp->ImageIndex = 1;
Node_tmp->SelectedIndex = 1;
}
}
Насколько я понял, в комбинированном списке, переданном процедуре в качестве параметра, содержатся имена таблиц.
В процедуре для каждой таблицы получаем список полей, затем динамически создаётся экземпляр TEdit, в свойстве Text которого записывается имя таблицы, и указатель на него помещается в свойство Data вновь создаваемого узла-потомка корневого узла дерева.
TableName->Text = ListTable->Items->Strings;
Node_tmp = Tree_tmp->Items->AddChildObject(Tree_tmp->Items->GetFirstNode(),ListTable->Items->Strings,TableName);
Затем, для каждого поля этой таблицы динамически создаётся экземпляр TEdit, в свойстве Text которого записывается имя поля, а указатель на этот TEdit и имя соответствующего поля помещаются в некий комбинированный список.
FieldName->Text = StrListFieldsName->Strings[i_field];
Form1->ComboBox1->Items->AddObject(StrListFieldsName->Strings[i_field],FieldName);
Одновременно, указатель на TEdit, содержащий имя поля, помещается в свойство Data вновь создаваемого дочернего узла TreeView
И для этого узла создается один подузел с той же надписью, что и в этом самом узле, поскольку FieldName->Text содержит то же самое, что и свойство Text текущего узла Node_ch_tmp, а именно StrListFieldsName->Strings[i_field].
При этом обращает на себя внимание тот факт, что в свойство Data созданного подузла не записывается ничего.
Ну хорошо, криминала вроде нет, но вот вопрос: а для чего все эти динамически создаваемые TEdit'ы?
И ещё: а где пример попытки использования экземпляров TEdit, сохранённых в свойствах Data?
P.S. Коллега, мы с Вами определённо трудоголики. В субботний вечер - и за работой. Надо лечиться, скажем, микстурой от Винап.
И ещё: а где пример попытки использования экземпляров TEdit, сохранённых в свойствах Data?
Вот здесь работает, т.е. при выборе в ComboBox1 какого то элемента, я могу манипулировать обьектом который связан с этим элементом.
void __fastcall TForm1::ComboBox1Select(TObject *Sender)
{
TEdit *MyField = (TEdit *)ComboBox1->Items->Objects[ComboBox1->ItemIndex];
Label1->Caption = MyField->Text;
}
Label1 - показывает именно то что мне надо :))
Ту же самую процедуру делаю с TField - ничего не выходит, хотя записывает Обьекты TField только в последей таблице(У меня по ним цикл)
Когда записываю эти обьекты в Узлы TreeView1 то на стадии компиляции проэкта возникает ошибка:
Type 'void' is not defined class with virtual function
Тип Data - не определенный класс с виртуальной функцией dynamic_cast<..>(..)
Или не так??? :)
void __fastcall TForm1::TreeView1CustomDrawItem(TCustomTreeView *Sender,
TTreeNode *Node, TCustomDrawState State, bool &DefaultDraw)
{
TEdit *MyField;
MyField = dynamic_cast<TEdit *>(Sender->Selected->Data);
Label1->Caption = MyField->Text;
}
P.S. Коллега, мы с Вами определённо трудоголики. В субботний вечер - и за работой. Надо лечиться, скажем, микстурой от Винап. [/QUOTE]
Ага я еще какой :))
Всё верно, промашку я допустил, сейчас поднял свои исходники - вместо dynamic_cast надо reinterpret_cast. Первый вариант не проходит, т.к. тип свойства TTreeNode->Data не имеет виртуальных функций, а dynamic_cast работает именно с теми классами, у которых есть виртуальные функции. И как я это проглядел с самого начала. Нет, определённо пора лечиться.
Ну ты молодец!!!!
Супер, просто слов нет!!
Работает этот код!!!
То что нужно :))
TEdit *MyField = new TEdit(this);
MyField = reinterpret_cast<TEdit *>(TreeView1->Selected->Data);
Label1->Caption = MyField->Text;
Спасибо огромное!!!