[ мои работы ]
[ статьи ]
[ полезные ссылки ]
[ vingrad ]
[ обо мне ]
ПОИСК
Webalex-co
  Разное - 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.
 
Copyright © «AlexandrS», 2009
Все права защищены.