Единственный способ изменить размер поля или его тип - использовать 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 [001054]