Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доработка библиотеки EhLib от Петровича 
:(
    Опции темы
Alex
Дата 12.2.2005, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 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 "перейти" в другую колонку, все будет нормально smile.
    В v3.4 такого дефекта вроде-бы не наблюдается, однако, "лечилка" не мешает, поэтому оставлена.
  • (DBGridEh.pas) Изменено поведение при изменении фильтра и порядка сортировки.
    В исходном варианте, при испоьзовании датасетов требующих переоткрытия для обновления данных после изменения текста запроса, были на мой взгляд два неприятных момента которые я устранил:

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

         b. Если колонки грида созданы динамически, а не в дизайнере (такое иногда
            бывает smile, то после переоткрытия теряется информация о маркерах
            сортировки, значениях фильтров, ширин колонок, и пр.. В общем всего что
            хранится в списке колонок, поскольку при закрытии датасета он очищается,
            а после открытия, создается заново со значениями по умолчанию.
            Чтобы предотвратить подобный ход событий, перед закрытием датасета,
            всем колонкам ставится признак 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



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0706 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.