Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

TableBeforePost(Sender: TObject)

var Id: Integer;

begin

 with TTable(Sender) do

 begin

{проверяем, существует ли ID для этой записи}

if Field[0].AsInteger=0 then

begin

{ищем
имя таблицы в ID-Таблице}

IDTable.FindKey[Name]

{извлекаем последний Id – подразумеваем блокировку записи}

Id := IDTable.FieldByName['Last Id'].AsInteger;

Inc(Id);

{записываем новый Id в ID-таблицу – подразумеваем разблокировку таблицы}

IDTable.FieldByName['Last Id'].AsInteger := Id;

IDTable.Post;

{записываем извлеченный ID в вашу таблицу}

Field[0].AsInteger := Id;

end;

 end;

end;

end;

Если вы поместите этот код в обработчик события таблицы BeforePost, вы убедитесь в том, что все ID будут последовательными (без «дырок»). Недостаток: если пользовать во время попытки добавления новой записи вдруг передумает, вы будете иметь запись с заполненным только полем ID.

В случае, если вы решили воспользоваться данным способом (последовательные ID), поместите приведенный выше код в обработчик события таблицы OnNewRecord.

3. Вы можете использовать ID-файл

Используйте те же принципы, что и в предыдущем способе, но вместо ID-таблицы используется ID-Файл. Это дает преимущество за счет более высокой скорости работы, но в многопользовательской среде вы должны сами заботиться о блокировке записей.

Динамическое создание таблицы и полей во время выполнения программы

Delphi в режиме разработки позволяет быстро добавлять и настраивать в вашем проекте компоненты для работы с базами данных, но есть ситуации, когда вам нужно создавать и конфигурировать объекты во время выполнения программы. Например, во время выполнения программы вам может понадобиться добавить колонку с вычисляемым полем (используя алгоритмы пользователя). Поэтому вопрос: как, не используя среды разработки, Инспектора Объектов и редактора TFields, создавать и сконфигурировать TField и другие компоненты для связки данных?

В следующем примере показано динамическое создание TTable, таблицы базы данных в связке с TTable, TFieldDefs, TFields, вычисляемых полей и подключение обработчика для события OnCalc.

Для начала выберите пункт New Application меню File. Будет создан новый проект с пустой формой, на которой мы и будет создавать на лету наши компоненты.

В секцию interface вашего модуля формы добавьте, как показано ниже, объявление обработчика события OnCalcFields и поля TaxAmount. Позже мы создадим TTable и назначим этот обработчик событию TTable OnCalcFields, который позволит при чтении

каждой записи вызывать событие OnCalcFields, которое, в свою очередь, выполнит нашу процедуру TaxAmountCalc.

type TForm1 = class(TForm)

 procedure TaxAmountCalc(DataSet: TDataset);

private

 TaxAmount: TFloatField;

end;

В секции implementation создайте обработчик события OnCalc как показано ниже:

procedure TForm1.TaxAmountCalc(DataSet: TDataset);

begin

 Dataset['TaxAmount'] := Dataset['ItemsTotal'] * (Dataset['TaxRate'] / 100);

end;

Создайте обработчик формы 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 do

 begin

{ Определяем основную базу данных и таблицу. Примечание: Test.DB пока не существует. }

DatabaseName := 'DBDemos';

TableName := 'Test.DB';

{ Назначаем TaxAmountCalc обработчиком события, чтобы использовать его при наступлении события OnCalcFields в MyTable. }

OnCalcFields := TaxAmountCalc;

{ Создаем и добавляем определения полей к массиву TTableFieldDefs, затем создаем 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

Поделиться с друзьями: