Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Hello, World!
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  06:45[Войти] | [Зарегистрироваться]

Обсуждение материала
DBTreeView своими руками
Полный текст материала


Другие публикации автора: Елена Филиппова

Цитата или краткий комментарий:

«... В статье речь пойдет об отображении данных, хранящихся в БД и имеющих иерархическую (древовидную) структуру. Визуальное представление таких данных требует соответствующего инструмента. Существует немало компонент, которые позволяют представлять данные в виде дерева — для краткости будем называть их все DB TreeView... ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.

Результаты голосования
Оценка содержания

  Содержит полезные и(или) интересные сведения
[1]2683.9%
 
  Ничего особенно нового и интересного
[2]412.9%
 
  Написано неверно (обязательно укажите почему)
[3]13.2%
 
Всего проголосовали: 31

Оценка стиля изложения

  Все понятно, материал читается легко
[1]2291.7%
 
  Есть неясности в изложении
[2]28.3%
 
  Непонятно написано, трудно читается
[3]00%
 
Всего проголосовали: 24




Смотрите также материалы по темам:
[TTreeView] [Древовидные структуры] [Отображение списков, сеток]

Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 68

19-11-2008 04:58
сообщение от автора материала
А может быть он уже есть в какой-нибудь версии Delphi ? (у меня Delphi 7, там нет)

Нет, в стандартной поставке Дельфи нет такого компонент ни в 7-й версии, ни в дальнейших.


19-11-2008 04:56
- А может быть он уже есть в какой-нибудь версии Delphi ? (у меня Delphi 7, там нет)

По крайней мере, в палитре Delphi 2009 я его не нахожу. И раньше (BDS2006, Delphi 7) тоже не замечал.


19-11-2008 02:42
>> Я вообще стараюсь обходиться только стандартными компонентами

Я, кстати, тоже. Нелюблю чужие компоненты, с ними надо разбираться, еще не дай бог будут глючить, да еще в тот момент когда проект под них уже заточен ... Если бы у Borland'а был бы свой родной компонент TDBTreeView, то я был бы счастлив. По крайней мере вопросов о создании своего компонета не стояло бы.

А может быть он уже есть в какой-нибудь версии Delphi ? (у меня Delphi 7, там нет)


18-11-2008 22:48
Далеко не очевидно, что надо писать компоненты и даже писать как их писать.
Лично меня раздражает необходимость устанавливать в палитру компоненты по всякому поводу. Я вообще стараюсь обходиться только стандартными компонентами. Последствия - самые благоприятные, я без труда портирую свой код в новые версии Delphi.
А статьи Елены как раз тем и хороши, что напрямую не связаны с написанием компонент. Совсем недавно я порылся в сети по поводу начинки грида чекбоксами, а потом вспомнил, что у Елены по поводу оформления грида есть обширная статья - и сразу все сделал за час работы. А так бы пришлось все сочинять заново. А если бы это был компонент?! При моем стиле программирования пришлось бы из компоненты вытаскивать код. Так что тут не все однозначно.


18-11-2008 01:19
Сразу оговорюсь, к автору претензий не имею. В любом случае написать статью - это лучше чем ничего не написать. К тому же то что в статье написано - написано довольно таки толково и понятно. Некоторые вопросы сразу же снимаются. Но человек всегда стремится к большему. Так и мне после прочтения статьи захотелось в конце концов получить собственный рукописный компонент, который можно использовать в последствии, забыв даже его исходный код и не вдаваясь каждый раз в подробности построения деревьев.
При этом нельзя написать статью про создание абстрактного компонента, потому что создание разных компонентов может очень сильно отличатся. Поэтому создание компонента, например, TDBTreeView, я считаю, должно быть в отдельной статье. А ваша статья как нельзя больше подходит для этого.

P.S. Для себя я проблему решил таким образом: нашел на Torry freeware компонент с исходниками, и пытаюсь сейчас разобратся в исходниках.


17-11-2008 05:31
сообщение от автора материала
Юрий меня опередил.
Статья не имеет никакого отношения к созданию компонента, который "бросил на форму" и дерево готово.
Она посвящена тому, как научиться самому решать свои задачи без поиска сторонних компонент.

Задайте свой вопрос на Круглом столе, уверена, заинтересованные собеседники найдутся.


17-11-2008 05:22
>>> Статья может и неплохая, но, на мой взгляд незаконченная. Компонента нет
Понимаете, не все статьи посвящены созданию компонентов ;-) Данная публикация как раз их тех, где рассказывается, как изменить существующий компонент, а не создавать свой с нуля.
 Geo


17-11-2008 03:01
Спасибо за ответ, но ...

>> А вообще, компоненты ищут на Torry, а на Королевстве учатся программировать.

В курсе :) Я как раз и хочу написать свой компонент.

>> Обратите внимание на публикации из раздела "Сокровищница"
Там три статьи. Самая близкая - Компонент для выгрузки набора данных в дерево. Но там все сделано на простейшем уровне. Данные подкружаются из указанного НД в отдельной процедуре, ну и больше по сути ничего. Представьте, что у вас для того чтобы данные отобразились в DBGrid надо выполнить процедуру LoadDataFromDB ...

А интересует то как раз процедура СОЗДАНИЯ КОМПОНЕНТА. Какие методы перекрыть для отрисовки, как обновлять данные, какие объекты использовать для связи с НД. Кстати кто-нибудь знает как работать с объектом TDataLink, у него даже событий нет, а вот у TFieldDataLink есть, но он больше подходит для компонентов работающих с одним полем (типа TDBEdit). Вобщем вопросов больше чем ответов.

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

PS: я пытался по исходникам VCL посмотреть как делаются компоненты TDBxxxxx из Txxxxxx, но, скажу вам, довольно сложная эта задача, учитывая то, что самый близкий к требуемому компоненту это TDBGrid.


13-11-2008 09:09
>> А как насчет создания действительно нового компонента с названием например TDBTreeView?
Посмотрите вот здесь.
http://www.delphikingdom.com/asp/itemq.asp?Mode=1&ItemID=66
Обратите внимание на публикации из раздела "Сокровищница".

А вообще, компоненты ищут на Torry, а на Королевстве учатся программировать.
 Geo


13-11-2008 02:21
А как насчет создания действительно нового компонента с названием например TDBTreeView? Перекрытия стандартных процедур отрисовки, использования TFieldDataLink и т.д. и т.п. Чтобы в конце получить компонент готовый к использованию: положил на форму, указал свойство DataSoure, DataField, <поле в с ID родителя>, может еще что-нибудь и увидел содержимое БД в виде дерева. Я так понимаю, тут еще есть над чем подумать.

Или, может быть, где-то уже есть такое описание? Я не нашел


22-07-2007 02:39
Статья очень хорошая. Спасибо!


07-05-2007 10:05
Да, пожалуйста, гуру, расскажите как удалять узлы, и еще, как отследить, что запись не является больше родителем ни для одной записи, т.е. что это последний подраздел?


09-04-2007 03:50
Статья хорошая, особенно для ребят, начинающих программировать в делфях. Изложено все корректно и понятно. Елена, спасибо большое за то, что не полинились и поделились своим "частным мнением".


05-02-2007 21:12
Привет,
Переделал код, штобы работало без RxLib а то RxLib умерло, внедрилос в jedi... инсталировать огромную библиотеку незахотелось...

Код паложил по линку:
http://bigcalc.googlepages.com/treedbnorx.zip

Удачи.


20-12-2006 09:19
>>> как при данной реализации дерева выполнять удаление узла с удалением всех дочерних веток???
Насколько я понмню, в этой статье речь идет об отображении, а не о модификации данных. Если Вас интересубт вопросы различных вариантов представления деревьев и способов работы с ними, то милости прошу сюда http://delphikingdom.ru/asp/viewitem.asp?catalogid=1263
 Geo


20-12-2006 04:30
Господа, так покажет все-таки кто-нибудь как при данной реализации дерева выполнять удаление узла с удалением всех дочерних веток??? Задача ведь необходимая.


07-12-2006 07:26
сообщение от автора материала
Спасибо, рада что пригодилось.

ListEntities описывается как TCollection?
Нет, не совсем так. Посмотрите внимательнее по коду: ListEntities имеет тип TLists, это наследник TCollection, в котором как раз и реализованы метод AsString и другие.
По большому счету, это деталь конкретной реализации примера и к самому способу построения дерева отношения не имеет. Вы можете использовать что-то другое.


07-12-2006 07:15
Елена, статья классная - спасибо за реализацию опыта!

У меня возникла проблема при создании методом веток из одного места))) - ListEntities описывается как TCollection? Если да, то при вызове его атемов таким образом ListEntities[Level-1].AsString среда ругается показывая что не существует метода AsString;

возможно я не правильно объявил ListEntities:TCollection;
 4oFF


24-11-2006 06:02
Кстати когда на подразделениях двойным кликом кликаем
чтобы перейти на уровень вниз, выдается exeption т.к. в коде нет
обработки этого. Правится добавлением проверки if ID<>0:

procedure TFormTree.gridCompaniesDblClick(Sender: TObject);
Var ID , i : Integer;
    Allow  : Boolean;
begin
          ID:=qCompanies.FieldByName('ID').AsInteger;
          //Application.MessageBox(qCompanies.FieldByName('ID').AsInteger)  ;
          if ID<>0 then begin
            //Application.MessageBox(PChar(Integer(qCompanies.FieldByName('ID'))),PChar(Integer(qCompanies.FieldByName('ID'))), MB_OK + MB_ICONSTOP)  ;
                      // принудительное "невидимое" раскрытие той ветки, на которой стоим
          TreeCompanies.OnExpanding(TreeCompanies ,TreeCompanies.Selected , Allow);

          // Перебираем все получившиеся дочерние ветки и ищем ту, ID которой
          // совпадает с ID строки в правой таблице. То есть ищем ветку в дереве,
          // которая соответсвует той записи в таблице, на которой мы стоим
          // Как только нашли, визуально раскрываем ветку и делаем ее выделенной,
          // то есть визуально "встаем" на нее в дереве
          FOR i:=0 To TreeCompanies.Selected.Count-1 Do
          IF Integer(TreeCompanies.Selected.Item[i].Data) = ID
          Then Begin
                TreeCompanies.Selected.Item[i].Expand(False);
                TreeCompanies.Selected.Item[i].Selected:=True;
                TreeCompanies.Repaint;
                Exit;
               End;

          end;



end;


24-11-2006 01:40
А ясно, пасиба, все получилось, нужно в этом утиле в коде в Uses добавить Variants;


23-11-2006 11:06
сообщение от автора материала
Поискать, в каком юните такая функция реализована. Или в редакторе нажать на ней F1.


23-11-2006 11:00
В ListUtils используется функция VarToStr, но при компиляции на нее ругается, не находит ее реализации, где взять??


09-11-2006 10:36
>>> Поля никто не отменял!!!!!!!! они как были у объектов в Объектном паскале с самого начала, так и остались просто для них сделан процедурный тип: записать/считать в свойство, которое по сути является полем!!!!
А разве я говорил, что поля отменили?! Просто AsInteger в данном случае -- это не поле, а свойство. Более того, это чисто процедурное свойство, а не процедурная надстройка, читающая значение поля.

Рекомендация же по изучению матчасти относится к тому, что вернет выражение, как получить тот или иной адрес, а также что такое переопределение типов.
 Geo


