On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

Delphi 5. Обзор компонентов

В этой статье будет рассказано о компонентах TXLSWrite и TXLSRead, позволяющих работать с файлами MS Excel (даже без наличия самого Excel`я, записывать файлы этого формата с вашими данными, не запуская приложения MS Office), о компоненте для интерфейса от DF Software, решающим многие проблемы программиста, - DFS Status Bar, и об очень необычном, но, тем не менее, весьма полезном модуле TVObject, дающим вам возможность работать с произвольными объектными реляционными базами данных.

Допустим, вам необходимо написать клиентское приложение для работы с некоторой базой данных. Процесс разработки структуры данных я опущу за ненадобностью, так как его стоило бы рассмотреть в другой статье. Будем считать, что база данных у вас уже готова, да и приложение работает без проблем. Но, как известно, это еще не все. Одной из главных задач подобных программ является возможность работы с генератором отчетов - то есть удобный, быстрый и хорошо оформленный вывод данных на печать или в файл. Для этого существует множество различных способов: от создания серверов автоматизации приложений MS Office до создания COM-сервера Perl и передачи данных в скрипт с последующим выводом в документ, созданный на основе ранее предопределенного шаблона. В сущности, каждый из этих методов хорош по-своему и имеет приверженцев. Однако какой бы вы ни использовали метод, проблема всегда одна - как сделать форматированный вывод данных в таблицу. Под форматированным выводом я тут понимаю необходимость расставить данные в ячейки, провести некоторые логические операции с данными (подсчет сумм или количеств значений, разбиение на сегменты и т.д.), а также выделение цветом в зависимости от назначения данной ячейки. Можно выводить табличные данные и в MS Word, но мне показалось, что предпочтительней будет делать экспорт в MS Excel - это все-таки табличный редактор. Итак, предлагаю вам оценить следующие два компонента: TXLSWrite, TXLSRead. Как ясно из названия, эти компоненты берут на себя задачу считывания и записи информации в файл формата электронных таблиц MS Office. Не визуальные, они не занимают много места в скомпилированном файле, работают напрямую с файлом *.xls, что позволяет и не иметь приложения MS Excel на компьютере. Последнее свойство особенно хорошо, так как позволяет обойти массу проблем, возникающих при косвенном (сервер автоматизации) запуске приложения MS Office. К примеру, при сворачивании приложения Офиса во время работы генератора отчетов возможно неверное оперирование данными при вставке в документ, зависание компьютера или самого приложения.
Для создания шаблона отчета (если вы хотите передавать данные через сервер автоматизации) или собственно отчета вам будет достаточно трех компонент: TStringGrid, TXLSWrite, TXLSRead. Строковая сетка очень похожа на лист электронной таблицы, именно с ней мы и будем работать. Ввод данных ничем не отличается от, собственно, ввода данных прямо в Excel`e - есть даже смысл создать интерфейс, частично копирующий алгоритм ввода данных в ячейки, как сделал автор в тестовом приложении. Исходя из того, что большинство данных в MS Excel вполне просто представляются в строковом виде, мы получаем возможность вводить не только фиксированные значения, но и пользоваться формулами, сносками, создавать вычисляемые поля. Чтобы разнообразить представление данных в документе, есть возможность создания своих стилей для ячеек с данными. Например, стиль ячейки, в которую предполагается поместить какое-либо итоговое значение, может содержать данные о цвете шрифта, его размере и типе, информацию о виде границ ячейки, цвете фона, выравнивании текста. Естественно, что вы имеете возможность создавать неограниченное количество стилей. Есть поддержка логических значений - соответствующие свойства позволяют устанавливать значения для ячеек со значениями true и false. Радует и обилие поддерживаемых версий документов этих компонент - читают версии от 2.0 до 97 и могут сохранять документы в версиях от 4.0 до 97 включительно. События этих компонент позволяют определять пользовательские обработчики в зависимости от типа данных, сопоставленных определенной ячейке. Скажем, для ячейки с типом данных "дата-время" есть событие OnDateTimeCell.
В общем, не скажу, что компоненты так хороши, как пишет сам автор. Во-первых, нет исходного кода - он доступен только после регистрации за $30 (это и понятно - кто станет за просто так раскрывать свой алгоритм записи файла MS Excel напрямую). Во-вторых, нет документации, а только краткий файл описания некоторых возможностей, хотя в самих компонентах есть много недокументированных функций, в которых не так уж легко разобраться. Но стоит признать, что преимущества тоже есть. Это и прямая запись в файл, и поддержка многих версий, прозрачная работа для пользователя и программиста, достаточное количество функций и свойств для создания отчетов средней сложности. Используйте эти компоненты, если у вас нет необходимости создавать очень сложные, дифференцированные отчеты. Мое мнение таково, что эти компоненты лучше всего подойдут для решений задач средней сложности для небольших предприятий (программа для отдела кадров, например) или приложений для домашнего использования, как, скажем, Data@cd (каталог ваших дисков), WhereIsIt (очень продвинутый менеджер ваших дисковых архивов).
Теперь же обратимся снова к примочкам интерфейса. DFS Status Bar - один из тех компонент, про который можно сказать All-in-One, столько возможностей для настройки он в себе содержит.
Как известно, наиболее частым вопросом о компоненте TStatusBar является вопрос о включении в одну из панелей TProgressBar для отображения завершенности некоторого длительного процесса. Иногда еще встречается необходимость включить маленькую картинку в строку статуса (как в MS Word при сохранении документа или посылке его на печать). Могу предположить, что и семафоры состояния кнопок Caps Lock, Scroll Lock и Num Lock также найдут свое применение. Так вот, уважаемые любители продвинутых Status Bar`ов, этот компонент - то, что вы искали. Выглядит он совершенно одинаково со своим собратом из VCL, вот только свойств у него больше будет, что не может не радовать. Перейдем непосредственно к возможностям испытуемого. Как уже было сказано, он помогает решить относительно широкий спектр проблем. Но обо всем по порядку. Так, можно задать три вида бегунка. Первый - нормальный, к которому мы все привыкли. Второй - передвигающийся влево-вправо "колобок". Третий - как в Netscape Explorer. Можно вставить какое-либо изображение в панель - в данном случае это микросхема из поставки Borland Delphi. В следующей ячейке приведен пример вставки даты и времени. Но возможности этим не ограничиваются. Вставлять можно как время и дату именно в таком порядке, так и только время или дату, или дату и время соответственно - как вам будет удобнее и нужнее. На второй, нижней панели (их две для лучшего обозрения возможностей) вставлены семафоры трех клавиш: Caps Lock, Num Lock и Scroll Lock соответственно. Далее идет панель с вставленной датой и панель с датой и временем (как и говорилось об этом выше - есть такая возможность). Еще два типа панелей могут обеспечить вам, скажем, имя текущего открытого файла (панель показывает начало и конец строки или пути к файлу), а также рабочий каталог программы (показывает только начало длинной стоки). Но если вам и этого мало, можете поставить в свойстве PanelType значение OwnerDraw, - и рисуйте тогда на панели сами все, что вам заблагорассудится. И, конечно же, на этот компонент вы можете "положить" другие визуальные компоненты, если вам это понадобится, - это тоже поддерживается.
В остальном этот компонент содержит все те же атрибуты, что и его предок из поставки Borland. Его можно "лепить" с помощью Align к краям формы, выставлять формат даты и времени для соответствующих панелей, цвет фона и шрифта, скорость передвижения бегунков, их позицию, выставлять свойство AutoFit, чтобы панель в строке статуса занимала именно столько места, сколько занимает текст в ней.
Этот компонент я бы посоветовал всем, кто так или иначе собирается сделать интерфейс программы более информативным и удобным для пользователя. Работать с этим произведением искусства программерской мысли поистине приятно, написан он качественно и грамотно, являясь полностью совместимым со стандартными компонентами VCL.
Следующий предмет обзора не совсем обычен с точки зрения компонентов. Это модуль, содержащий в себе массу функций для работы с коллекциями. И хотя на первый взгляд применение ему найти очень трудно, это впечатление обманчиво. Сам автор, Андрей Дроздов, позиционирует свое детище как модуль для обеспечения работы с объектными реляционными базами данных, позволяющих иметь к тому же разделение доступа к данным как в современных развитых продуктах больших компаний.
Этот модуль предназначен для работы с объектно-ориентированными базами данных и организации в памяти структур данных, таких как коллекции объектов, коллекции строк, множества целых чисел, битовые множества и т.п. За основу принят объектно-ориентированный подход, который заимствован из Turbo Vision. Это значит, что все данные содержатся в виде полей некоторых объектов, которые являются потомками базового класса TVObject. Таким образом, когда мы говорим о таблице в подобной базе данных, мы имеем в виду коллекцию - набор объектов. Но, несмотря на "похожесть" с Turbo Vision, этот модуль не является тривиальным переносом его из среды Turbo Vision в Borland Delphi. Так как в основе подобной конструкции лежит сам язык Object Pascal, то и ограничения на типы данных накладываются только возможностями языка. Это, конечно, позволяет полностью использовать возможности языка при проектировке и работе с базой данных, но надо отметить, что при этом не стоит забывать о нормализации данных. Это особенно важно, учитывая то, что сложность структуры данных может существенно повлиять на скорость работы и доступность данных из программы. Иногда лучше потратить на несколько дней больше при проектировании базы данных, чем потом мучаться, пытаясь создать процедуру, которая будет эти данные считывать. Также существуют несколько серьезных отличий в основах организации работы этой системы. Например, в основном работа с данными ведется в памяти компьютера. А для удаленных записей имеется корзина, которая сохраняется вместе с коллекцией и из которой можно восстановить удаленные записи или окончательно их удалить. Но есть и сходства. Как и в "нормальных" СУБД, возможно использование индексов, они служат для сортировки данных или для сохранения уникальности некоторых ключей. Хотя может быть и так, что индекс не будет отвечать за сортировку. Отличие этих индексов состоит в том, что они не сохраняются в коллекции, а создаются при загрузке базы методом быстрой сортировки. Учитывая, что структура данных может быть очень сложна, автор реализовал несколько очень хороших методов сортировки и поиска по любому из индексов. Как и в любой реляционной базе данных, между коллекциями могут быть установлены непосредственные связи (в объекте детальной коллекции хранится ссылка (указатель) на соответствующий объект главной коллекции). Для сохранения объектов на диске используются потоки и хранилища. Поток используется, в основном, для последовательной записи (чтения) данных на диск. В нем поддерживается возможность верификации данных и защиты их от несанкционированного доступа (включение этих механизмов практически не сказывается на производительности, что есть очень и очень хорошо).
Вообще, в этом модуле реализован эффективный механизм блокировки файлов, позволяющий избежать взаимной блокировки (deadlock) нескольких пользователей (перед открытием многих файлов вы должны заблокировать их все; если у вас это получилось, то можете открывать файлы, предварительно приостанавливая блокировку для каждого из них). Когда программа завершается (в т.ч. аварийно), все блокировки автоматически снимаются. Хранилище является аналогом ресурсов, используемых в Turbo Vision, если кто еще помнит, что это такое, - уж очень древняя штука. Однако в них реализованы некоторые дополнительные возможности: объекты идентифицируются целыми числами, есть поле тэга, реализована быстрая автоматическая дефрагментация (при достижении некоторого процента фрагментации данных), возможность многопользовательского доступа к данным хранилища (в режиме "только для чтения"). Если поток или хранилище открываются только для чтения, то используется быстрый механизм проецирования файлов в память компьютера. Порывшись в мануалах и исходных текстах, набредаешь на интересные объекты: коллекция строк, множества чисел типа Integer и типа Word, битовое множество TVMarks с расширенными возможностями, другие полезные классы. Все это можно прекрасно сохранять в поток и без труда считывать оттуда. Также выполнен интересный механизм "клонирования" объектов, унаследованных от TVObject (создания точной копии объекта). Для объектно-ориентированной базы данных, по словам автора, оказалось, достаточно легко реализовать репликацию и согласование данных (даже не на уровне записей, а на уровне отдельных полей). Поддерживается также многоверсионность данных, позволяющая обходиться без программ конвертации данных, в случаях, когда изменяется их структура.
Ну... Что тут еще можно сказать? Лично я давно искал подобный модуль, так как слишком часто приходится сталкиваться с проблемой сохранения каких-либо многочисленных настроек, небольших баз данных для своих приложений. Автор включил в поставку хорошие файлы описаний модулей, что поможет вам разобраться в принципах функционирования всей иерархии объектов и применения их свойств и методов. Да и просто разобраться в коде этих файлов пойдет на пользу любому программисту - впечатляет решение организации пользовательской базы, ведь в использовании объектов нет ничего сверхъестественного, но оригинален сам подход и полнота возможностей по обслуживанию данных.
Не давая в тексте статьи ссылок на освещаемые компоненты, хочу сказать, что скоро начнет работу сайт, который будет полностью посвящен обзору компонент. Там будут и данные статьи (после их выхода в газете), и более подробное описание свойств и методов компонент, и, возможно, демонстрационные приложения. Если вам необходим какой-либо из компонентов - пишите, я постараюсь помочь вам.



Литература по Borland Delphi