Foxwx微信公众号管理软件---同心软件 -以高级编程语言进行微信公众号管理,我们一直在努力!

CURSOR对象化1

吾不知其名,强名之

备选名:

你还没这么做嘛?大神现场教你做框

紧急通知,这个牌子的框,不能买了

神密代码惊现某论坛,全员被监控

价值千万代码,某论坛全面泄露

狐狸的末日,世纪末救世主传说

不可不看,神奇代码惊现江湖

你开发还用这个嘛? 未来五年怎么成为高收入人群

家中有了这个,马上成为百万富翁

开发中使用了这个,三年的事情三天弄完

......


--------------割鸡割鸡割鸡割鸡割鸡割鸡割鸡---------------------------


VFP 过时了嘛?

作者:XINJIE

VFP是面向对象的语言。我想,在大部分情况下,它是正确的。唯一不正确的场景,可能就是当你操作 Cursor 时才会发生(不懂什么是 Cursor 的,可以直接关闭本帖了)。这里所说的 Cursor,应该是你用任何方式打开或者创建的 Cursor。例如,User abc.dbf;SQLExec(my, [Select.....], [mycursor])等等。。。。

当你理解了上面所说的内容后,就需要看另外一个问题了。是使用DBC好呢?还是自由表好?

据我所知,这也是一个没有尿点的争论话题。巴特,VFP是一门数据库编程语言的说法肯定是被认同滴。“数据库”指的是DBC,如果对单机程序而言。如果是C/S或者B/S应用环境,还有“数据库”吗?有!巴特,需要你自己来“创造”!这个话题,后面会慢慢展开。。。。


对于 Cursor,可能真的很多的看客不懂它,巴特,我也不想解释,因为我也不是很懂。有人翻译为临时表,有人称之为游标。。。总之,它是你在内存中操作的“表”。(打引号不是为了强调。。。而是为了自保。。。)

其实,这篇帖子的标题应该是:我们总是梦想着对象化!


对于VFP而言,唯一,或者说在大多数人眼中,唯一没有对象化的就是 Cursor。当然,精通CA的除外。那些冒充精通CA的就别凑热闹了。虽然我从没用过CA。。。。。。

既然提到了CA,先简略的说一句。据某位大侠说,CA生成器真的真的很难用。。。即使是用去天堂教上帝如何用VFP的迷糊发布的版本也是如此。。。

对象化一定好吗?未必。但是,这是另外的专题了,这里不讨论。OK?!

VFPer们最熟悉的莫过于是DBF,很抱歉的是,它的所有操作都不是对象化的。因为,你不能用类似  Object.Save 的方式来保存你的编辑结果。

有人会说,VFP的 Cursor 很牛逼,虽然它不是对象化的。我也承认你的这个观点,但是并不妨碍我继续我的话题。所以,请打住。熟练操作 Cursor 并不会代表你理解我所要说的“对象化操作Cursor”这个话题。




我曾经这样评价VFP:一个轻量级的重型武器。

为了更好的展开这个话题,还是先看看经典的VFP操作数据的方式。

假设一个场景:你需要在表中添加一条记录。仅仅只有一个表。至于这个表你是用什么方式得到的,无关紧要。

  1. If 表没有打开

  2.     打开表

  3. EndIf


  4. 选择工作区

  5. 追加一条新记录


我们就从这个最简单的伪代码开始。。。。。。

首先,这是一个典型的过程化。假设,我们可以对象化的操作表,那么,这段伪代码应该是这样滴:

  1. If m.oCursor.lUser = .F.

  2.     m.oCursor.CursorInit

  3. EndIf


  4. m.oCursor.Select

  5. m.oCursor.InsertBlank

这样搞有意义吗?估计很多人会有此疑问。

首先,这是一个假设场景,而且,是极简状态。事实上,为了新增一条记录,你可能还要搞上各种判断,例如,你需要检查操作者是否具有新增记录的权限。

如果是过程化的代码,那么这一系列的判断,可能还要更改某些控件的 Enabled 状态。当然,如果你的控件完全没有绑定数据源,那更需要这样的代码了。

你感觉到问题所在了吗?

一系列控件的 Enabled 状态,难道不是依据新增记录是否成功所决定的吗?偶分扣死!你太聪明了。有问题吗?问题大了去了。。。。。

当在现实场景中书写新增记录的代码片段时,看那一片代码,有过程化操作表的语句,有对象化操控控件的语句。。。。你不觉得太乱了吗?桥归桥,路归路,各司其职不是更好吗?例如,你的“新增”按钮只负责告诉系统“要增加一条记录了哈”,系统按照一定的规则找到 Cursor 对象,启用它的“新增”的方法,难道不是更好吗?事实上,我就是这么干滴。。。。。。

我的 Cursor 对象的“新增”方法大概是这样滴:

  1. With This

  2.     If .BeforAppend()

  3.         .Append()

  4.         .AfterAppend()

  5.     EndIf

  6. EndWith

“新增”按钮发出一条语句

  1. ThisForm.Append()

然后撒丫子就去找狐朋狗友喝酒去了。。。老子的任务完成了,你们爱咋地咋地。。。。

ThisForm 一看“新增”按钮跑路了,心想,我也不当冤大头。。。。击鼓传花吧。。。。

  1. This.DataEnvironment.Append()

DataEnviroment 心想,甩锅给我?门儿都没有。。。。

  1. This.oCursor.Append()

苦命的 oCursor 只好自己干了。。。先找小弟 BeforeAppend :兄弟,咱准备好没?没准备好就直接拒绝吧。。。多干那么多干嘛啊。。。出力不讨好。。。。这时,就要看 BeforAppend 的了,BeforAppend 心想:QTMD,老子是个人自扫门前雪,休管他人瓦上霜。。。。咣当当,干完后,甩锅回去。。。。oCursor正美呢,看,我多聪明,就被甩回的锅砸回神了。。。哦,居然甩回来一个 .T.。。。。我K,苦命啊,继续找小弟 Append:喂喂喂,醒醒,开工了哈。。。。Append 懒洋洋的应了声,知道了。。。其实心里想,你也不看看我懂啥,就让我干活。。。不会干咋办啊。。。干脆,大道至简:

  1. Select 工作区

  2. Append

齐活!不就是新增一条记录吗,我办到了。。。。剩下的就不归我管了。。。。。继续甩锅回去。。。。。oCursor一看锅飞回来了,气的火冒三丈。。。。还没干完呢。。。。。那个 ComboBox 控件没绑定数据源,要更改 Enabled 状态。。。。。一脚把呼呼大睡的 AfterAppend 踢醒,来,你负责去改 ComboBox 的状态。。。。然后也撒丫子找人喝大酒去了。。。。昨天和 Form 的梁子还没了结。。。。







2018年6月30日 | 发布:admin | 分类:程序开发 | 评论:1

留言列表:

  • admin 发布于 2018/7/7 15:23:17  回复
  • 沙个发

发表留言: