发信人: hunter__fox(雁回西楼)
整理人: hunter__fox(2002-03-16 22:17:39), 站内信件
|
以下是四个函数,可用于寻VFP表格作一些小手术,使一些信息不易被查觉.....
声明:我希望有人用它,也希望我有名字留在里面....
--------------------------------------------------------------------
&& 此文件中包含函数:
&& L LockTableEx(cFileName, lLock)---------文件加/解锁
&& L IsLock(cFileName)---------------------判断文件是否加锁
&& N HideField(cFileName,cFields,lShow)---隐藏表格文件中指定字段
&& N ShowField(cFileName,cFields)---------显示表格文件中指定字段
&& 更详细的信息,请参考数头的说明部分
&& 修订日期:
&& Hunter 2001-12-20
&& Hunter 2001-11-18
Define LockInfo_LOC 0x00 && 文件加锁标志
Define DBFInfo_LOC 0x30 && DBF标志
&& 只此一个函数即可实现对VFP表格加锁及解锁功能.
&& 参数说明:
&& cFileName 文件名,应当是一个存在且可被专用模式打开的文件.
&& lLock 是否加锁,为.F.时表示解锁,
&& 无参数或参数非逻辑值作 .F. 处理.
&& 返回逻辑值表示文件操作后是否处于锁状态(出错返回 .Null.)
&& Hunter 2001-11-18
Function LockTableEx(cFileName, lLock)
Local nFileHandle && 这是文件句柄
If Type("cFileName") # "C" Or Not File(cFileName)
&& cFileaName 指定的文件不存在
Return .Null.
EndIf
If Type("lLock") # "L"
&& 若不指定动作则进行解锁操作
lLock = .F.
EndIf
nFileHandle = FOpen(cFileName, 12)
If nFileHandle < 1
&& 未能以"读写模式"打开文件.
&& 请检查文件是否已被打开使用.
Return .Null.
EndIf
&& 文件指针指向开头
FSeek(nFileHandle, 0, 0)
&& 按第二个参数要求做(加锁或解锁)
FWrite(nFileHandle,Iif(lLock, Chr(LockInfo_LOC), Chr(DBFInfo_LOC)))
FClose(nFileHandle)
Return lLock
EndFunc
&& 此函数用于判断一个VFP表格是否被加锁
&& 参数 cFileName 应是一个存在用可被专用模式打开的表格文件名
&& 返回逻辑值:用于表示此文件是否被加锁(出错时返回 .Null.)
&& Hunter 2001-11-18
Function IsLock(cFileName)
Local nFileHandle && 这是文件句柄
Local cReadString && 此文件第一字符
Local lReturn && 这是函数的返回值
If Type("cFileName") # "C" Or Not File(cFileName)
&& cFileaName 指定的文件不存在
Return .Null.
EndIf
nFileHandle = FOpen(cFileName,2)
If nFileHandle < 1
&& 未能以"读写模式"打开文件,请检查文件是否已被打开使用.
Return .Null.
EndIf
&& 读出第一字节内容
FSeek(nFileHandle, 0, 0)
cReadString = FRead(nFileHandle, 1)
FClose(nFileHandle)
&& 判断是否由 LockTableEx() 加锁
lReturn = (Asc(cReadString) = LockInfo_LOC)
Return lReturn
EndFunc
&& 此函数用于将某一表格中部分字段设为系统字段使之为可见
&& 参数 cTableName 应是一个存在且并未被使用的 VFP 表格文件
&& 参数 cFields 是需要设为系统字段的字段列表(短名格式),
&& 各字段间用","分隔,最后一个字段后不需要加","
&& 参数 lShow 是为了与 ShowField()共用代码而加的参数,默认为 .F.
&& 若值为 .T. 则将 cFields 指定的定的字段设为可见.
&& 返回值 字段修改成功返回修改的字段数,出错返回已修改字段数
&& 若返回值为 0 则可能包含更多错误,
&& 如文件不存在/非VFP表/已打开/指定字段均不存在等
&& Hunter 2001-12-20
Function HideField(cFileName,cFields,lShow)
Local nFileHandle && 打开的文件句柄
Local nRecStart && 记录开始处(由此计算字段数)
Local nFieldTotal && 表内字段数
Local nPField && 当前读取字段序号
Local cNowField && 要修改的字段
Local nPChange && 修改点
Local vNewVal && 将写入的值
Local nReturn && 程序返回值(修改字段数)
If Not File(cFileName)
&& 文件不存在
Return 0
EndIf
If (Not Type("cFields") = "C") Or Len(Alltrim(cFields)) = 0
&& 字段列表不正确
Return 0
EndIf
If Not Type("lShow") = "L"
lShow = .F.
EndIf
nFileHandle = FOpen(cFileName,2)
If nFileHandle < 1
&& 未能打开文件
Return 0
EndIf
FSeek(nFileHandle,8)
&& 计算表格字段数
nRecStart = Asc(FRead(nFileHandle,1)) + ;
Asc(FRead(nFileHandle,1)) * 256
nFieldTotal = (nRecStart - 32 - 264) / 32
Local aFieldName[nFieldTotal] && 表格内字段列表
&& 取出字段名
For nPField = 1 To nFieldTotal
FSeek(nFileHandle,nPField * 32)
aFieldName[nPField] = Lower(ChrTranc(FRead(nFileHandle,11),Chr(0x00),""))
EndFor
&& 规范 cFields 格式
If Not Right(cFields,1) == ","
cFields = Lower(cFields) + ","
EndIf
&& 修改字段属性
nReturn = 0
Do While Not At(",",cFields) = 0
&& 从字段表中取一个字段名
cNowField = Alltrim(Left(cFields,At(",",cFields) - 1))
cFields = Substr(cFields,At(",",cFields) + 1)
&& 定位此字段
nPField = aScan(aFieldName,cNowField)
If nPField > 0
&& 计算修改点
nPChange = nPField * 32 + 18
&& 取原属性值并计算新值
FSeek(nFileHandle,nPChange)
If lShow = .T.
vNewVal = BitAnd(Asc(FRead(nFileHandle,1)),254)
Else
vNewVal = BitOr(Asc(FRead(nFileHandle,1)),1)
EndIf
&& 修改属性值
FSeek(nFileHandle,nPChange)
FWrite(nFileHandle,Chr(vNewVal))
&& 计数加 1
nReturn = nReturn + 1
EndIf
EndDo
FClose(nFileHandle)
Return nReturn
EndFunc
&& 此函数仅是为了方便调用功能而设,参数用法与 HideField() 前两参数相同
&& Hunter 2001-12-20
Function ShowField(cFileName,cFields)
HideField(cFileName,cFields,.T.)
EndFunc
---- 作者:Hunter__fox【雁回西楼】
※ 来源: 网易虚拟社区 广州站. |
|