Использование методов FindFirst, FindLast, FindNext, FindPrior
Известно, что набор данных может быть отфильтрован с использованием свойства Filtered Условие фильтрации задается свойством Filter или описывается в обработчике события OnFliter Re cord Свойство Filtered указывает, выполнять ли фильтрацию (значение True) или нет (значение False) В этом случае в НД показываются все записи, а не только удовлетворяющие условию фильтрации
Для НД, в котором определены условия фильтрации, но сама фильтрация в текущий момент не включена, Delphi предоставляет интересную возможность Она заключается в том, что в неотфильтрованном в данный момент НД можно обеспечить навигацию только между теми записями, которые удовлетворяют условию фильтрации (оно в текущий момент, когда свойство Filtered = False, не действует)
Для этой цели используются методы FindFirst, FindLast. FindNext, FindPrior
Условие фильтрации можно сделать совпадающим с условием поиска, указанным в параметре./^ Values метода Locate При этом поиск с помощью указанных методов имеет довольно большое преимущество перед поиском с помощью Locate если в Locate можно указывать только значения, то в условии фильтрации можно указывать логические условия, например
Accept := (DataSet['Doljnosf] = 'доцент') AND (DataSet['TabNum'] > 150000);
т е. включать в НД только записи о сотрудниках-доцентах, и притом не всех, а только тех из них, у которых табельный номер больше 150000
В случае, если искомая запись найдена, данные методы возвращают True, в противном случае - False. Аналогичный результат возвращает свойство Found
function FindFirst: Boolean; -
переходит на первую запись, удовлетворяющую фильтру;function FindLast: Boolean; -
переходит на последнюю запись, удовлетворяющую фильтру;function FindNext: Boolean; -
переходит на следующую запись, удовлетворяющую фильтру;function FindPrior: Boolean; -
переходит на предыдущую запись, удовлетворяющую фильтру;property Found: Boolean; -
возвращает True, если последнее обращение к одному из методов FindFirst, FindLast, FindNext, FindPrior привело к нахождению нужной записи.Пример.
Предоставить пользователю возможность перемещаться на первую, последнюю, следующую, предыдущую запись, удовлетворяющую условию "Содержимое Edit1 входит как часть ФИО сотрудника". Заметим, что свойство Table1.Filtered = False, т.е. хотя в обработчике события Table1.OnFilterRecord и указано условие фильтрации, в НД показываются все записи, и он остается в неотфильтрованном состоянии (см. рис. 7.27 и 7.28)условие
фильтрацииprocedure TFormX.TablelFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept := POS(Editl.Text,DataSet['FIO']) > 0;
end;
// нажата кнопка "Первая"
procedure TFormX.FindFirstButtonClick(Sender: T0b;ect) ;
begin
Labell .Caption := ";
IF not Tablel.FindFirst THEN
Labell.Caption := 'Нет такой записи';
end;
// нажата кнопка "Последняя"
procedure TFormX . FmdLastButtonClick (Sender : TObject) ;
begin
Labell.Caption := ";
IF not Tablel.FindLast THEN
Labell.Caption := 'Нет такой записи';
end;
// нажата кнопка "Следующая"
procedure TFormX.FindNextButtonClick(Sender: TObject);
begin
Labell.Caption := ";
IF not Tablel.FindNext THEN
Labell.Caption := 'Нет такой записи';
end;
// нажата кнопка "Предыдущая"
procedure TFormX.FindPriorButtonClick(Sender: TOb^ect) ;
begin
Labell.Caption := ";
IF not Tabiel.FindPrior THEN
Labell.Caption := 'Нет такой записи';
end;
Заметим, что поскольку фильтрация записей с использованием события OnFilter Record или (и) свойства Filter может применяться только на небольших объемах записей (из-за того, что при этом используется последовательный метод доступа к записям в ТБД), аналогичные ограничения накладываются и на поиск записей с использованием методов FindFirst, FindLast, FindNext, FindPrior.