Contributor: BRIAN CORLL {$F+,O+} UNIT OOPX; (**************************************) (* OOPX Version 1.00 *) (* Object-Oriented Interface for the *) (* Paradox Engine Version 2.0 *) (* and Turbo Pascal Version 6.0 *) (* Copyright 1991 Brian Corll *) (**************************************) (* Portions Copyright 1990-1991 *) (* Borland International *) (**************************************) INTERFACE Uses PXEngine; const PXError : Integer = PXSUCCESS; VarLong = 1; VarInt = 2; VarDate = 3; VarDoub = 4; VarAlpha = 5; VarShort = 6; type DateRec = record M,D,Y : Integer; end; type PXObject = object ErrCode : Integer; THandle : TableHandle; RHandle : RecordHandle; LHandles: Array[1..32] of LockHandle; SearchBuf : RecordHandle; LastLock: Byte; Name : String; RecNo : RecordNumber; Locked : Boolean; UnLocked: Boolean; constructor InitName(TblName : String); constructor InitOpen(TblName : String; IndexID : Integer; SaveEveryChange : Boolean); constructor InitCreate(TblName : String; NFields : Integer; Fields,Types : NamesArrayPtr); destructor Done; procedure ClearErrors; procedure LockRecord; procedure LockTable(LockType : Integer); procedure UnLockRecord; procedure UnLockTable(LockType : Integer); procedure RenameTable(FromName,ToName : String); procedure AddTable(AddTableName : String); procedure CopyTable(CopyName : String); procedure CreateIndex(NFlds : Integer; FldHandles : FieldHandleArray; Mode : Integer); procedure Encrypt(Password : String); procedure Decrypt(Password : String); procedure DeleteIndex(IndexID : Integer); procedure EmptyTable; procedure EmptyRecord; procedure ReadRecord; procedure InsertRecord; procedure AddRecord; procedure UpdateRecord; procedure DeleteRecord; procedure NextRecord; procedure PrevRecord; procedure GotoRecord(R : RecordNumber); procedure Flush; procedure SearchField(FHandle : FieldHandle;Mode : Integer); procedure SearchKey(NFlds : Integer;Mode : Integer); procedure InitSearchBuf(FldName : NameString;var Variable;VarType : Byte); procedure PutField(FldName : NameString;var Variable); procedure PutLongField(FldName : NameString;var L : Longint); procedure GetField(FldName : NameString;var Variable); procedure GetLongField(FldName : NameString;var L : Longint); function FieldNumber(FldName : NameString) : Integer; function FieldName(FHandle : FieldHandle) : NameString; function FieldType(FHandle : FieldHandle) : NameString; function IsBlank(FldName : NameString) : Boolean; function TableChanged : Boolean; procedure Refresh; procedure Top; procedure Bottom; function GetRecordNumber : Longint; end; function PXOk : Boolean; IMPLEMENTATION function PXOk : Boolean; begin PXOk := (PXError = PXSUCCESS); end; constructor PXObject.InitName; begin Name := TblName; end; constructor PXObject.InitOpen; begin THandle := 0; Name := ''; ErrCode := PXTblOpen(TblName, THandle, IndexID, SaveEveryChange); If ErrCode = PXSUCCESS then begin Name := TblName; ErrCode := PXRecBufOpen(THandle,RHandle); ErrCode := PXRecBufOpen(THandle,SearchBuf); end; LastLock := 0; FillChar(LHandles,32,0); PXError := ErrCode; Locked := False; UnLocked := False; end; constructor PXObject.InitCreate(TblName : String; NFields : Integer; Fields,Types : NamesArrayPtr); begin ErrCode := PXTblCreate(TblName,NFields,Fields,Types); PXError := ErrCode; end; procedure PXObject.Encrypt(Password : String); begin ErrCode := PXTblEncrypt(Name,Password); If ErrCode = PXERR_TABLEOPEN then begin ErrCode := PXTblClose(THandle); If ErrCode = PXSUCCESS then ErrCode := PXTblEncrypt(Name,Password); end; PXError := ErrCode; end; procedure PXObject.ClearErrors; begin ErrCode := 0; PXError := 0; end; procedure PXObject.Decrypt(Password : String); begin ErrCode := PXPswAdd(Password); If ErrCode = PXSUCCESS then begin ErrCode := PXTblDecrypt(Name); If ErrCode = PXERR_TABLEOPEN then begin ErrCode := PXTblClose(THandle); If ErrCode = PXSUCCESS then ErrCode := PXTblDecrypt(Name); end; end; PXError := ErrCode; end; procedure PXObject.CreateIndex(NFlds : Integer; FldHandles : FieldHandleArray; Mode : Integer); begin ErrCode := PXKeyAdd(Name,NFlds,FldHandles,Mode); PXError := ErrCode; end; procedure PXObject.DeleteIndex; begin ErrCode := PXKeyDrop(Name,IndexID); PXError := ErrCode; end; procedure PXObject.Flush; begin ErrCode := PXSave; PXError := ErrCode; end; procedure PXObject.LockRecord; var LockTest : Boolean; begin Locked := False; Inc(LastLock); ErrCode := PXNetRecLock(THandle,LHandles[LastLock]); ErrCode := PXNetRecLocked(THandle,LockTest); Locked := (ErrCode = PXSUCCESS) and LockTest; If not Locked then Dec(LastLock); PXError := ErrCode; end; procedure PXObject.LockTable; begin Locked := False; ErrCode := PXNetTblLock(THandle,LockType); Locked := (ErrCode = PXSUCCESS); PXError := ErrCode; end; procedure PXObject.UnLockRecord; begin UnLocked := False; ErrCode := PXNetRecUnlock(THandle,LHandles[LastLock]); If (ErrCode = PXSUCCESS) then begin UnLocked := True; LHandles[LastLock] := 0; Dec(LastLock); end; end; procedure PXObject.UnLockTable(LockType : Integer); begin UnLocked := False; ErrCode := PXNetTblUnlock(THandle,LockType); PXError := ErrCode; UnLocked := (PXError = PXSUCCESS); end; procedure PXObject.RenameTable(FromName,ToName : String); begin ErrCode := PXTblRename(FromName,ToName); PXError := ErrCode; end; procedure PXObject.AddTable(AddTableName : String); begin ErrCode := PXTblAdd(AddTableName,Name); PXError := ErrCode; end; procedure PXObject.CopyTable(CopyName : String); begin ErrCode := PXTblCopy(Name,CopyName); PXError := ErrCode; end; procedure PXObject.EmptyTable; begin ErrCode := PXTblEmpty(Name); PXError := ErrCode; end; procedure PXObject.EmptyRecord; begin ErrCode := PXRecBufEmpty(RHandle); PXError := ErrCode; end; procedure PXObject.ReadRecord; begin ErrCode := PXRecGet(THandle,RHandle); PXError := ErrCode; end; procedure PXObject.InsertRecord; begin ErrCode := PXRecInsert(THandle,RHandle); PXError := ErrCode; end; procedure PXObject.AddRecord; begin ErrCode := PXRecAppend(THandle,RHandle); PXError := ErrCode; end; procedure PXObject.UpdateRecord; begin ErrCode := PXRecUpdate(THandle,RHandle); PXError := ErrCode; end; procedure PXObject.DeleteRecord; begin ErrCode := PXRecDelete(THandle); PXError := ErrCode; end; procedure PXObject.NextRecord; begin ErrCode := PXRecNext(THandle); PXError := ErrCode; end; procedure PXObject.PrevRecord; begin ErrCode := PXRecPrev(THandle); PXError:= ErrCode; end; procedure PXObject.GotoRecord(R : RecordNumber); begin ErrCode:= PXRecGoto(THandle,R); PXError := ErrCode; end; procedure PXObject.PutField(FldName : NameString;var Variable); var FType : NameString; FirstChar : Char; FHandle : FieldHandle; begin FHandle := FieldNumber(FldName); If (PXError <> PXSUCCESS) then Exit; ErrCode := PXFldType(THandle,FHandle,FType); FirstChar := FType[1]; case FirstChar of 'D' : ErrCode := PXPutDate(RHandle,FHandle,TDate(Variable)); 'A' : ErrCode := PXPutAlpha(RHandle,FHandle,String(Variable)); '$','N' : ErrCode := PXPutDoub(RHandle,FHandle,Double(Variable)); 'S' : ErrCode := PXPutShort(RHandle,FHandle,Integer(Variable)); end; PXError := ErrCode; end; procedure PXObject.InitSearchBuf(FldName : NameString;var Variable;VarType : Byte); var FHandle : FieldHandle; begin FHandle := FieldNumber(FldName); If (PXError <> PXSUCCESS) then Exit; case VarType of VarDate : ErrCode := PXPutDate(SearchBuf,FHandle,TDate(Variable)); VarAlpha : ErrCode := PXPutAlpha(SearchBuf,FHandle,String(Variable)); VarDoub : ErrCode := PXPutDoub(SearchBuf,FHandle,Double(Variable)); VarShort : ErrCode := PXPutShort(SearchBuf,FHandle,Integer(Variable)); VarLong : ErrCode := PXPutLong(SearchBuf,FHandle,Longint(Variable)); end; PXError := ErrCode; end; procedure PXObject.PutLongField(FldName : NameString;var L : Longint); var FHandle : FieldHandle; begin FHandle := FieldNumber(FldName); If (PXError <> PXSUCCESS) then Exit; ErrCode := PXPutLong(RHandle,FHandle,L); PXError := ErrCode; end; procedure PXObject.GetField(FldName : NameString;var Variable); var FType : NameString; FirstChar : Char; FHandle : FieldHandle; begin FHandle := FieldNumber(FldName); If (PXError <> PXSUCCESS) then Exit; ErrCode := PXFldType(THandle,FHandle,FType); FirstChar := FType[1]; case FirstChar of 'D' : ErrCode := PXGetDate(RHandle,FHandle,TDate(Variable)); 'A' : ErrCode := PXGetAlpha(RHandle,FHandle,String(Variable)); '$','N' : ErrCode := PXGetDoub(RHandle,FHandle,Double(Variable)); 'S' : ErrCode := PXGetShort(RHandle,FHandle,Integer(Variable)); end; PXError := ErrCode; end; procedure PXObject.GetLongField(FldName : NameString;var L : Longint); var FHandle : FieldHandle; begin FHandle := FieldNumber(FldName); If (PXError <> PXSUCCESS) then Exit; ErrCode := PXGetLong(RHandle,FHandle,L); PXError := ErrCode; end; function PXObject.GetRecordNumber : Longint; begin ErrCode := PXRecNum(THandle,RecNo); If (ErrCode = PXSUCCESS) then GetRecordNumber := RecNo; PXError := ErrCode; end; function PXObject.FieldNumber(FldName : NameString) : Integer; var FldHandle : FieldHandle; begin ErrCode := PXFldHandle(THandle,FldName,FldHandle); If (ErrCode = PXSUCCESS) then FieldNumber := FldHandle else FieldNumber := 0; PXError := ErrCode; end; function PXObject.IsBlank(FldName : NameString) : Boolean; var Blank : Boolean; FHandle : FieldHandle; begin FHandle := FieldNumber(FldName); If (ErrCode <> PXSUCCESS) then PX(PXError); IsBlank := False; ErrCode := PXFldBlank(RHandle,FHandle,Blank); If ErrCode = PXSUCCESS then IsBlank := Blank; PXError := ErrCode; end; function PXObject.TableChanged : Boolean; var Changed : Boolean; begin TableChanged := False; ErrCode := PXNetTblChanged(THandle,Changed); If ErrCode = PXSUCCESS then TableChanged := Changed; PXError := ErrCode; end; procedure PXObject.Refresh; begin ErrCode := PXNetTblRefresh(THandle); PXError := ErrCode; end; function PXObject.FieldName(FHandle : FieldHandle) : NameString; var FName : NameString; begin ErrCode := PXFldName(THandle,FHandle,FName); If ErrCode = PXSUCCESS then FieldName := FName else FIeldName := ''; PXError := ErrCode; end; procedure PXObject.SearchField(FHandle : FieldHandle;Mode : Integer); begin ErrCode := PXSrchFld(THandle,SearchBuf,FHandle,Mode); PXError := ErrCode; end; procedure PXObject.SearchKey(NFlds : Integer;Mode : Integer); begin ErrCode := PXSrchKey(THandle,SearchBuf,NFlds,Mode); PXError := ErrCode; end; function PXObject.FieldType(FHandle : FieldHandle) : NameString; var FType : NameString; begin FieldType := ''; ErrCode := PXFldType(THandle,FHandle,FType); If ErrCode = PXSUCCESS then FieldType := FType; PXError := ErrCode; end; procedure PXObject.Top; begin ErrCode := PXRecFirst(THandle); PXError := ErrCode; end; procedure PXObject.Bottom; begin ErrCode := PXRecLast(THandle); PXError := ErrCode; end; destructor PXObject.Done; begin ErrCode := PXRecBufClose(RHandle); ErrCode := PXRecBufClose(SearchBuf); ErrCode := PXTblClose(THandle); PXError := ErrCode; end; begin end.