Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка данных по нажатию на заголовок DBGrid


Страницы:   1 2

duponamk ©   (2015-01-22 04:26:00) 

День добрый, уважаемые.
Нужен совет, как заставить нормально работать сортировку по клику на заголовке DBGrid'а.
Индексы я создал, сортировка по ним из отдельной формы идет как надо.
На форме DBGrid из пакета AlphaControls (прога, соотв., тоже на этих контролах строится).
Для отображения инфы из базы используется 6 полей, соотв., в размер грида полностью помещается инфа 4х полей. 2 последних уползают за край грида.
Так вот, если я нажимаю на заголовках первых 4х столбцов - сортировка происходит нормально. А если тыкнуть на последних 2х заголовках, предварительно прокрутив окно, чтобы они стали видны - прога считает, что я нажал на 4ом столбце и сортирует соответственно.
Сортировка организована так:
...

IndexesList: array[0..5] of string;

...

//Запишем названия индексов в массив
IndexesList[0] := 'index_idx';
IndexesList[1] := 'opsname_idx';
IndexesList[2] := 'region_idx';
IndexesList[3] := 'autonom_idx';
IndexesList[4] := 'area_idx';
IndexesList[5] := 'city_idx';

...

procedure TPstIdxMainForm.GridTitleClick(Column: TColumn);
begin
ShowMessage(IntToStr(Column.Index));
PstIdxDat.Table1.Active := False;
(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[Column.Index];
PstIdxDat.Table1.Active := True;
end;


Как поправить код, чтобы сортировка отрабатывала на нужных столбцах правильно? Раньше просто этого не надо было, сейчас решил добавить - и задумался :).
Использую Delphi XE4.
PS. Просьба: EhLib, сортировку с помощью SQL запросов, THeaderControl - не предлагать (не то пальто :)).


brother   (2015-01-23 11:25:00) [21]

надо лучше вазелинить)


duponamk   (2015-01-23 11:23:00) [22]


> Что именно не ппроходит?


Вариант с датасетами.


Inovet   (2015-01-22 19:36:00) [23]

> [15] duponamk ©   (22.01.15 19:04)

Что именно не ппроходит?


duponamk   (2015-01-22 19:04:00) [24]

Нет, не проходит такой фокус.


duponamk   (2015-01-22 18:35:00) [25]

if      f = datasetFIELD1 then dataset.IndexName := 'idx1';
else if f = datasetFIELD2 then dataset.IndexName := 'idx2';
else if f = datasetFIELD3 then dataset.IndexName := 'idx3';


Сча попробую.


duponamk   (2015-01-22 18:33:00) [26]

Методом научного тыка выяснил: после нажатия на правую часть горизонтального скроллбара, он сдвигает грид вправо и показывает последние 5-6й столбцы грида, как и было велено. После нажатия, например, на 5ом столбце, грид мотается назад к исходному состоянию и в этот момент, скорее всего, и фиксируется нажатие на заголовок. Но в этот момент курсор мыши уже находится над 3им столбцом и, прога считает, что я нажал на 3ИЙ столбец, а не на 5ЫЙ. И идет сортировка по 3ему столбцу.
Как-то так.
Так что поля тут, скорее всего, ни при чем. Скорее, надо каким-то образом ловить этот момент и соответственно его обрабатывать. А вот как...


Inovet   (2015-01-22 18:24:00) [27]

> [11] duponamk ©   (22.01.15 18:09)

В гриде указатели на поля TField а вот в них имя поля есть, но зачем, если эти же поля есть в Датасете вот и сравниванй указатели. Кликнули по заголовку, взял указатель на поле, которое привязано к этому столбцу, сравниваешь со своими. Например:

if      f = datasetFIELD1 then dataset.IndexName := 'idx1';
else if f = datasetFIELD2 then dataset.IndexName := 'idx2';
else if f = datasetFIELD3 then dataset.IndexName := 'idx3';


duponamk   (2015-01-22 18:09:00) [28]


> а в TCrackedGrid(Grid).LeftCol что в этом случае?


То же, что и написал постом выше вашего:

> Не проходит.
> Я не зря в коде указал вызов ShowMessage. При нажатии на
> столбец, мне показывается номер столбца, по которому я якобы
> тыкнул. В данном случае, когда я нажимаю на 5-6й столбцы,
>  ShowMessage выдает мне, что я якобы нажал на 3-4й столбцы,
>  а не 5-6й.
> Вот, что называется, и думай, а почему так, а не так как
> надо?



> > [3] duponamk ©   (22.01.15 09:25)
> > МойКолум1 - а дальше? С чем, собственно, сравнивать?
>
> А дальше выставляй нужный индекс. Сравнивать с указателем
> на поле. У тебя поля в датасете созданы в дизайнтайм? Если
> нет, сравнивай по имени поля.


У меня датасет = данные из таблицы. Таблица = БД, БД = файл БД с лежащей внутри нее таблицей с данными. Поля в гриде - да, создаются во время создания-показа формы приложения с заранее заданными св-вами.
Насколько я понял - имена полей надо брать из столбцов грида?


Inovet   (2015-01-22 16:12:00) [29]

> [3] duponamk ©   (22.01.15 09:25)
> МойКолум1 - а дальше? С чем, собственно, сравнивать?

А дальше выставляй нужный индекс. Сравнивать с указателем на поле. У тебя поля в датасете созданы в дизайнтайм? Если нет, сравнивай по имени поля.


junglecat   (2015-01-22 10:08:00) [30]

а в TCrackedGrid(Grid).LeftCol что в этом случае?


duponamk   (2015-01-22 10:02:00) [31]


> type TCrackedGrid = class(TDBGrid)
> public
>  property LeftCol;
> end;
>
> (PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[Column.
> Index + TCrackedGrid(Grid).LeftCol] ?


Не проходит.
Я не зря в коде указал вызов ShowMessage. При нажатии на столбец, мне показывается номер столбца, по которому я якобы тыкнул. В данном случае, когда я нажимаю на 5-6й столбцы, ShowMessage выдает мне, что я якобы нажал на 3-4й столбцы, а не 5-6й.
Вот, что называется, и думай, а почему так, а не так как надо?


junglecat   (2015-01-22 09:52:00) [32]

type TCrackedGrid = class(TDBGrid)
public
 property LeftCol;
end;

(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[Column.Index + TCrackedGrid(Grid).LeftCol] ?


duponamk   (2015-01-22 09:45:00) [33]


> (PstIdxDat.Source1.Dataset as TABSTable).IndexName := Column.
> FieldName + '_idx' ?


Не прокатывает. Я ж говорю, прога при сдвиге грида вправо считает, что последние 2 столбца - это 3-4й, а не 5-6й. Счет столбцов нарушается какого-то лешего. Мне и интересно, как эту бяку побороть?


junglecat   (2015-01-22 09:34:00) [34]

(PstIdxDat.Source1.Dataset as TABSTable).IndexName := Column.FieldName + '_idx' ?


duponamk   (2015-01-22 09:33:00) [35]

А по нажатию на последние 2 столбца, прога считает, что нажали на 3-4й столбцы и соответственно их сортирует.


duponamk   (2015-01-22 09:25:00) [36]


> > [1] Inovet ©   (22.01.15 08:01)
> > TColumn
>
> Column


МойКолум1 - а дальше? С чем, собственно, сравнивать? В процедуру передается только столбец, по которому нажали.


Inovet   (2015-01-22 08:02:00) [37]

> [1] Inovet ©   (22.01.15 08:01)
> TColumn

Column


Inovet   (2015-01-22 08:01:00) [38]

if TColumn.Field = МойКолум1 then


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо