我们总是梦想着对象化(十二)

2021-08-16 11:42:18 浏览数 (1)

很抱歉,因个人原因停更了几天。再次说声抱歉。

现在,该是 MyCursor 出场的时间了。它可能是这套控制机制中最复杂的一个自定义类。我们将分两部分进行描述:一部分为控制更新的内容;一部分为游标设置的内容。为了保证内容的连续性,今天先来说说第一部分。

当我们更新游标的时候,除非在特殊的状况下直接操作游标,大部分情况下,我们可以使用 TableUpdate()函数进行远程数据更新。

首先,我们先在 MyCursor 类中增加几个自定义方法:BeforeAdd、Add、AfterAdd、SetControlRO。其中,SetControlRO 是一个钩子方法,用于设置表单控件的只读状态。

在 Add 中,我们仅仅需要类似如下的代码:

代码语言:javascript复制
If This.lEnabledUpdate = .T.
 This.BeforeAdd()
 Select (This.Alias)
 m.LcOldError = On([Error])
 On Error
 If This.BufferModeOverride = 3
 m.Temp = Tableupdate(.F., This.lForce) && 开放式行缓冲
 Else
 m.Temp = Tableupdate(.T., This.lForce) && 开放式表缓冲
 Endif
 If m.Temp = .F. && ODBC 错误
 * 这里是处理更新错误的代码
 On Error &LcOldError
 Return m.llResult
 Else
 This.SetControlRO()
 This.AfterSave()
 On Error &LcOldError
 Return .T.
 Endif
Endif

自定义属性 lEnabledUpdate 决定了所控制的游标是否为可更新游标;lForce 自定义属性决定了是否强制覆盖其他用户提交的更新。

然后,我们打开 MyDataEnvironment 类,定位到它的 Add 方法,它基本上应该是如下的样子:

代码语言:javascript复制
Private All Like l*
Local loCursor As MyCursor Of MySPT.VCX, ;
  loRelation As MyRelation Of MySPT.VCX, ;
  llReturn As Logical
Begin Transaction && 开始 VFP 事务
= SQLSetprop(Thisform.nStatementHandle,[Transactions], 2) && 开始远程事务
For Each m.loRelation In This.Objects
 If Upper(m.loRelation.BaseClass) == [RELATION]
 m.llReturn = m.loRelation.Add()
 If m.llReturn = .F.
Exit
 Endif
 Endif
Endfor
If m.llReturn = .T.
 For Each m.loCursor In This.Objects
 If Upper(m.loCursor.BaseClass) == [CURSOR]
 m.llReturn = m.loCursor.Add()
 If m.llReturn = .F.
 Exit
 Endif
 Endif
 Endfor
 If m.llReturn = .T.
 = SQLSetprop(Thisform.nStatementHandle, [Transactions], 1) && 结束远程事务
 End Transaction && 结束 VFP 事务
 Endif
EndIf 
Thisform.Refresh
Return m.llReturn

至此,我们已经完成了这套控制系统的一个功能:增加记录。

编辑和删除记录,可以参照以上步骤自行完善。此外,针对记录指针的移动以及记录搜索,也可以参照以上步骤纳入到这套控制系统之中。

如果,你在实际应用过程中遇到了非常规的需求,那么,你可以派生出它的一个子类,来完成你的特殊需求。

下一次,我们来看看 MyCursor 的第二部分:游标设置。

你的反馈是我写作的动力,欢迎评论,未完待续。

0 人点赞