Метод CancelRange
Метод procedure CancelRange; служит для отмены предыдущих условий фильтрации. Если предыдущую фильтрацию не отменить, возможно, следующие фильтрации принесут не такой результат, которого Вы ожидаете.
Изменим пример, приводившийся выше. Сначала удалим из него вызов метода CancelRange. Пусть изначально НД сортируется по наименованию товара (поле 'Tovar'). Разместим в форме группу зависимых переключателей RadioGroup1, позволяющую переключать текущие индексы Tablel:
procedure TFormI.RadioGroup1Click(Sender: TObject);
begin
WITH RadioGroupl do begin
CASE Itemlndex OF
0 : Table1.IndexFieldNames := 'Tovar'; //текущий индекс по полю 'Tovar'
1 : Tablel.IndexFieldNames := 'GrNum'; //текущий индекс по полю 'GrNum'
END;//case
END;//with
end;
Когда пользователь хочет произвести фильтрацию по номеру группы, он нажимает кнопку "Фильтровать", для которой реализован следующий обработчик нажатия:
procedure TForm1.Button1Click(Sender: TObject);
var GrNumTrnp1,GrNumTmp2 : Integer;
begin
{проверка правильности Edit1.Text и Edit2.Text фильтрация по начальному и конечному номеру группы}
WITH Tablel do begin
//отмечаем строку текущего выбора в RadioGroupl:
RadioGroupl.Itemlndex := 1;
{смена текущего индекса}
IndexFieldNames := 'GrNum';
SetRange ( [GrNumTrnp1] , [GrNumTmp2] ) ;
END; {with}
end;
Как видно, для фильтрации по полю GrNum необходимо сменить текущий индекс таким образом, чтобы GrNum было индексным полем. Начинаем работу с неотфильтрованным НД (рис.8.24):
Фильтруем НД по номеру группы, например, только по 3 группе (рис.8.25).
Через некоторое время возвращаемся к сортировке по товару. Для этого отмечаем соответствующий переключатель в группе RadioGroup1. При этом видим, что показываются записи всех групп (рис.8.26):
Это происходит от того, что при смене текущего индекса невозможно осуществить фильтрацию по другому индексу, уже не являющемуся текущим.
Пусть через некоторое время нам вновь необходимо отфильтровать НД по третьей группе. Напомним, что обработчик нажатия кнопки "Фильтровать" снова сделает текущим индекс, построенный по полю GrNum. И с удивлением отмечаем, что хотя сортировка и меняется (по GrNum), фильтрации не происходит (рис.8.27).
Однако, если попробовать сделать фильтрацию по группе с номером 2, фильтрация будет осуществлена (рис.8.28).
Увиденное можно объяснить следующим образом. Первоначально имеет место фильтрация по индексу GrNum в диапазоне номеров групп [3..3]. После этого мы делаем текущим индекс, построенный по полю Tovar. Фильтрация по группам теперь невозможна, поскольку поле GrNum не входит в новый текущий индекс. Когда мы вновь делаем текущим индекс, построенный по полю GrNum, при этом не меняя диапазона групп [3..3], фильтрация не выполняется, поскольку она не отменена и диапазоны фильтрации не изменились. Когда же мы задаем новые условия фильтрации в диапазоне групп [2..2], НД фильтруется, т.к. изменился диапазон.
Обойти эту особенность можно, отменяя перед новой фильтрацией (по какому бы то ни было индексу) результаты предыдущей фильтрации методом НД CancelRange:
procedure TForm1.ButtonlClick(Sender: T0bject) ;
var GrNumTrnp1,GrNumTmp2 : Integer;
begin
{
проверка правильности Edit1.Text и Edit2.Text}{фильтрация по начальному и конечному номеру группы}
WITH Tablel do begin
CancelRange;
//отмечаем строку выбора текущего выбора в RadioGroupl:
RadioGroup1.Itemlndex := 1;
{смена текущего индекса}
IndexFieldNames := 'GrNum';
SetRange([GrNumTrnpl],[GrNumTmp2]) ;
END; {with}
end;