![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сортировка данных по нажатию на заголовок DBGrid
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