Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 1 марта!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Изменить размер поля или его тип

Автор: Reinhard Kalinke

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




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS