Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TreeView - как разобраться с делами ? [D7, WinXP]


Ranikin ©   (2002-12-24 15:18:00) 

Есть TreeView при добавлении узлов в дерево нужно к каждому узлу присвоить какое нить значение (помимо имени и указателя узла) - чтоб потом его можно было дернуть.
Куда можно пихнуть это значение ?
Например - есть дерево (каталог товарных групп) при выборе узла (группы) нужно произвести выборку по ID данной группы. А куда этот ID пихнуть при создании узла я не знаю.
Например в VB в TreeView есть такие параметры как key - в нее мы и пихали ID а теперь с переходом на Dephi - затык ...


Ranikin   (2002-12-25 11:33:00) [1]

Спасибо - вариант с созданием класса от TTreeNOde очень даже катит.
"
TMyTreeNode = class(TTreeNode)
private
FMyText: String;
public
property MyText: String read FMyText write FMyText;
end;

в обработчике OnCreateNodeClass пишем

procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
begin
NodeClass := TMyTreeNode;
end;

"


Separator   (2002-12-25 07:52:00) [2]

Если не ломает, то подправь ComCtrls, а потом подключай его к своему проекту


ЮЮ   (2002-12-25 07:47:00) [3]

Автор:
С поинтером маза не катит ...
Не могу я хранить в переменных все значения.
Нельзя ли как-нибудь пихнуть значение именно в узел ?
Нет ли какого-нибудь свойства узла куда можно положить данные ?

А все дальнейшие советы - прямая противоположность :-)
Для хранения целого числа можно использовать непосредственно TreeNode.Data, но с прведением типа Integer(), Pointer():
Запоминаем:
TreeNode.Data := Pointer(DataSet.Fields[0]. asInteger);
Используем:
DataSet.Locate("ID", Integer(TreeView.Selected.Data),[]);





Skier   (2002-12-24 17:45:00) [4]

Ойк !

with ANodeData^ do begin
//задание значений...
yrField1 :=111;
yrField2 :=3.14;
yrField3 :="Hello, world !";
end; //with


Skier   (2002-12-24 17:44:00) [5]

>Ranikin

type
TYourRec = packed record
yrField1 : Integer;
yrField2 : Double;
yrField3 : String;
end; //TYourRec
PYourRec = ^TYourRec ;

//...................

var
ANodeData : PYourRec;
begin
//...........
New(ANodeData); //создание динамической стр-ры
with ANodeData^ do begin
//задание значений...
yrField1 : 111;
yrField2 : 3.14;
yrField3 : "Hello, world !";
end; //with
//добавление узла с данными...(данные в ANodeData...)
TreeView1.Items.AddChildObject(TreeView1.Selected,"New Item",ANodeData);
//...........
end;

//................
Работа с данными узла.
if SomeTreeNode.Data <> nil then begin
with PYourRec(SomeTreeNode.Data)^ do begin
//...изменение данных узла...
end; //with
end; //if
//.................


Не забудь потом освобождать данные узлов
if SomeTreeNode.Data <> nil then Dispose(SomeTreeNode.Data)

И, кроме того вместо записи, можно использовать класс...


neXt   (2002-12-24 17:31:00) [6]

Вариант с хранением в Data указателя на структуру, наверно, самый удобный, но только для общности скажу о ещё одной возможности.
Начиная с Delphi6 у класса TTreeView есть событие OnCreateNodeClass специально для того, чтобы "пихнуть значение именно в узел". Пользоваться им можно так:
создаётся класс, наследник TTreeNode

TMyTreeNode = class(TTreeNode)
private
FMyText: String;
public
property MyText: String read FMyText write FMyText;
end;

в обработчике OnCreateNodeClass пишем

procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
begin
NodeClass := TMyTreeNode;
end;

и всё!
Далее, обращяться к свойству узла можно например так:
TMyTreeNode.(TreeView1.Selected).MyText = "что-то";
Если некое значение туда нужно положить в момент создания узла, то проще всего это сделать в обработчике события TTreeView.OnAddition, например так
procedure TForm1.TreeView1Addition(Sender: TObject; Node: TTreeNode);
begin
If Node is TMyTreeNode then
TMyTreeNode(Node).MyText := "нечто";
end;


Карелин Артем   (2002-12-24 16:31:00) [7]

Можно исправить VCL - правда опасно это ;)
Лучше последоват совету мастеров.
В Ф1 есть хороший пример.


Digitman   (2002-12-24 16:11:00) [8]


> Нет ли какого-нибудь свойства узла куда можно положить данные
> ?


Ну тебе ж сказали уже - TTreeNode.Data !
Готовь свои данные в памяти, какие, как и сколько тебе заблагорассудится, и назначай св-ву Data указатель на начало этих данных


jee   (2002-12-24 16:10:00) [9]

создай стуктуру вместо переменной со своими значениями, каждому узлу свой экземпляр и вяжи указатель на них


Ranikin   (2002-12-24 16:04:00) [10]

С поинтером маза не катит ...
Не могу я хранить в переменных все значения.
Нельзя ли как-нибудь пихнуть значение именно в узел ?
Нет ли какого-нибудь свойства узла куда можно положить данные ?


stone   (2002-12-24 15:38:00) [11]

а Ф1 нажать ломает?

The following example adds a new child to the selected item’s list of child items in the tree view control. The new item is identified by the text ‘New Item’. The TBitmap object is attached to the new item.

TreeView1.Items.AddChildObject(TreeView1.Selected,"New Item",MyBitMap);


Ranikin   (2002-12-24 15:35:00) [12]

А поподробнее .... кусок кода хоть какой нибудь ...


Woolen   (2002-12-24 15:33:00) [13]

Для добавления пользуйтесь процедурами TTreeView.Items.AddObject, AddObjectFirst, AddChildObject, AddChildObjectFirst. Какие параметры что значат можно посмотреть в справке по классу TTreeNodes. Свойство Items - объект такого класса.
Каждый узел является объектом типа TTreeNode. У него есть свойство Data. Это указатель, который может указывать на любой объект, переменную и т.п. А уже обект или переменная могут содержать нужную информацию. Берете указатель, приводите к, допустим, объекту при помощи скобок и пользуетесь.


stone   (2002-12-24 15:23:00) [14]

DATA


Наверх

Титульная страница Поиск, карта сайта Написать письмо