Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > [Virtual Treeview] Встраиваемые компоненты


Автор: NaumLeNet 17.11.2006, 18:40
Возможно ли использовать в качестве контента для ноды некий контрол? К примеру TFrame?

Стоит задача визуализации очень большого списка записей (+ связь с БД) в виде неких панелей. Реализовать с помощью VTW - это бы взяло половину траблов на себя. Возможно ли? Или лучше писать свой виртуальный грид?

Автор: Quadr0 17.11.2006, 23:31

M
Girder
Ента ссылка - есть в низу;-)

...

Автор: NaumLeNet 18.11.2006, 01:59
Я очень благодарен вам за вашу статью, в свое время "привыкал" к VTW именно по ней. 

Но тут речь идет о другом, насколько я понимаю. Editor визуализируется непосредственно в момент вызова, т.е. когда пользователь начинает редактировать ноду. В вашем примере это сделано в виде некоего универсального интерпритатора данных в наиболее удобном для редактировании формате. Кликнули - отредактировали в спец. редакторе - перечитали результат.

Мне же необходимо визуализировать данные в виртуальном гриде (VTW) не в виде plain text, а в виде особых UserControl'ов (Frames) в качестве ноды. 

Вещи похожие, но несколько разные. Тут я виже только одно решение - если бы была возможность едитор держать все время показанным (какой-нить аналог AlwaysShowEditor). Но все равно ряд проблем возникает - OnGetNode -> я должен вызвать метод спец. едитора (до которого надо попроще добраться), который бы синхронизировал контент с БД.

--
По сути хотелось бы максимально быстро и простро задействовать "виртуальную идеологию" VTW с максимально гибким контентом.

Если это все таки невозможно в рамках VTW, то что вы посоветуете?

Автор: Bose 23.11.2006, 12:15
NaumLeNet, TVirtualDrawTree тебе в помощь smile 
И рисуй в любом виде. 


Или как вариант ещё можно посмотреть дополнительные компоненты и примеры на сайте Soft-Gems. Насколько я помню там был компонент Virtual Button Treeview - дерево, с кнопкой в каждой ячейке. http://www.delphi-gems.com/supplement/download.php?ID=77

Автор: NaumLeNet 23.11.2006, 12:53
Bose
Отрисовать то, в принципе, не проблема =) Но ведь дело не только в отрисовке, а в реакции расположенных в гриде контролов на действия пользователей. Идеальный вариант расположение TFrame в ячейках грида.

За Virtual Button Treeview пример сенькс, сейчас посмотрю, может решит мою проблему.

--
Проблемы не решает. Реализация в лоб - отрисовка кнопки, контроль клика, перерисовка и прочее. Рендерить и контролить динамический контент на фрейме таким макаром, имхо, извращение. Как быть?...

Автор: Bose 23.11.2006, 16:51
Цитата(NaumLeNet @  23.11.2006,  12:53 Найти цитируемый пост)
Рендерить и контролить динамический контент на фрейме таким макаром, имхо, извращение. Как быть?...

Моё сугубо персональное мнение в том, что создавать по фрейму для каждой ячейки, каждого столбца*каждого узла - это уже извращение smile И потребление памяти при этом вырастет, и перерисовка каждого фрейма будет занимать какое-то время... smile 

Поэтому вариант с собственноручной прорисовкой мне кажется более простым smile...


NaumLeNet, а почему бы не рисовать эти фреймы самому?...  В OnInitNode создавать нужные фреймы, а в OnDraw или в AfterCellPaint, корректировать координаты и размеры уже созданных фреймов... только вот по-моему тормозииить это будеееет.... 

Автор: NaumLeNet 23.11.2006, 18:21
Вот в тормозах и проблема )

Задача стоит простая - необходим обычный лист интерактивных элементов с разного рода контентом. Первым делом пробовал ScrollBox + TPanels (+ создание на них кучи контролов, типа лейблов / имаг и прочего). Тормозаааа...

Потом в VS2005, в Syncfusion компонентах увидел реализацию грида, где каждая ячейка была UserControl'ом (+ DataBinding и прочие фишки). Портировать код просто нереально, слишком на дотнете завернуто. Там 50.000 юзерконтролов в гриде инициализировались ~1.5-2 сек(!) и работали быстро (явно грид виртуальный).

Автор: Bose 23.11.2006, 19:41
Всё, что могу посоветовать, это всё же использовать TvirtualDrawTree. Написать процедуру которая будет рендерить картинку фрейма в зависимости от данных, и выводить в дерево эту картинку. А при редактировании, уже подставлять вместо картинки реальный фрейм. Для увеличения скорости, отрендеренные картинки можно кэшировать, т.е. хранить в памяти копии всех фреймов, и перерисовывать их только, когда изменятся данные.



Автор: NaumLeNet 24.11.2006, 03:32
Я понимаю, о чем вы. Давайте еще разок -- отрендерить не проблема, организовать кэширование тоже. Редактировать не надо. А вот как внести интерактивность? ) На фрейме есть гиперссылки, есть пиктограммы (с обработкой MouseEnter/Leave) и прочие элементы.

Автор: Bose 24.11.2006, 17:21
Цитата(NaumLeNet @  24.11.2006,  03:32 Найти цитируемый пост)
 А вот как внести интерактивность? ) На фрейме есть гиперссылки, есть пиктограммы (с обработкой MouseEnter/Leave) и прочие элементы.

Либо обрабатывай MouseMove в дереве, либо выводи на экран все элементы, и пусть они сами обрабатывают эти события smile 
NaumLeNet, по-моему, поставленная задача не имеет быстроработающего тривиального решения. Готового рецепта нет. Да и по-моему, это уже слишком: интерактивные элементы в виртуальном дереве smile Имхо smile 

Автор: NaumLeNet 24.11.2006, 18:24
Короче решил проблему ) Жестоко, но решил. На базе VTV:

OnInitNode: создание фрейма, внедрение его в VTV, data binding
OnAfterCellPaint: появление фрейма, позиционирование его по Cell Rect'у.
OnFreeNode: удаление фрейма

TNodeData имеет указатель на связанный фрейм.

Есть ряд проблем и нюансов, но думаю решу. 

Один из них:
Т.к. OnAfterCellPaint не происходит, когда нода уходит из области видимости (к примеру, по причине изменения высоты нод(ы)... То фрейм который "связан" с этой нодой понятное дело остается на предыдущей позиции. Видать придется насильно обработать ряд нод за границей клиентской области.

В общем всем спасибо. Вопрос закрыт.

Автор: tauren81 28.7.2010, 17:32
А можно ли вставлять контролы не стандартного набора, а к примеру TRichViewEdit (как то так), проблема в том что он показывается во время инициализации редактирования, но прокрутка теряется, и что хуже после закрытия редактиорвания происходит не корректаня обработка фокуса, когда элемент родитель уже убит а сам контрол обрабатывается родными модулями, та же фигня с компонентами dxTreeList (хотел попуп едит затолкать). Неужто только  придется использовать обычные компонеты?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)