Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.008 c