使用方法 packTable(aTable:TTable);
这个packTable函数在完成后会重新生成所有的维护索引并PACK表
// Pack 一个 Paradox 或 dBASE 表
// 表必须是打开的而且是被独占的
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
// 表是被打开的而且是独占方式打开这样我们可以得到DB HANDEL
if Table.Active = False then
raise EDatabaseError.Create('数据表在压缩之前必须是被打开的');
if Table.Exclusive = False then
raise EDatabaseError.Create('数据表必须以独占方式打开');
// 检测表类型 得到表的各种信息
Check(DbiGetCursorProps(Table.Handle, Props));
// 如果是PARADOX表,必须调用DBIDORESTRUCTURE
if Props.szTableType = szPARADOX then
begin
// 填充结构
FillChar(TableDesc, sizeof(TableDesc), 0);
// 从表的CURSOR HANDLE 得到 DATABASE 的HANDEL
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// 把表名放到描述区里
StrPCopy(TableDesc.szTblName, Table.TableName);
// 把表类型信息放到描述区里
StrPCopy(TableDesc.szTblType, Props.szTableType);
// 设置表描述区里的PACK 选项为TRUE
TableDesc.bPack := True;
// 关闭表才可以做重结构动作
Table.Close;
// 调用 DbiDoRestructure...
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, FALSE));
end
else
// 如果是DBASE表,简单调用DBIPACKTABLE即可
if Props.szTableType = szDBASE then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, TRUE))
else
//PACK动作只能对PARADOX和DBASE表来完成,其他会出错
raise EDatabaseError.Create('数据表类型必须为PARADOX或DBASE表 ' );
Table.Open;
end;