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

Вниз

Представление информации из баз данных в виде дерева   Найти похожие ветки 

 
Александр ©   (2007-10-16 11:15) [0]

Добрый день. Необходимо создать программу с интерфейсом наподобии Проводника, где в левом окне в виде дерева выводилось содержание таблицы БД, а при выборе конкретной ветви в правом окне выводилась информация из связной таблицы. Не получается оформить графическую часть (дерево). Подскажите, есть ли готовые компоненты и/или, если возможно, приведите пример, как релизовать эту задачу средствами Delphi. Ветви должны иметь возможность создаваться, редактироваться, удаляться. Спасибо.


 
Сергей М. ©   (2007-10-16 11:18) [1]


> есть ли готовые компоненты


TDBTreeView, TTreeView - для деревянной части.
TDBGrid, TGrid, TStringGrid, TListView - для всего остального.


 
Sergey13 ©   (2007-10-16 11:27) [2]

> есть ли готовые компоненты

http://polesoft.ru/
Там в библиотеке компонент был неплохой DBTreeView. Но ставилась библиотека, помнится, со всякими заморочками из за связи ее с библиотекой RxLib, точнее с ее полесофтовским вариантом. Есть охота - поразбирайся.


 
Ega23 ©   (2007-10-16 12:22) [3]

Я своё дерево, гм... пишу до сих пор...  :)


 
Правильный Вася   (2007-10-16 12:36) [4]


> пишу до сих пор

хобби?
а как же рыбалка?


 
Ega23 ©   (2007-10-16 12:37) [5]


> хобби?


Да нет, каждый раз какая-то новая фигня выплывает...  :(


 
ЮЮ ©   (2007-10-16 12:43) [6]

> Да нет, каждый раз какая-то новая фигня выплывает...  :(


С деревьями так всегда - то почки, то побеги... А то вообще тля налетит :)


 
Ega23 ©   (2007-10-16 12:46) [7]


> С деревьями так всегда - то почки, то побеги... А то вообще
> тля налетит :)


Основная проблема - отсутствие возможности однозначно определить на уровне TDataLink момент DataSet.DisableControls или DataSet.EnableControls.


 
Маша Шрайбер ©   (2007-10-16 13:05) [8]

>> Ega23 ©   (16.10.07 12:46) [7]
>> Основная проблема - отсутствие возможности однозначно определить на
>> уровне TDataLink момент DataSet.DisableControls или DataSet.EnableControls.

а свойство Control(s)Disabled(Enbled) (как-то так называется) как же?


 
Вася Правильный   (2007-10-16 13:11) [9]


> а свойство Control(s)Disabled(Enbled) (как-то так называется)
> как же?

у линка?!


 
Ega23 ©   (2007-10-16 13:32) [10]


> а свойство Control(s)Disabled(Enbled) (как-то так называется)
> как же?


И что? TDataLink НИКАК не ловит событие TDataSet.DisableControls, а на TDataSet.EnableControls приходит обычный DataChanged, и в этот момент у DataSet свойство ControlsDisabled УЖЕ False.
Проблема действительно серьёзная.


 
clickmaker ©   (2007-10-16 13:45) [11]


> [7] Ega23 ©   (16.10.07 12:46)

а нужно Disable/Enable именно у DS дерева отслеживать?


 
clickmaker ©   (2007-10-16 13:50) [12]

вернее, зачем именно момент Disable отслеживать?


 
Ega23 ©   (2007-10-16 14:06) [13]


> вернее, зачем именно момент Disable отслеживать?


Сажем так. Либо Disable, дабы в следующий раз, когда на DataChange попаду, перерисовать нужные узлы. Либо сам EnableControls ловить.

Просто дерево, в отличие от плоских представлений (DBGrid etc.) нужно полностью перестраивать каждый раз, т.к. парент мог поменяться.


 
Ega23 ©   (2007-10-16 14:17) [14]

Вообще ситуация следующая:
Есть некая иерархическая структура. При старте системы каждый элемент имеет статус, допустим 1. В процессе работы этот статус может меняться в диапазоне 1..8. Мне нужно соотетсвующий StateIndex у элементов отрисовывать.
Причём меняется это дело именно у DataSrt"а. Причём изменения могут приходить пачкой, т.е. от листового элемента вверх до корня.

Если завязываться на UpdateData, то при приходе такой пачки дерево начнёт  "скакать", т.к. будет несколько Locate по НД. По-идее, такие вещи надо делать:
1. DisableControls
2. Запомнили позицию.
3. Нужное количество Locate, Edit, Post.
4. Вернулись в позицию
5. EnableControls

Но по EnableControls я получаю только DataLink.DataChange. а вот распознать, был ли это EnableControls или простой Locate на уровне datalink я не могу. :(

Решение нашёл "через задницу": если использовать в качестве DataSet TCustomADODataSet, то можно на каждый DataChange бежать по всем записям через DataLink и смотреть наличие rsModified в текущей записи. Если есть - апдейтить нужный нод. В конце цикла - CancelUpdates.
Да, получается рассинхронизация данных в дереве и в НД, но для решения данной частной задачи - пойдёт.


 
jack128_   (2007-10-16 15:06) [15]

Ега, не парился, возьми VirtualStringTree и перестраивай его на каждый чих. В отличии от стандартного TreeView -  VST перестраивается мгновенно практически для любого разумного количества узлов. Тогда и не нужно будет париться.


 
jack128_   (2007-10-16 15:06) [16]


> парился

парься


 
clickmaker ©   (2007-10-16 15:16) [17]


> Но по EnableControls я получаю только DataLink.DataChange.
> а вот распознать, был ли это EnableControls или простой
> Locate на уровне datalink я не могу. :(

а ежели у DataLink (наследника) ввести св-во, типа текущей операции?


 
Ega23 ©   (2007-10-16 15:20) [18]


> а ежели у DataLink (наследника) ввести св-во, типа текущей
> операции?


В смысле? Там же событийная модель, я могу оперировать только тем, что Borland в базовых TDataSet и TDataSource поставляет. А свои писать - некузяво как-то...


> VirtualStringTree


Что за зверь такой?


 
jack128_   (2007-10-16 15:44) [19]


> Что за зверь такой?

Достаточно известное дерево, даже с дельфей поставлялось когда то (на отдельном диске).  И по функционалу, и по скорости значительно лудше стандартного... Хотя и несколько сложнее в использовании..
http://www.soft-gems.net/index.php?option=com_content&task=view&id=12&Itemid=33


 
Ega23 ©   (2007-10-16 15:49) [20]

Женя, спасибо, дома посмотрю.



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

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

Наверх




Память: 0.51 MB
Время: 0.023 c
2-1202396342
Res
2008-02-07 17:59
2008.03.02
Ошибка


15-1201595132
needhelp
2008-01-29 11:25
2008.03.02
проюлема с HDD


2-1202023218
Alex_Storm
2008-02-03 10:20
2008.03.02
DataTimePicker


2-1202118155
mephisto
2008-02-04 12:42
2008.03.02
Прочитать ячейку в памяти


2-1202059513
sauron
2008-02-03 20:25
2008.03.02
URL