Создание и удаление 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, активен, он должен быть закрыт или деактивирован перед вызовом этого метода.
Комментарии