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




Вниз

А существует ли такое дерево у которого ветки могли бы ссылаться 


Кен   (2004-02-20 04:51) [0]

друг на друга ? При этом с сохранением всей функциональности TreeView.

То есть, хочу, чтобы разные ветки дерева могли ссылаться на одни и теже Childы и работать с ними. И чтобы Parent был не один, а в виде массива всех ссылающихся на этот элемент Parentoв.

Такое дерево удобно, когда много дублирующейся информации. И чем писать к разным веткам одни и теже Childы, проще использовать ссылки на уже созданых детей.

Основная сложность в таком дереве - удаление лишних веток, чтобы не удалить случайно Childы, на которые ссылаются другие ветки, и чтобы не появлялись ничейные дети, у которых нет родителей.

Существует ли компонент для работы с таким видом дерева ? Очень хочу !



Mr. Chel   (2004-01-23 13:29) [1]

Глянь VirtualTreeView должно подойти
http://www.delphi-gems.com/VirtualTreeview/VT.php



Курдль   (2004-01-23 13:35) [2]

Пока что лучшие компоненты для подобных дел от "Developer Express". Называются "Quantum Grid". Включают в себя, деревья и гриды, в том числе DB-ориентированные, а т.ж. уйму визуальных компонентов.
Стоят не дорого - около 600 баксов.



Amoeba   (2004-02-20 18:12) [3]

Не уверен, что рекомендованные компоненты способны на это... Сомневаюсь, что вообще таковые готовые существуют...



MBo   (2004-02-20 18:17) [4]

Это не деревья, а графы.



Курдль   (2004-02-20 18:20) [5]


> Не уверен, что рекомендованные компоненты способны на это...
>

Естественно, этого не может быть "потому, что не может быть никогда". :)
Отношение "многие-ко-многим" в гридах еще никто не додумался реализовать :)
Однако, грамотно написанный запрос может решить все проблемы и без постороннего вмешательства (О! Шайтан-арба!) выстроиться, как надо, на любом DBTree...



Mystic   (2004-02-20 18:27) [6]

Трапеция это параллелограмм, у которого две стороны не параллельны...

Что тебе мешает использовать виртуальный TreeView, а данные хранить в своей сетевой структуре?



Кен   (2004-02-21 02:22) [7]


> Mr. Chel (23.01.04 13:29) [1]
> Глянь VirtualTreeView должно подойти
> http://www.delphi-gems.com/VirtualTreeview/VT.php

Поставил скачиваться.


> MBo © (20.02.04 18:17) [4]
> Это не деревья, а графы.

Что за графы такие ? Они есть в Дельфи 7 ? О них есть какие нибудь статьи для тех, кто не в курсе ?


> Mystic © (20.02.04 18:27) [6]
> Трапеция это параллелограмм, у которого две стороны не параллельны...
>
> Что тебе мешает использовать виртуальный TreeView, а данные
> хранить в своей сетевой структуре?

То, что я люблю простые решения и разделения труда.
Один написал такое хитрое дерево со всеми удобствами, а все остальные пользуются и не заморачиваются на всякие виртуальности и сетевые структуры.

Плюс возможность отдельно дорабатывать, оптимизировать, наворачивать код дерева и код программ которые его используют.
А когда всё в кучу свалено, то потом не разберёшься.



ЮЮ   (2004-02-21 03:41) [8]

>Курдль © (23.01.04 13:35) [2] Отношение "многие-ко-многим" в гридах еще никто не додумался реализовать :)

Ну это ты зря. Более того, некоторые даже множественное наследование реализовали :-)

>Один написал такое хитрое дерево со всеми удобствами, а все остальные пользуются и не заморачиваются

Так оно и есть, только в рамках одного коллектива (предприятия), т.к. просто так отдавать в чужие руки труд целого коллектива, ни у кого рука не поднимется

А в твоём случае (в случае любителя TreeView) вообще все делается элементарно: в памяти строится виртуальная модель твоих данных, к построению и удалению элементов которых TreeView не имеет никакого отношения, а в TreeViewNode.Data указываешь ссылку на элемент этой структуры. И все. Элемент данных один, а ссылок сколь хочешь.



Кен   (2004-02-22 01:58) [9]


> ЮЮ © (21.02.04 03:41) [8]
> Так оно и есть, только в рамках одного коллектива (предприятия),
> т.к. просто так отдавать в чужие руки труд целого коллектива,
> ни у кого рука не поднимется


