Список отчетов для отображения на рабочем столе хранится в базе данных, в настройках пользователя (в таблице
, где tp_UserProperties
). Для предоставления программного доступа к этому списку служит класс usrp_Name
= ‘DashboardReports’
TDashboardManager
. Этот класс позволяет:
Предоставить список отчетов рабочего стола в виде объекта типа TssDataStorage
;
Сохранить изменения в списке отчетов на основе полученного нового списка формата TssDataStorage
;
Дополнительно, при сохранении вызвать обработчики этого события. Подписаться/отписаться от этого события можно через свойство poOnChangeEventsList
класса TDashboardManager
.
Для редактирования этого списка отчетов служат классы TfmDashboardReports
(отображение списка отчетов) и TfmDashboardReportsEditor
(карточка редактирования). Отображение списка отчетов и сохранение изменений в этом списке выполняется через вызовы соответствующих методов объекта типа TDashboardManager
(см. выше).
Классы, используемые для подготовки отображения отчетов на рабочем столе, находятся в модуле uDashboardReportsManager.pas
.
Классы, занимающиеся отрисовкой отчетов:
TDashboardReportFlowCell
(потомок от TssFlowCell
);
TssFlowGrid
(потомок от TssControl
).
Классы, занимающиеся подготовкой данных для отчетов:
TDashboardReportsManager
(список менеджеров отчетов);
TDashboardReportManager
(менеджер отчета);
TDashboardReportControlThread
(поток подготовки данных для отчета).
Общая логика работы:
Создается объект TDashboardReportsManager
.
Для каждого отчета создается объект TDashboardReportManager
, который внутри себя создает объекты TDashboardReportFlowCell
и TDashboardReportControlThread
.
Поток TDashboardReportControlThread
занимается получением данных для отчета – формата печати и параметров отчета. Если какие-то из этих данных поменялись, то поток:
формирует в ячейке TDashboardReportFlowCell
новую картинку отчета.
Передаёт эту ячейку объекту TDashboardReportsManager
на отрисовку на рабочем столе.
Объект TDashboardReportsManager
в основном потоке перерисовывает полученные из п. 2.a ячейки.
Подробнее по каждому классу.
TDashboardReportFlowCell
– класс, содержащий данные для отрисовки отчета.
Формирует (на основе печатного представления отчета и параметров отчета) и сохраняет у себя изображение отчета.
Рисует содержимое ячейки отчета, на основе ранее сформированного изображения отчета и известного названия отчета.
TssFlowGrid
– визуальный класс, занимающийся отрисовкой. Потомок от TssControl
.
Хранит список объектов – потомков от TssFlowCel
. В данном случае – это объекты типа TDashboardReportFlowCell
.
Обеспечивает правильное выравнивание отрисовываемых ячеек.
Отрисовывает ячейки.
Открывает диалог настройки отчетов при нажатии на кнопку настройки отчетов.
TDashboardReportsManager
– класс верхнего уровня, содержащий список менеджеров отдельных отчетов.
Формирует внутри себя список менеджеров отдельных отчетов. При изменении пользователем списка отчетов рабочего стола, класс переформировывает список менеджеров отдельных отчетов и обновляет список отрисовываемых ячеек. Уведомление об изменении списка отчетов происходит через подписку на соответствующее события (через свойство poOnChangeEventsList класса TDashboardManager
).
Перерисовывает ячейки с изменившимися отчетами. Об изменении приходит уведомление от менеджеров отчетов (см. выше).
Уведомляет менеджеры отчетов об изменении в базе данных параметров отчета.
TDashboardReporsManager
– класс, управляющий подготовкой данных по конкретному отчету.
Хранит ссылки на управляющий поток (объект типа TDashboardReportControlThread
) и отрисовываемую ячейку (объект типа TDashboardReportFlowCell
).
Реагирует на уведомление от TDashboardReporsManager
о необходимости переформировать отчет, запуская в потоке TDashboardReportControlThread
подготовку данных для отчета.
Реагирует на уведомление от TDashboardReportControlThread
о необходимости перерисовать отчет, формируя в TDashboardReportFlowCell
изображение отчета и передавая ячейку на перерисовку в TDashboardReporsManager
.
TDashboardReportControlThread
– класс, занимающийся подготовкой данных для отчета. Это поток, который в цикле:
Ждет уведомления о необходимости подготовить данные для отчета:
Подготавливает данные для отчета;
Уведомляет TDashboardReporManager
о необходимости перерисовать отчет.