Категории
Самые читаемые
PochitayKnigi » Компьютеры и Интернет » Программирование » Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Читать онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 18 19 20 21 22 23 24 25 26 ... 123
Перейти на страницу:

   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;

Ниже приведен полный исходный код проекта:

unit gridcalc;

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

TaxAmount: TFloatField;

 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

 MyTable := TTable.Create(Self);

 with MyTable do

 begin

  DatabaseName := 'DBDemos';

  TableName := 'Test.DB';

  OnCalcFields := TaxAmountCalc;

  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%';

   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.CreateTable;

 end;

 MyDataSource := TDataSource.Create(Self);

 MyDataSource.DataSet := MyTable;

 MyGrid := TDBGrid.Create(Self);

 with MyGrid do

 begin

Parent := Self;

  Align := alClient;

  DataSource := MyDataSource;

 end;

 MyTable.Active := True;

 Caption := 'Новая таблица ' + MyTable.TableName;

end;

end

Проблема с AddIndex

Delphi 1 

Я использую таблицу paradox на своей локальной машине.

Я использую следующие команды: 

Table.DatabaseName := 'ABC';

Table.TableName := 'TEST';

Table.CreateTable;

Table.AddIndex('Primary','ID',[ixPrimary]); (работает как часы)

Table.AddIndex('Number_IDX','NUMBER',[ixUnique]); (здесь я получаю ошибку времени выполнения)

ID – LongInt поле

NUMBER – поле типа char[15] 

Как создать БД в кодировке CP1251?

Nomadic отвечает:

Вот такая конструкция проходит на DB2 2.1.2/NT и UDB5/NT…

CREATE DATABASE Efes2

USING CODESET 1251 TERRITORY RU

COLLATE USING IDENTITY; 

Таблицы в памяти

Delphi 1 

Вот пример InMemoryTable. Свободен для использования, модификации и всего остального. Ну и как в отношении других вещей: я не даю никаких гарантий. Я не несу никакой ответственности за ущерб, который может причинить код. Позвольте, я повторю это:

ВНИМАНИЕ! ДАННЫЙ КОД НЕ ПРЕДУСМАТРИВАЕТ НИКАКИХ ГАРАНТИЙ!

ИСПОЛЬЗУЙТЕ ЕГО НА СВОЙ СТРАХ И РИСК - ВЫ ЕДИНСТВЕННЫЙ ЧЕЛОВЕК, ОТВЕТСТВЕННЫЙ ЗА ЛЮБОЙ УЩЕРБ, КОТОРЫЙ МОЖЕТ ПОВЛЕЧЬ ЗА СОБОЙ ИСПОЛЬЗОВАНИЕ ДАННОГО КОДА — Я ВАС ПРЕДУПРЕДИЛ!

Благодарю Steve Garland <[email protected]> за предоставленную помощь. Он создал свой собственный "in-memory" табличный компонент, который послужил мне толчком для написания сего кода.

InMemory-таблицы являются характеристикой Borland Database Engine (BDE). InMemory-таблицы создаются в RAM и удаляются при их закрытии. Работают они значительно быстрее и очень полезны в случае, если вам нужны быстрые операции в небольших таблицах. Данный пример использует вызов функции BDE DbiCreateInMemoryTable. Данный объект должен работать наподобии простой регулярной таблицы, за исключением того, что InMemory-таблицы не поддерживают некоторые характеристики (типа проверка целостности, вторичные индексы и BLOB-поля), и в настоящее время данный код не содержит механизма обработки ошибок. Вероятно, вы получите ошибку при попытке создания memo-поля. Если у вас есть любые замечания, шлите их по адресу [email protected]

unit Inmem;

interface

uses DBTables, WinTypes, WinProcs, DBITypes, DBIProcs, DB, SysUtils;

type TInMemoryTable = class(TTable)

private

hCursor: hDBICur;

 procedure EncodeFieldDesc(var FieldDesc: FLDDesc; const Name: string; DataType: TFieldType; Size: Word);

 function CreateHandle: HDBICur; override;

public

 procedure CreateTable;

end;

implementation

{ Эта функция виртуальная, так что я смог перекрыть ее. В оригинальном VCL-коде для TTable эта функция реально открывает таблицу, но, поскольку мы уже имеем дескриптор таблицы, то мы просто возвращаем его }

function TInMemoryTable.CreateHandle;

begin

 Result := hCursor;

end;

{ Эта функция получена ее простым копированием из исходного кода VCL. Я должен был это сделать, поскольку это было объявлено в секции private компонента TTable, поэтому отсюда у меня не было к этому досупа. }

procedure TInMemoryTable.EncodeFieldDesc(var FieldDesc: FLDDesc; const Name: string; DataType: TFieldType; Size: Word);

const

 TypeMap: array[TFieldType] of Byte = (fldUNKNOWN, fldZSTRING, fldINT16, fldINT32, fldUINT16, fldBOOL,fldFLOAT, fldFLOAT, fldBCD, fldDATE, fldTIME, fldTIMESTAMP, fldBYTES,fldVARBYTES, fldBLOB, fldBLOB, fldBLOB);

begin

 with FieldDesc do

 begin

AnsiToNative(Locale, Name, szName, SizeOf(szName) - 1);

  iFldType := TypeMap[DataType];

  case DataType of

ftString, ftBytes, ftVarBytes, ftBlob, ftMemo, ftGraphic:

   iUnits1 := Size;

  ftBCD:

   begin

iUnits1 := 32;

    iUnits2 := Size;

   end;

  end;

  case DataType of

ftCurrency: iSubType := fldstMONEY;

  ftBlob: iSubType := fldstBINARY;

  ftMemo: iSubType := fldstMEMO;

  ftGraphic: iSubType := fldstGRAPHIC;

  end;

 end;

end;

{ Вот кухня, где все это происходит. Я скопировал эту функцию из исходников VCL и затем изменил ее для использования DbiCreateInMemoryTable вместо DbiCreateTable. Поскольку InMemory-таблицы не поддерживают индексы, я удалил весь соответствующий код. }

procedure TInMemoryTable.CreateTable;

var

 I: Integer;

 pFieldDesc: pFLDDesc;

 szTblName: DBITBLNAME;

 iFields: Word;

 Dogs: pfldDesc;

begin

 CheckInactive;

 if FieldDefs.Count = 0 then for I := 0 to FieldCount - 1 do with Fields[I] do if not Calculated then FieldDefs.Add(FieldName, DataType, Size, Required);

 pFieldDesc := nil;

 SetDBFlag(dbfTable, True);

 try

  AnsiToNative(Locale, TableName, szTblName, SizeOf(szTblName) - 1);

  iFields := FieldDefs.Count;

  pFieldDesc := AllocMem(iFields * SizeOf(FLDDesc));

  for I := 0 to FieldDefs.Count - 1 do with FieldDefs[I] do

1 ... 18 19 20 21 22 23 24 25 26 ... 123
Перейти на страницу:
Тут вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров.
Комментарии