Форум: "Потрепаться";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
ВнизКак в runtime добавить Calc Field в TTable? Найти похожие ветки
← →
Виктор (2002-07-18 16:56) [0]Пытаюсь добавить вычисляемое поле к уже имеющемуся набору полей таблицы - пока ничего не получается. Делаю так:
fld := TStringField.Create(nil);
fld.FieldKind := fkCalculated;
fld.FieldName := "Calc_FIO";
fld.DisplayLabel := "ФИО";
tbl.Fields.Add(fld);
← →
Виктор (2002-07-18 23:06) [1]АУ! Мастера Delphi! Как добавить Calc Field в runtime?
← →
kaif (2002-07-19 02:23) [2]По-моему это не через tbl.fields.add делается, а присвоением fld.DataSet := tbl или что-то в этом роде (не помню). Но однозначно нужно метод экземляра TField вызывать а не метод экземляра TDataSet. И еще рекомендую владельца для TField назначать (можно тот же tbl), чтобы об удалении экземпляра потом не думать. fld := TStringField.Create(tbl);
← →
Виктор (2002-07-19 10:36) [3]Спасибо. Попробовал, действительно при fld.DataSet := tbl появляется calc поле. Теперь проблема в следующем. Это присвоение можно делать только при закрытой DataSet. Если закрыть, присвоить и открыть заново, то остается только одно кальк-поле. При открытии таблицы не происходит заполнение fields полями из таблицы, если fields непусто (а содержит уже добавленной мной кальк-поле). Поэтому в моем случае при полностью динамическом формировании fields придется отказаться от кальк-полей и делать обычные поля непосредственно в базе. Минус - то, что база будет чуть больше, а плюс - можно будет индексы по ним строить. А как вы думаете?
← →
Пастор (2002-07-19 10:53) [4]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, Grids, DBGrids, ExtCtrls, DBCtrls, DB,
DBTables, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure TaxAmountCalc(DataSet: TDataset);
private
{ Private declarations }
TaxAmount: TFloatField;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.TaxAmountCalc(DataSet: TDataset);
begin
Dataset["TaxAmount"] := Dataset["ItemsTotal"] * (Dataset["TaxRate"] / 100);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
MyTable: TTable;
MyDataSource: TDataSource;
MyGrid: TDBGrid;
begin
{ Создаем компонент TTable -- связанная таблица базы данных будет создана ниже. }
MyTable := TTable.Create(Self);
with MyTable do
begin
{ Определяем основную базу данных и таблицу.
Примечание: Test.DB пока не существует. }
DatabaseName := "DBDemos";
TableName := "Test.DB";
{ Назначаем TaxAmountCalc обработчиком события,
чтобы использовать его при наступлении события
OnCalcFields в MyTable. }
OnCalcFields := TaxAmountCalc;
{ Создаем и добавляем определения полей к массиву TTable
FieldDefs, затем создаем TField с использованием
информации из определения поля. }
with FieldDefs do
begin
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 do
begin
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 do
begin
Parent := Self;
Align := alClient;
DataSource := MyDataSource;
end;
{ Запускаем нашу конструкцию! }
MyTable.Active := True;
Caption := "Новая таблица " + MyTable.TableName;
end;
end.
← →
kaif (2002-07-19 11:46) [5]У DataSet-а есть свойство FieldDefs. Этот объект имеет способность извлекать определения полей из таблицы (в закрытом состоянии) и управлять строительством полей runtime. Изучи его работу. Не бросай начатое дело. Сам себе потом спасибо скажешь.
← →
Виктор (2002-07-19 22:31) [6]Спасибо, Знатоки. Пошел разбираться.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c