Ето една работеща функция. Взел съм я от примерните програми на Delphi.
Тази функция премахва физически маркираните като изтрити записи и освен това преиндексира асоциираните индекси. Не забравяйте да добавите BDE към клауза USES.
{USES BDE}
function PackDBaseTable(Table: TTable):Boolean;
var
WasActive: Boolean;
TempTable: TTable;
vDateOfOldFile:TDateTime;
FileHandle : Integer;
vFilePathName:string;
begin
result := True;
WasActive := Table.Active;
Screen.Cursor := crHourglass;
TempTable := TTable.Create(Table.Owner);
try
try
// close if open
if WasActive then
Table.Close;
TempTable.Active := False;
TempTable.DatabaseName := Table.DatabaseName;
TempTable.TableName := Table.TableName;
TempTable.Exclusive := True;
if (TempTable.DatabaseName <> '') and
(Pos('\',TempTable.DatabaseName) > 0) then
vFilePathName := TempTable.DatabaseName + TempTable.TableName
else
vFilePathName := ExtractFilePath(Application.ExeName) + TempTable.TableName;
try
vDateOfOldFile := FileDateToDateTime(FileAge(vFilePathName));
except
vDateOfOldFile := 0;
end;
try
TempTable.Open;
except
beep;
ShowMessage('Файл ' + Table.TableName + ' е отворен от друг потребител!' +
#13 + 'Индексирането е невъзможно.' +
#13 + 'Опитайте по късно.');
result := False;
end;
if TempTable.Active then
begin
// pack the table
Check (DBIPackTable(TempTable.DBHandle, TempTable.Handle, nil, nil, True));
TempTable.Close;
if vDateOfOldFile > 0 then
begin
FileHandle := FileOpen(vFilePathName,fmOpenWrite or fmShareDenyNone);
if FileHandle > 0 then
begin
{valid file handle}
FileSetDate(FileHandle, DateTimeToFileDate(vDateOfOldFile));
FileClose(FileHandle);
end
else
begin
{Open error: FileHandle = negative DOS error code}
end;
end;
end;
except
result := False;
raise;
end;
finally
TempTable.Free;
Screen.Cursor := crDefault;
// eventually reopen
if WasActive then
Table.Open;
end;
end;