本篇是本系列的最后一篇。
对 VFP 熟悉的都知道,按照 VFP经典的设计方式,游标载入时表单还未加载。此外,也经常有在运行时 Use 的情况。对于前者,可以在设计时刻为控件指定数据源;而对于后者,很有可能需要在Cursor 载入后用代码的方式对相关控件进行数据源的设置。因此,我们需要在 MyCursor 中增加一个属性开关来适应这种状况,还需要一个自定义的钩子方法来完成对控件的数据源设置。因此,我们的自定义方法CursorInit 应该有类似下面的代码:
If This.lCursorInit = .T.
This.BeforeCursorInit()
= SQLExec(Thisform.nStatementHandle, This.CMD, (This.Alias))
This.SetCursor()
This.AfterCursorInit()
This.CursorSource=This.Alias
Select (This.Alias)
With This As Cursor
.SetIndex()
.SetControlRO()
.SetControlSource()
Endwith
Endif
lCursorInit 属性控制了 Cursor是否可以正常的“载入”,而 SetControlSource 自定义钩子方法则负责在必要的时候为控件设置数据源。
当我们在使用 SPT 时,首先要使用 SQLExec()来获取 Cursor ,我们可以将所需要执行的 Select 语句存储于MyCursor 的自定义属性 CMD,而所需的句柄则存储于 nStatementHandle 自定义属性。为了“以防不测”,我们可以增加 BeforeCursorInit和 AfterCursorInit 自定义钩子方法。
当我们成功的获取 Cursor 后,我们需要对 Cursor 进行必要的设置,这时,我们需要一个自定义方法:SetCursor,它的代码大致应该是以下的代码:
MakeTransactable(This.Alias) && 运行 Cursor 支持事务处理
If This.lBuffering = .T.
CursorSetProp([Buffering], This.BufferModeOverride, (This.Alias)) && 设置缓冲
EndIf
If This.lSendupdates=.T.
CursorSetProp([Tables], This.cRemoteTableName, This.Alias)
CursorSetProp([UpdateNameList], This.cFieldRelation, This.Alias)
CursorSetProp([KeyFieldList], This.cMainKey, This.Alias)
CursorSetProp([UpdatableFieldList], This.cEnabledField, This.Alias)
CursorSetProp([SendUpdates], This.lSendUpdates, This.Alias)
CursorSetProp([WhereType], This.nWhereType, This.Alias)
CursorSetProp([UpdateType], This.nUpdateType, This.Alias)
Endif
这样,我们就可以使用标准的 SPT 方式来完成 MyCursor 。
参照前述的方法,我们可以在 MyDataEnvironment 中增加一个CursorInit 方法来控制 Cursor 的载入时机。
至此,我们就完成了一套控制 Cursor 的对象化的模型。如果你需要操作本地DBF 或者远程视图,可以参照以上内容自行完善。
当你完全领悟这套控制机制后,CA对你来说无异于水到渠成。
至此结束。谢谢欣赏。