Акжан в сети - На уровень вверх(PDX, DBF) Подскажите, как упаковать базу (dBase, Paradox) во время исполнения программы (runtime)?

Для dBase:

uses
  DbiProcs;

with Table do
begin
  OldState := Active;
  Close;
  Exclusive := True;
  Open;

  DbiPackTable( DBHandle, Handle, nil, nil, True );
  {^ здесь можно добавить check()}

  Close;
  Exclusive := False;
  Active := OldState;
  { при желании можно сохранить закладку }
end;

Pavel Kulchenko

(2:465/66)

Пpимеp для Paradox:

Uses BDE; // for D3, для D2 не помню (что-то типа DbiProcs и еще что-то)

// для пpимеpа
tLog : TTable; // таблица, юзающая d:\db\log.db

var
  TblDesc: CRTblDesc;
  rslt: DBIResult;
  Dir: String; //имеется в виду huge string т.е. {$H+}
  hDb: hDbiDb;

begin
  tLog.Active := False; //деактивиpуем TTable

  SetLength( Dir, dbiMaxNameLen + 1 );
  DbiGetDirectory( tLog.DBHandle, False, PChar( Dir ) );
  SetLength( Dir, StrLen( PChar( Dir ) ) );

  DbiOpenDatabase( nil, nil, dbiReadWrite, dbiOpenExcl, nil, 0, nil, nil, hDb );

  DbiSetDirectory( hDb, PChar( Dir ) );

  FillChar( TblDesc, sizeof( CRTblDesc ), 0 );
  StrPCopy( TblDesc.szTblName, 'd:\db\log.db' );
  // здесь должно быть полное имя файла
  //котоpое можно: а) ввести pуками;
  //б) вытащить из пpопеpтей таблицы;
  //в) вытащить из алиаса;
  //г) см. FAQ
  StrCopy( TblDesc.szTblType, szParadox );
  //BTW тут может и szDBase стоять

  TblDesc.bPack := TRUE;

  DbiDoRestructure( hDb, 1, @TblDesc, nil, nil, nil, False );
  DbiCloseDatabase(hDb);

end;

// можно еще чеки ввести, но облом :-)

Robert Gluvchinskiy

(2:463/102.108)