Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
Единственный способ изменить размер поля или его тип - использовать DBIDoRestructure. Вот простой пример, который может вам помочь в этом:
functionBDEStringFieldResize(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) наше поле:} fori := 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); {в случае отсутствия операций возбуждаем исключение:} caseeRestrStatus 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
;