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 - не предлагать (не то пальто :)).


duponamk   (2015-01-26 06:26:00) [1]


> думаю, тип датасета тут рояли не играет, главное, что FieldName
> приходит правильный


Ты прав, тип датасета роли не играет, если имя поля правильное.


> Пробуешь, конечно, на чистом проекте, не на рабочем?


Может, это и неправильно, но делаю прямо на рабочем проекте: нет времени на создание нового и проверки всего вышепредложенного в новом проекте.

Проблема решилась: установил версию 9.19 AphaControls с AlphaDB-Aware, удалил с формы DBGrid, добавил ее по-новой - глюк исчез. Delphi не обновил в проекте инфу о том, что стоит новый набор компонентов.
Сейчас, насколько я могу судить, все работает как надо.

Спасибо всем за помощь. Тему можно закрывать.


Inovet   (2015-01-25 23:36:00) [2]

> [34] duponamk ©   (25.01.15 19:12)
> У меня уже мозги набекрень от этой проблемы.

Пробуешь, конечно, на чистом проекте, не на рабочем?


junglecat   (2015-01-25 21:10:00) [3]

такой вариант работает на ура
procedure TForm1.sDBGrid1TitleClick(Column: TColumn);
begin
 ADODataSet1.IndexFieldNames := Column.FieldName;
end;

думаю, тип датасета тут рояли не играет, главное, что FieldName приходит правильный


junglecat   (2015-01-25 19:41:00) [4]

возможно, это какой-то косяк именно XE4
В ХЕ3 все пучком


duponamk   (2015-01-25 19:12:00) [5]


> Ну я же не совсем тупой. Конечно, я твою ситуацию воспроизвел


Извини, не хотел обидеть.
У меня уже мозги набекрень от этой проблемы.
Если в ближайшее время не удастся ее решить - буду думать в сторону уменьшения ширины столбцов, чтоб они влезли, блин, в грид.
Но у меня не одна такая прога, в которой столбцы вылезают за края грида, и туда тоже со временем хотелось бы эту возможность добавить. А ширину столбцов не везде можно убавить.


junglecat   (2015-01-25 18:59:00) [6]

Ну я же не совсем тупой. Конечно, я твою ситуацию воспроизвел


duponamk   (2015-01-25 18:55:00) [7]


> у меня такого не наблюдается. Что я делаю не так?


У тебя столбцы в гриде видны все? Если да - то таких косяков и не будет.
Попробуй сделать так, чтоб крайний столбец не был виден совсем и нужен был горизонтальный скроллинг грида. И после этого попробуй сделать сортировку по крайнему столбцу. У меня не идет.


junglecat   (2015-01-25 18:41:00) [8]

> Поставил 9.19.
> Проблема осталась.

у меня такого не наблюдается. Что я делаю не так?


duponamk   (2015-01-25 18:07:00) [9]


> AlphaControls 2014 v9.19, TsDBGrid
> такой проблемы нету


Поставил 9.19.
Проблема осталась.
Зато выяснил еще одно: клик по частично видимому 5му столбцу - сортировка по данному столбцу происходит нормально. А по 6му (крайнему) - он невидим вообще (нужен горизонтальный скролл, чтобы его увидеть) - происходит обратный скролл и фиксируется нажатие на 4й столбец и соответственно этому идет сортировка (по 4му столбцу).


duponamk   (2015-01-25 15:23:00) [10]


> AlphaControls 2014 v9.19, TsDBGrid
> такой проблемы нету


Проверю. У меня 9.18.


Inovet   (2015-01-24 19:54:00) [11]

> [23] duponamk ©   (24.01.15 14:10)
> PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(0)

Двойной клик на датасете может спасти ОРД.


junglecat   (2015-01-24 16:43:00) [12]

AlphaControls 2014 v9.19, TsDBGrid
такой проблемы нету


duponamk   (2015-01-24 16:09:00) [13]


> и чем этот вариант принципиально отличается от того, что
> я в [5] предложил?


Может, и ничем. Тот вариант я тоже пробовал. Он нормально отрабатывает на первых 4х столбцах, которые помещаются в гриде. С 5-6м столбцами, которые находятся за пределами грида и чтобы добраться до них, нужен горизонтальный скроллинг грида - идет затыка с сортировкой. После скролла 5-6й столбцы доступны, можно нажать на заголовках этих столбцов. Вот только после нажатия идет обратный скролл и не фиксируется нажатие на последних столбцах. Уже проверено. Фиксируется нажатие на 3-4й столбцы и соответственно этому идет сортировка. Мне, собственно, это и надо победить.


junglecat   (2015-01-24 14:19:00) [14]

и чем этот вариант принципиально отличается от того, что я в [5] предложил?


junglecat   (2015-01-24 14:17:00) [15]

> ошибка: Accecc violation at address

тут отладчик нужен
что-то из PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber может быть nil


duponamk   (2015-01-24 14:10:00) [16]


> Код давай.



...

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
//if      f = datasetFIELD1 then dataset.IndexName := 'idx1';
//else if f = datasetFIELD2 then dataset.IndexName := 'idx2';
//else if f = datasetFIELD3 then dataset.IndexName := 'idx3';

PstIdxDat.Table1.Active := False;
if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(0) then
 (PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[0]
else if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(1) then
 (PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[1]
else if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(2) then
(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[2]
else if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(3) then
 (PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[3]
else if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(4) then
(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[4]
else if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(5) then
(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[5];
PstIdxDat.Table1.Active := True;
end;


Мог в чем-то напутать, т.к. при нажатии на произвольном столбце вылетает ошибка: Accecc violation at address... и т.д.


duponamk   (2015-01-24 14:07:00) [17]


> а что за грид такой загадочный?
> с Rx таких проблем нету
>
> procedure TForm1.RxDBGrid1TitleClick(Column: TColumn);
> begin
>  ADODataSet1.IndexFieldNames := Column.FieldName;
> end;


Грид из набора AlphaControls, о чем я писал в первом посте.
RxDBGrid не подходит, хоть он у меня и есть. Не то пальто.
ADO не использую - не нужен для программы.


junglecat   (2015-01-24 13:41:00) [18]

а что за грид такой загадочный?
с Rx таких проблем нету

procedure TForm1.RxDBGrid1TitleClick(Column: TColumn);
begin
 ADODataSet1.IndexFieldNames := Column.FieldName;
end;


Плохиш   (2015-01-24 00:21:00) [19]


> Код давай.

Испугаться хочешь?


Inovet   (2015-01-23 18:30:00) [20]

> [17] duponamk ©   (23.01.15 11:23)
> Вариант с датасетами.

Код давай.


Страницы:   1 2

Наверх

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