Динамическое создание таблицы и полей во время выполнения программы
Delphi в режиме разработки позволяет быстро добавлять и
настраивать в вашем проекте компоненты для работы с базами данных, но есть
ситуации, когда вам нужно создавать и конфигурировать объекты во время
выполнения программы. Например, во время выполнения программы вам может
понадобиться добавить колонку с вычисляемым полем (используя алгоритмы
пользователя). Поэтому вопрос: как, не используя среды разработки, Инспектора
Объектов и редактора TFields, создавать и сконфигурировать TField и другие
компоненты для связки данных?
В следующем примере показано динамическое создание TTable, таблицы базы
данных в связке с TTable, TFieldDefs, TFields, вычисляемых полей и подключение
обработчика для события OnCalc.
Для начала выберите пункт New Application меню File. Будет создан новый
проект с пустой формой, на которой мы и будет создавать на лету наши компоненты.
В секцию interface вашего модуля формы добавьте, как показано ниже,
объявление обработчика события OnCalcFields и поля TaxAmount. Позже мы создадим
TTable и назначим этот обработчик событию TTable OnCalcFields, который позволит
при чтении каждой записи вызывать событие OnCalcFields, которое, в свою очередь,
выполнит нашу процедуру TaxAmountCalc.
Создайте обработчик формы OnCreate как показано ниже (для получения
дополнительной информации о создании обработчиков событий обратитесь к Delphi
Users Guide, Chapter 4 "Working With Code").
procedure TForm1.FormCreate(Sender: TObject);
var
MyTable: TTable;
MyDataSource: TDataSource;
MyGrid: TDBGrid;
begin{ Создаем компонент TTable -- связанная
таблица базы данных будет создана ниже. }
MyTable := TTable.Create(Self);
with MyTable dobegin{ Определяем основную базу данных и таблицу.
Примечание: Test.DB пока не существует. }
DatabaseName := 'DBDemos';
TableName := 'Test.DB';
{ Назначаем TaxAmountCalc обработчиком события,
чтобы использовать его при наступлении события
OnCalcFields в MyTable. }
OnCalcFields := TaxAmountCalc;
{ Создаем и добавляем определения полей к массиву TTable
FieldDefs, затем создаем TField с использованием
информации из определения поля. }with FieldDefs dobegin
Add('ItemsTotal', ftCurrency, 0, false);
FieldDefs[0].CreateField(MyTable);
Add('TaxRate', ftFloat, 0, false);
FieldDefs[1].CreateField(MyTable);
TFloatField(Fields[1]).DisplayFormat := '##.0%';
{ Создаем вычисляемое TField, назначаем свойства,
и добавляем поле к массиву определений MyTable. }
TaxAmount := TFloatField.Create(MyTable);
with TaxAmount dobegin
FieldName := 'TaxAmount';
Calculated := True;
Currency := True;
DataSet := MyTable;
Name := MyTable.Name + FieldName;
MyTable.FieldDefs.Add(Name, ftFloat, 0, false);
end;
end;
{ Создаем в базе данных новую таблицу,
используя в качестве основы MyTable. }
MyTable.CreateTable;
end;
{ Создаем компонент TDataSource
и назначаем его MyTable. }
MyDataSource := TDataSource.Create(Self);
MyDataSource.DataSet := MyTable;
{ Создаем табличную сетку, отображаем
на форме, и назначаем MyDataSource для
получения доступа к данным из MyTable. }
MyGrid := TDBGrid.Create(Self);
with MyGrid dobegin
Parent := Self;
Align := alClient;
DataSource := MyDataSource;
end;
{ Запускаем нашу конструкцию! }
MyTable.Active := True;
Caption := 'Новая таблица ' + MyTable.TableName;
end;
Динамическое создание таблицы и полей во время выполнения программы в Delphi: пример создания TTable, связанной с TFieldDefs, TFields, вычисляемых полей и подключения обработчика для события OnCalc.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.