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

Вниз

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

 
Кен ©   (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]

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



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

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

Наверх




Память: 0.54 MB
Время: 0.01 c
8-12458
LEON88
2003-10-31 00:43
2004.03.05
Программа поверх игры


1-12373
dkDimon
2004-02-19 01:39
2004.03.05
DDE


3-12253
tytus
2004-02-09 13:31
2004.03.05
ВМР в DBGrid


14-12500
Verg
2004-02-13 09:50
2004.03.05
Сегодня можно программировать?


1-12387
Иванко
2004-02-23 13:52
2004.03.05
Проблема у RichEdit c Charset (Глюки WIN XP???)