Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];

Вниз

TreeView - как разобраться с делами ?   Найти похожие ветки 

 
Ranikin   (2002-12-24 15:18) [0]

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


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

DATA


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

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


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

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


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

а Ф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 16:04) [5]

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


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

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


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


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


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


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

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


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

Вариант с хранением в 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;



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

>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)

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


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

Ойк !

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


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

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

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






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

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


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

Спасибо - вариант с созданием класса от 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;

"



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.6 MB
Время: 0.046 c
1-15110
тупень
2002-12-21 11:08
2003.01.06
Еще один тупой вопрос


1-15138
hp1100
2002-12-20 20:08
2003.01.06
Загрузка ассоциированных файлов в уже запущенную программу


1-14975
BaSergey
2002-12-23 18:05
2003.01.06
Как правильно освобождать память из-под COM/ActiveX?


14-15221
·•·?c?p·•·
2002-12-14 01:29
2003.01.06
Прога!


7-15329
1234567890
2002-10-26 16:28
2003.01.06
Зашариные папки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский