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

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

DevExpress cxGrid [D7]


Страницы:   1 2 3

shadow_hawk ©   (2013-05-23 19:05:00) 

Добрый день!

Помогите плизз справиться с задачкой:

Для ускорения навигации в cxGrid включил:
DataController.DataModeController.GridMode := True;

Что получил:
Плюс:
 Скорость увеличилась (это и понятно - сколько надо отобразить строк столько и грузится, а не вся таблица целиком, а в ней около 33000 записей)

Минус:
Фильтр больше не работает. В Footer не показывается количество строк (соответствующих фильтру), просто 0.

По фильтру:
У разработчиков увидел намек на то, что надо обрабатывать событие для фильтра - OnBeforeChange, но что там писать??? не пойму :(
Попытался хотя бы количество и номер строки выяснить:


procedure TFormMain.DBTableViewDataControllerFilterBeforeChange(
 Sender: TcxDBDataFilterCriteria; ADataSet: TDataSet;
 const AFilterText: String);
var
 ARecNo, ARecordCount : integer;
begin
 if NOT ( FormMain.DBTableView.DataController.FilteredRecordCount = 0 ) then
 begin
   with DBTableView.DataController do
   begin
     if IsGridMode then
     begin
       ARecNo := DataSet.RecNo;
       ARecordCount := DataSet.RecordCount;
     end;
   end;
   Caption := ' ARecNo= "' + IntToStr(ARecNo)+
               '" ARecordCount= "' + IntToStr(ARecordCount) + '"';
 end;
 DBTableView.DataController.Summary.FooterSummaryValues[1] := IntToStr(ARecNo);
end;


В заголовке окна вижу - считается правильно - и общее кол-во видно и номер строки. Только общее количество постоянно - фильтр не работает, хотя в области фильтра я вижу строку активного фильтра:


(firma = Тест)


Как было до включения GridMode (и работало):
По правой кнопке выбираю значение ячейки и вызываю процедуры построения и активации фильтра:


procedure TFormMain. MenuItem1Click(Sender: TObject);
begin
 if NOT ( FormMain.DBTableView.DataController.FilteredRecordCount = 0 )   then
 begin
  FilterLike(( DBTableView.Controller.FocusedColumn as TcxGridDBColumn ),
              ( DBTableView.Controller.FocusedColumn as TcxGridDBColumn ).DataBinding.Field.Text, False );
 end;
end;



procedure FilterLike(Col: TcxGridDBColumn; Text: Variant; FlagAddFiltr: Boolean );
begin
   Screen.Cursor := crHourGlass;
   with FormMain.DBTableView.DataController.Filter do
   begin
     if NOT FlagAddFiltr then Clear;
     AddItem( Root, Col, foLike, Text, Text );
     Active := true;
   end;
   Screen.Cursor := crDefault;
end;


shadow_hawk   (2013-05-27 17:33:00) [1]


> Очень странно.
> Фильтр там организован в DataController.Filter.AutoDataSetFilter
> + tvDataControllerFilterGetValueList
> Остальное в tvOrdersDataControllerSummaryAfterSummary


А вот это надо поковырять. В любом случае это уже лучше!
Наводит на мысль, что решить вопрос с фильтром разработчик предлагает одним из нескольких способов:
я споткнулся на DataControllerFilterBeforeChange,
а другие типо DataControllerFilterGetValueListупустил из виду.
Вернее я естественно смотрел этот пример, но оказалось, что в меню  демо-программы необходимо все включать - калькулятор, сортировку и фильтр и тогда видно, что они работают! Причем даже на группах! Ну а уж к ПКМ это можно прикрутить :)

Спасибо!


shadow_hawk   (2013-05-27 16:46:00) [2]


> GridMode предполагает что большинство возможностей грида
> будут отключены, их реализацией будет заниматься сам разработчик.
>   Сомнительное удовольствие, однако.


Совершенно верно! НО! когда записей очень много надо что то делать, а я решал раньшевопрос просто:
Все записи раз в какое-то время в архивную таблицу переносил и когда нужны общие результаты - а они не так часто нужны - то просто сделал дополнительный инструмент, в котором на уровне SQL-запроса делаю нужную выборку. Но наворачивать такую поисковую систему как постоянный инструмент - это глупость. А при отключенной GridMode  клиент очень доволен всеми возможностями - просто ему иногда очень ненравится ждать когда все данные закешируются (10-15 сек. максимум) в датасет. Памяти на 10-15 тысяч записей вполне хватает.

И тем не менее у меня есть желание решить этот вопрос с включенным GridMode, и я надеюсь, что мне это удастся. Очень много людей его задают и почему-то никто так и не опубликовал нормальное решение в виде кода. Это надо исправить.


turbouser   (2013-05-27 15:57:00) [3]


> shadow_hawk ©   (27.05.13 14:30) [37]
> в нем я не нашел ни фильтра, ни суммы, ни счетчиков.

Очень странно.
Фильтр там организован в DataController.Filter.AutoDataSetFilter + tvDataControllerFilterGetValueList
Остальное в tvOrdersDataControllerSummaryAfterSummary
и т.п.


> Inovet ©   (27.05.13 14:35) [38]


> Не значит ли это, что GridMode для чего-то другого предназначен?

GridMode предполагает что большинство возможностей грида будут отключены, их реализацией будет заниматься сам разработчик. Сомнительное удовольствие, однако.


Inovet   (2013-05-27 14:35:00) [4]

> [37] shadow_hawk ©   (27.05.13 14:30)
> Этот пример я тоже изучал  - в нем я не нашел ни фильтра,
> ни суммы, ни счетчиков. Хотя грид и установлен в GridMode := True;

Не значит ли это, что GridMode для чего-то другого предназначен? Мне показалось, тут намекали на это.


shadow_hawk   (2013-05-27 14:30:00) [5]

To Inovet


> > TdxMemData
>
> Так, а где среди TADO такой компонент?


Этот компонент на закладке Dev Express

Это вариант, когда не надо привязываться к базе данных, просто для примера. В реальной программе я его не использую.

To turbouser


> \Program Files (x86)\DevExpress VCL\ExpressQuantumGrid\Demos\Delphi\GridModeDemo\


Этот пример я тоже изучал  - в нем я не нашел ни фильтра, ни суммы, ни счетчиков. Хотя грид и установлен в GridMode := True;

:(


turbouser   (2013-05-27 13:53:00) [6]

\Program Files (x86)\DevExpress VCL\ExpressQuantumGrid\Demos\Delphi\GridModeDemo\


Inovet   (2013-05-27 13:45:00) [7]

> [32] shadow_hawk ©   (27.05.13 13:14)
> TdxMemData

Так, а где среди TADO такой компонент?


shadow_hawk   (2013-05-27 13:42:00) [8]


> Ну да, сейчас, только шнурки поглажу и побегу ставить делфи,
>  компоненты, примеры ваять...
>
> Найми программиста, в конце концов.


Больше негде тролить?


Плохиш   (2013-05-27 13:30:00) [9]


> И где пример, о котором ты говоришь?

О каком примере я говорил?

> Приведи простой пример

Ну да, сейчас, только шнурки поглажу и побегу ставить делфи, компоненты, примеры ваять...

Найми программиста, в конце концов.


shadow_hawk   (2013-05-27 13:14:00) [10]

То Плохиш


> Странно, я сходил к гуглю, набрал название требуемого компанента,
>  ткнул мышой в предложеный вариант запроса, и, о чудо, в
> первой же ссылки получил подробную инструкцию по использованию
> фильтрации в этом компоненте.


И где пример, о котором ты говоришь? Инструкции я читал - воспользоваться не не получается - получил оверфлоу по стеку. Поэтому и пришел за помощью!

Приведи простой пример, не надо никаких сложностей:
Форма и 3 компонента: TdxMemData, TDataSource и cxGrid.
В гриде пару столбцов String один Integer и GridMode в True.
В футтере по колонке integer отображать skSum по любой текстовой skCount.
В фильтре отображать строку фильтра.
Написать процедуры, которые заставять работать фильтр, skSum и skCount.

Мне это не под силу - если ты с этим справился - код в студию и ветку можно закрыть :)


Плохиш   (2013-05-27 11:04:00) [11]