09-11-2006 05:35
to Geo:
Ничего подобного. Полю Data присваивается не адрес поля (к тому же, это не поле, а свойство (property)), а значение. Учите матчасть ;-)
  Geo

Сам учи матчасть. Поля никто не отменял!!!!!!!! они как были у объектов в Объектном паскале с самого начала, так и остались просто для них сделан процедурный тип: записать/считать в свойство, которое по сути является полем!!!!
 sams


08-11-2006 14:50
>>> мы адресному полю Data объекта класса TTreeNode присвоили адрес поля qTreeCompanies.FieldByName('ID').AsInteger объекта qTreeCompanies класса TQuery
Ничего подобного. Полю Data присваивается не адрес поля (к тому же, это не поле, а свойство (property)), а значение. Учите матчасть ;-)
 Geo


08-11-2006 05:37
To  Erik Ivanov
Приветсвую!
Дались вам эти 4 байта. По-моему, они вовсе не причём. 4 байта у Pointer - это контейнер под адрес переменной для адресации к ней?
Меня что интересует: мы адресному полю Data объекта класса TTreeNode присвоили адрес поля qTreeCompanies.FieldByName('ID').AsInteger объекта qTreeCompanies класса TQuery, а потом взяли и изменили полностью запрос и выполнили его, на что будет указывать TTreeNode.Data?
 sams


08-11-2006 03:02
To sams
Нет ты неправ! Pointer(qTreeCompanies.FieldByName('ID').AsInteger) это просто приведение integer в pointer, а не указатель на память. Немного грязный прием, но что делать, таков выделеный тип памяти в компоненте. А работает это потому, что Pointer = 4 байта и Integer = 4 байта.


08-11-2006 01:15
Статья полезная. Слава автору!
Но есть вопрос. Возможно, я не прав, но хочется разобраться, чтобы понимать.
В процедуре добавления новой ветки ExpandLevel() есть код
     TreeNode:=TreeCompanies.Items.AddChildObject(Node ,
                                  qTreeCompanies.FieldByName('Name').AsString ,
                                  Pointer(qTreeCompanies.FieldByName('ID').AsInteger));
Если я прав, то Pointer(qTreeCompanies.FieldByName('ID').AsInteger) присваивает полю (нетипированному указателю) объекта TreeNode адрес целочисленного поля объекта qTreeCompanies, где хранится число - возвращаемое запросом выборки данных. Скажем, если на основе замечательного примера будем делать удаление узла дерева, то:
1) нужно ли указателю присваивать nil перед удалением узла? Не будет ли теряться память и почему - ведь указатель продолжает указывать на целочисленную переменную?
2) Если  перед созданием узла создан тип указатель p1 на запись из n полей, для него выделена память new(p1) и TreeNode.DATA:=p; То перед выходом из программы или удалением дерева (узла) в программе нужно ли для каждого узла делать dispose(TreeNode.DATA)?
 sams


17-11-2005 02:13
Доброго времени суток Вам, жители королевства
Отличная статья.
Вот только бы еще помимо добавления и редактирования, показать как производить удаление.
Уважаемый автор, прекрастная королева, подскажите - как это реализовать.


16-11-2005 00:44
Доброго времени суток :-)
Хорошая статья.
Но может кто подскажет - как реализовать еще и удаление записей?
Помогите начинающему :-(


25-02-2005 04:43
Ой, это я без подписи. Извиняюсь.


25-02-2005 04:42
2 Елена Филиппова
Спасибо, за помощь.
Все работает. Называется заработался. :)
Сообщение не подписано


25-02-2005 03:53
сообщение от автора материала
Пример приготовлен на D5. С тех пор изменилось распределение некоторых функций по модулям. Для того, чтобы Delphi "понимала", что такое VarToStr, Вам нужно подключить модуль Variants.pas

На сайте есть раздел по некоторым ошибкам. Так вот эта ошибка там хорошо описана:
http://www.delphikingdom.com/asp/listerrors.asp?ID=40

На будущее, для поиска модуля, в котором описан данный идентификатор, воспользуйтесь поиском в файлах *.pas


25-02-2005 00:36
Пример хороший как стартовая площадка, для дальнейшего изучения подобных вещей.
Но у меня не большая загвоздочка, начинаю компилировать, выдает ошибку:
[Ошибка] ListUtils.pas(276): Undeclared identifier: 'VarToStr'
Почему не может определить VarToStr не могу понять.
Компилирую в D7.
Подскажите пожалуйста , может у меня что-то не так настроено.


14-01-2005 16:25
все, конечно, привильно описано, но TreeView - это действительно г. для себя я написал компонент DBTreeList субкласом от TCustomGrid. он выводит первой колонкой дерево, а потом сетку грида. так вот после долгих мучений я остановился на полной загрузке и формировании всего дерева. использую 3 ключевых поля - id, ParentID и RelativeID - где последнее - id самого верхнего уровня ветки. алгоритм построения - НЕ рекурсивный, поэтому быстрый. 1 этап - сортировка, 2 - построение дерева. датасет из 500 записей формируется за 2-3 секунды. если интересно, выложу алгоритм, хотя нового в нет ничего нет.


08-12-2004 09:32
Поясните пожалуста что значит запрос
Select * From COMPANY
Where ParentID=:ParentID
я непонимаю что он вообще делает!!
больше всего непонятен знак '=:'
я не волшебник, я только учусь..
так что если можно сделайте ответ максимально подробным.


05-10-2004 18:13
Вопрос снят. Решил уже.


23-07-2004 16:40
Структура такая же. Элементарная.
id serial, name varchar, parent int2
serial - автоинкремент.
Думаю, может из-за этого дело. Хотя, не могу объяснить, почему. Наверно надо попробовать поле id сделать просто числовым. Другого ничего мне пока на ум не приходит.
Использую компоненты Zeos для доступа к бд из делфи.

Если можно, еще один вопрос: как "распахнуть" TreeView в заданном месте?
Например, я строю дерево, используя Query1. Этот Query1 содержит на самом первом этапе информацию только о тех данных, парент у которых самый низкий (т.е. самый верхний уровень). Использую Query2 для поиска по этой же базе и этой же таблице. И теперь хочу по даблклику на любом из найденных результатов поиска в DBGrid-е "распахнуть" дерево именно на этом результате.
Ломаю себе голову и ничего не выходит.


22-07-2004 18:45
сообщение от автора материала
А структура данных такая же?


22-07-2004 15:38
Кто-нибудь пробовал отображать данные в древовидной форме из бд PostgreSQL? По описанному в статье методу не строится вообще. А если пытаюсь воспользоваться сторонними компонентами - вылетает ошибка "Переполнение стека" и все.
Пробовал на MySQL, MS SQL, Access - работает нормально.


25-06-2004 17:03
У меня работает на делфи 7.


08-06-2004 13:49
У меня Delphi 7 может поэтому пример не работает?????  

А эта тема очень нужная!


16-09-2003 18:28
Прошу прощения, что ничего существенного не высказываю по поводу статьи. Я еще новичок
Вопрос к Konstantin Tsvetkov: Где можно увидеть опубликованный вами кусок проекта???

>>....
>>3. Могу опубликовать кусок проекта поддерживающего дерево (с учётом >>выше сказанного) с более 450 000 узлами (тормозов нет). Дерево >>храниться в MS SQL Server 2000. К стати оный позволяет одним >>запросом выяснить есть ли у объекта дерева дети.
>>


11-09-2003 10:04
Посмотрел, сравнил с
http://borland.xportal.ru/modules.php?name=News&file=article&sid=86
выбрал второе. Мне показалось, что там проще.


17-04-2003 07:00
Вместо того, чтобы проверять if TreeView.Selected <> Nil
мне кажется правильнее использовать TreeView.Select(Node)
т.к. если мы кликаем по Buttons( с плюсом) ветка не
выделяется


