Різнобарвний dbgrid
Різнобарвний DBGrid. 8 років тому.
Майже вісім років тому, з'явилася на світло Borland Delphi 1. Всі ці вісім років програмісти у всьому світі, пов'язані з базами даних, вирішували кілька найскладніших завдань, які (разом з рішеннями) описані тут:- Різнобарвний DBGRID
- Що можна помістити в DBGrid
- незвичайна TDBGrid
Розглянемо, як їх можна вирішити в наші дні. Скористаємося безкоштовної для exUSSR бібліотекою EhLib Дмитра Большакова. В даний час це кращі компоненти в exUSSR по співвідношенню функціональність + якість / ціна. Вся настройка гріда для більшої наочності робиться в вихідному коді. У ваших додатках більшість дій можна виконати візуально в дизайнера.
1. Демонстраційний проект
Час йде, BDE офіційно визнаний мертвим, тому ми як движка будемо використовувати ADO. Почитати докладніше можна тут: "Трохи про використання ADO в Delphi" (з цієї ж статті взята базка в MS ACCESS). Ніяких проблем зв'язка TADOConnection - TADODataSet не викликає. Цікавим моментом в програмі є редагування властивості TADOConnection.ConnectionString в run-time:
2. Розфарбовуємо рядок
Пишеться обробник події OnGetCellParams:
Ніякого малювання на канві, ніяких тонкощів з викликом методів, просто вказуємо грід властивості осередку, передаються в аргументах - і все, решту він робить сам!
Якщо потрібно просто підсвітити рядок на якій стоїть курсор, то це ще простіше:
3. CheckBox в поле DBGrid
Якщо поле DataSet'а має тип Boolean, то ніяких додаткових зусиль робити не доведеться, грід сам будемо відображати checkbox. Для полів інших типів потрібно налаштувати властивості стовпця DBGridEh наступним чином:
4. Картинка в поле DBGrid
Щоб показати замість значення поля картинку, що залежить від значення поля, необхідно зробити наступне: Column [i] .ImageList - ImageList з картинками, Column [i] .KeyList властивість типу Strings - кожен рядок - значення поля, замість якого буде підставлятися картинка з ImageList з відповідним індексом; свойствоColumn [i] .NotInKeyListIndex повинно містити індекс картинки зіставляється значеннями поля, яких немає в KeyList (наприклад, це зручно для значення NULL). Список з властивості PickList використовується для зіставлення картинкам спливаючих підказок (для цього необхідно також виставити в TRUE властивості Column.Tooltips і DBGridEh.ShowHint).
5. Смугасте вікно
Код узятий із прикладів до EhLib, обробник OnGetCellParams:
6. MultiSelect
Для початку потрібно виставити
Після цього будь-яке виділення зроблене користувачем доступно через властивість TDBGridEh.Selection. Selection.SelectionType вказує на тип виділення:
Докладніший приклад є в довідці EhLib, а для копіювання / вирізання / вставки вже є готові процедури.
7. Складні заголовки
Це те, чого так не вистачає в стандартному гріді і через що із заздрістю починаєш поглядати на 1С ;-).
Показати як це робиться ще простіше, ніж пояснити:
Після цього стовпці з заголовками Subtitle> 1 і Subtitle> 2 будуть об'єднані під заголовком title> 1.
8. Швидкий (інкрементальний) пошук
Це те, що вражає в DBGridEh після звичайного гріда (як демка BioLife в Delphi після TurboPascal).
Вказує грід на те, що після натискання Ctrl + F слід перейти в режим швидкого пошуку.
Вказує на те, що режим «швидкого» пошуку є основним, натискання цифро-буквених клавіш будуть сприйматися ґрідом як частина рядка, яку він буде шукати в поточному стовпці. Перейти до режиму редагування можна натисканням F2.
9. Авто-Сортування
Для того, щоб зробити сортування по стовпцях в звичайному гріді, потрібно виконати тривалу кропітку роботу, з EhLib це займе кілька секунд:
в USES треба додати один з модулів: EhLibADO, EhLibBDE, EhLibCDS, EhLibDBX або EhLibIBX в залежності від типу DataSet'ов які ви використовуєте. Дані модулі, якщо вони входять в додаток, автоматично реєструють об'єкт-сортувальник.
Допомогли вихідні. Код EhLib красивий, зручно розбитий на модулі. В результаті його вивчення виникли такі виправлення:
Тепер в будь-якому проекті кодування сортування TADODataSet буде займати миті ;-)
X.Подведеніе підсумків.
Вихідний код прикладу, демонстраційна базка і виправлені модулі EhLib тут (19.8K).