Tag: paradox

  • pack table (Paradox, dBase)

    If you use the TTable component in Delphi then to find the code to pack the table (to remove the records which are marked as deleted) is not a problem. For example:
    http://www.swissdelphicenter.ch/torry/showcode.php?id=35

    But how to pack the table using pure BDE API? What if you do not want to use the TTable/TDatabase components?

    Today I wrote the next code for this task:

    uses BDE; 
    
    procedure TfrmMain.piPackTableClick(Sender: TObject); 
    
      procedure DbiError(ErrorCode: DBIResult); 
      begin 
        raise Exception.CreateFmt('BDE Error Code: %x', [ErrorCode]); 
      end; 
    
      procedure Check(Status: DBIResult); 
      begin 
        if Status <> 0 then DbiError(Status); 
      end; 
    
      function StrToOem(const AnsiStr: string): string; 
      begin 
        SetLength(Result, Length(AnsiStr)); 
        if Length(Result) > 0 then 
          CharToOem(PChar(AnsiStr), PChar(Result)); 
      end; 
    
    var 
      hDatabase: hDbiDb; 
      hTableCursor: hDbiCur; 
      TableDesc: CRTblDesc; 
    begin 
      { check if BDE installed } 
      Check(dbiInit(nil));  
    
      { Open a database session with exclusive read/write access } 
      Check(DbiOpenDatabase('',  
                            nil, // database type (Standard) 
                            dbiReadWrite, // open mode (versus read-only) 
                            dbiOpenExcl, // exclusive (versus shared) 
                            nil, // database login password 
                            0, nil, nil, 
                            hDatabase)); 
      try 
        Check(DbiSetDirectory(hDatabase, Pointer(StrToOem(ExtractFilePath(cbFileName.Text)))));  
    
        { Open the table, returning its cursor handle } 
        Check(DbiOpenTable(hDatabase, 
              PChar(ExtractFileName(cbFileName.Text)), 
      {$IFDEF DB_PARADOX} 
              szParadox, 
      {$ENDIF}  
    
      {$IFDEF DB_DBASE} 
              szDBASE, 
      {$ENDIF} 
    
              nil, nil, 0, // no result index required 
              dbiReadOnly, dbiOpenShared, 
              xltField, // use logical field types (normal) 
              False, nil, 
              hTableCursor)); 
    
      {$IFDEF DB_PARADOX} 
        FillChar(TableDesc, SizeOf(CRTblDesc), #0); 
        with TableDesc do 
        begin 
          StrCopy(szTblName, PChar(ExtractFileName(cbFileName.Text))); 
          StrCopy(szTblType, szParadox); 
          bPack := True; 
        end; 
        Check(DbiCloseCursor(hTableCursor)); 
        Check(DbiDoRestructure(hDatabase, 1, @TableDesc, nil, nil, nil, False)); 
      {$ENDIF}  
    
      {$IFDEF DB_DBASE} 
        Check(DbiPackTable(hDatabase, hTableCursor, nil, szDBASE, True)) 
        Check(DbiCloseCursor(hTableCursor)); 
      {$ENDIF} 
      finally 
        Check(DbiCloseDatabase(hDatabase)); 
      end; 
    end;