home *** CD-ROM | disk | FTP | other *** search
/ PC Format Collection 48 / SENT14D.ISO / tech / delphi / disk14 / doc.pak / DB.INT < prev    next >
Encoding:
Text File  |  1995-08-24  |  19.2 KB  |  586 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Delphi Visual Component Library                 }
  5. {                                                       }
  6. {       Copyright (c) 1995 Borland International        }
  7. {                                                       }
  8. {*******************************************************}
  9.  
  10. unit DB;
  11.  
  12. {$N+,P+,S-}
  13.  
  14. interface
  15.  
  16. uses SysUtils, WinTypes, WinProcs, DbiTypes, DbiProcs, DbiErrs, Classes;
  17.  
  18. const
  19.  
  20. { TDBDataSet flags }
  21.  
  22.   dbfOpened     = 0;
  23.   dbfPrepared   = 1;
  24.   dbfExecSQL    = 2;
  25.   dbfTable      = 3;
  26.   dbfFieldList  = 4;
  27.   dbfIndexList  = 5;
  28.   dbfStoredProc = 6;
  29.   dbfExecProc   = 7;
  30.  
  31. type
  32.  
  33. { Forward declarations }
  34.  
  35.   TDBError = class;
  36.   TSession = class;
  37.   TDatabase = class;
  38.   TFieldDefs = class;
  39.   TDataset = class;
  40.   TDBDataset = class;
  41.   TField = class;
  42.   TDataSource = class;
  43.   TDataLink = class;
  44.  
  45. { Generic types }
  46.  
  47.   TSymbolStr = string[DBIMAXNAMELEN];
  48.   TMessageStr = string[DBIMAXMSGLEN];
  49.  
  50.   PFieldDescList = ^TFieldDescList;
  51.   TFieldDescList = array[0..1023] of FLDDesc;
  52.  
  53.   PIndexDescList = ^TIndexDescList;
  54.   TIndexDescList = array[0..63] of IDXDesc;
  55.  
  56. { Exception classes }
  57.  
  58.   EDatabaseError = class(Exception);
  59.  
  60.   EDBEngineError = class(EDatabaseError)
  61.   public
  62.     constructor Create(ErrorCode: DBIResult);
  63.     destructor Destroy; override;
  64.     property ErrorCount: Integer;
  65.     property Errors[Index: Integer]: TDBError;
  66.   end;
  67.  
  68. { BDE error information type }
  69.  
  70.   TDBError = class
  71.   public
  72.     constructor Create(Owner: EDBEngineError; ErrorCode: DBIResult;
  73.       NativeError: Longint; Message: PChar);
  74.     property Category: Byte;
  75.     property ErrorCode: DBIResult;
  76.     property SubCode: Byte;
  77.     property Message: TMessageStr;
  78.     property NativeError: Longint;
  79.   end;
  80.  
  81. { TLocale }
  82.  
  83.   TLocale = Pointer;
  84.  
  85. { TSession }
  86.  
  87.   TPasswordEvent = procedure(Sender: TObject; var Continue: Boolean);
  88.  
  89.   TCallBack = record
  90.     Data: Longint;
  91.     BufLen: Word;
  92.     Buffer: Pointer;
  93.     ChainedFunc: Pointer;
  94.   end;
  95.  
  96.   TSession = class(TComponent)
  97.   public
  98.     constructor Create(AOwner: TComponent);
  99.     destructor Destroy; override;
  100.     procedure AddPassword(const Password: string);
  101.     procedure CloseDatabase(Database: TDatabase);
  102.     procedure DropConnections;
  103.     function FindDatabase(const DatabaseName: string): TDatabase;
  104.     procedure GetAliasNames(List: TStrings);
  105.     procedure GetAliasParams(const AliasName: string; List: TStrings);
  106.     procedure GetDatabaseNames(List: TStrings);
  107.     procedure GetDriverNames(List: TStrings);
  108.     procedure GetDriverParams(const DriverName: string; List: TStrings);
  109.     function GetPassword: Boolean;
  110.     procedure GetTableNames(const DatabaseName, Pattern: string;
  111.       Extensions, SystemTables: Boolean; List: TStrings);
  112.     procedure GetStoredProcNames(const DatabaseName: string; List: TStrings);
  113.     function OpenDatabase(const DatabaseName: string): TDatabase;
  114.     procedure RemoveAllPasswords;
  115.     procedure RemovePassword(const Password: string);
  116.     property DatabaseCount: Integer;
  117.     property Databases[Index: Integer]: TDatabase;
  118.     property Handle: HDBISES;
  119.     property KeepConnections: Boolean default True;
  120.     property Locale: TLocale;
  121.     property NetFileDir: string;
  122.     property PrivateDir: string;
  123.     property OnPassword: TPasswordEvent;
  124.   end;
  125.  
  126. { TParamList }
  127.  
  128.   TParamList = class(TObject)
  129.   public
  130.     constructor Create(Params: TStrings);
  131.     destructor Destroy; override;
  132.     property Buffer: PChar;
  133.     property FieldCount: Integer;
  134.     property FieldDescs: PFieldDescList;
  135.   end;
  136.  
  137. { TDatabase }
  138.  
  139.   TTransIsolation = (tiDirtyRead, tiReadCommitted, tiRepeatableRead);
  140.  
  141.   TLoginEvent = procedure(Database: TDatabase;
  142.     LoginParams: TStrings) of object;
  143.  
  144.   TDatabase = class(TComponent)
  145.   protected
  146.     procedure Loaded; override;
  147.   public
  148.     constructor Create(AOwner: TComponent); override;
  149.     destructor Destroy; override;
  150.     procedure Close;
  151.     procedure CloseDatasets;
  152.     procedure Commit;
  153.     procedure Open;
  154.     procedure Rollback;
  155.     procedure StartTransaction;
  156.     procedure ValidateName(const Name: string);
  157.     property DatasetCount: Integer;
  158.     property Datasets[Index: Integer]: TDBDataset;
  159.     property Handle: HDBIDB;
  160.     property IsSQLBased: Boolean;
  161.     property Locale: TLocale;
  162.     property Temporary: Boolean;
  163.   published
  164.     property AliasName: TSymbolStr;
  165.     property Connected: Boolean default False;
  166.     property DatabaseName: TFileName;
  167.     property DriverName: TSymbolStr;
  168.     property KeepConnection: Boolean default True;
  169.     property LoginPrompt: Boolean default True;
  170.     property Params: TStrings;
  171.     property TransIsolation: TTransIsolation default tiReadCommitted;
  172.     property OnLogin: TLoginEvent;
  173.   end;
  174.  
  175. { TDataSetDesigner }
  176.  
  177.   TDataEvent = (deFieldChange, deRecordChange, deDataSetChange,
  178.     deDataSetScroll, deLayoutChange, deUpdateRecord, deUpdateState,
  179.     deCheckBrowseMode, dePropertyChange, deFieldListChange,
  180.     deFocusControl);
  181.  
  182.   TDataSetDesigner = class(TObject)
  183.   public
  184.     constructor Create(DataSet: TDataSet);
  185.     destructor Destroy; override;
  186.     procedure BeginDesign;
  187.     procedure DataEvent(Event: TDataEvent; Info: Longint); virtual;
  188.     procedure EndDesign;
  189.     property DataSet: TDataSet;
  190.   end;
  191.  
  192. { TFieldDef }
  193.  
  194.   TFieldClass = class of TField;
  195.  
  196.   TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord,
  197.     ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime,
  198.     ftBytes, ftVarBytes, ftBlob, ftMemo, ftGraphic);
  199.  
  200.   TFieldDef = class
  201.   public
  202.     constructor Create(Owner: TFieldDefs; const Name: string;
  203.       DataType: TFieldType; Size: Word; Required: Boolean; FieldNo: Integer);
  204.     destructor Destroy; override;
  205.     function CreateField(Owner: TComponent): TField;
  206.     property DataType: TFieldType;
  207.     property FieldClass: TFieldClass;
  208.     property FieldNo: Integer;
  209.     property Name: string;
  210.     property Required: Boolean;
  211.     property Size: Word;
  212.   end;
  213.  
  214. { TFieldDefs }
  215.  
  216.   TFieldDefs = class
  217.   public
  218.     constructor Create(DataSet: TDataSet);
  219.     destructor Destroy; override;
  220.     procedure Add(const Name: string; DataType: TFieldType; Size: Word;
  221.       Required: Boolean);
  222.     procedure AddFieldDesc(FieldDesc: FLDDesc; Required: Boolean;
  223.       FieldNo: Word);
  224.     procedure Assign(FieldDefs: TFieldDefs);
  225.     procedure Clear;
  226.     function Find(const Name: string): TFieldDef;
  227.     function IndexOf(const Name: string): Integer;
  228.     procedure Update;
  229.     property Count: Integer;
  230.     property Items[Index: Integer]: TFieldDef; default;
  231.   end;
  232.  
  233. { TDataSet }
  234.  
  235.   TBookmark = Pointer;
  236.  
  237.   PBufferList = ^TBufferList;
  238.   TBufferList = array[0..dsMaxBufferCount - 1] of PChar;
  239.  
  240.   TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert,
  241.     dsSetKey, dsCalcFields);
  242.  
  243.   TGetMode = (gmCurrent, gmNext, gmPrior);
  244.  
  245.   TKeyIndex = (kiLookup, kiRangeStart, kiRangeEnd, kiCurRangeStart,
  246.     kiCurRangeEnd, kiSave);
  247.  
  248.   PKeyBuffer = ^TKeyBuffer;
  249.   TKeyBuffer = record
  250.     Modified: Boolean;
  251.     Exclusive: Boolean;
  252.     FieldCount: Integer;
  253.     Data: record end;
  254.   end;
  255.  
  256.   TDataSetNotifyEvent = procedure(DataSet: TDataSet) of object;
  257.  
  258.   TDataSet = class(TComponent)
  259.     procedure BeginInsertAppend;
  260.     procedure BindFields(Binding: Boolean);
  261.     procedure CheckCanModify;
  262.     procedure CheckFieldName(const FieldName: string);
  263.     procedure CheckRequiredFields;
  264.     procedure CheckSetKeyMode;
  265.     procedure CopyBuffer(SourceIndex, DestIndex: Integer);
  266.     procedure CreateFields;
  267.     procedure DestroyFields;
  268.     procedure EndInsertAppend;
  269.     function FieldByNumber(FieldNo: Integer): TField;
  270.     procedure FreeFieldBuffers;
  271.     function GetActive: Boolean;
  272.     procedure GetCalcFields(Index: Integer);
  273.     function GetField(Index: Integer): TField;
  274.     function GetFieldCount: Integer;
  275.     procedure GetIndexInfo;
  276.     function GetNextRecord: Boolean;
  277.     function GetNextRecords: Integer;
  278.     function GetPriorRecord: Boolean;
  279.     function GetPriorRecords: Integer;
  280.     function GetRecord(Index: Integer; GetMode: TGetMode): DBIResult;
  281.     function GetRecordCount: Longint;
  282.     function InitKeyBuffer(Buffer: PKeyBuffer): PKeyBuffer;
  283.     procedure InitRecord(Buffer: PChar);
  284.     procedure InternalClose;
  285.     procedure InternalOpen;
  286.     procedure MoveBuffer(CurIndex, NewIndex: Integer);
  287.     procedure PostKeyBuffer(Commit: Boolean);
  288.     procedure RemoveDataSource(DataSource: TDataSource);
  289.     procedure RemoveField(Field: TField);
  290.     procedure SetActive(Value: Boolean);
  291.     procedure SetBufferCount(Value: Integer);
  292.     procedure SetBufListSize(Value: Integer);
  293.     procedure SetCurrentRecord(Index: Integer);
  294.     procedure SetField(Index: Integer; Value: TField);
  295.     procedure SetFieldDefs(Value: TFieldDefs);
  296.     procedure SetState(Value: TDataSetState);
  297.     procedure UpdateBufferCount;
  298.     procedure UpdateFieldDefs;
  299.   protected
  300.     procedure CheckInactive;
  301.     procedure ClearBuffers;
  302.     procedure CloseCursor; virtual;
  303.     function CreateHandle: HDBICur; virtual;
  304.     procedure DataEvent(Event: TDataEvent; Info: Longint); virtual;
  305.     procedure DoAfterCancel; virtual;
  306.     procedure DoAfterClose; virtual;
  307.     procedure DoAfterDelete; virtual;
  308.     procedure DoAfterEdit; virtual;
  309.     procedure DoAfterInsert; virtual;
  310.     procedure DoAfterOpen; virtual;
  311.     procedure DoAfterPost; virtual;
  312.     procedure DoBeforeCancel; virtual;
  313.     procedure DoBeforeClose; virtual;
  314.     procedure DoBeforeDelete; virtual;
  315.     procedure DoBeforeEdit; virtual;
  316.     procedure DoBeforeInsert; virtual;
  317.     procedure DoBeforeOpen; virtual;
  318.     procedure DoBeforePost; virtual;
  319.     procedure DoOnCalcFields; virtual;
  320.     procedure DoOnNewRecord; virtual;
  321.     function GetDataSource: TDataSource; virtual;
  322.     function GetIndexField(Index: Integer): TField;
  323.     function GetIndexFieldCount: Integer;
  324.     function GetKeyBuffer(KeyIndex: TKeyIndex): PKeyBuffer;
  325.     function GetKeyExclusive: Boolean;
  326.     function GetKeyFieldCount: Integer;
  327.     procedure InitFieldDefs; virtual;
  328.     procedure Loaded; override;
  329.     procedure OpenCursor; virtual;
  330.     procedure PrepareCursor; virtual;
  331.     function ResetCursorRange: Boolean;
  332.     function SetCursorRange: Boolean;
  333.     procedure SetIndexField(Index: Integer; Value: TField);
  334.     procedure SetKeyBuffer(KeyIndex: TKeyIndex; Clear: Boolean);
  335.     procedure SetKeyExclusive(Value: Boolean);
  336.     procedure SetKeyFieldCount(Value: Integer);
  337.     procedure SetKeyFields(KeyIndex: TKeyIndex;
  338.       const Values: array of const);
  339.     procedure SetLinkRanges(MasterFields: TList);
  340.     procedure SetName(const Value: TComponentName); override;
  341.     procedure SwitchToIndex(IndexName, TagName: PChar);
  342.     procedure WriteComponents(Writer: TWriter); override;
  343.     property InfoQueryMode: Boolean;
  344.   public
  345.     constructor Create(AOwner: TComponent); override;
  346.     destructor Destroy; override;
  347.     function ActiveBuffer: PChar;
  348.     procedure Append;
  349.     procedure AppendRecord(const Values: array of const);
  350.     procedure Cancel;
  351.     procedure CheckBrowseMode;
  352.     procedure ClearFields;
  353.     procedure Close;
  354.     procedure CursorPosChanged;
  355.     procedure Delete;
  356.     procedure DisableControls;
  357.     procedure Edit;
  358.     procedure EnableControls;
  359.     function FieldByName(const FieldName: string): TField;
  360.     function FindField(const FieldName: string): TField;
  361.     procedure First;
  362.     procedure FreeBookmark(Bookmark: TBookmark);
  363.     function GetBookmark: TBookmark;
  364.     function GetCurrentRecord(Buffer: PChar): Boolean;
  365.     procedure GetFieldNames(List: TStrings);
  366.     procedure GotoBookmark(Bookmark: TBookmark);
  367.     procedure Insert;
  368.     procedure InsertRecord(const Values: array of const);
  369.     function IsLinkedTo(DataSource: TDataSource): Boolean;
  370.     procedure Last;
  371.     procedure MoveBy(Distance: Integer);
  372.     procedure Next;
  373.     procedure Open;
  374.     procedure Post;
  375.     procedure Prior;
  376.     procedure Refresh;
  377.     procedure Resync(Mode: TResyncMode);
  378.     procedure SetFields(const Values: array of const);
  379.     procedure UpdateCursorPos;
  380.     procedure UpdateRecord;
  381.     property BOF: Boolean;
  382.     property CanModify: Boolean;
  383.     property DataSource: TDataSource;
  384.     property DefaultFields: Boolean;
  385.     property Designer: TDataSetDesigner;
  386.     property EOF: Boolean;
  387.     property FieldCount: Integer;
  388.     property FieldDefs: TFieldDefs;
  389.     property Fields[Index: Integer]: TField;
  390.     property Handle: HDBICur;
  391.     property Modified: Boolean;
  392.     property RecordCount: Longint;
  393.     property RecordSize: Word;
  394.     property State: TDataSetState;
  395.     property Locale: TLocale;
  396.   published
  397.     property Active: Boolean default False;
  398.     property AutoCalcFields: Boolean default True;
  399.     property BeforeOpen: TDataSetNotifyEvent;
  400.     property AfterOpen: TDataSetNotifyEvent;
  401.     property BeforeClose: TDataSetNotifyEvent;
  402.     property AfterClose: TDataSetNotifyEvent;
  403.     property BeforeInsert: TDataSetNotifyEvent;
  404.     property AfterInsert: TDataSetNotifyEvent;
  405.     property BeforeEdit: TDataSetNotifyEvent;
  406.     property AfterEdit: TDataSetNotifyEvent;
  407.     property BeforePost: TDataSetNotifyEvent;
  408.     property AfterPost: TDataSetNotifyEvent;
  409.     property BeforeCancel: TDataSetNotifyEvent;
  410.     property AfterCancel: TDataSetNotifyEvent;
  411.     property BeforeDelete: TDataSetNotifyEvent;
  412.     property AfterDelete: TDataSetNotifyEvent;
  413.     property OnNewRecord: TDataSetNotifyEvent;
  414.     property OnCalcFields: TDataSetNotifyEvent;
  415.   end;
  416.  
  417. { TDBDataSet }
  418.  
  419.   TUpdateMode = (upWhereAll, upWhereChanged, upWhereKeyOnly);
  420.   TDBFlags = set of 0..15;
  421.  
  422.   TDBDataSet = class(TDataSet)
  423.   protected
  424.     procedure CloseCursor; override;
  425.     procedure Disconnect; virtual;
  426.     procedure OpenCursor; override;
  427.     procedure SetDBFlag(Flag: Integer; Value: Boolean); virtual;
  428.     property DBFlags: TDBFlags;
  429.     property UpdateMode: TUpdateMode default upWhereAll;
  430.   public
  431.     property Database: TDatabase;
  432.     property DBHandle: HDBIDB;
  433.     property DBLocale: TLocale;
  434.   published
  435.     property DatabaseName: TFileName;
  436.   end;
  437.  
  438. { TDataSource }
  439.  
  440.   TDataChangeEvent = procedure(Sender: TObject; Field: TField) of object;
  441.  
  442.   TDataSource = class(TComponent)
  443.   public
  444.     constructor Create(AOwner: TComponent); override;
  445.     destructor Destroy; override;
  446.     procedure Edit;
  447.     function IsLinkedTo(DataSet: TDataSet): Boolean;
  448.     property State: TDataSetState;
  449.   published
  450.     property AutoEdit: Boolean default True;
  451.     property DataSet: TDataSet;
  452.     property Enabled: Boolean default True;
  453.     property OnStateChange: TNotifyEvent;
  454.     property OnDataChange: TDataChangeEvent;
  455.     property OnUpdateData: TNotifyEvent;
  456.   end;
  457.  
  458. { TField }
  459.  
  460.   TFieldNotifyEvent = procedure(Sender: TField) of object;
  461.   TFieldGetTextEvent = procedure(Sender: TField; var Text: string;
  462.     DisplayText: Boolean) of object;
  463.   TFieldSetTextEvent = procedure(Sender: TField; const Text: string) of object;
  464.   TFieldRef = ^TField;
  465.  
  466.   TField = class(TComponent)
  467.   protected
  468.     procedure AccessError(const TypeName: string);
  469.     procedure CheckInactive;
  470.     procedure Change; virtual;
  471.     procedure DataChanged;
  472.     procedure FreeBuffers; virtual;
  473.     function GetAsBoolean: Boolean; virtual;
  474.     function GetAsDateTime: TDateTime; virtual;
  475.     function GetAsFloat: Double; virtual;
  476.     function GetAsInteger: Longint; virtual;
  477.     function GetAsString: string; virtual;
  478.     function GetCanModify: Boolean;
  479.     function GetDefaultWidth: Integer; virtual;
  480.     procedure GetText(var Text: string; DisplayText: Boolean); virtual;
  481.     function HasParent: Boolean; override;
  482.     procedure PropertyChanged(LayoutAffected: Boolean);
  483.     procedure ReadState(Reader: TReader); override;
  484.     procedure SetAsBoolean(Value: Boolean); virtual;
  485.     procedure SetAsDateTime(Value: TDateTime); virtual;
  486.     procedure SetAsFloat(Value: Double); virtual;
  487.     procedure SetAsInteger(Value: Longint); virtual;
  488.     procedure SetAsString(const Value: string); virtual;
  489.     procedure SetDataType(Value: TFieldType);
  490.     procedure SetSize(Value: Word);
  491.     procedure SetText(const Value: string); virtual;
  492.   public
  493.     constructor Create(AOwner: TComponent); override;
  494.     destructor Destroy; override;
  495.     procedure Assign(Source: TPersistent); override;
  496.     procedure AssignValue(const Value: TVarRec);
  497.     procedure Clear; virtual;
  498.     procedure FocusControl;
  499.     function GetData(Buffer: Pointer): Boolean;
  500.     procedure SetData(Buffer: Pointer);
  501.     function IsValidChar(InputChar: Char): Boolean; virtual;
  502.     property AsBoolean: Boolean;
  503.     property AsDateTime: TDateTime;
  504.     property AsFloat: Double;
  505.     property AsInteger: Longint;
  506.     property AsString: string;
  507.     property CanModify: Boolean;
  508.     property DataSet: TDataSet;
  509.     property DataSize: Word;
  510.     property DataType: TFieldType;
  511.     property DisplayName: PString;
  512.     property DisplayText: string;
  513.     property EditMask: string;
  514.     property EditMaskPtr: PString;
  515.     property FieldNo: Integer;
  516.     property IsIndexField: Boolean;
  517.     property IsNull: Boolean;
  518.     property Size: Word;
  519.     property Text: string;
  520.   published
  521.     property Alignment: TAlignment default taLeftJustify;
  522.     property Calculated: Boolean default False;
  523.     property DisplayLabel: string;
  524.     property DisplayWidth: Integer;
  525.     property FieldName: string;
  526.     property Index: Integer;
  527.     property ReadOnly: Boolean default False;
  528.     property Required: Boolean default False;
  529.     property Visible: Boolean default True;
  530.     property OnChange: TFieldNotifyEvent;
  531.     property OnGetText: TFieldGetTextEvent;
  532.     property OnSetText: TFieldSetTextEvent;
  533.     property OnValidate: TFieldNotifyEvent;
  534.   end;
  535.  
  536. { TDataLink }
  537.  
  538.   TDataLink = class(TPersistent)
  539.   protected
  540.     procedure ActiveChanged; virtual;
  541.     procedure CheckBrowseMode; virtual;
  542.     procedure DataSetChanged; virtual;
  543.     procedure DataSetScrolled(Distance: Integer); virtual;
  544.     procedure FocusControl(Field: TFieldRef); virtual;
  545.     procedure EditingChanged; virtual;
  546.     procedure LayoutChanged; virtual;
  547.     procedure RecordChanged(Field: TField); virtual;
  548.     procedure UpdateData; virtual;
  549.   public
  550.     constructor Create;
  551.     destructor Destroy; override;
  552.     function Edit: Boolean;
  553.     procedure UpdateRecord;
  554.     property Active: Boolean;
  555.     property ActiveRecord: Integer;
  556.     property BufferCount: Integer;
  557.     property DataSet: TDataSet;
  558.     property DataSource: TDataSource;
  559.     property Editing: Boolean;
  560.     property ReadOnly: Boolean;
  561.     property RecordCount: Integer;
  562.   end;
  563.  
  564. const
  565.   Null = TField(nil);
  566.  
  567. procedure AnsiToNativeBuf(Locale: TLocale; Source, Dest: PChar; Len: Word);
  568. procedure NativeToAnsiBuf(Locale: TLocale; Source, Dest: PChar; Len: Word);
  569. function ExtractFieldName(const Fields: string; var Pos: Integer): string;
  570.  
  571. procedure RegisterFields(const FieldClasses: array of TFieldClass);
  572.  
  573. procedure DatabaseError(const Message: string);
  574. procedure DBError(Ident: Word);
  575. procedure DBErrorFmt(Ident: Word; const Args: array of const);
  576. procedure DbiError(ErrorCode: DBIResult);
  577. procedure Check(Status: DBIResult);
  578.  
  579. var
  580.   Session: TSession;
  581.  
  582. const
  583.   RegisterFieldsProc: procedure(const FieldClassess: array of TFieldClass) = nil;
  584.  
  585. implementation
  586.