|
|
![]() |
|
|
![]() |
| |
Разное - EhLib Patch
Уже долгое время Я и Александр Сысоев дорабатываем и исправляем библиотеку EhLib. Все исправления обрамлены условной трансляцией NoChangesByALX. Пакет содержит только исправленные модули библиотеки EhLib 4.2.16. Если у кого-то есть свои доработки, и Вы хотите ими поделиться с людьми, то будем рады включить их в пакет обновлений.
Скачать (433.2 КБ)
Использование:
1. Распаковать архив в папку ..\EhLib
2. перекомпилировать библиотеку
История версий:
Версия 1.3
В украинской локализации в файле формы поиска DBGridEhFindDlgs.dfm
пропущен TDBComboBoxEh с именем dbcTreeFindRange, что приводит к AV
при нажатии на гриде Ctrl+F. (Спасибо tulnov(sobaka)gmail.com)
DBGridEh:
Исправлена ошибка отрисовки текста в многострочном заголовке при включенных темах,
если текст попадал на границу подчиненных заголовков. 
Версия 1.2
Улучшена поддержка Delphi 2009 (Все demo проекты компилируются и работают).
DBGridEh:
Исправлена отрисовка Title в Windows Vista.
Исправлен AV. (Спасибо Максиму Буянову)
Ошибка возникает при вызове DefaultDrawColumnCell для
колонки, не привязанной к полю датасета (для отображения картинки).
Условия ошибки:
1. Добавить в редакторе колонку без привязки к полю датасета
2. В колонке указать ImageList
3. Создать обработчик OnGetCellParams колонки для указания ImageIndex
4. Создать обработчик OnDrawColumnCell, в котором после настройки
Canvas вызвать DefaultDrawColumnCell.
Версия 1.1
Добавлено:
Поддержка Delphi 2009
Редактор колонок
Модуль локальной фильтрации и сортировки для FIBPlus
DBCtrlsEh:
В функции DateTimeStampToVarValue при преобразовании даты в Variant значением по умолчанию будет текущая дата, а не дата 1.1.1900
Изменены DelBSpace и DelESpace. Теперь, они удаляют не только пробелы, но и
все управляющие символы (<=' '). Эти процедуры используются для обработки
строки помещаемой в TCustomDBNumberEditEh.Text.
Без доработки, если в свойство присваивался текст (или вставлялся из
Clipboard) содержащий ведущие и/или завершающие пробелы, то они удалялись.
Однако, если текст содержал например завершающий ^M (как бывает при
копировании ячейки из MS Excel), то это вызывало ошибку.
Теперь, все будет в порядке.
В принципе, можно еще изменить поведение на присваивание/вставку
многострочного текста. Сейчас это вызовет ошибку. Хотя, догично просто
отбрасывать все строки кроме первой.
В TCustomDBEditEh.Change добавлена замена ^M и ^J на ' ' при
WantReturns=False и ^I на ' ' при WantTabs=False. Завершающие ^M, ^J и ^I
вместо замены удаляются.
Без этого, в поле с WantReturns=False нельзя ввести ^M с клавиатуры, однако
можно присвоить его свойству Text, или вставить из буфера обмена. То же и с
WantTabs.
DBGridEh:
Добавлено свойство SavePosition определяющее набор ключевых полей
набора данных для сохранения/восстановления позиции.
Изменено поведение при пересортировке.
Ранее, выполнение DefaultApplySorting всегда приводило к открытию Dataset.
Все потому что при вызове DatasetFeatures.ApplySorting в
TDBGridEhDataService.DefaultApplySorting параметр IsReopen всегда True.
Теперь, в этот параметр передается AGrid.DataSource.DataSet.Active,
соответственно, если dataset был закрыт, то он и останется закрытым. В этом
случае по DefaultApplySorting будет только сформирован правильный текст
запроса, который может быть открыт позже.
Это удобно использовать при восстановлении сохраненных параметров сортировки
и фильтрования при создании формы.
Т.е. сначала, при закрытом dataset, восстанавливаются параметры сортировки и
фильтрования. Далее вызываются DefaultApplySorting и ApplyFilter. И только
потом открывается dataset.
Иначе, при традиционном открытии dataset'а в OnCreate формы (до
восстановления параметров сортировки и фильтрования), происходит несколько
переоткрытий dataset'а: при открытии, при DefaultApplySorting и при
ApplyFilter!
При большом числе записей это может быть очень долго!
Изменена реакция на Ctrl+Up, Ctrl+Down, Ctrl+Shift+Up и Ctrl+Shift+Down.
Ранее, они были эквивалентны соответственно сочетаниям Ctrl+PgUp,
Ctrl+PgDown, Ctrl+Shift+PgUp и Ctrl+Shift+PgDown.
Теперь, они действуют почти как в IDE Delphi - прокрутка окна просмотра,
по возможности без изменения текущей позиции в наборе данных:
Ctrl+Up - перемещение окна просмотра вверх (прокрутка вниз);
Ctrl+Down - перемещение окна просмотра вниз (прокрутка вверх);
Ctrl+Shift+Up - не действует;
Ctrl+Shift+Down - не действует.
См. TCustomDBGridEh.KeyDown.
Изменено поведение при изменении фильтра и порядка сортировки.
В исходном варианте, при испоьзовании датасетов требующих переоткрытия
для обновления данных после изменения текста запроса, были на мой взгляд
два неприятных момента которые я устранил:
a. После переоткрытия датасета, теряется положение текущей записи - текущей
становится первая запись. Это не очень удобно, особенно при изменения
порядка сортировки. Да и при фильтровании, если текущая (до применения
фильтра) запись присутствует в отфильтрованном наборе, хочется что-бы
она же и осталось текущей.
Для решения проблемы, перед закрытием датасета сохраняется список имен
и значений полей текущей записи, и ее положение в гриде. Соответственно
после открытия делается попытка спозиционировать датасет на эту запись
(locate), и если попытка удачна, делается попытка восстановить ее
положение в гриде (что-бы она осталась на той-же строке). Если запись не
будет найдена, то как и ранее, грид будет спозиционирован на первую
запись.
b. Если колонки грида созданы динамически, а не в дизайнере (такое иногда
бывает :), то после переоткрытия теряется информация о маркерах
сортировки, значениях фильтров, ширин колонок, и пр.. В общем всего что
хранится в списке колонок, поскольку при закрытии датасета он очищается,
а после открытия, создается заново со значениями по умолчанию.
Чтобы предотвратить подобный ход событий, перед закрытием датасета,
всем колонкам ставится признак IsStored (якобы они созданы в дизайнере).
Естественно, реальное значение свойства IsStored всех колонок сохраняется
и восстанавливается после открытия датасета.
В моей реализации устранения этих моментов есть подводный камень:
Может возникнуть ошибка, если после переоткрытия датасета изменится
состав возвращаемых им полей. Например если датасет используется
в рамках ReadCommited транзакции, и к моменту его переоткрытия кто-то,
изменил на SQL-сервере метаданные объекта входящего в запрос. Хотя по моему,
такая ситуация вряд-ли может встретиться в реальной жизни. Да и в случае
"статически" (в дизайнере) созданных полей возникнет та-же бяка (хотя,
пожалуй еще хуже будет).
Конечно, сохранение позиции, надо-бы сделать включаемым/отключаемым опцией
в OptionsEh. Но для этого, требуется коррекция еще и других модулей EhLib.
Поэтому, это лучше делать автору.
А вот фича "b", должна быть обязательно устранена, поскольку ее наличие
делает невозможным нормальное использование сортировки и фильтрования
с датасетами требующими переоткрытия.
См. tSaveContext,
DBGridEhCenter.ApplySorting,
DBGridEhCenter.ApplyFilter
DbUtilsEh:
Исправлена ошибка/недочет.
В функции GetExpressionAsFilterString зачем-то блокировалась возможность
формирования WHERE-условия для фильтра если Dataset закрыт.
Я убрал данную проверку. Теперь, при вызове DefaultApplyFilter при закрытом
dataset'е будет соответственно изменен текст запроса.
Это удобно при восстановлении сохраненного фильтра до открытия dataset'а,
дабы избежать лишних открытий/закрытий.
Исправлена ошибка/недочет.
В исходном варианте, в выражении фильтрования, нельзя было использовать
константу 'NOW' допустимую в SQL.
См. ConvertVarStrValues.
|
|
|
|