532______________________________________________Глава S

Параметр KeyValues представляет собой открытый массив: разделяемый за-
пятыми список значений полей, по которым индексирован набор данных, в той по
следовательности, в которой они входят в индекс. При этом не обязательно пер(
числять все поля — достаточно перечислить первое или несколько первых. Пар;

метр KeyValues_Size определяет индекс последнего поля в массиве, участвующее
в поиске. Поскольку индексы начинаются с 0, то KeyValues_Size на единицу MI
ныпе количества полей, участвующих в поиске.

Вместо FindKey для полей строкового типа можно использовать аналогичнь;

метод FindNearest, обеспечивающий переход к наиболее совпадающей строк'
если полного совпадения не получено. Объявление и параметры этого метода •;

же, что и в методе FindKey. Метод FindNearest можно применять и к цифровы
полям. В этом случае он переместит курсор на первую запись, значение полей в K(
торой больше или равны заданных значений ключей.

Для методов FindKey и FindNearest удобно применять макрос OPENARRAY
создающий временный открытый массив и определяющий его размер:

OPENARRAY(TVarRec,(список ключей))

Макрос OPENARRAY может воспринимать список, включающий до 19 эл'
ментов, разделенных запятыми.

Рассмотрим примеры. Пусть мы хотим выполнить тот же поиск по фамилиг
что и приведенный выше. В данном случае соответствующий код может иметь ви;:

Tablel->IndexFieldNames = "Fam";

Tablel->FindNearest(STVarRec(EFam->Text),0) ;

Если мы хотим выполнить аналогичный поиск, но нас интересует не прост
один из сотрудников с заданной фамилией, а работающий в конкретном подразд'
лении, заданном пользователем в окне редактирования EDep, то поиск можно ос'
ществить с помощью макроса OPENARRAY следующим образом:

Tablel->IndexFieldNames = "Dep;Fam";

Tablel->FindNearest(OPENARRAY(TVarReс,(EDep->Text,EFam->Text))) ;

Первый оператор индексирует таблицу по полям Dep и Fam, а второй задж
ключи для этих полей. Конечно, не надо индексировать таблицу каждый раз перс
осуществлением поиска. Достаточно выполнить это один раз.

Приведем еще один пример. Пусть мы хотим предоставить пользователю уско-
ренный поиск фамилии. Пользователь будет набирать фамилию в окне EFam и при
вводе каждого нового символа курсор должен перемещаться на запись, наиболее
близко совпадающую с уже введенными символами. Для этого сначала надо ин-
дексировать таблицу по полю Fam. А затем достаточно в событие OnChange окна
редактирования EFam вставить обработчик

Tablel->FindNearest(STVarRec(EFam->Text),0) ;

Теперь остановимся на методе Locate. Этот метод объявлен следующим обра-
зом:

bool   fastcall Locate(const System::AnsiString KeyFields,

const System::Variant &KeyValues, TLocateOptions Options);

В качестве первого параметра KeyFields передается строка, содержащая спи-
сок ключевых полей. В качестве второго параметра передается KeyValues — мас-
сив ключевых значений. А третий параметр Options является множеством опций,
элементами которого могут быть loCaselnsensitive — нечувствительность поиска к
регистру, в котором введены символы, и loPartialKey — допустимость частичного
совпадения. Метод возвращает false, если искомая запись не найдена.

В простейшем случае применение Locate отличается от рассмотренных ранее
методов только отсутствием необходимости индексировать набор данных опреде-