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

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

Читать бесплатно Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001. Жанр: Программирование издательство неизвестно, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

   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

Перейти на страницу:

Валентин Озеров читать все книги автора по порядку

Валентин Озеров - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


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

Отзывы читателей о книге Советы по Delphi. Версия 1.4.3 от 1.1.2001, автор: Валентин Озеров. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*