| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > [Virtual Treeview] Встраиваемые компоненты |
| Автор: NaumLeNet 17.11.2006, 18:40 |
| Возможно ли использовать в качестве контента для ноды некий контрол? К примеру TFrame? Стоит задача визуализации очень большого списка записей (+ связь с БД) в виде неких панелей. Реализовать с помощью VTW - это бы взяло половину траблов на себя. Возможно ли? Или лучше писать свой виртуальный грид? |
| Автор: Quadr0 17.11.2006, 23:31 | ||
... |
| Автор: 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 тебе в помощь И рисуй в любом виде. Или как вариант ещё можно посмотреть дополнительные компоненты и примеры на сайте 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 пример сенькс, сейчас посмотрю, может решит мою проблему. -- Проблемы не решает. Реализация в лоб - отрисовка кнопки, контроль клика, перерисовка и прочее. Рендерить и контролить динамический контент на фрейме таким макаром, имхо, извращение. Как быть?... |
| Автор: 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 | ||
Либо обрабатывай MouseMove в дереве, либо выводи на экран все элементы, и пусть они сами обрабатывают эти события NaumLeNet, по-моему, поставленная задача не имеет быстроработающего тривиального решения. Готового рецепта нет. Да и по-моему, это уже слишком: интерактивные элементы в виртуальном дереве |
| Автор: 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 (хотел попуп едит затолкать). Неужто только придется использовать обычные компонеты? |