Список отчетов для отображения на рабочем столе хранится в базе данных, в настройках пользователя (в таблице , где 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 о необходимости перерисовать отчет.