Чтение онлайн

ЖАНРЫ

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

Озеров Валентин

Шрифт:

Пример DBIDoRestructure

Единственный способ изменить размер поля или его тип — использовать DBIDoRestructure. Вот простой пример, который может вам помочь в этом:

function BDEStringFieldResize(ATable: TTable; AFieldName: string; ANewSize: integer): boolean;

type TRestructStatus = (rsFieldNotFound, rsNothingToDo, rsDoIt);

var

 hDB: hDBIdb;

 pTableDesc: pCRTblDesc;

 pFldOp: pCROpType; {фактически
это массив array of pCROpType}

 pFieldDesc: pFldDesc; {фактически это массив array of pFldDesc}

 CurPrp: CurProps;

 CSubType: integer;

 CCbrOption: CBRType;

 eRestrStatus: TRestructStatus;

 pErrMess: DBIMsg;

 i: integer;

begin

 Result := False;

 eRestrStatus := rsFieldNotFound;

 AFieldName := UpperCase(AFieldName);

 pTableDesc := nil;

 pFieldDesc := nil;

 pFldOp := nil;

 with ATable do try

{убедимся что имеем исключительный доступ и сохраним dbhandle:}

if Active and (not Exclusive) then Close;

if (not Exclusive) then Exclusive := True;

if (not Active) then Open;hDB := DBHandle;

{готовим данные для DBIDoRestructure:}

BDECheck(DBIGetCursorProps(Handle,CurPrp));

GetMem(pFieldDesc,CurPrp.iFields*sizeOf(FldDesc));

BDECheck(DBIGetFieldDescs(Handle,pFieldDesc));

GetMem(pFldOp,CurPrp.iFields*sizeOf(CROpType));

FillChar(pFldOp^,CurPrp.iFields*sizeOf(CROpType),0);

{ищем в цикле (через fielddesc) наше поле:}

for i:=1 to CurPrp.iFields do begin

{для ввода мы имеем серийные номера вместоPdox ID, возвращаемых DbiGetFieldDescs:}

pFieldDesc^.iFldNum := i;

if (Uppercase(StrPas(pFieldDesc^.szName)) = AFieldName) and (pFieldDesc^.iFldType = fldZSTRING) then begin

eRestrStatus := rsNothingToDo;

if (pFieldDesc^.iUnits1 <> ANewSize) then begin

pFieldDesc^.iUnits1 := ANewSize;

pFldOp^ := crModify;

eRestrStatus := rsDoIt;

end;

end;

inc(pFieldDesc);

inc(pFldOp);

end; {for}

{"регулируем"
массив указателей:}

dec(pFieldDesc,CurPrp.iFields);

dec(pFldOp,CurPrp.iFields);

{в случае отсутствия операций возбуждаем исключение:}

case eRestrStatus of

rsNothingToDo:

raise Exception.Create('Ничего не сделано');

rsFieldNotFound:

raise Exception.Create('Поле не найдено');

end;

GetMem(pTableDesc,sizeOf(CRTblDesc));

FillChar(pTableDesc^,SizeOf(CRTblDesc),0);

StrPCopy(pTableDesc^.szTblName,TableName);

{StrPCopy(pTableDesc^.szTblType,szPARADOX); {}

pTableDesc^.szTblType := CurPrp.szTableType;

pTableDesc^.iFldCount := CurPrp.iFields;

pTableDesc^.pecrFldOp := pFldOp;

pTableDesc^.pfldDesc := pFieldDesc;

Close;

BDECheck(DbiDoRestructure(hDB, 1, pTableDesc, nil, nil, nil, False));

 finally

if pTableDesc <> nil then FreeMem(pTableDesc,sizeOf(CRTblDesc));

if pFldOp <> nil then FreeMem(pFldOp, CurPrp.iFields*sizeOf(CROpType));

if pFieldDesc <> nil then FreeMem(pFieldDesc, CurPrp.iFields*sizeOf(FldDesc));

Open;

 end; {пробуем с table1}

 Result := True;

end;

Reinhard Kalinke

Изменение конфигурации IDAPI

Delphi 1

Возможно ли установить параметр MAXFILEHANDLES в IDAPI.CFG посредством Delphi?

Да. Следующий компонент показывает как это можно сделать (а также изменить другие параметры):

unit CFGTOOL;

interface

uses SysUtils, Classes, DB, DbiProcs, DbiTypes, DbiErrs;

type TBDEConfig = class(TComponent)

private

 FLocalShare : Boolean;

 FMinBufSize : Integer;

 FMaxBufSize : Integer;

 FSystemLangDriver : String;

Поделиться с друзьями: