Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сортировка для DBGrid  (Прочитано 24727 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Harry
Команда клуба

ua
Offline Offline

« : 13-12-2003 19:02 » 

А возможна ли для DBGrid сортировка по полю путем щелчка по соответствующему столбцу? Для них только четыре события имеются: OnChange, OnSetText, OnGetText и OnValidate. По идее, это все не то...
Записан

Слабый пол силен в силу слабости сильного пола к слабому
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 13-12-2003 19:47 » 

Выписка из хелпа:
Цитата

TCustomDBGrid.OnTitleClick

Occurs when the user releases the mouse in one of the column headers.

type
  TDBGridClickEvent = procedure (Column: TColumn) of object;
property OnTitleClick: TDBGridClickEvent;

Description

Write an OnTitleClick event handler to take specific action when the user clicks in one of the column headers. The Column parameter is the TColumn object that corresponds to the column where the mouse was when the user released the left mouse button.


Получает номер столбца.
Записан

Странно всё это....
DimOC
Гость
« Ответ #2 : 10-01-2004 19:44 » 

Есть такая бесплатная библиотека компонентов EhLib в ней присутствует компонент TDBGridEh, а у него есть свойство TitleBtnClick.
Кроме этого там еще много чего удобного и хорошего есть.
Пользуюсь уже года два и не жалуюсь.

Пример:

Код:
procedure TFrmSpisokFilm.GrdZaprosTitleBtnClick)Sender{ TObject; ACol{ Integer; Column{ TColumnEh:;
 var
   RecNow{ Integer;
   AddStr{ String;

 begin
   try
     FrmMain.ShowFrmMessage)'Пересортировка ...':;
     Application.ProcessMessages;
     RecNow {= FrmMain.QrZapros.FieldByName)'IDR':.asInteger;
     FrmMain.CloseQr)FrmMain.QrZapros:;
     FrmMain.QrZapros.SQL.Clear;
     if GrdZapros.Columns[ACol(.Title.SortMarker in [smUpEh, smNoneEh(
     then AddStr {= 'DESC';
     case ACol of
       0{ FrmMain.QrZapros.SQL.Append)'select * from T_FILM_SELECT order by IDR_T_TIPFILM '+AddStr+', NAME':;
       1{ FrmMain.QrZapros.SQL.Append)'select * from T_FILM_SELECT order by NAME '+AddStr:;
       2{ FrmMain.QrZapros.SQL.Append)'select * from T_FILM_SELECT order by FILM_SAVE '+AddStr+', NAME':;
     end;
     FrmMain.OpenQr)FrmMain.QrZapros:;
     if not FrmMain.QrZapros.Locate)'IDR', RecNow, [(:
     then FrmMain.QrZapros.First;
   finally
     FrmMain.CloseFrmMessage;
   end;
 end;


Это так если по-быстрому... а если по-умному, то оптимизируй дальше.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 12-01-2004 09:05 » 

Harry,  тут был похожий пример и именнопо сортировке: https://club.shelek.ru/viewart.php?id=100
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #4 : 12-01-2004 09:21 » new

кстати,насчёт самой сортировки. если ты думаешь, что можно отсортировать данные на уровне TDBGrid'а, то это не так. по крайней мере, для стандартного грида. сортировку надо менять на уровне набора данных, т.е. для таблицы - изменить индекс сортировки, для select-запроса  - order by.
Записан

Harry
Команда клуба

ua
Offline Offline

« Ответ #5 : 13-01-2004 22:40 » 

Дзенкаю, будем попробовать. x77, т.е. ты имеешь в виду, сортировку самих данных в базе? Мутно то как... зачем? Или Grid просто не найдет неотсортированные записи?
Записан

Слабый пол силен в силу слабости сильного пола к слабому
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 15-01-2004 06:55 » 

у DBGrid'а просто нет механизма для "внутренней" сортировки. он отображает данные только в том порядке, в котором их возвращает связанный с ним Dataset (т.е. таблица или query). поэтому для изменения порядка сортировки надо либо использовать нестандартный грид (что иногда приводит к неверным результатам, т.к. сама идея сортировки данных на стороне клиента порочна в принципе), либо менять порядок записей в результирующем наборе данных на уровне таблицы (индексом) или запроса (order by).

использовать сотрировку на стороне клиента надо аккуратно. например, ты выводишь из таблицы первые 100 записей (из 1000, к примеру) отсортированные по какому-то полю. если ты пересортируешь эти записи на стороне клиента, просто изменится их порядок. а вот если ты изменишь сортировку на уровне запроса к серваку, то ты в итоге можешь получить совершенно другие 100 записей! вот этот момент надо чётко отслеживать. Улыбаюсь
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines