📄 物理删除dbf数据库记录.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>心得体会</title>
<meta name="Microsoft Theme" content="none, default">
<meta name="Microsoft Border" content="none, default">
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="97%" height="35">
<tr>
<td width="12%" bgcolor="#c5ede9" height="4"><a href="http://personal.htxx.com.cn/zhcwork"><font size="3" color="#FF0000">返回主页</font></a></td>
<td width="78%" bgcolor="#c5ede9" height="4">
<p align="center"><font size="6" color="#FF0000" face="楷体_GB2312">心得体会</font></td>
</tr>
</table>
<p>以下是我在编程中的一些体会,由于主页刚改版不久,以前的一些体会慢慢再放上了,如果您有什么<br>
灵感不妨也写出来,大家相互交流,共同提高吗。</p>
<p><font color="#0000FF"><u>制作彩色SPEEDBUTTON的方法</u></font><font color="#FF0000">(2000。2.20)</font></p>
<table border="0" cellpadding="0" cellspacing="0" width="97%" height="35">
<tr>
<td width="78%" bgcolor="#c5ede9" height="4">
<p align="left" style="line-height: 150%"><font color="#FF0000">S</font>peedButton由于没有color属性,如果想要彩色的化,又不想用第三方控件,可以用如下方法。<br>
1、放置一label,设置其颜色为需要颜色,autosize属性为False,Caption为空,设置其大小为合适尺寸。<br>
2、在label上放置一SpeedButton,设置Flat为True,大小与Label相同,即可获得彩色SpeedButton了。</td>
</tr>
</table>
<p><u><font color="#0000FF">物理删除DBF</font></u>数据库记录<font color="#FF0000">(2000.7.3)</font></p>
<table border="0" cellpadding="0" cellspacing="0" width="97%" height="35">
<tr>
<td width="78%" bgcolor="#c5ede9" height="4">
<p align="left" style="line-height: 150%">我给你程序,你结合BDE HELP用。<br>
在DELPHI 3 中为DBF数据库增加Undel,Pack等功能<br>
在用Delphi 3 开发基于Dbf 数据库时,若用Ttable元件的Delete 方法删除<br>
一条记录,同时CachedUpdates为True (或CachedUpdates为False,但调用了<br>
ApplyUpdates方法),则Delphi 在该条记录的物理位置的首部用“*”打上<br>
标记(正如用Foxpro或Dbase的Del命令一样)。<br>
在Delphi 中对各种数据库(Paradox,Dbase 等)的底层操作均是通过数据库<br>
引擎(BDE)进行的。对于Dbase数据库,缺省情况下,BDE将标有删除标记“<br>
*”的记录过滤掉,不提供给上层应用程序,因此使用Delphi中Data Access <br>
页上的元件或用DataBase DeskTop均无法对这些记录进行显示和操作,因而<br>
无法象Foxpro 那样在必要时用Undel恢复删除或用Pack 进行彻底地物理删<br>
除。日积月累,这类记录越来越多,占用了大量的磁盘空间,降低了操作时<br>
间,降低了安全性。因此这就要求Delphi 能提供显示已被打有“*”标记的<br>
记录的方法(DispDeleted ),能够恢复误删除方法(Undel ),以及物理<br>
删除有“*”标记记录的方法(PackTable)。<br>
既然有“*”标记的记录是在数据库引擎BDE中被过滤掉的,那么也只有通过<br>
对BDE编程,使BDE 不过滤有“*”记录,从而使用Delphi中Data Access 页<br>
上的元件或用DataBase DeskTop能对这些记录进行显示和操作。在Borland公<br>
司提供的BDE API 接口数据结构中有一参数 curSOFTDELETEON,当它值为<br>
True时,则BDE不过滤有“*”记录,当它为False时,则过滤。而BDE缺省时<br>
curSOFTDELETEON为False。因此当我们需要显示和操作有“*”记录时,我们<br>
可以通过编程将curSOFTDELETEON设为True,当我们不需要显示和操作有“*<br>
”记录时,我们可以将curSOFTDELETEON设为False,值得注意的是,由于“*<br>
”不是数据库的一个“Field",因此在允许显示有“*”记录时,Delphi并不<br>
将“*”也也显示出来,这就让使用者难以区别该条记录是否是有“*”标记<br>
。同样,BDE的API接口中也有一个变量bDeleteFlag,当bDeleteFlag为True<br>
时,则此记录是有J“*”标记的,反之则没有。因此当需要时,我们可以对<br>
BDE编程,取出该变量来进行判断。关于如何对BDE进行编程,请读者参考相<br>
关资料,本文仅针对以上几个问题给出源程序和例子,以供读者参考。<br>
<br>
// 判断Atable 中当前记录是否已被删除, 若返回值为True 则已被删除,<br>
否则未被删除 <br>
Function GetDelFlag(Atable: Ttable):Boolean;<br>
var<br>
CP: CurProps;<br>
RP: RecProps;<br>
begin<br>
with Atable do begin<br>
UpdateCursorPos; // 同步 BDE 和 Delphi<br>
<br>
Check(DbiGetCursorProps(Handle, CP));<br>
// 确认是Dbase 表!且已置软删除<br>
if CP.szTableType<>szDBASE then<br>
raise EDatabaseError.Create('Not is DBASE DBF!');<br>
if CP.bDeletedOn = False then<br>
raise EDatabaseError.Create('Soft deletes is not on');<br>
<br>
// 取出删除标记 <br>
Check(DbiGetRecord(Handle, dbiNOLOCK, nil, @RP));<br>
GetDelFlag := RP.bDeleteFlag;<br>
end;<br>
end;<br>
<br>
// 设置软删除标记.<br>
// 若使SofeDelete=True 则使BDE 不过滤有“*”标记记录,否则,过滤<br>
procedure SetSofDelete(Table: Ttable; SoftDelete: Boolean);<br>
var<br>
rslt: DBIResult;<br>
Props: CURProps;<br>
begin<br>
Check(DbiGetCursorProps(Table.Handle, Props));<br>
// 确认是Dbase 表<br>
if StrIComp(Props.szTableType, szDBASE) <> 0 then<br>
raise EDBEngineError.Create(DBIERR_NOTSUPPORTED);<br>
// 确认能设置软删除<br>
rslt := DbiValidateProp(hDBIObj(Table.Handle), curSOFTDELETEON,SoftDelete);<br>
if rslt = DBIERR_NONE then<br>
// 设置软删除<br>
Check(DbiSetProp(hDBIObj(Table.Handle), curSOFTDELETEON, Longint(SoftDelete)))<br>
<br>
else<br>
raise EDBEngineError.Create(rslt);<br>
end;<br>
<br>
// 允许有“*”标记记录显示<br>
procedure DispDeleted(Table: Ttable);<br>
Begin<br>
SetSofDelete(Table,True );<br>
End;<br>
<br>
// 不允许有“*”标记记录显示<br>
procedure UndispDeleted(Table: Ttable);<br>
Begin<br>
SetSofDelete(Table,False );<br>
End;<br>
<br>
// 恢复删除<br>
procedure Undel(dBASETbl: Ttable);<br>
var<br>
Cprops: CurProps;<br>
begin<br>
Check(DbiGetCursorProps(dBASETbl.Handle, Cprops));<br>
// 确认是Dbase 表,且软删除已设置为True;<br>
if StrIComp(Cprops.szTableType, szDBASE) <> 0 then<br>
raise EDBEngineError.Create(DBIERR_NOTSUPPORTED);<br>
if Cprops.bDeletedOn = False then<br>
raise EDatabaseError.Create('Soft deletes is not on');<br>
Check(DbiUndeleteRecord(dBASETbl.Handle));<br>
end;<br>
<br>
<br>
procedure TForm1.Button1Click(Sender: Tobject);<br>
begin<br>
Table1.Active:=True; <br>
DispDeleted(Table1);<br>
end;<br>
<br>
procedure TForm1.Button3Click(Sender: Tobject);<br>
begin<br>
Undel(Table1);<br>
end;<br>
<br>
procedure TForm1.Button4Click(Sender: Tobject);<br>
begin<br>
GetDelFlag(Table1);<br>
end;<br>
<br>
end.</td>
</tr>
</table>
<p align="center"><br>
<br>
<u><font color="#FF0000"><a href="http://personal.htxx.com.cn/zhcwork">返回</a></font></u>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -