Вот что у нас получится. Дерево работает над базой MySQL. В примере 2 дерева, работающие над одной таблицей базы. 3-й ряд кнопок сам определяет какое дерево активно. Исходники прилагаю.
Типовая таблица для дерева. Это минимальный набор полей. Всё остальное можно добавлять по необходимости. При этом копирование-вставка записей будут происходить корректно.
Основные особенности
Динамическая загрузка веточек (на OnExpanding). Позволит более эффективно расходовать память.
В одной таблице могут быть несколько деревьев, отличающиеся по полю external_id. Скажем у нас есть вопросы разных тестов в группах. Тогда мы можем все вопросы всех тестов писать в одной таблице. А внешний ключ делать на тесты.
Вырезать копировать вставить работает для произвольного количества полей. Используется инструкция insert select базы mysql.
Можно вырезать копировать и вставлять из одного дерева в другое, при условии, что деревья находятся в одной таблице. В примере я это реализовал.
Выделение элементов происходит либо по нажатию на чекбоксы либо по нажатию на сам элемент.
Основной функционал
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// main methods procedure InitialSetup; procedure InitialUpdate; procedure DeleteCheckedOrSelected; procedure AddFolder(AName:string); procedure AddFile(AName:string); procedure NodeUp; procedure NodeDown; procedure Copy; procedure Cut; procedure Paste; procedure ClearAllPointers; procedure Rename(ANewName:string); |
Настройка дерева перед запуском
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
with PSDBTreeView1.MC do begin FDConnection:=DBConnection.FDConnection; DBName:='coffeetest_db'; DBTable:='dbtreeexplorertesttable'; with DBFields do begin id:='id'; idParent:='idParent'; name:='name'; sortIndex:='sortIndex'; isFolder:='isFolder'; isTrash:='isTrash'; isChecked:='isChecked'; external_id:='external_id'; end; IsUseExternalID:=true; external_id_value:=1; PSDBTreeView1.MC.CopyCutPaste.OnCopyCut:=OnCopyCut; PSDBTreeView1.MC.MF.OnFocus:=OnFocusDBTreeView; InitialSetup; end; |
Освобождение памяти при уничтожении
Пока не доделал этот момент, освобождение происходит в ручную
1 2 3 4 5 6 7 8 9 |
procedure TForm1.FormDestroy(Sender: TObject); begin PSDBTreeView1.MC.ClearAllPointers; //PSDBTreeView1.MC.Checkboxes.UncheckAllChecked; PSDBTreeView2.MC.ClearAllPointers; //PSDBTreeView2.MC.Checkboxes.UncheckAllChecked; end; |
Компонент делал на основе панели. У панели нет OnDestroy. Пытался ловить сообщения, но пока не получилось корректно. Доделаю позже.
Что ещё не доделал?
Drag and Drop.
Упростить настройку дерева перед запуском. Тут столкнулся с трудностью, что если перенести все методы на уровень TPSDBTreeView, то не срабатывает событие OnCopyCut. Но это сделаю, позже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
{ doesn't copy paste if setup like this, OnCopyCut doesn't work with PSDBTreeView1 do begin FDConnection:=DBConnection.FDConnection; DBName:='coffeetest_db'; DBTable:='dbtreeexplorertesttable'; id_field:='id'; idParent_field:='idParent'; name_field:='name'; sortIndex_field:='sortIndex'; isFolder_field:='isFolder'; isTrash_field:='isTrash'; isChecked_field:='isChecked'; external_id_field:='external_id'; IsUseExternalID:=true; external_id_value:=1; PSDBTreeView1.MC.CopyCutPaste.OnCopyCut:=OnCopyCut; PSDBTreeView1.MC.MF.OnFocus:=OnFocusDBTreeView; InitialSetup; end; } |
Перенос свойств и событий в объектный инспектор.
Удаление элементов дерева можно упростить при помощи каскадного удаления в таблице.
При уничтожении объекта, память выделенную под указатели нужно очищать извне, то есть, например так
1 2 3 4 5 6 7 8 9 |
procedure TForm1.FormDestroy(Sender: TObject); begin PSDBTreeView1.MC.ClearAllPointers; //PSDBTreeView1.MC.Checkboxes.UncheckAllChecked; PSDBTreeView2.MC.ClearAllPointers; //PSDBTreeView2.MC.Checkboxes.UncheckAllChecked; end; |
Исходники
В исходниках сами исходники и пример использования
Как использовать?
Проинсталлировать PSDBTreeView_BPL.
Прописать в пути в tools/options/library/librarypath
\ // путь до папки, где у Вас будут храниться исходники компонента
\00_Main
\01_TreeView
Далее добавить на форму, настроить перед запуском. Смотрите пример и повторяйте. Будут вопросы пишите.
В базе MySQL создать таблицу с полями как на рисунке выше.
Для базы потребуется libmysql.dll