Набор компонент VCL и модулей Delphi, автор Кладов Владимир.

Введение.

Данный набор компонентов и модулей предназначен для ускорения разработки в первую очередь. Исторически компоненты создавались в различное время, и модифицировались по мере возникавших надобностей (и продолжают модифицироваться и расширяться постоянно). При создании и модификации компонент не было "изначального плана", не преследовалась идеологическое единство и всеобщий охват всех возможных комбинаций использования, просто реализовывалось то, что срочно понадобилось для той или иной цели. Поэтому вполне естественным образом в коде могут обнаруживаться различные недоработки и несовместимости различных режимов использования. Впрочем, своё предназначение этот набор компонент вполне оправдывает, по крайней мере в своей работе мне приходится использовать их постоянно.

Данный набор компонент и модулей публикуется со всеми исходными кодами под лицензией GPL (Стандартная Общественная Лицензия), текст которой прилагается в архиве дистрибутива и ссылка на который имеется в начале практически каждого исходного файла.

Установка

Состав:

 TFastListView

Наследник TListView (на самом деле, является наследником промежуточного класса TColorListView - автор А. Шахайло, но этот промежуточный класс не предлагается для самостоятельного использования, и инкапсулирует в основном возможности по рисованию ячеек и заголовка различным цветом и шрифтами). Основное отличие от предка - этот список предназначен для быстрого отображения больших наборов данных, обычно загруженных из базы данных, поэтому базовый компонент TListView используется сразу как виртуальный. Причем, отображение всегда подразумевает вид таблицы (lvReport), и другие варианты просто никогда не тестировались.

Имеется довольно значительное число внешних и функциональных улучшений, такие как сортировка и фильтрация значений по колонкам, в том числе сортировка по нескольким колонкам, упрощение сортировки по определенным правилам, запоминание ширины и порядка колонок в реестре, программный доступ к ячейкам по именам полей, сопоставленных колонкам, редактирование ячеек, возможность сохранения содержимого в Excel или текстовой файл и многое другое.

 TFastTreeView Еще один наследник TListView. Стандартный компонент TTreeView не годится совершенно для работы с большими деревьями. Данная реализация дерева оказалась полезной во многих случаях.

Данный компонент позволяет работать без проблем с большим числом узлов, имеет некоторые дополнительные улучшения.

TFastTable Компонент предназначен для не-визуального хранения таблиц данных, обычно загруженных из таблиц баз данных. Может использоваться в качестве хранилища данных для TFastListView, когда последний объявляется полностью виртуальным, и все данные отображаются в нем по событиям OnDataCell / OnDataCellData. Фактически таблица устроена как список строк с индексами от 0 до Count-1, и с поименованными колонками.

Основная цель разработки компонента TFastTable - это компактное хранение огромного числа данных (миллионов и более ячеек). Экономия достигается за счет того, что тождественные строки сохраняются в единственном экземпляре. Второй целью была высокая скорость доступа к ячейкам TFastListView. Для быстрого поиска соответствия между именем колонки и ее индексом в списке колонок используются хэш-таблицы. А для тех случаев, когда и этой скорости оказывается недостаточно, есть набор свойств II, SS, FF, которые позволяют передать в списке параметров свою переменную типа TFastIndex, инициализированную значением null, в которой при первом обращении сохраняется сопоставленный индекс колонки, что еще больше ускоряет дальнейшее обращение к ячейкам. Правда, запись исходного кода в этом случае становится несколько более громоздкой, и приходится вручную контролировать соответствие имен переменных типа TFastIndex и наименований колонок.

Дополнительные возможности TFastTable - это хранение целочисленных и вещественных (Extended) значений, сопоставленных ячейкам. Это позволяет не тратить время на внутренние преобразования значений в строчное представление и наоборот, при работе с числовыми полями таблицы.

Использует вспомогательный компонент TFloatList, предназначенный для хранения списка вещественных чисел (типа Extended).

 TUniEdit Этот компонент инкапсулирует сразу несколько вариантов редактируемого поля (TEdit, TCombobox, TDatePicker, TCheckBox), позволяя размещать вместе с полем сразу текстовую метку этого поля (свойство Title), и контролировать параметры ввода значений изменением всего пары свойств. Применение TUniEdit позволяет упростить настройку формы, выравнивание элементов (например, есть в наличии свойство Align, которого почему-то нет в стандартном TEdit).

Дополнительное удобство - это возможность навешивания кнопки EllipsisButton с многоточием на нем, опять же изменением всего одного свойства и добавлением обработчика события OnEllipsis.

 TNormalReport Это очень серьезный компонент. Он претендует на полную и окончательную замену всевозможных компонентов для создания печатных отчетов.

Главное преимущество по сравнению со всеми своими аналогами - это полный контроль всего, что должно быть выведено на печать, обычными программными средствами. При использовании этого компонента вопросы с тем, "как выполнить" группировку линеек не могут возникать в принципе, так как весь процесс вывода на печать полностью контролируется программой пользователя. Процедура печати - это обычный пользовательский обработчик события OnPrint, в которой в нужном порядке размещаются нужные команды.

Входящие в набор  TNormalBand и  TNormalLabel могут использоваться для предварительного "рисования" (на любой, обычно скрытой, форме) линеек и ячеек, которые при печати заполняются нужными значениями и отправляются затем на печать методами TNormalReport (например, AddBand, AddRight и т.п.) Но использоваться могут, вообще говоря, любые визуальные контролы. Просто TNormalBand и TNormalLabel лучше приспособлены для форматирования текста на бумаге. Например, они изначально имеют белый фон, имеют дополнительные свойства для управления рамками, а TNormalLabel - и дополнительный широкий набор для обеспечения форматирования текста (WrapWord, WrapLetters, WrapSyllabel, InScale, InFontScale).

При аккуратном использовании, TNormalReport обеспечивает очень быструю подготовку даже очень большого числа страниц. Форма предварительного просмотра в компонент встроена изначально, имеется возможность из предварительного просмотра напечатать нужный лист или диапазон листов отчета.

 TKnopka,  TPnKnopka,
TGrKnopka
Компонент "кнопка". Помимо множества прочих достоинств, самое важное - на время обработки события OnClick, кнопка становится недоступной. Это предотвращает автоматически многие проблемы в тех случаях, когда до завершения обработки ни в коем случае нельзя пользователю давать нажимать на кнопку повторно, в том числе в ситуациях, когда пользователь на все кнопки нажимает двойным кликом мыши.

Кроме того, поддерживаются:

  • многострочный текст в заголовке кнопки, в с возможностью переноса по словам, по слогам или по буквам,
  • картинка TPicture или из TImageList (есть возможность для состояния Enabled=FALSE использовать отдельный ImageList) или из списка стандартных пиктограмм (системные ресурсы, кроме нескольких дополнительных), может быть размещена слева, справа, сверху, снизу от текста или вместо текста,
  • при этом кнопка полностью нормально выглядит с темами XP,
  • поддерживается опциональная возможность множественного срабатывания одним длительным нажатием мышью или клавишей ENTER,
  • двойной клик всегда приводит к двум вызовам события OnClick, в отличие от стандартной кнопки (если к этому моменту первый клик полностью обработан, и кнопка снова доступна, разумеется),
  • опциональная рамка из точек вокруг текста,
  • цветной текст на кнопке,
  • выравнивание; для обеспечения расстояния между множеством таких выровненных кнопок на одном родителе, введен дополнительный компонент - TPnKnopka - кнопка на панели,
  • имеется графический аналог TGrKnopka, не требующий выделения отдельного дескриптора окна для каждой кнопки,
  • имеются средства для быстрой миграции проекта к использованию компонента TKnopka / TPnKnopka вместо TButton / TBitBtn / TSpeedButton.
TExcelReport Класс для упрощения формирования Excel-документа. Вообще, скорость формирования отвратительно низкая при таком подходе. Но в случаях, когда требуется различное форматирование для практически каждой ячейки, быстрым способом (через буфер обмена) все равно не удается воспользоваться.

Данный компонент используется в TFastListView для сохранения списка в книгу Excel в случае, когда переменная SaveToExcelViaClipboard установлена в значение FALSE.

TXMLReport Класс для упрощения формирования XML-документа. Поддерживается формирование стандартизированного заголовка, запись в кодировке UTF-8, автоматическая замена пробелов на символы '_' в тэгах.
TODBCQuery, TODBCDataBase Классы для работы с базой данных через ODBC напрямую, минуя ADO. Использует API ODBC-драйверов - функции, начинающиеся с SQL. Например, SQLAllocHandle, SQLDriverConnect, SQLExecute и т.д.