> И ... если найдешь ПРИМЕР (что бы работал ФИЛЬТР в cxGRID)
> на сайте разработчика - ткни меня в него носом

Кстати, ссылка вела на форум разработчиков.

> и ветку сразу закроем!

Ветку можно закрывать.


Плохиш   (2013-05-27 11:02:00) [12]


> Если ты не знаешь, что такое cxGrid - тогда ... ну сходи
> на сайт разработчика и почитай что это

Странно, я сходил к гуглю, набрал название требуемого компанента, ткнул мышой в предложеный вариант запроса, и, о чудо, в первой же ссылки получил подробную инструкцию по использованию фильтрации в этом компоненте.


Inovet   (2013-05-26 13:00:00) [13]

> [28] turbouser ©   (26.05.13 12:13)
> Именно датасет. Не грид

Пытаемся донести мысль о датасете уже много постов.


turbouser   (2013-05-26 12:13:00) [14]


> shadow_hawk ©

Сам - это значит что тебе самому надо фильтровать датасет. Именно датасет . Не грид.


Германн   (2013-05-26 02:31:00) [15]


> Если ты не знаешь, что такое cxGrid - тогда ... ну сходи
> на сайт разработчика и почитай что это

В первую очередь на сайт разработчика стоит сходить тебе! Ты же используешь данный компонент!


shadow_hawk   (2013-05-25 22:22:00) [16]

To turbouser


> Ты внимательно читал? Для гридмоде фильтр не будет работать.
>  DBTableViewDataControllerFilterBeforeChange предполагает
> что ты сам (САМ, емае!!!) будешь фильтровать датасет. Понятно?
>


Очень тяжело оставаться политкорректным :)

Я в первом посте об этом написал! Я знаю, что надо писать самомуобработчик события OnBeforeChange и написал, что не знаю чтотам писать!!! Какими буквами еще об этом надо прокричать? :)

Если ты не знаешь, что такое cxGrid - тогда ... ну сходи на сайт разработчика и почитай что это, потому что в двух словах это ГРИД, а больше объяснять ветка не потянет, и компоненты там же найдешь. Извини, если погорячился, но мне нужна ПОМОЩЬ, а не пустая болтовня, и вопросы по моим предыдущим постам :)

МАСТЕРА, плизз отзовитесь, кто знает cxGRID, кто справился с GridMode := True


turbouser   (2013-05-25 21:57:00) [17]

ТС, откуда у тебя эти компоненты?


turbouser   (2013-05-25 21:54:00) [18]


>  shadow_hawk ©   (25.05.13 21:48) [23]


> что бы работал ФИЛЬТР в cxGRID

Ты внимательно читал? Для гридмоде фильтр не будет работать. DBTableViewDataControllerFilterBeforeChange предполагает что ты сам (САМ, емае!!!) будешь фильтровать датасет. Понятно?


shadow_hawk   (2013-05-25 21:48:00) [19]

To turbouser

Вопрос:

> За тебя поискать ответы и примеры на сайте devexpress?

Ответ:

> По фильтру:
> У разработчиков увидел намек на то, что надо обрабатывать
> событие для фильтра - OnBeforeChange, но что там писать?
> ?? не пойму :(

Вопрос:

> ты хоть понимаешь, зачем вообще этот GridMode нужен?

Ответ:

> Для ускорения навигации в cxGrid включил:
> DataController.DataModeController.GridMode := True;
>
> Что получил:
> Плюс:
>  Скорость увеличилась (это и понятно - сколько надо отобразить
> строк столько и грузится, а не вся таблица целиком

Ответы я взял из своего первого поста.

И ... если найдешь ПРИМЕР(что бы работал ФИЛЬТРв cxGRID) на сайте разработчика - ткни меня в него носом :) - буду очень благодарен и ветку сразу закроем!


turbouser   (2013-05-25 20:47:00) [20]


> shadow_hawk ©


> Надеюсь мы все выяснили, осталось понять, как это теперь
> поможет ответить на вопрос про OnBeforeChange при GridMode
> := True ?

За тебя поискать ответы и примеры на сайте devexpress?


Страницы:   1 2 3

Наверх

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