
Эксперт
   
Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва
Репутация: 80 Всего: 162
|
Для пользователей библиотеки EhLib. Мною, были сделаны несколько доработок некоторых модулей этой библиотеки. Мои доработки следующие: - (DBGridEh.pas) Изменена реакция на 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 - не действует.
- (DBGridEh.pas) Исправлена ошибка. По крайней мере в v3.2 наблюдалось забавное поведение фильтра. А именно:
Если задать (с клавиатуры) выражение фильтрования в каком-то поле, например во втором, и нажать Enter, то все прекрастно отфильтруется. Однако, если после этого сделать Grid.ClearFilter а затем Grid.ApplyFilter то, в отличие от ожиданий, ничего не произойдет. Т.е. не смотря на Grid.ClearFilter, во втором поле останется строка с условием фильтрования, и Dataset останется отфильтрованным! Поисходило это потому, что при Grid.ApplyFilter из редактора фильтра "извлекалось" текущее содержимое, и "запихивалось" обратно в STFilter.ExpressionStr соответствующей колонки. Отсюда, если перед Grid.ApplyFilter "перейти" в другую колонку, все будет нормально . В v3.4 такого дефекта вроде-бы не наблюдается, однако, "лечилка" не мешает, поэтому оставлена.
- (DBGridEh.pas) Изменено поведение при изменении фильтра и порядка сортировки.
В исходном варианте, при испоьзовании датасетов требующих переоткрытия для обновления данных после изменения текста запроса, были на мой взгляд два неприятных момента которые я устранил:
a. После переоткрытия датасета, теряется положение текущей записи - текущей становится первая запись. Это не очень удобно, особенно при изменения порядка сортировки. Да и при фильтровании, если текущая (до применения фильтра) запись присутствует в отфильтрованном наборе, хочется что-бы она же и осталось текущей. Для решения проблемы, перед закрытием датасета сохраняется список имен и значений полей текущей записи, и ее положение в гриде. Соответственно после открытия делается попытка спозиционировать датасет на эту запись (locate), и если попытка удачна, делается попытка восстановить ее положение в гриде (что-бы она осталась на той-же строке). Если запись не будет найдена, то как и ранее, грид будет спозиционирован на первую запись.
b. Если колонки грида созданы динамически, а не в дизайнере (такое иногда бывает , то после переоткрытия теряется информация о маркерах сортировки, значениях фильтров, ширин колонок, и пр.. В общем всего что хранится в списке колонок, поскольку при закрытии датасета он очищается, а после открытия, создается заново со значениями по умолчанию. Чтобы предотвратить подобный ход событий, перед закрытием датасета, всем колонкам ставится признак IsStored (якобы они созданы в дизайнере). Естественно, реальное значение свойства IsStored всех колонок сохраняется и восстанавливается после открытия датасета.
В моей реализации устранения этих моментов есть подводный камень:
Может возникнуть ошибка, если после переоткрытия датасета изменится состав возвращаемых им полей. Например если датасет используется в рамках ReadCommited транзакции, и к моменту его переоткрытия кто-то, изменил на SQL-сервере метаданные объекта входящего в запрос. Хотя по моему, такая ситуация вряд-ли может встретиться в реальной жизни. Да и в случае "статически" (в дизайнере) созданных полей возникнет та-же бяка (хотя, пожалуй еще хуже будет).
Конечно, сохранение позиции, надо-бы сделать включаемым/отключаемым опцией в OptionsEh. Но для этого, требуется коррекция еще и других модулей EhLib. Поэтому, это лучше делать автору.
А вот фича "b", должна быть обязательно устранена, поскольку ее наличие делает невозможным нормальное использование сортировки и фильтрования с датасетами требующими переоткрытия.
- (DbUtilsEh.pas) Исправлена ошибка/недочет.
В исходном варианте, в выражении фильтрования, нельзя было использовать константу 'NOW' допустимую в SQL.
- (EhLibADO.pas) Расширены возможности.
В ADODataSetDriverName добавлена поддержка для MS SQL-сервера (по имени OLEDB провайдера).
- (EhLibIBX.pas) Исправлена ошибка.
Некоторые версии сервера Interbase не допускает использования номеров полей в выражении ORDER BY, поэтому в конструктор объектов этого модуля добавлено:
Измененные модули для версии 3.5 приложены к посту. Для других версий можно сделать аналогично. Для этого, все мои изменения отмечены условной трансляцией по символу NoChangesBySAP
--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце.
|