发信人: 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【雁回西楼】 
 ※ 来源: 网易虚拟社区 广州站.   | 
 
 
 |