Во времена кражи исходников Виндос и Халф Лайфа 2, зажимать какое-то жалкое дерево - несолидно.


> А в твоём случае (в случае любителя TreeView) вообще все
> делается элементарно: в памяти строится виртуальная модель
> твоих данных, к построению и удалению элементов которых
> TreeView не имеет никакого отношения


Нет имеет. Мои данные надо вообще оставить в покое, потому, что речь не о них, а о связях между ними. Мне нужен удобный механизм для работы с этими связями. Связи простейшие, в виде массива родителей и массива детей, для каждого элемента моих данных. Нужно удобное удаление и удобный доступ. Вот и всё. Как это реализовать ?


> Mr. Chel (23.01.04 13:29) [1]
> Глянь VirtualTreeView должно подойти
> http://www.delphi-gems.com/VirtualTreeview/VT.php

Глянул. Там мультипэрента вроде бы нету. Или я не нашёл ?


> Курдль © (23.01.04 13:35) [2]
> Пока что лучшие компоненты для подобных дел от "Developer
> Express". Называются "Quantum Grid". Включают в себя, деревья
> и гриды, в том числе DB-ориентированные, а т.ж. уйму визуальных
> компонентов.
> Стоят не дорого - около 600 баксов.

Это вот это : http://www.devexpress.com/ ? Там точно есть то что я хочу ?



jack128   (2004-02-22 10:40) [10]


> Глянул. Там мультипэрента вроде бы нету. Или я не нашёл
>
естственно нету - это ж ДЕРЕВО!!!! Напомню, под деревом тут подрузамевают структуру реализую отношение один ко многим(либо визуальный компонент отображающий такие отношения).
Вообще как, то что ты хочешь, должно выглядить???



Думкин   (2004-02-22 11:46) [11]

> [6] Mystic © (20.02.04 18:27)

Как однажды пошутил МВо:
"Эллипс - это круг вписанный в квадрат 3 на 4".



Юрий Зотов   (2004-02-22 12:08) [12]

> Mystic © (20.02.04 18:27) [6]
> Думкин © (22.02.04 11:46) [11]

Да, тут нужен Rouse_ с его "Антологией"...

"Что за графы такие? Они есть в Дельфи 7?"

"...я люблю простые решения и разделения труда. Один написал такое хитрое дерево со всеми удобствами, а все остальные пользуются и не заморачиваются..."

"Во времена кражи исходников Виндос и Халф Лайфа 2, зажимать какое-то жалкое дерево - несолидно".



Кен   (2004-02-23 01:41) [13]


> jack128 © (22.02.04 10:40) [10]
> Вообще как, то что ты хочешь, должно выглядить???

Обычное дерево с тем отличием, что в разных его ветках может показываться одно и тоже ( если пэрентов много ).


> естственно нету - это ж ДЕРЕВО!!!! Напомню, под деревом
> тут подрузамевают структуру реализую отношение один ко многим.

Один - это часный случай многих. :) Значит дерево - это часный случай чего-то другого. Вопрос чего ? И какой компонент позволяет удобно с этим работать.



nikkie   (2004-02-23 02:42) [14]

>Там мультипэрента вроде бы нету.
тебе этого и не надо.

>в разных его ветках может показываться одно и тоже
вот именно для этого отлично подойдет TVirtualTreeView.
в узле дерева надо хранить ссылку на твой блок данных.
несколько разных узлов могут ссылаться на один и тот же блок данных.
текст, который будет показан в дереве заполняется в событии OnGetText.
в обработчике этого события ты вытаскиваешь свои данные по ссылке, сохраненной в Node.Data. автоматически получаются идентичные узлы в дереве.



Alex Konshin   (2004-02-23 03:29) [15]

Ну есть у меня такое дерево, классификатор товаров на прежней питерской работе на нем построен.
Но тебе не дам - не в коня корм, тебе дашь, а потом еще и объяснять замучаешься.
Будешь красть исходники?



Кен   (2004-02-23 06:01) [16]


> nikkie © (23.02.04 02:42) [14]
> >Там мультипэрента вроде бы нету.
> тебе этого и не надо.
>
> >в разных его ветках может показываться одно и тоже
> вот именно для этого отлично подойдет TVirtualTreeView.
> в узле дерева надо хранить ссылку на твой блок данных.

