标题:抛砖引玉了,用完即焚的小例子,欢迎讨论
只看楼主
倦猫1973
Rank: 2
等 级:论坛游民
威 望:1
帖 子:68
专家分:28
注 册:2022-11-17
结帖率:85.71%
已结贴  问题点数:20 回复次数:8 
抛砖引玉了,用完即焚的小例子,欢迎讨论
很多情况下,我们需要保存一些环境、句柄什么的,在程序执行完成后自动释放。但如果直接在同一段程序内在执行结束/出错时逐一判断并恢复,会让程序变得很长可读性变差,也很难处理程序出错时,那些恢复环境的代码就没有被执行了,即使用 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
**************************************************


搜索更多相关主题的帖子: 关闭 This dbf 打开 If 
2023-03-25 12:28
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:3 
向楼主学习

坚守VFP最后的阵地
2023-03-25 12:44
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:3 
涓撲笟
2023-03-25 12:49
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:3 
谢谢分享!
2023-03-25 14:00
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
得分:3 
谢谢分享,利用对象的特性,管理临时表。类似我的CA,也是通过对象自动控制句柄、cursor等。
With object.devnew('caName')
...
endwith

利用with 变量都不需要了

[此贴子已经被作者于2023-3-25 22:09编辑过]

2023-03-25 22:08
sostemp
Rank: 4
等 级:业余侠客
威 望:8
帖 子:162
专家分:221
注 册:2009-6-2
得分:3 
向楼主学习
2023-03-26 08:13
倦猫1973
Rank: 2
等 级:论坛游民
威 望:1
帖 子:68
专家分:28
注 册:2022-11-17
得分:0 
以下是引用easyppt在2023-3-25 22:08:18的发言:

谢谢分享,利用对象的特性,管理临时表。类似我的CA,也是通过对象自动控制句柄、cursor等。
With object.devnew('caName')
...
endwith

利用with 变量都不需要了


你 vfp 几啊,为什么我只能这么写,你能那么写?

程序代码:
With NewObject("Dbf", "CAT_Publics.vcx") As Object Of Cat_Publics.vcx
    .Open("c:\abc.dbf")
EndWith
2023-03-26 11:10
星光闪闪513
Rank: 2
等 级:论坛游民
帖 子:26
专家分:31
注 册:2015-10-27
得分:3 
高手在论坛
2023-03-26 20:22
aqyejun
Rank: 3Rank: 3
等 级:论坛游民
威 望:9
帖 子:121
专家分:99
注 册:2010-6-11
得分:3 
学习

【独叶为舟】工作室
2023-03-27 08:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511674-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.111779 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved