Delphi. Иерархические данные. DBTreeView своими руками. Добавляем Checkboxes

Продолжаем серию DBTreeView своими руками. В данной статье добавим Checkboxes к элементам дерева при помощи свойства StateIndex. Добавим CheckBoxes и свяжем их статус с базой данных. Скажу сразу, что Checkboxes здесь это картинки 16*16 и можно организовать любые другие картинки, например radioboxes, но там совершенно другая логика. В данной статье посмотрим только на Checkboxes и их связь с базой данных.

2

 

Начали!

Добавим ImageList на форму и добавим 3 картинки 16*16 таким образом

3

У TreeView1 выберем в свойстве StateImages ImageList1

9

Для того, чтобы выводить чекбоксы, воспользуемся свойством TTreeNode.StateIndex. Вот, что написано в Help по этому поводу

StateIndex реагирует на нажатие OnCLick, а ImageIndex не реагирует, насколько я понял из экспериментов, поэтому для галочек, нам как раз подойдет StateIndex.

Отсутствие иконки это индексы 0 и -1!!! Это важный факт! Поэтому, в качестве рабочих подключим иконки 1 и 2.

Само присвоение иконок можно организовать следующим образом, немного обновив процедуру UpdateTree

По хорошему, надо запоминать статус узла в БД, и при чтении из БД отображать его. Но в данном случае, не будем усложнять и сделаем простой вывод картинок. Работу с базой данных отложим на конец статьи.

Код обработки чекбоксов при нажатии на узел

Переменная NotAllowed для победы над сложностью, которая состоит в том, что при разворачивании узла происходит одновременное нажатие на узел, и статус картинки чекбокса меняется. Попробуйте без переменной NotAllowed, которую я ввёл – разверните и сверните любой узел с детьми и увидите о чем я говорил.

Запрещаем обработку TreeViewClick при разворачивании

Запрещаем обработку TreeViewClick при сворачивании

Разрешаем при отпускании мыши

Собственно обработка

Во вспомогательном модуле DMDB

Как связать чекбоксы с базой данных?

Действительно, ведь мы пишем компонент, DBTreeView, соответственно и связь с базой данных также должна быть…

Для начала добавим в базе одно поле IsChecked

4

 

 

В программе MySQL WorkBench

Сначала сделаем модель через Reverse engeneering

Сделаем изменения в модели

Синхронизируем её через DataBase Synchronize model

 

Теперь перепишем процедуру DBSelection следующим образом.  Эта процедура будет запоминать выбор и записывать его в базу данных

 

Чтение из базы данных

Сам код чтения из базы следующий

его мы вставим в код UpdateTree процедуры, который написали ранее

Запись в базу данных

Для записи в базу данных у нас в модуле DMDB было оформлено несколько процедур

В каждой из них нужно добавить изменения

Вставка одной записи в дерево

Вставка нескольких узлов сразу

Также добавить в DragDrop

Если без этого кода, то галочка не проставляется

Также добавить в NodeUP и NodeDOWN

Если без этого кода, то галочка не проставляется

Тестируем работу приложения

5

6

 

7

 

8

 

 

This entry was posted in Delphi, Без рубрики, Деревья. Bookmark the permalink.