А как я по данным определю все узлы которые на них ссылаются ? Перебирать всё дерево от начала до конца каждый раз ?
Ведь удалять то нельзя те данные, на которые ещё кто то продолжает ссылаться.


> Alex Konshin © (23.02.04 03:29) [15]
> Будешь красть исходники?

Красть не буду. Только копировать. А как ещё можно пользоваться исходинками не копируя ?



Alex Konshin   (2004-02-23 06:14) [17]

Да пожайлуйста. Но тебе - только за деньги.



nikkie   (2004-02-23 12:32) [18]

>А как я по данным определю все узлы которые на них ссылаются ?
TTreeView & TVirtualTreeView - визуальные компоненты. предназначены для визуального отображения твоих данных. в них и не должно быть наворочено алгоритмов обработки структур данных. иначе получится, во-первых,
А когда всё в кучу свалено, то потом не разберёшься.
а во-вторых, область применения уже - всем нужны разные структуры данных.

так что если ты надеялся с помощью TTreeView решить свою проблему "Как, в чём хранить связи между данными?", то зря. в той ветке тебе уже сказали, я могу лишь повторить, что тебе надо разбираться со структурами данных. начать можно отсюда:
http://algolist.manual.ru/ds/basic/



Курдль   (2004-02-24 17:22) [19]

Я не пойму, зачем вы все путаете причинные места со следственными органами?
TreeView и пр. визуальные компоненты - лишь средства отображения.
Создайте разумную структуру данных в памяти, а визуальному компоненту лишь подсунте "видимую часть айсберга".
Например, для решения проблемы, изложенной вначале топика, можно всего-навсего передать DB-ориентированному TreeView след. пример:
1. Name = Запись_1, ID = 1, ID_PARENT = NULL;
2. Name = Запись_2, ID = 2, ID_PARENT = 1;
3. Name = Запись_3, ID = 3, ID_PARENT = NULL;
4. Name = Запись_2, ID = 4, ID_PARENT = 3;

В результате нарисуется дерево с 2-мя узлами (1 и 3) и 2-мя идентичными ветвями (2, 4).



Кен   (2004-02-25 04:36) [20]

Удалено модератором
Примечание: За очередные грубые нападки на модератора 7 дней RO



ЮЮ   (2004-02-25 09:07) [21]

TSuperCrossedObject = class
private
FParent: TObject;
FChildren: TObjectArray;
FIndirectChildren: TObjectArray;
FIndirectParents: TObjectArray;
public
function AddChild(Child: TObject): integer;
procedure InsertChild(Child: TObject; Idx: integer);
procedure MoveChild(FromIdx, ToIdx: integer);
function RemoveChild(Idx: integer): TObject;

function AddIndirectChild(Child: TObject): integer;
procedure InsertIndirectChild(Child: TObject; Idx: integer);
procedure MoveIndirectChild(FromIdx, ToIdx: integer);
function RemoveIndirectChild(Idx: integer): TObject;
end;
где кроме прямых связей владения поддерживаем ссылочные (Indirect) связи
в Destructor-е необходимо "разорвать" ссылочные связи перед уничтожением объекта



nikkie   (2004-02-25 09:10) [22]

>Кен
неужели тебе самому приятно в роли клоуна выступать?
если тебе нужны хеши, заведи ветку про них, может посоветуют реализацию.
TTreeView здесь не причем, это ты понимаешь?

>какими такие могут быть разные структуры данных ?
ну если ты уже знаешь умное слово хеш, то должен знать и другие умные слова - 1-направленный список, 2-направленный список, очередь, стек. все это - элементарные разные структуры данных. причем это только кирпичики, из которых под конкретную задачу можно построить и более сложные модели.



Erik   (2004-02-25 09:37) [23]

Удалено модератором
Примечание: Не стоит решать за модератора ;)




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




Наверх





Память: 0.79 MB
Время: 0.038 c
1-12423           Дас Виндовс 45        2004-02-23 14:12  2004.03.05  
Поиск элемента в массиве


1-12362           Elritar               2004-02-25 05:05  2004.03.05  
Nested COM objects (непереводимый диалект)


7-12553           Retro                 2003-12-16 23:52  2004.03.05  
драйвер


4-12588           lefan                 2003-12-26 07:04  2004.03.05  
имитировать мышь и клаву...


1-12354           ИЛЮХА                 2004-02-21 11:53  2004.03.05  
Картинки