FAQ DELPHI



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.
 




<<



https://exelab.ru/pro/