Сортування колонок у DBGrid
Сортування колонок у DBGrid
- розмір шрифту зменшити розмір шрифту збільшити розмір шрифту
- Друк
Сортування колонок у DBGrid
Багато професійних програм відображають дані в полях табличної сітки і дозволяють Вам сортувати будь-яку колонку, просто клацаючи по її заголовку. Те, що тут викладено – не найкращий шлях для вирішення завдання, дана технологія ніщо інше, як проста імітація такої поведінки компонента.
Головна перешкода у вирішенні завдання – сам DBGrid. Проблема у відсутності подій OnClick або OnMouseDown, що дозволяють реагувати на елементарні маніпуляції із заголовком. Правда, існує подія OnDoubleClick, але для цієї мети вона не дуже витончена. Все що нам потрібно - зробити заголовок, що реагує на одноразове клацання мишею. Звернемося до компонента THeaderControl.
THeaderControl - компонент, введений в палітру ще Delphi 2.0 і забезпечує необхідні нам функції. Головна перевага - реакція компонента при клацанні на окремих панелях, панелі також забезпечують візуальне відображення подібно до кнопки (можуть вдавлюватися і віджиматися). Нам необхідно "прикрутити" THeaderControl до DBGrid. Ось як це зробити:
По-перше, створіть новий додаток. Покладіть THeaderControl на форму. Він автоматично вирівнюється по верхньому краю форми. Потім помістіть на форму DBGrid і надайте властивості Align значення alClient. Потім додайте компоненти TTable та TDataSource. У компоненті TTable присвойте властивості DatabaseName значення DBDEMOS, а властивості TableName значення EVENTS.DB. У TDataSource вкажіть у властивості DataSet на компонент Table1, а TDBGrid у властивості DataSource на DataSource1. Якщо властивість Active компонента TTableбуло неактивно, увімкніть його (значення True). Тепер трохи почаклуємо!
Зробимо так, щоб компонент THeaderControl виглядав схожим на заголовок компонента DBGrid. Зробимо необхідні маніпуліції у момент створення форми. Двічі клацніть на подію OnCreate форми та введіть наступний код:
Після того як THeaderControl замінив стандартний заголовок DBGrid, в першу чергу ми скидаємо (встановлюємо False) прапор dgTitles у властивості Options компонента DBGrid. Потім ми додаємо колонку HeaderControl і встановлюємо її ширину, рівну 12. Це буде порожньою колонкою, яка має ту ж ширину, що і ліва колонка статусу в DBGrid.
Потім потрібно переконатися, що таблиця відкрита для ексклюзивного доступу (ніякі інші користувачі використовувати її не зможуть). Причину я поясню трохи згодом.
Тепер додаємо секції HeaderControl. Для кожної доданої колонки ми створюємо в заголовку той самий текст, що у відповідній колонці DBGrid. У циклі ми проходимо по всіх колонках DBGrid та повторюємо текст заголовка колонки та його висоту. Ми також встановлюємо для HeaderControl значення властивостей MinWidth і MaxWidth, що дорівнює ширині відповідної колонки в DBGrid. Це убезпечить колонки від зміни їх ширини. Для змінних розмірів колонок потрібно додаткове кодування, і я вирішив не позбавляти Вас цього задоволення.
Тепер найцікавіше. Ми збираємося створити індекс для кожної колонки у DBGrid. Ім'я індексу буде таким самим, як і назва колонки. Цей код ми повинні укласти в конструкцію try..finally, оскільки існують деякі поля, які не можуть бути проіндексовані (наприклад, Blob- та Memo-поля). За спроби індексації цих полів генерується виняткова ситуація. Ми перехоплюємо цей виняток і недопускаємо можливості клацанняна цій колонці. Це означає, що колонки, що містять неіндексовані поля, не реагуватимуть на клацання мишею. Створення цих індексів є поясненням того, чому таблиця має бути відкрита як ексклюзивного доступу. І насамкінець ми закриваємо таблицю, скидаємо прапор ексклюзивності і знову робимо таблицю активною.
Останній крок. При натисканні на HeaderControl нам необхідно включити правильний індекс таблиці. Створимо обробник події OnSectionClick компонента HeaderControl як показано нижче:
Це все! Після натискання на заголовку колонки значення властивості таблиці IndexName стає рівним заголовку компонента HeaderControl.
Просто та красиво, так? Проте є безліч місць, які потребують поліпшення. Наприклад, вторинне клацання має відновлювати порядок сортування. Або можливість зміни розміру самих колонок. Спробуйте самі це не складно!
Тут наведено покращений код порівняно з попередньою версією "Ради", він полягає у використанні як ім'я індексу ім'я поля замість заголовка.
Це покращує гнучкість. Зміни вказані похилим курсивом.
Використовуйте властивість FieldName компонента DBGrid для завдання індексу з тим самим ім'ям, що й ім'я поля.