Метод CancelRange

Метод CancelRange служит для отмены предыдущих условий фильтрации. Если предыдущую фильтрацию не отменить, возможно, следующие фильтрации принесут не такой результат, которого вы ожидаете.

Изменим пример, приводившийся выше. Сначала удалим из него вызов метода CancelRange. Пусть сначала НД сортируется по наименованию товара (поле Tovar). Разместим в форме группу зависимых переключателей RadioGroup1, позволяющую переключать текущие индексы Table1.

procedure TForml.RadioGroup1Click(Sender: TObject);

Begin

with RadioGroupl do

Begin

case ItemIndex of

// Текущий индекс - по полю ‘Tovar’:

0: Tablel.IndexFieldNames:= 'Tovar';

// Текущий индекс - по полю 'GrNum'

1: Tablel.IndexFieldNames:= 'GrNum';

end; //case

end; //with

end;

Когда пользователь хочет произвести фильтрацию по номеру группы, он нажимает кнопку «Фильтровать», для которой реализован следующий обработчик нажатия:

procedure TForm1.Button1Click(Sender: TObject);

Var

GrNumTmpl,GrNumTmp2: Integer;

Begin

with Tablel do

Begin

// Отмечаем строку текущего выбора в RadloGroup1;

RadioGroupl.Itemlndex:= 1;

// Смена текущего индекса:

IndexFieldNames:= ’GrNum ';

SetRange([GrNumTmp1],[GrNumTmp2]);

end; {with}

end;

Как видно, для фильтрации по полю GrNum необходимо сменить текущий индекс таким образом, чтобы GrNum было индексным полем.

Начинаем работу с неотфильтрованным НД, показанным на рис. 7.20.

 
 

Рис. 7.20. Неотфильтрованный набор данных.

Фильтруем НД по номеру группы, например, только по 3-й группе (рис. 7.21):

 
 

Рис. 7.21. Набор данных отфильтрован по группе 3.

Через некоторое время возвращаемся к сортировке по товару. Для этого отмечаем соответствующий переключатель в группе RadioGroup1. При этом видим, что показы­ваются записи всех групп (рис. 7.22):

 
 

Рис. 7.22. При смене текущего индекса фильтрация отключается.

Это происходит оттого, что при смене текущего индекса невозможно осуществить фильтрацию по другому индексу, уже не являющемуся текущим.

Пусть через некоторое время нам вновь необходимо отфильтровать НД по третьей группе. Напомним, что обработчик нажатия кнопки «Фильтровать» снова сделает текущим индекс, построенный по полю GrNum. И с удивлением отмечаем, что, хотя сортировка и меняется (по GrNum), фильтрации не происходит (рис. 7.23).

 
 

Рис. 7.23. Против ожидания, фильтрация не включилась.

Однако, если попробовать сделать фильтрацию по группе с номером 2, фильтрация будет осуществлена (рис. 7.24).

 
 

Результат можно объяснить следующим образом. Первоначально имеет место фильтрация по индексу GrNum в диапазоне номеров групп [3...3]. После этого мы делаем текущим индекс, построенный по полю Tovar. Фильтрация по группам теперь невозможна, поскольку поле GrNum не входит в новый текущий индекс. Когда мы вновь делаем текущим индекс, построенный по полю GrNum, при этом не меняя диа­пазона групп [3...3], фильтрация не выполняется, поскольку она не отменена и диапа­зоны фильтрации не изменились. Когда же мы задаем новые условия фильтрации в диапазоне групп [2...2], НД фильтруется, т. к. изменился диапазон.

Рис. 7.24. При смене условия фильтрации фильтрация включилась.

Чтобы исключить указанный результат, следует перед новой фильтрацией (по ка­кому бы то ни было индексу) отменять результаты предыдущей фильтрации методом CancelRange:

procedure TForm1.ButtonlClick(Sender: TObject);

Var

GrNumTmpl,GrNumTmp2:Integer;

­begin

with Tablel do

Begin

CancelRange;

RadioGroupl.ItemIndex:= 1;

// Смена текущего индекса:

IndexFieldNames:= 'GrNum';

SetRange([GrNumTmpl],[GrNumTmp2]);

end; {with}

end;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: