Получить во время выполнения приложения список индексов, ассоциированных с таблицей также просто, как вызвать метод GetIndexNames для компонентов TTable, TQuery или TStoredProc. Метод GetIndexNames возвращает список, доступный в наборе данных для компонента TStrignList, установленного на форме (для нашего примера), или других визуальных компонентов, таких как TListBox, через свойство Items:
ListBox1.Clear;Table1.GetIndexNames(ListBox1.Items); |
Естественно, список TStrings, возвращаемый методом GetIndexNames, не должен использоваться визуальным компонентом. Он может представлять собой массив имен индексов, храниться в памяти и использоваться в качестве списка или массива.
Но существует возможность получения дополнительной информации об индексах таблицы, а не только их имена. Другие описываемые атрибуты представляют собой имя каждого индекса, имена полей, включающие каждый индекс и опции индекса, используемые при их создании. Получение этих величин немного труднее, чем простое использование GetIndexNames. В основном, данные значения можно получить с помощью простой итерации свойства IndexDefs компонента TTable, TQuery или TStoredProc. Свойство IndexDefs по существу является массивом записей, по одной записи на каждый индекс таблицы.
Каждая индексная запись (index record) содержит информацию об индексе. Процесс получения массива записей, содержащих информацию отдельно о каждом индексе, достаточно прост в реализации.
Свойство IndexDefs компонента TTable содержит информацию об индексах таблицы, используемой компонентом TTable, TQuery или TStoredProc. Само свойство IndexDefs в свою очередь также имеет различные свойства, содержащие специфическую информацию об извлекаемых индексах. Объект IndexDefs содержит два свойства:
Count: type Integer; доступно только во время выполнения программы и имеет флаг только для чтения; указывает на количество элементов в свойстве Items (например, количество индексов в таблице).
Items: type TIndexDef; доступно только во время выполнения программы и имеет флаг только для чтения; массив объектов TIndexDef, каждый объект описывает один индекс таблицы.
Свойство Count объекта IndexDefs является основой для создания счетчика цикла, в теле которого с помощью элементов свойства Items извлекается информация о каждом индексе таблицы. Каждый объект IndexDef, содержащийся в свойстве Items, состоит из множества свойств, описывающих характеристики каждого индекса в отдельности. Все свойства объекта IndexDef доступны только во время выполнения программы и имеют флаг "только для чтения". Вот эти свойства:
Expression: type String; содержит выражение, использующееся для dBASE multi-field индексов (индексов для нескольких полей). Fields: type String; содержит поле или несколько полей, на основе которых создан индекс. Name: type String; имя индекса. Options: type TIndexOptions; характеристики индекса (ixPrimary, ixUnique и др.). Перед получением любой информации об индексе (Count или Items) необходимо вызвать метод Update объекта IndexDefs. Это обновляет (или инициализирует) набор индексов для объектов IndexDef.
Примеры
procedure TForm1.ListBtnClick(Sender: TObject);vari: Integer;beginListBox1.Items.Clear;with Table1 do beginif IndexDefs.Count > 0 then beginfor i := 0 to IndexDefs.Count - 1 doListBox1.Items.Add(IndexDefs.Items[i].Name)end;end;end; |
procedure TForm1.FormShow(Sender: TObject);vari: Integer;S: String;beginwith Table1 do beginOpen;{Обновляем объект IndexDefs}IndexDefs.Update;if IndexDefs.Count > 0 then begin{Устанавливаем колонки и строки сетки для соответствия элементам IndexDefs}SG1.ColCount := 4;SG1.RowCount := IndexDefs.Count + 1;{Устанавливаем заголовки колонок сетки согласно именам свойств TIndexDef}SG1.Cells[0, 0] := 'Name';SG1.ColWidths[0] := 200;SG1.Cells[1, 0] := 'Fields';SG1.ColWidths[1] := 200;SG1.Cells[2, 0] := 'Expression';SG1.ColWidths[2] := 200;SG1.Cells[3, 0] := 'Options';SG1.ColWidths[3] := 300;{Цикл с опросом IndexDefs.Items}for i := 0 to IndexDefs.Count - 1 do begin{Заполняем ячейки сетки в текущей колонке}SG1.Cells[0, i + 1] := IndexDefs.Items[i].Name;SG1.Cells[1, i + 1] := IndexDefs.Items[i].Fields;SG1.Cells[2, i + 1] := IndexDefs.Items[i].Expression;if ixPrimary in IndexDefs.Items[i].Options thenS := 'ixPrimary, ';if ixUnique in IndexDefs.Items[i].Options thenS := S + 'ixUnique, ';if ixDescending in IndexDefs.Items[i].Options thenS := S + 'ixDescending, ';if ixCaseInsensitive in IndexDefs.Items[i].Options thenS := S + 'ixCaseInsensitive, ';if ixExpression in IndexDefs.Items[i].Options thenS := S + 'ixExpression, ';if S > ' ' then begin{Отфильтровываем ", "}System.Delete(S, Length(S) - 1, 2);SG1.Cells[3, i + 1] := S;end;end;end;end;end; |