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)