По поводу реализации. Нужно разделить хранение данных и отображение. Вот твою VirtualTable можно допилить до требуемого функционала. Она должна быть в виде базового класса, содержащего все методы и события для работы с данными в отдельном *.pas файле. На основе него отдельный компонент "VirtualTable" и компоненты для манипулирования данными в нем.
Затем твоя или любая другая визуальная таблица. В ней отпадает необходимость заниматься хранением данных: она подключается к VirtualTable как менеджеру (или компонентам работы с БД, которые тоже внутри хранят данные так же, как и VirtualTable) и получает от него все что надо. Колонки, строки, значения колонок в каждой строке, события на перед/после загрузки данных/модификации значений/добавления-удаления строк-колонок. При этом сам компонент теряет кучу точек для работы с данными (как случилось при переходе от MTStringTable к MTStrTbl).
andrestudio писал(а):
Нужно сохранять атрибуты ячеек(Цвет, Шрифт, Стили шрифта и цвет, Align - Выравнивание по горизонтали и вертикале) Тут напрашиваетсяПри этом к каждой строке это необязательно: изначально визуальная таблица имеет форматирование по-умолчанию для каждой колонки. Если разработчик схемы хочет отформатировать какую-то ячейку в строке - добавляется отдельный компонент "Форматирование ячеек" как менеджер к визуальной таблице. На каждое событие отрисовки строки таблица уведомляет все такие компоненты чтобы те дали нужные данные. В этом компоненте сразу можно давать точки со значениями отдельных колонок нужной строки и пользователь на основе их значений задаёт форматирование (или форматирование уже задано в компоненте, пользователь только принимает решение включать его, или оставить стандартное согласно таблице). Опять же - уменьшаем количество точек у визуальной таблицы.
А вот если пользователь программы выбирает ячейку и щелкает на панели инструментов "жирный шрифт"/"выравнивание", то его форматирование цепляется уже к конкретной строке. Почему к строке - если цеплять к каждой ячейке, то у каждой ячейки должен быть список прикрепленных данных, что накладно по памяти; строк меньше, чем ячеек, а к строке прикрепляется структура, содержащая форматирование для каждой ячейки строки.
Уменьшаем дальше количество точек-свойств таблицы: добавляем отдельные компоненты для добавления/удаления/перемещения/скрытия/отображения колонок, связывания их с колонками в VirtualTable (колонки в VirtualTable должны иметь такие свойства как Name, Title), и другие, которые относятся к визуальной таблице, а не к данным в ней (в VirtualTable), например, экспорт в HTML/RTF с форматированием.
Таким образом, например, большая часть существующих компонентов от MTStrTbl (манипулирование строками-колонками-значениями, импорт-экспорт, сортировка-поиск) на самом деле должны перекочевать к VirtualTable. А у MTStrTbl остаться только форматирование и связывание отображаемых колонок с колонками в VirtualTable (по свойству Name), предоставление редактирования значений.
В визуальной таблице задается связь к менеджеру VirtualTable. Перечень колонок задается в виде
"<name1>=<width>=<format>=....."
"<name2>=<width>=<format>=....."
где <name> - из требуемой колонки VirtualTable. Заголовок колонки берется из соответствующего Title.
Фактически функционал визуальной таблицы сводится к чтению данных из подключенной VirtualTable и отрисовке в окне.