25-02-2003 08:06
>>>Maniac
Я бы сказал, что дерево с динамическим созданием дочерних веток как раз и является способом ограничить размер предоставляемых за раз данных (и логически разграничить эти данные). Ведь оно само по себе является этой самой "фильтрующей выборкой". Если пользователю не нужны какие-то вышестоящие уровни - сделай возможность отсекать ветку и работай только с ней.
Кроме того, загрузка дерева целиком - несколько не согласуется с идеологией серверных БД. Хотя, конечно, все опять упирается в структуру данных. Если в дереве - только название и ссылка на объект, а в программе нормально реализовано отражение изменений сделанных другими пользователями, то можно наверное и целиком грузить если сильно хочется, а вот если в ноде параллельно отражается еще куча информации, то многовато получается.
Кстати, если в программе _существенно_ долго грузится одна ветка, то можно представить сколько будет грузиться все дерево, пусть даже и один раз - при загрузке.

TTreeView - действительно жуткий тормоз. Несколько ранее Алексей давал ссылку на VirtualTree - тоже рекомендую.

По поводу [+] - мое мнение, что ставить его надо только на ноды, у которых реально есть дети, что и стараюсь делать.

По поводу установки комментариев - в GExprets 1.12 появилось много вкусных примочек, в том числе и комментирование/раскомментирование выделенных строк.


16-01-2003 11:43
На Эту Статью Я Наткнулся, Когда Свой TDBTreeView Уже Написал :-). Поэтому, Решил Посмотреть, Что Думают По Этому Поводу Умные Люди, И Не Делаю Ли Я У Себя Ккаих-Либо Глупостей.

Первое, Что Меня Заинтересовало, Это Идея Подгружать Ветки По Мере Открытия. Идея, В Общем-То, Очевидная И Красивая, Но У Себя Я От Нее Отказался, Потому Что Это Медленно. Однако, Стал Читать Дальше И Нашел Объяснение:

>>>Пример построен на локальных Paradox-таблицах. Следовательно для переноса его на SQL-серверные БД стоит учитывать их особенности.

Вот! Те Самые "Особенности" Сервных БД Сводят На Нет Все Усилия По Динамическому Открытию Дерева. На Медленном Соединении С Сервером Много Select"ов Каждой Ветки Будут Гораздо Медленней Одного Вытягивания Всей Таблицы На Клиент. А Раз Уж Мы Втягиваем Все, То Построение Всего Дерева Сразу Не Добавит Много Времени К Открытию.

Предвосхищая Вопрос По Поводу Больших Таблиц, Для Которых Поветочное Вытягивание Будет Таки Быстрее... Тут Уже Проблема С Интерфейсной Стороны. Для Таких Больших Таблиц Представление В Виде _Одного_ Дерева Уже Сильно Сомнительно Для Пользователя. У Большинства Людей Не Такая Большая Короткая Память, Как У Программистов, Поэтому Большие Объемы Данных Нежелательно Представлять Одним Большим Контролом. Не Охватят. Тут Лучше Что-Нибудь Либо Постраничное, Либо С Предварительной Фильтрующей Выборкой, Ограничивающей Размер Дерево До Вменяемого Количества.


25-07-2002 19:25
Просто спасибо.


24-06-2002 09:07
Спасибо, все очень понятно.
Я новичок и поэтому прошу помочь организовать удаление если можно. Благодарю


06-06-2002 14:06
В общем ничего нового, есть интересные моменты... Кроме того, есть одна фишка... Имеет смысл использовать автоинкрементное поле для ID. В этом случаи построение дерева проходит всего за один проход и нет необходимости выполнять кучу перезапросов для добавления ветвей (дети всегда младше родителей :))) Достаточно запрос отсортировать по ID в порядке возрастания.
Лично я пробился безрезультатно над чужими готовыми компонентами и нашёл иного выхода как пользовать стандартный TTreeView, что впрочем не сказалось на скорости построения дерева и навигации по нему.

