Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как вытащить обьект из узла???

2.2K
09 августа 2003 года
Storm
20 / / 17.07.2003
Как поместить, вроде просто:
TField *Field;
TTreeNode *Node;
...->AddObject(Node,"Узел1",Field)

А как вытащить???
Что то типа: Node->Data ????
310
09 августа 2003 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by Storm
Как поместить, вроде просто:
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* не относящееся).
2.2K
09 августа 2003 года
Storm
20 / / 17.07.2003
Цитата:
Originally posted by fellow

 
Код:
//.....................................
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 - мне не подходит :((((

310
09 августа 2003 года
fellow
853 / / 17.03.2003
А что именно не работает? Возвращается нулевой указатель, или объект, на который указывает указатель, недействителен и не понимает вызова функции? Действительно ли Вы правильно заполняете поле Data у подчиненного узла и считываете из поля Data того же самого узла?
2.2K
09 августа 2003 года
Storm
20 / / 17.07.2003
Цитата:
Originally posted by fellow
А что именно не работает? Возвращается нулевой указатель, или объект, на который указывает указатель, недействителен и не понимает вызова функции? Действительно ли Вы правильно заполняете поле 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;
}
}

310
09 августа 2003 года
fellow
853 / / 17.03.2003
Долго всматривался в процедуру заполнения узлов TreeView. Впечатлён, хе-хе.
Насколько я понял, в комбинированном списке, переданном процедуре в качестве параметра, содержатся имена таблиц.
В процедуре для каждой таблицы получаем список полей, затем динамически создаётся экземпляр TEdit, в свойстве Text которого записывается имя таблицы, и указатель на него помещается в свойство Data вновь создаваемого узла-потомка корневого узла дерева.
 
Код:
TEdit *TableName = newTEdit(this);
TableName->Text = ListTable->Items->Strings;
Node_tmp = Tree_tmp->Items->AddChildObject(Tree_tmp->Items->GetFirstNode(),ListTable->Items->Strings,TableName);

Затем, для каждого поля этой таблицы динамически создаётся экземпляр TEdit, в свойстве Text которого записывается имя поля, а указатель на этот TEdit и имя соответствующего поля помещаются в некий комбинированный список.
 
Код:
TEdit *FieldName = new TEdit(this);
FieldName->Text = StrListFieldsName->Strings[i_field];
Form1->ComboBox1->Items->AddObject(StrListFieldsName->Strings[i_field],FieldName);

Одновременно, указатель на TEdit, содержащий имя поля, помещается в свойство Data вновь создаваемого дочернего узла TreeView
 
Код:
Node_ch_tmp = Tree_tmp->Items->AddChildObject(Node_tmp,StrListFieldsName->Strings[i_field],FieldName);

И для этого узла создается один подузел с той же надписью, что и в этом самом узле, поскольку FieldName->Text содержит то же самое, что и свойство Text текущего узла Node_ch_tmp, а именно StrListFieldsName->Strings[i_field].
При этом обращает на себя внимание тот факт, что в свойство Data созданного подузла не записывается ничего.
 
Код:
Node_ch_ch_tmp = Tree_tmp->Items->AddChild(Node_ch_tmp,FieldName->Text);

Ну хорошо, криминала вроде нет, но вот вопрос: а для чего все эти динамически создаваемые TEdit'ы?
И ещё: а где пример попытки использования экземпляров TEdit, сохранённых в свойствах Data?

P.S. Коллега, мы с Вами определённо трудоголики. В субботний вечер - и за работой. Надо лечиться, скажем, микстурой от Винап.
2.2K
09 августа 2003 года
Storm
20 / / 17.07.2003
Ну хорошо, криминала вроде нет, но вот вопрос: а для чего все эти динамически создаваемые TEdit'ы?
И ещё: а где пример попытки использования экземпляров 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]

Ага я еще какой :))
310
09 августа 2003 года
fellow
853 / / 17.03.2003
Всё верно, промашку я допустил, сейчас поднял свои исходники - вместо dynamic_cast надо reinterpret_cast. Первый вариант не проходит, т.к. тип свойства TTreeNode->Data не имеет виртуальных функций, а dynamic_cast работает именно с теми классами, у которых есть виртуальные функции. И как я это проглядел с самого начала. Нет, определённо пора лечиться.
2.2K
09 августа 2003 года
Storm
20 / / 17.07.2003
Цитата:
Originally posted by fellow
Всё верно, промашку я допустил, сейчас поднял свои исходники - вместо dynamic_cast надо reinterpret_cast. Первый вариант не проходит, т.к. тип свойства TTreeNode->Data не имеет виртуальных функций, а dynamic_cast работает именно с теми классами, у которых есть виртуальные функции. И как я это проглядел с самого начала. Нет, определённо пора лечиться.



Ну ты молодец!!!!
Супер, просто слов нет!!
Работает этот код!!!
То что нужно :))

TEdit *MyField = new TEdit(this);
MyField = reinterpret_cast<TEdit *>(TreeView1->Selected->Data);
Label1->Caption = MyField->Text;

Спасибо огромное!!!

310
09 августа 2003 года
fellow
853 / / 17.03.2003
Но всё-таки не забудьте проверить приведённый указатель на неравенство NULL.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог