Создание и удаление TFields во время выполнения
Потомки компонента TField (типа TStringField, TIntegerField и т.п.) создаются, вызывая метод Create для потомка типа TField соответствующего поля в наборе данных. То есть, метод Create для TStringField потомка TField вызывался бы, чтобы создать потомка TField строкового типа в текущем наборе данных.
Методу Create передается один параметр - владельца потомка TField, каковым является форма, которая его содержит (TForm). После создания потомка компонента TField, большинство ключевых свойств должно быть установлено, чтобы связать его с полем в наборе данных. Это:
- FieldName - имя поля в таблице
- Name - уникальный идентификатор потомка компонента TField
- Index - позиция потомка компонента TField в массиве TFields (свойство Fields для TTable или TQuery, с которым TField будет связан.
- DataSet - TTable или TQuery, с которым TField будет связан.
Отрывок кода ниже демонстрирует создание TStringField. Контейнер TForm называется Form1 (упоминается здесь как переменная Self), активный набор данных - TQuery называется Query1, а поле, для которого создается компонент TStringField - поле таблицы dBase
называется CO_NAME.
Этот новый потомок будет вторым TField в массиве свойства Fields для Query1.
Обратите внимание, что набор данных, с которым новый потомок TField будет связан (в нашем случае Query1) должен быть закрыт перед добавлением TField и затем заново открыт.
procedure TForm1.Button2Click(Sender: TObject); var T: TStringField; begin Query1.Close; T := TStringField.Create(Self); T.FieldName := 'CO_NAME'; T.Name := Query1.Name + T.FieldName; T.Index := Query1.FieldCount; T.DataSet := Query1; Query1.FieldDefs.UpDate; Query1.Open; end;
Этот пример создает новый TStringField по имени Query1CO_NAME.
Для удаления существующего потомка TField просто вызовите метод Free для этого компонента.
В примере ниже используется метод TForm FindComponent, чтобы возвратить указатель на компонент TStringField по имени Query1CO_NAME. Возвращаемое значение для FindComponent будет иметь тип TComponent, если успешно, или nil при неудаче.
Возвращаемое значение может использоваться, чтобы определить, существует ли компонент фактически до вызова метода Free.
procedure TForm1.Button1Click(Sender: TObject); var TC: TComponent; begin TC := FindComponent('Query1CO_NAME'); if not (TC = nil) then begin Query1.Close; TC.Free; Query1.Open; end; end;
Как и с созданием TField, если набор данных, связанный с потомком TField, активен, он должен быть закрыт или деактивирован перед вызовом этого метода.
Комментарии