Желающим могу скинуть кусок кода...

И ложка дёгтя... Нет ли зеркала сайта без этой сказочной лабуды (Сорри ежели чего)


07-03-2002 11:28
Статья отличная. Лучше бы, конечно, без RX
Но никто не заметил возникающей ошибки при переходах
снизу - вверх на другую ветку?
И где Konstantin Tsvetkov опубликовал код   для работы с SQL
где и  узлы нужно добавлять, удалять, перемещать, без перестройки дерева ??
А статья очень хорошая !!!!!!!!










06-03-2002 11:55
Хорошая статья, знакомящая с приемами построения деревьев, но хотелось бы пожелать автору не останавливаться на достигнутом, а именно, рассмотреть работу с такой ситуацией, когда с базой данных работает более чем один пользователь, причем  количество записей достаточно большое (десятки тысяч и более). Я имею ввиду обработку таких событий как DataSetChanged.
Например когда пользователь выбрал определенный узел в дереве, т.е. существует 'текущий путь', в то время как другой пользователь модифицирует БД, причем изменив этот 'текущий путь' и т.д. (разрешение конфликтов).
Тривиальным решением является перестройка всего дерева каждый раз когда БД была модифицированна, плюс можно использоывть процедуру восстановления пути. Но такой подход требует много времени. Более реальным на мой взгляд является анализ уже раскрытых, видимых узлов. Кроме того стандартный компонент TTreeView не отличается высоким быстродействием, например есть компонент реализующий дерево (Home page: www.lischke-online.de, component page:virtualtreeview.lischke-online.de) который во многом превосходит стандартный.
С уважением, Алексей.


14-02-2002 20:52
Статья хорошая, я как начинающий её заюзал уже в начальной реализации.
Я проавда юзаю АДО, ну да не то важно.. я бы хотел такое предложение внести. В статье [+] добавляются ко всем узлам без исключений, лично я ввёл доп. поле в таблицу типа Boolean показывающее соответственно наличие детей у узла, меняется это значение программно... не сложно в принципе... а вобщем взял пример без изменений и ничё - работает :)
спасибо, Елена.


08-01-2002 18:46
В статье рассказано про вариант отображения данных. А решение задачи получения 'всего дерева одним select-ом...' зависит от структуры данных.


05-01-2002 11:39
Честно говоря, задача тривиальная. По большому счету получается рекурсивность обхода дерева. Вот добиться получения всего дерева одним select-ом...


05-01-2002 00:59
>>>А почему использован TRxQuery, который есть не у всех ?

Потому что именно этот компонент позволяет включать в текст
SQL-запроса макросы, что очень сильно упрощает работу с динамической
модификацией текста запроса в run-time.
Мне казалось, что библиотеку RXLib использует подавляющее большинство программистов.
Хотя, это делает учебный пример зависимым от сторонних компонент.
Я просто хотлеа облегчить себе жизнь. Возможно это было не совсем корректно.

  


29-12-2001 16:40
А почему использован TRxQuery, который есть не у всех ?


29-12-2001 16:05
А почему использован TRxQuery, который есть не у всех ?


27-11-2001 14:20
>Статья должна довать в руки технологические приёмы на правильном
>знании предмета ( TTreeView ), а не описывать реализации
Именно это и есть в статье — один из возможных технологических приемов.

>И раскрытие узла будет другим...
От того, что Вы изменили текст запроса не изменяется принцип работы с деревом, ибо способ обеспечения появления значка [+] не является принципиальным.
Кстати, такой вариант не годится для локальных баз и для IB.  
Так что это тоже еще один вариант _реализации_ . Правда я не вижу в этом ничего плохого.

>А вот как синхронизировать перемещения узлов в TTreeView
>с таблицей и наоборот - это технология...
Если решена задача представления данных в виде SQL-дерева, задача
способа обхода такого дерева и его модификации, то все остальное — реализация задачи. И это на самом деле не просто.





