Для получения доступа к полям таблицы объект TDataSet обладает рядом методов и свойств, основными из которых являются:
· property Fields[Index: Integer];
· function FieldByName(const FieldName: string): TField;
· property FieldCount.
Свойство FieldCountвозвращает число полей в текущей структуре записи. Если необходимо программным путем прочитать имена полей, то для доступа к ним следует применить свойство Fields(пример 5).
Пример 5
Var
S: String;
Begin
S := Table.Fields[0].FieldName;
end;
В приведенном выше примере 5 переменной S присваивается имя первого поля таблицы, индекс которого соответствует нулю. Для доступа к имени последнего поля следует указать индекс равный Table.FieldCount – 1 (Пример 6).
Пример 6
Var
S: String;
Begin
S := Table.Fields[Table.FieldCount - 1].FieldName;
end;
Если необходимо определить текущее содержание выбранного поля конкретной записи, то рекомендуется использовать свойство Fields или метод FieldsByName. Для этого достаточно найти значение i - го поля записи как i - й элемент массива Fields(пример 7).
Пример 7
Var
S: String;
i: Integer;
Begin
i := 3;
S := Table.Fields[i].AsString;
end;
Предположим, что указанное поле в записи содержит номер записи, тогда код, приведенный выше, возвратил бы строку типа «10», «1012» или «1024». Если требуется получить доступ к этой переменный, как к числовой величине, тогда необходимо использовать тип AsInteger вместо типа AsString. Аналогично, указываются и другие типы данных: AsBoolean, AsFloat и AsDate.
В примере 8 показано, что для доступа к данным можно применять функцию FieldsByName вместо свойства Fields.
Пример 8
Var
S: String;
Begin
S := Table.FieldsByName(‘Nuncode’).AsString;
end;
В приведенных примерах 5 – 8 показано, что метод FieldsByName, и свойство Fields возвращают те же самые данные. Два различных синтаксиса используются для того, чтобы обеспечить программистов гибким и удобным набором инструментов для доступа к содержимому DataSet.
Рассмотрим пример, как можно использовать доступ к полям таблицы во время выполнения программы. Для этого необходимо поместить в форму объект Table, два объекта ListBox и две кнопки Button, и присвоить кнопкам имена Fields и Values (рис. 3.). Далее требуется установить связь объекта Table1 с базой данных DBDEMOS посредством свойства DatabaseName и выбрать таблицу CUSTOMER в списке свойства TableName. Для доступа к данным в период дизайна требуется установить свойство Activeтаблицы в состояние True.
Расположение элементов управления в форме
Рис.3
Далее необходимо написать обработчик события для нажатой кнопки Fields(пример 9).
Пример 9
procedure TForm1.FieldsClick(Sender: TObject);
Var
i: Integer;
Begin
ListBox1.Clear;
for i := 0 to Table1.FieldCount - 1 do
ListBox1.Items.Add(Table1.Fields[i].FieldName);
end;
Приведенная процедура (пример 9) функционирует следующим образом. Первая программная строка очищает компонент ListBox1. Затем в цикле последовательно добавляются имена полей таблицы. Обратите внимание на то, что счет в цикле начинается с 0, и заканчивается Table1.FieldCount – 1. Если не вычесть единицу из значения FieldCount, то произойдет исключительная ситуация «List Index Out of Bounds», обусловленная попыткой прочесть имя поля которое не существует.
Для получения доступа к содержимому полей обработчик события для кнопки Valuesбудет иметь вид, приведенный в примере 10.
Пример 10
procedure TForm1.ValuesClick(Sender: TObject);
Var
i: Integer;
Begin
ListBox2.Clear;
for i := 0 to Table1.FieldCount - 1 do
ListBox2.Items.Add(Table1.Fields[i].AsString);
end;
На рисунке 4 приведено функционирующее приложение, демонстрирующее выполнение процедур приведенных в примерах 9 – 10.
Реализация процедур
Рис.4
Напомним, что класс TField обладает следующими свойствами:
· property AsBoolean;
· property AsFloat;
· property AsInteger;
· property AsString;
· property AsDateTime.
Если возникает необходимость, то можно преобразовывать тип поля Boolean к Integer или к Float, тип поля Integer к String или тип поля Float к Integer. Однако преобразовывать тип поля String к Integer невозможно. Если необходимо работать с полями Date или DateTime, то можно использовать преобразования AsString и AsFloat для доступа к ним.