Delphi FAQ -

| | | | | |
| | | | | | |



Google  
 

Paradox



: .


unit repair_u;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, DBTables, BDE, StdCtrls;

type
  TForm1 = class(TForm)
    tb: TTable;
    te: TTable;
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
// Pack a Paradox or dBASE table
// The table must be opened execlusively before calling this function

procedure PackTable(Table: TTable);
var
  Props: CURProps;
  hDb: hDBIDb;
  TableDesc: CRTblDesc;
begin
  // Make sure the table is open exclusively so we can get the db handle
  if not Table.Active then
    raise EDatabaseError.Create('Table must be opened to pack');
  if not Table.Exclusive then
    raise EDatabaseError.Create('Table must be opened exclusively to pack');
  // Get the table properties to determine table type
  Check(DbiGetCursorProps(Table.Handle, Props));
  // If the table is a Paradox table, you must call DbiDoRestructure
  if (Props.szTableType = szPARADOX) then
  begin
    // Blank out the structure
    FillChar(TableDesc, sizeof(TableDesc), 0);
    // Get the database handle from the table's cursor handle
    Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
    // Put the table name in the table descriptor
    StrPCopy(TableDesc.szTblName, Table.TableName);
    // Put the table type in the table descriptor
    StrPCopy(TableDesc.szTblType, Props.szTableType);
    // Set the Pack option in the table descriptor to TRUE
    TableDesc.bPack := True;
    // Close the table so the restructure can complete
    Table.Close;
    // Call DbiDoRestructure
    Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
  end
  else
    {// If the table is a dBASE table, simply call DbiPackTable} if
      (Props.szTableType = szDBASE) then
      Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
    else
      // Pack only works on PAradox or dBASE; nothing else
      raise EDatabaseError.Create('Table must be either of Paradox or dBASE ' +
        'type to pack');
  Table.Open;
end;
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  tb.open;
  PackTable(tb);
  tb.close;
  te.open;
  PackTable(te);
  te.close;
end;

end.






Copyright 2004-2016 "Delphi Sources". Delphi World FAQ




     Twitter     Facebook