抛砖引玉了,用完即焚的小例子,欢迎讨论
很多情况下,我们需要保存一些环境、句柄什么的,在程序执行完成后自动释放。但如果直接在同一段程序内在执行结束/出错时逐一判断并恢复,会让程序变得很长可读性变差,也很难处理程序出错时,那些恢复环境的代码就没有被执行了,即使用 TRY...CATCH...FINALLY 也不理想,有些大量类似操作时时候我们可以用类的 Destory 来解决这个问题。以对不确定的临时 dbf 临时表进行若干操作,制作了一个 DBF 类,程序用法如下。
程序代码:
Local loDbf As cat_publics.vcx loDbf = NewObject("Dbf", "cat_publics.vcx") If loDbf.Open("c:\abc.dbf") Insert Into (loDbf.Alias) .... Update (loDbf.Alias) .... Delete (loDbf.Alias) .... EndIf
好了就这样子。由于 loDdf 是一个局部变量 vfp 会自动销毁它,Destory 事件则保证不管什么时候程序是否出错,都能把 c:\abc.dbf 关闭。
DBF 类示例代码如下:
程序代码:
************************************************** *-- 类: dbf (g:\CAT_publics\vcx_common\cat_publics.vcx) *-- 父类: control *-- 基类: control *-- 时间戳: 01/12/23 08:01:12 PM * DEFINE CLASS dbf AS control Width = 25 Height = 25 Alias = "" *-- 错误是否提示 alert = .T. Name = "dbf" PROCEDURE open LPARAMETERS tcDbfName, tcAlias, tlExclusive, tnBuffering *-- 说明 * 打开 tcDbfName 指定的工作区,在类关闭后自动关闭 *-- 参数 * tcDbfName * DBF 文件名 * tcAlias * 可选,工作区别名 * tlExclusive * 可选,是否独占打开 * tnBuffering * 可选,是否设置缓冲模式 *-- 返回值 * .T. 打开成功 * .F. 打开失败 If Not File(m.tcDbfName) And This.Alert = .T. Sy_MsgBox("文件(%s)不存在!", 16, _Screen, m.tcDbfName) Return .F. EndIf *-- 关闭上一次工作区 Use In Select(This.Alias) This.Alias = Evl(m.tcAlias, "") If Empty(This.Alias) This.Alias = Sys(2015) EndIf *-- 关闭同名工作区 Use In Select(This.Alias) *-- 打开文件 loErr = NULL Try If m.tlExclusive Use (m.tcDbfName) In 0 Alias (This.Alias) Exclusive Else Use (m.tcDbfName) In 0 Alias (This.Alias) Shared Again EndIf Catch To loErr If This.Alert = .T. Sy_TryErr(m.loErr) EndIf EndTry If Used(This.Alias) And Vartype(m.tnBuffering) == "N" CursorSetProp("Buffering", m.tnBuffering, This.Alias) EndIf If IsNull(m.loErr) Return .T. Else Return .F. EndIf ENDPROC PROCEDURE Destroy If Used(This.Alias) ; And CursorGetProp("Buffering", This.Alias) > 1 ; And GetNextModified(0, This.Alias) <> 0 Use In Select(This.Alias) Sy_MsgBox("注意:缓冲内的数据并未提交,己被放弃!", 16) Else Use In Select(This.Alias) EndIf ENDPROC ENDDEFINE * *-- EndDefine: dbf **************************************************