Советы по Delphi

         

Формат и размер dBase-поля


Во время выполнения программы мне необходимо получать размеры и десятичные порядки полей таблицы DBase.

Следующий код иллюстрирует необходимые вызовы BDE:

    procedure GetdBaseFieldTypes( t : TTable; var l : TStringList); var pF: pFLDDesc; cProps: CURProps; p: pFLDDesc; i: Byte; w : Word; s : string; oldmode : LongInt;

begin Check(DbiGetCursorProps(t.Handle,cProps)); Check(DbiGetProp(hDBIObj(t.Handle),curXLTMODE,oldmode,SizeOf(LongInt),w)); Check(DbiSetProp(hDBIObj(t.Handle), curXLTMODE, LongInt(xltNONE))); try if MaxAvail < (cProps.iFields*SizeOf(FLDDesc)) then raise EOutofMemory.Create('Недостаточно памяти для процесса'); GetMem(pF,(cProps.iFields*SizeOf(FLDDesc))); Check(DbiGetFieldDescs(t.Handle,pF)); p := pF; for i := 1 to cProps.iFields do begin with p^ do begin s := IntToStr(iFldNum)+' : '+StrPas(szName)+' : '; case iFldType of fldDBCHAR    : begin { Char string, строка символов } s := s + 'CHARACTER('+IntToStr(iUnits1)+')'; end; fldDBNUM     : begin { Number, число } s := s + 'NUMBER('+IntToStr(iUnits1)+','+InttoStr(iUnits2)+')'; end; fldDBMEMO    : begin { Memo (blob), МEMO-BLOB-поле } s := s + 'MEMO'; end; fldDBBOOL    : begin { Logical, лочическая величина } s := s + 'LOGICAL'; end; fldDBDATE    : begin { Date, поле даты } s := s + 'DATE'; end; fldDBFLOAT   : begin { Float, числа с плавающей точкой } s := s + 'FLOAT('+IntToStr(iUnits1)+','+InttoStr(iUnits2)+')'; end; fldDBLOCK    : begin { Логический тип LOCKINFO } s := s + 'LOCKINFO'; end; fldDBOLEBLOB : begin { OLE object (blob), OLE-объект, BLOB-поле } s := s + 'OLE'; end; fldDBBINARY  : begin { Binary data (blob), двоичные данные, BLOB-поле } s := s + 'BINARY'; end; else s := s + 'НЕИЗВЕСТНО'; end; end; l.Add(s); Inc(p); end; finally Check(DbiSetProp(hDBIObj(t.Handle),curXLTMODE,oldmode)); FreeMem(pF,(cProps.iFields*SizeOf(FLDDesc))); end; end;

- Eryk Bottomley [000830]



Содержание раздела