Вверх ↑
Ответов: 4621
Рейтинг: 746
#1: 2021-08-31 11:13:07 ЛС | профиль | цитата
Да у меня что-то все реже появляется вдохновение сесть и углубиться в кодинг. Есть некоторые идеи, вынашиваемые уже годами, но так и не начатые.

По поводу реализации. Нужно разделить хранение данных и отображение. Вот твою VirtualTable можно допилить до требуемого функционала. Она должна быть в виде базового класса, содержащего все методы и события для работы с данными в отдельном *.pas файле. На основе него отдельный компонент "VirtualTable" и компоненты для манипулирования данными в нем.

Затем твоя или любая другая визуальная таблица. В ней отпадает необходимость заниматься хранением данных: она подключается к VirtualTable как менеджеру (или компонентам работы с БД, которые тоже внутри хранят данные так же, как и VirtualTable) и получает от него все что надо. Колонки, строки, значения колонок в каждой строке, события на перед/после загрузки данных/модификации значений/добавления-удаления строк-колонок. При этом сам компонент теряет кучу точек для работы с данными (как случилось при переходе от MTStringTable к MTStrTbl).

andrestudio писал(а):
Нужно сохранять атрибуты ячеек(Цвет, Шрифт, Стили шрифта и цвет, Align - Выравнивание по горизонтали и вертикале) Тут напрашивается
Достаточно в классе VirtualTable предусмотреть добавление пользовательских данных к любой строке по ключу - визуальная таблица хранит свои атрибуты, какой-то другой компонент - свои. Интерфейс VirtualTable имеет методы добавления/чтения таких данных. Поскольку он не должен ничего знать о формате этих данных - он предоставляет события на добавление/удаление строк, чтобы визуальная таблица сама могла удалить прицепленные данные.
При этом к каждой строке это необязательно: изначально визуальная таблица имеет форматирование по-умолчанию для каждой колонки. Если разработчик схемы хочет отформатировать какую-то ячейку в строке - добавляется отдельный компонент "Форматирование ячеек" как менеджер к визуальной таблице. На каждое событие отрисовки строки таблица уведомляет все такие компоненты чтобы те дали нужные данные. В этом компоненте сразу можно давать точки со значениями отдельных колонок нужной строки и пользователь на основе их значений задаёт форматирование (или форматирование уже задано в компоненте, пользователь только принимает решение включать его, или оставить стандартное согласно таблице). Опять же - уменьшаем количество точек у визуальной таблицы.
А вот если пользователь программы выбирает ячейку и щелкает на панели инструментов "жирный шрифт"/"выравнивание", то его форматирование цепляется уже к конкретной строке. Почему к строке - если цеплять к каждой ячейке, то у каждой ячейки должен быть список прикрепленных данных, что накладно по памяти; строк меньше, чем ячеек, а к строке прикрепляется структура, содержащая форматирование для каждой ячейки строки.


Уменьшаем дальше количество точек-свойств таблицы: добавляем отдельные компоненты для добавления/удаления/перемещения/скрытия/отображения колонок, связывания их с колонками в VirtualTable (колонки в VirtualTable должны иметь такие свойства как Name, Title), и другие, которые относятся к визуальной таблице, а не к данным в ней (в VirtualTable), например, экспорт в HTML/RTF с форматированием.

Таким образом, например, большая часть существующих компонентов от MTStrTbl (манипулирование строками-колонками-значениями, импорт-экспорт, сортировка-поиск) на самом деле должны перекочевать к VirtualTable. А у MTStrTbl остаться только форматирование и связывание отображаемых колонок с колонками в VirtualTable (по свойству Name), предоставление редактирования значений.

В визуальной таблице задается связь к менеджеру VirtualTable. Перечень колонок задается в виде
"<name1>=<width>=<format>=....."
"<name2>=<width>=<format>=....."

где <name> - из требуемой колонки VirtualTable. Заголовок колонки берется из соответствующего Title.

Фактически функционал визуальной таблицы сводится к чтению данных из подключенной VirtualTable и отрисовке в окне.
карма: 26

1
Голосовали:andrestudio
Редактировалось 11 раз(а), последний 2021-08-31 14:09:07