Получение информации об индексах ТБД
Компонент TindexDefs содержит информацию обо всех индексах таблицы базы данных, объявленных в ней в текущий момент. У TTable имеется свойство property IndexDefs: TIndexDefs; которое содержит ссылку на объект класса TIndexDefs. Поэтому для каждого компонента TTable всегда можно получить информацию об индексах данной ТБД через свойства и методы TIndexDefs. Рассмотрим эти методы и свойства.
Свойства:
property Count: Integer; -
возвращает число индексов;property Items[Index: Integer|: TIndexDef; -
коллекция объектов типа TIndexDef, каждый из которых содержит информацию о конкретном индексе. Index должен принадлежать диапазону [0..Count-1].Экземпляр типа TIndexDef имеет следующие свойства (информацию о методах объекта данного класса можно получить в системе помощи Delphi):
property Name: string; -
возвращает имя индекса;Пример.
Записать в ListBox1 имена всех индексов ТБД, ассоциированной с Table 1:ListBoxl.Clear;
Table1.IndexDefs.Update;
FOR i := 0 TO Tablel.IndexDefs.Count - 1 do ListBoxl.Items.Add(Tablel.IndexDefs[i].Name) ;
Перед считыванием значения свойства Name необходимо выполнить метод Tablel IndexDefs.Update (см. ниже) для обновления информации обо всех имеющихся индексах.
Отметим, что для Paradox-таблиц имя первичного индекса не выдается; вместо этого выдается пустая строка, поскольку первичный индекс для Paradox-таблиц не имеет имени (рис. 8.1):
Пустую строку имени первичного индекса можно заменять, например, словом 'Primary':
var i : Integer;
Ima : String;
begin
ListBox1:Clear;
Table1.IndexDefs.Update;
FOR i := 0 TO Table1.IndexDefs.Count - 1 do begin
Ima := Table1.IndexDefs[i].Name;
IF Ima = '' THEN Ima := 'Primary';
ListBoxl.Items.Add(Ima) ;
END; //FOR
end;
property Fields: string, -
возвращает список полей, по которым построен данный индекс Поля в строке разделены точкой с запятой Именно в таком виде строку можно указывать в свойстве IndexFie!dNames (компонент TTable)property Options: TIndexOptions -
возвращает характеристики индекса в виде множества TIndexOptions = set of (ixPrimary ixUnique, ixDescending, ixNonMaintatned, ixCaselnsensitne). Таким образом, возвращаемое значение может состоять максимум из 6 элементовПример
Показать в Edit1 Text список полей индекса, чье имя является текущим в ListBox1 (результат на рис 82)// обработчик события выбора элемента в ListBoxl:
procedure TForm1.ListBox1Click(Sender: TObject);
var Teklndex : Integer;
begin
Teklndex := ListBox1.Itemlndex; { индекс текущего элемента в ListBoxl}
Edit1.Text := Tablel.IndexDefs[Teklndex].Fields;
Label2.Caption := 'Поля индекса ' + ListBoxl.Items[Teklndex] + ':' ;
end;
Методы
procedure Add(const Name, Fields: string; Options: TIndexOptions);
Метод Add создает новый объект TIndexDef и помещает его в коллекцию TIndexDefs Items На момент создания должны быть определены такие параметры нового объекта TIndexDef, как Name, Fields, Options Их назначение совпадает с назначением аналогичных свойств компонента TindexDef . Этот метод в основном используется при создании новых таблиц
procedure Update;
обновляет элементы коллекции TIndexDefs Items текущей информацией из НД, причем обновление может производиться и без открытия набора данныхprocedure Clear;
очищает элементы коллекции TIndexDefs Itemsfunction Index0f(const Name: string): Integer;
возвращает из коллекции TIndexDefs Items индекс элемента, у которого свойство Name совпадает с параметром Name данного методаfunction FindIndexForFields(const Fields: string): TIndexDef;
Отыскивает индекс по списку его полей, которые содержатся в строке Fields Возвращает указатель на объект TIndexDefв коллекции TIndexDefs Items, в котором содержимое свойства Fields совпадает с параметром Fields индексаМетод GetIndexNames
procedure GetIndexNames(List: Tstrings) - возвращает в параметре List список имен индексов Заметим, что для Paradox-таблиц имя главного индекса не выдается
Пример.
Выдать список индексов ТБД, ассоциированной с Table1 (рис.8.3):ListBox2.Clear;
Tablel.GetIndexNames(ListBox2.Items) ;
Свойства IndexFieldCount и IndexFields
Свойство IndexFieldCount: Integer; - возвращает число полей в текущем индексе НД. Номер первого поля 0.
Свойство IndexFields[Index: Integer]: TField; содержит набор полей текущего индекса; обращение IndexFields [Index] возвращает информацию о поле, определенном в текущем индексе под номером Index (нумерация полей начинается с 0). Для n определенных полей Index лежит в диапазоне 0.. (n-1). Например, чтобы записать в ListBox1 имена всех полей текущего индекса, можно использовать такой фрагмент программы:
var i : Integer;
ListBox1.Clear;
For i:= 0 TO Tablel.IndexFieldCount - 1 do ListBoxl.Items.Add(Tablel.IndexFields[I].FieldName) ;
Поскольку при обращении к Index Fields [Index] возвращается указатель на объект типа TField, для данного поля текущего индекса можно пользоваться всеми свойствами и методами типа TField.