Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: CL | DM;

Вниз

TreeView   Найти похожие ветки 

 
markers ©   (2006-09-08 22:44) [0]

Здраствуйте!
Имееются данные в виде:
catid, parentcat, name ....
1) Как лучше всего построить дерево на основе этих данных.
2) (САМЫЙ ВЫЖНЫЙ!) Как можно хранить дополнительные данные в каждом ноде (Если точно, то нужно хранить ID категории). Хотел использовать для этго "Tag" но он отсутствует :( А использовать например StateImages ИМХО криво. :(


 
markers ©   (2006-09-09 01:16) [1]

Никаких идей?


 
Джо ©   (2006-09-09 01:29) [2]

> Как можно хранить дополнительные данные в каждом ноде (Если
> точно, то нужно хранить ID категории).

TreeNode.Data.


 
Джо ©   (2006-09-09 01:30) [3]

> [2] Джо ©   (09.09.06 01:29)

Или сделать собственного наследника TTreeNode с нужными данными и передавать его класс в TTreeView.OnCreateNode.


 
palva ©   (2006-09-09 01:36) [4]

1. Написать программу с использованием Add AddChild. Если исходные данные не упорядочены, то предварительно их отсортировать нужным образом.

2. У TTreeNode есть свойство Data типа Pointer. Может быть оно подойдет?


 
markers ©   (2006-09-09 01:56) [5]

palva ©   (09.09.06 1:36) [4]
Я тоже об этом думал, но не помню (Когда-то видел/делал) как его юзать, подскажите плиз!


 
markers ©   (2006-09-09 01:58) [6]

palva ©   (09.09.06 1:36) [4]
1) У меня проблема больше в том (небольшая), что у меня вложенность может быть любая...


 
markers ©   (2006-09-09 02:01) [7]

Я вообще так понимаю, что код заполнения TreeView должен быть примерно таки (Код на PHP):
function GetCatListTxt($parentid=0,$level=0,$conn)
{
 $query="SELECT catid,name FROM ".CATEGORY_TABLE." WHERE parentid=$parentid";
 $result=mysql_query($query,$conn);
 while (list($catid,$name)=mysql_fetch_row($result))
   {
   $tSubTreeItem = $name."<br>\n";
   $ret.=$tSubTreeItem.GetCatListTxt($catid,$level+1,$conn);
   }
 return $ret;
}


 
Джо ©   (2006-09-09 02:02) [8]

> [5] markers ©   (09.09.06 01:56)
> palva ©   (09.09.06 1:36) [4]
> Я тоже об этом думал, но не помню (Когда-то видел/делал)
> как его юзать, подскажите плиз!

ANode.Data := Poinrer(Id), но, возможно, [3] подойдет лучше, особенно, если придется хранить информации больше, чем просто Id.


 
palva ©   (2006-09-09 02:06) [9]

markers ©   (09.09.06 01:56) [5]
> как его юзать, подскажите плиз

Ну если у вас идентификатор целое число, то сначала присвоить его свойству data, потом прочитать из data. Возможно потребуется дополнительно написать явное преобразование типа. Если идентификатор большой по размеру, то сохранять указатель на него.


 
markers ©   (2006-09-09 02:07) [10]

Джо ©   (09.09.06 2:02) [8]
" но, возможно, [3] подойдет лучше" Непонял?
И ещё... Я положил в данные, но как их теперь прочитать?


 
markers ©   (2006-09-09 02:09) [11]

palva ©   (09.09.06 2:06) [9]
Нужно хранить просто ID категории в базе данных (Так что не слишком большая цифра получится)


 
Джо ©   (2006-09-09 02:10) [12]

> [10] markers ©   (09.09.06 02:07)
> Непонял?

Посты в ветке последовательно нумеруются. В посте [3] описан еще один вариант.


> И ещё... Я положил в данные, но как их теперь прочитать?

Id := Integer(ANode.Data);


 
markers ©   (2006-09-09 02:10) [13]

Правда (задумался), тут ещё захотелось по-мимо ID хранить (Для OWERDRAW) состояние нода (Например для подписи "Новинка!") Такое возможно?


 
Джо ©   (2006-09-09 02:11) [14]

> [13] markers ©   (09.09.06 02:10)
> Правда (задумался), тут ещё захотелось по-мимо ID хранить
> (Для OWERDRAW) состояние нода (Например для подписи "Новинка!
> ") Такое возможно?

Возможно. Смотри пост [3].


 
markers ©   (2006-09-09 02:12) [15]

Джо ©   (09.09.06 2:10) [12]
Пасибо!
Значит никак (Кроме создания наследника) несколько значений создать незя?
Не хочу блин наследники делать..... Обойдусь о доппараметрах пока :)


 
markers ©   (2006-09-09 02:12) [16]

Ответ получен! Спасибо!


 
Джо ©   (2006-09-09 02:14) [17]

> [15] markers ©   (09.09.06 02:12)
> Джо ©   (09.09.06 2:10) [12]
> Пасибо!
> Значит никак (Кроме создания наследника) несколько значений
> создать незя?

Можно. Свойство Data — это указатель. Который, соответственно, может указывать на что угодно. Например, на запись (record).


 
Джо ©   (2006-09-09 02:16) [18]

> [15] markers ©   (09.09.06 02:12)
> Не хочу блин наследники делать.....

А что тут сложного?

type
 TMyTreeNode = class (TTreeNode)
 private
   FIsNew: Boolean;
   FId: Integer;
 public
   property Id: Integer read FId write FId;
   property IsNew: Boolean read FIsNew;
 end;

И всё.


 
palva ©   (2006-09-09 02:28) [19]

К TreeNode можно еще присоединить объект (вернее создать с объектом)- метод AddObject


 
Loginov Dmitry ©   (2006-09-09 09:37) [20]

> У меня проблема больше в том (небольшая), что у меня вложенность
> может быть любая...


Жизненный пример:


type
 PCardData = ^TCardData;
 TCardData = packed record
   cdKey, cdOwnerKey: Integer;
   cdDate: TDateTime;
 end;

procedure TCardsFrame.BuildTreeByDBData;
var
 MainNode, TempNode, SelectNode: TTreeNode;
 I: Integer;
 NodeList: TList;
 CardData: PCardData;
 AKey: Integer;
begin
 if CardioDM.dstCards.FieldByName("CRD_ID").IsNull then
   AKey := -1
 else
   AKey := CardioDM.dstCards.FieldByName("CRD_ID").AsInteger;
   
 DBTreeView.Items.BeginUpdate;
 ClearData;
 DBTreeView.Items.Clear;

 // Создаем корень дерева
 MainNode := DBTreeView.Items.AddChild(nil, "Все картотеки");
 with MainNode do
 begin
   ImageIndex := 1;
   SelectedIndex := 1;
 end;
 SelectNode := MainNode;

 NodeList := TList.Create;
 try
   with CardioDM.dstCards do
   begin
     First;
     while not Eof do
     begin
       TempNode := DBTreeView.Items.AddChild(MainNode, FieldByName("CRD_NAME").AsString);
       with TempNode do
       begin
         New(CardData);
         FillChar(CardData^, SizeOf(TCardData), 0);
         CardData^.cdKey := FieldByName("CRD_ID").AsInteger;
         if CardData^.cdKey = AKey then SelectNode := TempNode;
         if not FieldByName("CRD_OWNERID").IsNull then
           CardData^.cdOwnerKey := FieldByName("CRD_OWNERID").AsInteger;
         if not FieldByName("CRD_DATE").IsNull then
           CardData^.cdDate := FieldByName("CRD_DATE").AsDateTime;
         Data := CardData;
       end;

       // Добавляем новый итем в список
       NodeList.Add(TempNode);
       Next;
     end;
     // Упорядочиваем итемы в соответствии в CRD_OWNERID
     for I := 0 to NodeList.Count - 1 do
       TTreeNode(NodeList[I]).MoveTo(FindParentNode(TTreeNode(NodeList[I])), naAddChild);

   end;
 finally
   NodeList.Free;
   DBTreeView.Items.EndUpdate;
 end;

 // Выделяем необходымый итем
 DBTreeView.Selected := SelectNode;
end;


Здесь для ускорения работы используется список TList



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

Текущий архив: 2006.10.22;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.04 c
8-1142759038
zxcv
2006-03-19 12:03
2006.10.22
выделение малоконтрастных объектов на изображении


2-1159959399
Gloomer
2006-10-04 14:56
2006.10.22
Отправка почты через IdSMTP


2-1159680977
APiC
2006-10-01 09:36
2006.10.22
Вычисления


2-1159981434
Merry
2006-10-04 21:03
2006.10.22
Invalid pointer operation.


4-1149743403
Misha Uskov
2006-06-08 09:10
2006.10.22
Хук CoCreateInstance