- Код: Выделить всё
unit btrfields;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
{ TBtrFieldDef }
TBtrFieldType = (
btrAUTOINC2,btrAUTOINC4,btrBFLOAT4,btrBFLOAT8,btrBFLOAT,btrBIGINT,btrBIT,btrBLOB,btrCHAR,
btrCLOB,btrCURRENCY,btrDATE,btrDATETIME,btrDECIMAL,btrDOUBLE,btrFLOAT4,btrFLOAT8,btrGUID,
btrIDENTITY,btrINTEGER1,btrINTEGER2,btrINTEGER4,btrINTEGER8,btrINTEGER,btrLOGICAL,btrLOGICAL2,
btrLONGVARBINARY,btrLONGVARCHAR,btrMONEY,btrNUMERIC,btrNUMERICSA,btrNUMERICSLB,btrNUMERICSLS,
btrNUMERICSTB,btrNUMERICSTS,btrREAL,btrSMALLIDENTITY,btrSMALLINT,btrSTRING,btrTIME,btrTIMESTAMP,
btrTINYINT,btrUBIGINT,btrUINTEGER,btrUNIQUEIDENTIFIER,btrUNSIGNED_BINARY,btrUNSIGNED1_BINARY,
btrUNSIGNED2_BINARY,btrUNSIGNED4_BINARY,btrUNSIGNED8_BINARY,btrUSMALLINT,btrUTINYINT,btrVARCHAR,
btrWSTRING,btrWSZSTRING,btrWZSTRING,btrZSTRING
);
TBtrFieldDef = class(TCollectionItem)
private
FFieldName: string;
FFieldType: TBtrFieldType;
FSize: Integer;
FPrecision: Integer;
procedure SetSize(lSize: Integer);
procedure SetPrecision(lPrecision: Integer);
procedure SetFieldType(lFieldType: TBtrFieldType);
protected
public
FieldValue:string;
constructor Create(ACollection: TCollection); override;
destructor Destroy; override;
procedure SetDefaultSize;
published
property FieldName: string read FFieldName write FFieldName;
property FieldType: TBtrFieldType read FFieldType write SetFieldType;
property Size: Integer read FSize write SetSize;
property Precision: Integer read FPrecision write SetPrecision;
property Value:string read FieldValue write FieldValue;
end;
{ TBtrFieldDefs }
TBtrFieldDefs = class(TCollection)
private
FOwner: TPersistent;
function GetItem(Idx: Integer): TBtrFieldDef;
protected
function GetOwner: TPersistent; override;
public
constructor Create(BOwner: TPersistent);
{$ifdef SUPPORT_DEFAULT_PARAMS}
procedure Add(const Name: string; DataType: TBtrFieldType; Size: Integer = 0);
{$else}
procedure Add(const Name: string; DataType: TBtrFieldType; Size: Integer);
{$endif}
function AddFieldDef: TBtrFieldDef;
property Items[Idx: Integer]: TBtrFieldDef read GetItem;
//function FieldByName(FName)
end;
implementation
procedure TBtrFieldDef.SetDefaultSize;
begin
// choose default values for variable size fields
case FFieldType of
btrINTEGER1, btrUNSIGNED1_BINARY, btrLOGICAL, btrBIT, btrTINYINT, btrUTINYINT :
begin
FSize := 1;
FPrecision := 0;
end;
btrAUTOINC2, btrINTEGER2, btrUNSIGNED2_BINARY, btrLOGICAL2, btrSMALLIDENTITY, btrSMALLINT, btrUSMALLINT :
begin
FSize := 2;
FPrecision := 0;
end;
btrAUTOINC4, btrBFLOAT4, btrDATE, btrFLOAT4, btrINTEGER4, btrTIME, btrUNSIGNED4_BINARY, btrIDENTITY,
btrREAL, btrINTEGER, btrUINTEGER :
begin
FSize := 4;
FPrecision := 0;
end;
btrBFLOAT8, btrCURRENCY, btrDATETIME, btrFLOAT8, btrINTEGER8, btrTIMESTAMP, btrUNSIGNED8_BINARY,
btrDOUBLE, btrBIGINT, btrUBIGINT :
begin
FSize := 8;
FPrecision := 0;
end;
//&&&!!!!!!????
btrGUID, btrUNIQUEIDENTIFIER :
begin
FSize := 16;
FPrecision := 0;
end;
btrNUMERIC, btrNUMERICSA, btrNUMERICSLB, btrNUMERICSLS, btrNUMERICSTB, btrNUMERICSTS :
begin
FSize := 37;
FPrecision := 0;
end;
btrDECIMAL :
begin
FSize := 64;
FPrecision := 0;
end;
btrSTRING, btrZSTRING, btrVARCHAR, btrCHAR :
begin
FSize := 8000;
FPrecision := 0;
end;
end;
end;
function TBtrFieldDefs.GetItem(Idx: Integer): TBtrFieldDef;
begin
Result := TBtrFieldDef(inherited GetItem(Idx));
end;
constructor TBtrFieldDefs.Create(BOwner: TPersistent);
begin
inherited Create(TBtrFieldDef);
FOwner := BOwner;
end;
function TBtrFieldDefs.AddFieldDef: TBtrFieldDef;
begin
Result := TBtrFieldDef(inherited Add);
end;
function TBtrFieldDefs.GetOwner: TPersistent; {override;}
begin
Result := FOwner;
end;
procedure TBtrFieldDefs.Add(const Name: string; DataType: TBtrFieldType; Size: Integer);
var
FieldDef: TBtrFieldDef;
begin
FieldDef := AddFieldDef;
FieldDef.FieldName := Name;
FieldDef.FieldType := DataType;
if Size <> 0 then
FieldDef.Size := Size;
end;
constructor TBtrFieldDef.Create(ACollection: TCollection); {virtual}
begin
inherited;
FPrecision := 0;
end;
destructor TBtrFieldDef.Destroy; {override}
begin
inherited;
end;
procedure TBtrFieldDef.SetFieldType(lFieldType: TBtrFieldType);
begin
FFieldType := lFieldType;
SetDefaultSize;
end;
procedure TBtrFieldDef.SetSize(lSize: Integer);
begin
FSize := lSize;
end;
procedure TBtrFieldDef.SetPrecision(lPrecision: Integer);
begin
FPrecision := lPrecision;
end;
end.
В основном код ещё сырой и не отлаженный. На данный момент меня интересует реализация метода
- Код: Выделить всё
TBtrFieldDefs.Add
При попытке его вызова
- Код: Выделить всё
var
BTR:TBTRFielddefs;
BTR.Add('Test', btrChar, 1);
Возникает ошибка в строке
- Код: Выделить всё
Result := TBtrFieldDef(inherited Add);
В чём может быть ошибка, куда копать?