23-11-2001 17:13
TO: Елена Филиппова
Мои претензии сводятся к тому, что не надо вносить разброд в неокрепшие умы, ошибками и решениями, которые 'только по условию задачи'. Статья должна довать в руки технологические приёмы на правильном знании предмета ( TTreeView ), а не описывать реализации. Ведь я уже говорил, что реализация может быть и другой:

SELECT M.IdMapObject, M.NameRus, M.NameLat,(SELECT COUNT(*) FROM MapObject WHERE Head = M.IdMapObject) AS ChildCount, M.Kind FROM MapObject M WHERE (M.Head = %d)

И раскрытие узла будет другим...

А вот как синхронизировать перемещения узлов в TTreeView с таблицей и наоборот - это технология...


23-11-2001 10:50
1) Да, Вы правы. Но это просто еще один вариант. Может быть лучше, чем предложенный мной.  
2) А почему это должно было быть учтено? Разве в задаче это сказано?
3) Я отмечала в статье, что пишу только о компоненте  TTreeView и сам вопрос предсталвения древовидных структур не затрагивается. Так при чем тут SQL Server и запросы к нему?
Не сочтите за наезд, но я не понимаю причину Ваших претензий. Кроме первого пункта, остальные мне не ясны.

>>>>>Могу опубликовать кусок проекта
И что же Вас удерживает?




22-11-2001 23:50
1. Для того, что появился крестик нужно всего лишь nNode.HasChildren := True Тогда условием раскрытия узла служит: if Node.HasChildren and ( Node.Count = 0 ) then LoadItemChild( Node )
2. Не учтено, что узлы нужно добавлять, удалять, перемещать, без перестройки дерева.
3. Могу опубликовать кусок проекта поддерживающего дерево (с учётом выше сказанного) с более 450 000 узлами (тормозов нет). Дерево храниться в MS SQL Server 2000. К стати оный позволяет одним запросом выяснить есть ли у объекта дерева дети.


21-11-2001 11:30
>>Andrew P.Rybin
Да, свои комментарии для 'отчеркивания' кода я ставлю 'ручками'.
Есть некоторые вещи, которые я всегда делаю 'ручками', мне это
доставляет удовольствие, честное слово :о)) Это как бы ритуал.

А насчет алиаса, Вы правы. Я не подумала об упрощении настройки примера для всех... Учту в следующий раз.


21-11-2001 10:04
Вопрос можно? ;-)
Елена Вы ручками вставляете //----- или есть какой-нибудь IDE Expert?


21-11-2001 09:57
Маленькое техническое пожелание к примеру.
Если добавить компонент DataBase
  with Database do begin
    DatabaseName := "TreeDB";
    DriverName := "STANDARD";
    LoginPrompt := False;
    Params.Clear;
    Params.Add("PATH=УКАЖИТЕ ВАШ ПУТЬ");
    Params.Add("DEFAULT DRIVER=PARADOX");
    Params.Add("ENABLE BCD=FALSE");
  end;
то это не сильно его (пример) усложнит, и позволит не заводить алиас ;-)

Отличная статья!


21-11-2001 09:53
К технической стороне у меня претензиц нет. А в остальном создается впечатление, что это уже где-то было...
Сообщение не подписано


21-11-2001 09:42
Мне понравилась. Спасибо.


20-11-2001 17:48
Отличная статья. Спасибо Королеве :о)


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
"Мы с тобой одной крови — ты и я!". Чьи это заветные слова?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.

Оценка содержания
 
Содержит полезные и(или) интересные сведения
 
Ничего особенно нового и интересного
 
Написано неверно (обязательно укажите почему)


Оценка стиля изложения
 
Все понятно, материал читается легко
 
Есть неясности в изложении
 
Непонятно написано, трудно читается

Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования