Delphi: предлагаю совместно разработать объект- WYSIWYG-отчет (основа
- From
- bunin@mes.djug.pyatigorsk.su (2:50/128.0)
- To
- All ()
- Date
- 1996-06-27T08:30Z
- Area
- SU.WINDOWS.PROG
X-RealName: "Oleg V Bunin"
RFC-Subject: Delphi: предлагаю совместно разработать объект- WYSIWYG-отчет (основа имеется) см.письмо
Исходные данные:
Практически любой отчет представляет собой комбинацию следующих
данных:
- данные, представленные в табличной форме
- данные, представленные в виде обычного текста.
В одном отчете может быть несколько таблиц (не путать с таблицами
баз данных) и несколько фрагментов текста. Последние могут
располагаться перед, после, между и сбоку от таблиц.
Таблицы и текстовые фрагменты могут быть произвольно и независимо
друг от друга отформатированы. Форматирование включает в себя:
- шрифт, его размер,цвет,стиль и т.п.
- обрамление таблицы и ее отдельных ячеек, толщина и стиль
обрамления
- заливка фона ячеек таблицы и текстовых фрагментов.
Принцип формирования отчета:
Разработка объекта-отчета основана на том, что сам отчет не выполняет
никаких действий, связанных с получением данных, в отличие, скажем, от
ReportSmith и CrystalReport. Прикладная программа полностью ответственна
за получение данных для отчета (поиск и выборка записей из баз данных
и т.п.) и за их занесение в форму отчета. Этим самым исключается двойное
выполнение трудоемких операций поиска и извлечения информации из баз
данных. Кроме того, появлется больше возможностей по преобразованию и
форматированию данных перед их занесением в отчет. Например, пользователь
осуществляет выборку записей, просматривает ее в TDBGrid, при желании
помечает нужные записи и затем формирует отчет из уже отобранных данных.
Таким образом, объект-отчет должен обладать широким набором функций,
позволяющих программно (через API) помещать текст в заданное место отчета,
произвольно фоматировать текст и таблицы. Кроме того, должна быть
возможность редактировать и форматировать отчет уже после его создания.
Варианты решения:
Для решение задачи можно использовать два подхода.
1. Создать что-то вроде WinWord.
Недостатки: это слишком круто и трудоемко, и очень сложно (а,может,
невозможно) создать соответствующий API для форматирования и занесения
в _заданное место_ отчета данных. Кроме того, для редактирования уже
созданного отчета придется действительно создавать настоящий Word.
Короче говоря, задача практически неразрешимая.
2. Отчет в виде электронной таблицы (ЭЛ).
Идеальное решение.
Опробовано мною на примере объекта TSheet из пакета Borland Visual
Solution Pack. Отказался от TSheet по нескольким причинам: неполный
API для программного форматирования, проблемы при печати на матричных
принтерах, нет Preview, используется VBX и dll размером >400К, при
вводе в таблицу определенных данных пытается без спроса форматировать
их (например, заменяет число на дату вида "Oct.1996").
Благодаря тому, что все рабочее поле отчета-ЭЛ разбито на ячейки,
очень легко осуществлять:
- помещение данных в заданное место (строку,колонку), в отличие от
Word-образных отчетов, где координатная система основана на мм или
дюймах;
- произвольное форматирование на уровне ячейки (внутри ячейки
форматирование единое для всего ее содержимого), что вполне достаточно
для большинства отчетов. Привязка формата к ячейкам избавляет от
необходимости его хранения и представления в RTF-подобном формате.
- создание и форматирование таблиц, поскольку ЭЛ - это уже готовый
шаблон таблицы.
- изменение ширины и высоты ячеек (как в Excel).
- разбиение на страницы.
Что уже мною сделано:
- создан объект, отображающий ЭЛ ( с возможностью включения,
выключения показа нумерации строк и столбцов - как в Excel )
- создано API для произвольного форматирования (шрифт, обрамление,
выравнование) заданной ячейки и помещению в нее текста
- реализована возможность:
а) текст, не помещающийся в ячейку, занимает соседние незанятые
ячейки
б) объеденение (слияние) нескольких подряд идущих ячеек, и задание
для области объедения выравнивания вправо, влево, по центру. Если
объеденить по всем строкам ЭЛ - получится простенький RTF-редактор.
в) задание количества фиксированных строк и столбцов, не перемещаемых
при скроллинге таблицы
- изменение ширины колонок и высоты строк реализовано через API и с
помощью мышки (пока на данный момент эти изменения не фиксируются).
- простейшие объекты для хранения описания всей ЭЛ и отдельных (занятых)
ячеек
- печать отчета (но есть проблемы)
Особенности реализации:
- за основу взят объект TCustmGrid из VCL Delphi 1
- размер шрифта и высота строк ЭЛ задаются в пунктах
- ширина столбцов задается в мм
Объект-ЭЛ может использоваться не только для создания отчета, но и для
ввода и показа данных в сложной табличной форме.
Главное, что еще требуется:
- доработать печать, ввести разбиение на страницы (по горизонтали
и по вертикали) и расположение на странице с возможностью масштабирования
- создать Preview
- предусмотреть возможность включения в отчет BMP-изображений
- реализовать заливку фона ячеек
- экспорт ЭЛ в RTF-формат
- сохранение и чтение отчета из файла
- вывод текста в ячеках с учетом заданного формата (текст,число,дата
и т.п.)
- вставка строк и столбцов
- Protected-области
- копирование ячеек и областей вместе с их форматированием через
Clipboard
Если кто согласен взяться за совместную доработку, сообщайте, я пошлю
исходные тексты и пример.
P.S. Если у кого-нибудь имеются какие-либо исходники, касающиеся
печати и Preview (Delphi, C) буду очень благодарен, если вы ими
поделитесь.
Олег Бунин
---
* Origin: YuzhMES (2:50/128.0@fidonet)