Поддерживаются асинхронные запросы с возможностью их отмены (через API-функцию SQLCancel), поддерживаются множественные наборы результатов запросов (метод More используется для перехода к следующему результату). Поддержка двоичных полей (Binary) не реализована за ненадобностью. Отсутствует возможность использовать параметры - запрос должен формироваться как текст, все параметры должны быть переведены в текстовой формат. См. модуль UtilsUnit - он содержит большинство недостающих для этого методов, например, DateToSQL, DateTimeToSQL, StrToSQL и некоторые другие.

TNewQuery Компонент для работы с базами данных. В зависимости от значения символов условной компиляции, может компилироваться как наследник TQuery, TADOQuery или TODBCQuery (см. выше).

Помимо возможности быстрой адаптации кода к любой из трех версий компонентов для работы с данными, имеется ряд дополнительных возможностей. Самая ценная из них - это возможность автоматического протоколирования последних выполнявшихся запросов с целью их сохранения (например, в текстовой файл) в случае аварии (или программно). В случае, когда запрос оформляется без использования параметров, т.е. все параметры уже вставлены в текст запроса в строковом виде, такой запрос может быть загружен в соответствующий инструмент (например, Query Analyzer), и протестирован отдельно от программы.

Для упрощения работы с полями имеются свойства IField, SField, DField, FField - для обращения к полям по имени, и аналогичные им IFieldN, SFieldN, DFieldN, FFieldN - для работы с полями по их индексам от 0 до FieldCount-1. Использование указанных свойств доступа к полям позволяет сократить записи вроде Q.FieldByName('Продукт') as Integer до более краткой Q.IField('Продукт') и при этом не переходить к использованию типа Variant и преобразований данных с ним (что может вызывать проблемы с преобразованиями некоторых типов данных).

Для проверки значения поля на NULL имеются методы-функции NullField и NullFieldN. Для формирования динамических запросов имеется рад дополнительных функций в отдельно реализованном модуле UtilsUnit. Например, функции SqlUpdIns, SqlUpd, SqlIns позволяют унифицированным образом оформить в программном коде читабельный текст запроса, сэкономив при этом усилия на проверку синтаксических ошибок в тексте SQL-запроса. Функции StrToSQL, DateToSQL и другие - формировать запросы без параметров, что облегчает их отладку методом прямой вставки текста запроса в средство отладки SQL-запросов (Query Analyzer, Database Desktop).

UtilsUnit Набор утилитных функций для работы с датой/временем, преобразования типов данных, форматирования строк, разбора строк на части, динамического формирования SQL-запросов и т.п.
TPhotographer Компонент для "фотографирования" экрана при возникновении исключительной ситуации в программе. Кроме фотографирования экрана, формируется текст, содержащий описание ошибки, а так же с помощью модуля StackUnit фиксируется состояние программного стека (при использовании StackUnit - с именами вызывавшихся функций) и журнал последних выполнявшихся запросов (см. TNewQuery). Далее полученная информация сбрасывается во внешний файл (C:\LastErrorLog.txt - по умолчанию) и/или в таблицу базы данных (определяется символами условной компиляции).

Для использования данного компонента достаточно включить его в список используемых модулей (главного модуля, например), и назначить в качестве обработчика Application.OnException обработчик из модуля utPhotoExc, следующим образом:

Application.OnException := Photographer.AppException;

StackUnit Набор функций для формирования стека вызванных на момент обращения функций по их именам. Данный стек выдаётся модулем utPhotoExc (см. компонент TPhotographer) при возникновении исключительной ситуации, что может помочь для последующего разбора полётов. В отличие от функции CrackStack в модуле TPhotographer, сопоставляющей адреса возвратов из кадров возврата в программном стеке именам функций, сохранённым при линковке программы в файле "имя-программы".map, данный вариант предполагает модификацию всех функций программы таким образом, что в начале каждой функции вызывается специальная функция этого модуля (с именем enter) и ей передаётся при этом имя вызванной функции.

Это не означает, однако, что необходимо вручную модифицировать все свои функции таким образом, чтобы добавить обращение к этой функции в начале каждой функции или процедуры. В теле модуля StackUnit реализована функция ModifySources_AddingEnterCall(directory: String), которую достаточно вызвать один раз в начале работы программы, чтобы в начале каждого запуска программы были проверены все новые функции и добавлены для них вызовы процедуры enter из этого же модуля.

Предусмотрена возможность предотвратить проверку на необходимость вставки обращения к enter в тех случаях, когда это необходимо. Имеется возможность удалить все обращения к функции enter во всех модулях директории, простой установкой символа условной компиляции REMOVE_ENTRY_CALLS и перекомпиляцией исходного кода (build), после чего достаточно запустить перекомпилированную программу однократно.

DecimalCalculations Набор функций для десятичных вычислений с произвольной наперед заданной (константой в модуле, по умолчанию 37 десятичных значков) точностью. Необходимость в модуле возникла для целей точных десятичных вычислений с правилами округления при вычислениях, принятыми в математике (а не в вычислительной технике или бухгалтерии). Скорость вычислений значительно хуже, чем при использовании встроенных типов, но в некоторых случаях, когда точность намного важнее скорости - модуль незаменим.
TScanner Компонент для считывания штрих-кодов через сканер, подключенный к COM-порту.

Установка

Справа приведена схема взаимного использования (схема зависимости) компонентов. Стрелочка от компонента А к компоненту Б показывает, что "А использует Б". Из нее явно видно, что при установке компонентов для TFastListView, TUniEdit и TNewQuery, TKnopka и TNormalReport желательно оформить единый пакет компонентов, куда следует включить эти компоненты, а так же модуль, содержащий класс TExcelReport. Вообще, имеет смысл создавать вообще один пакет для всего набора предоставляемых компонентов, и включать в него все компоненты этой "библиотеки". В этом случае установка упрощается, так как требуется установить только один пакет. Тем не менее, компоненты TFastTreeView, TNormalReport (вместе с TNormalBand и TNormalLabel) и TScanner могут иметь свои собственные три раздельных пакета. Тем более, что для использования некоторых их этих компонентов установка вообще не требуется. Например, TNewQuery предназначен для работы в основном в стиле обычного класса, т.е. для динамического создания в процессе выполнения программы на том участке кода, где он требуется, так что его установка на палитру компонентов вовсе и не нужна.

Для того, чтобы при включении TUniEdit в пакет была вызвана процедура регистрации его для установки на палитру, необходимо в свойства пакета добавить символ условной компиляции IN_PACKAGE. Кроме того, язык текстовых сообщений (пунктов меню и прочее), используемых в TFastListView, TNormalReport и других компонентов, выбирается так же на этапе сборки пакета. Поэтому желательно включить символ условной компиляции RUSSIAN_LANGUAGE.

При использовании компонентов очень важно правильно указать все пути, по которым лежат исходные файлы компонентов (или откомпилированные модули .DCU). Лучше всего пути прописывать не в свойствах проекта (имеется в виду как проект пакета для установки, так и использующий эти компоненты рабочий проект), т.е. не в Project | Options | Directories/Conditionals | Source Path, а в настройках среды разработки. Настройки эти обнаруживаются в среде Delphi в пункте меню Tools | Environment Options..., где следует выбрать закладку Library, и отредактировать поле Library path, добавив туда пути с компонентами. В этом случае, эти пути становятся известны компилятору во всё время работы, и уже нет необходимости прописывать пути отдельно для каждого проекта.

Как вариант, можно упростить себе задачу, если установить компоненты по пути: C:\Work\Components, распаковав туда все папки архива. Затем открыть FastListView\FalstListviewPkgXX.dpk (где XX - соответствует версии Delphi 5, 6 или 7 - XX пусто для версии Delphi 5), и нажать на кнопку Install на окне пакетов - они уже настроены на эти пути. FastListviewPkg уже содержит FastTreeView и AdoSQLUnit (TNewQuery), но для них могут быть созданы и отдельные пакеты, если их предполагается использовать без TFastListView.

Обратите внимание на то, что после установки пакета и загрузки проекта, его использующего, обязательно в первый раз следует выполнить команду Build, а не Compile (т.к. на этапе разработки и для конечного проекта формируется несколько различный код). Невыполнение этого требования приведет к невозможности компиляции проекта (что исправляется вызовом команды Build для проекта).

Лицензия

Данная библиотека публикуется под лицензией GPL. Текст лицензии на русском и английском языке приведён в дистрибутиве.



(C) by Vladimir Kladov, 2000-2010