Текущий архив: 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