编写简单的导航条

从接触 FoxPro 开始,我们就面对着自己编写 “Navigator”(导航条),我与一些朋友都认为:数据库系统开发时,基本的数据导航、添加、删除、修改是很见程序员功力的。实际情况也是这样,无论是 Visual FoxPro 还是其他工具,如:Delphi、PB、VB,虽然都提供了各自的控件,但是实际情况总是复杂的,标准控件往往不能应付。学会编学这些控件应该是很有意义的事情。

本文中笔者将介绍用 Visual FoxPro 编写一个简单的导航条。导航条的内容就是“首记录、上一条、下一条、尾记录”。在编写导航条之前,让我们思考一下“导航条”的作用是什么?

1.完成数据浏览工作,即:“首记录、上一条、下一条、尾记录”。

2.与应用程序的其他功能配合。譬如“新添、删除、修改”记录时导航条的状态控制、完成这些操作后它的状态控制。 

根据以上分析,我们建立一个名为“Navigator”的类,其基类是:CommandGroup。放入四个按钮,如图1:

建立如下属性和方法,如图2:

下面我就介绍一下这些属性或方法的意义。

属性\方法名称

描述

初始值 

cursorname(属性)

 被导航光标的名称

 .null. 

workarea(属性)

 被导航光标所在的工作区号,根据cursorname得到

 0 

navigate(方法) 

实现光标导航   

setcontrol(方法)

 在任何情况下实现对控件enabled属性的控制

setmodi(方法)

 添加、修改等锁定光标操作前,设定所有控件的enabled属性为.F.  

从cursorname得到workarea

在navigate类的Init事件中加入如下代码:

with thislocal nworkareaif isnull(.cursorname)    messagebox("请指定光标")    return .f.*cursorname的值仍是初始值为.null.,说明未指定被导航光标,本对象不被建立else    nworkarea=select(.cursorname)    if nworkarea=0        messagebox(.cursorname+"不存在")        return .f.*检测cursorname是否存在,如果不存在则本对象不被建立    else        .workarea=nworkarea        .setcontrol*将光标所在的工作区号填入属性workarea,并设定各控件的enabled属性状态    endifendifendwith

大家从代码中可以发现,我这里假设:在设计时指定被控光标名称(cursorname属性),运行时不支持改变被控光标。

实现导航功能

lpara iaction*接受参数,取值可能是(1、2、3、4),代表四种动作with thisdo case case iaction=1 &&首记录    go top in .workareacase iaction=2 &&上一条记录    if !bof(.workarea)        skip -1 in .workarea    endifcase iaction=3 &&下一条记录    if !eof(.workarea)        skip 1 in .workarea    endifcase iaction=4 &&尾记录    go bottom in .workareaendcaseendwith

在任何情况下实现对控件enabled属性的控制功能

with thisif bof(.workarea)=.t.    .buttons(1).enabled=.f.    .buttons(2).enabled=.f.else    skip -1 in .workarea    if bof(.workarea)=.t.        .buttons(1).enabled=.f.        .buttons(2).enabled=.f.    else        .buttons(1).enabled=.t.        .buttons(2).enabled=.t.        skip 1 in .workarea    endifendifif eof(.workarea)=.t.    .buttons(3).enabled=.f.    .buttons(4).enabled=.f.else    skip 1 in .workarea    if eof(.workarea)=.t.        .buttons(3).enabled=.f.        .buttons(4).enabled=.f.    else        .buttons(3).enabled=.t.        .buttons(4).enabled=.t.    endif    skip -1 in .workareaendifendwith

添加、修改等锁定光标操作前,设定所有控件的enabled属性为.F.

with thisfor i=1 to 4    .buttons(i).enabled=.f.endforendwith

在每个commandbutton控件的Click事件中写入如下代码,这里只列示“首记录”按钮:

with this.parent    .navigate(1)    .setcontrol    .parent.refreshendwith

使用我们的类——看看效果

新建一个表单,把这个自定义控件拖入表单;在数据环境中放入一个表,并将该表名称写入navigate对象的cursorname属性中。运行表单,看看效果。如图:

结合其他操作使用我们的类

下面我们演示一下,我们的自定义控件与其它操作的配合。在表单中加入三个button,如上图。

在insert按钮的Click事件中,写入下面的代码:

with thisform.navigator1.setmodithis.enabled=.f..command2.enabled=.t..command3.enabled=.t.begin transappend blankgo bottom.refreshendwith

在commit按钮的Click事件中,写入下面的代码:

end transwith thisform.navigator1.setcontrol.command1.enabled=.t.this.enabled=.f..Command3.enabled=.f..refreshendwith

在rollback按钮的Click事件中,写入下面的代码:

rollbackwith thisform.navigator1.setcontrol.Command1.enabled=.t..Command2.enabled=.f.this.enabled=.f..refreshendwith

总结

以上是一个简单且不完善的例子,没有太多的技巧,只是简单介绍一下Visual FoxPro中可视化类的制作以及常用的导航控件的写法。

每一个程序员都应该拥有自己的“类库”,“代码重用”会为我们带来很大的财富。

猫猫的心里话

加菲猫的VFP|狐友会社群接收投稿啦

加菲猫的VFP,用VFP不局限VFP,用VFP混合一切。无论是VFP,还是JS,还是C,只要能混合起来,都可以发表。

商业模式,销售技巧、需求规划、产品设计的知识通通可以发表。

暂定千字50元红包,,优秀的文章红包更大,一经发表,红包到手。

如何帮助使用VFP的人?

用VFP的人,有专业的,有非专业了,很多人其实是小白,问出的问题是小白,如果问题不对,我们引导他们问正确的问题。无论如何请不要嘲笑他们说帮助都不看,这么简单的问题都不会,嘲笑别人不行,而无法提出建设性答案,是很low的。

我们无论工作需要,还是有自己的软件,都是是需要真正的知识,如何让更多人学习真正的VFP知识呢,只需要点赞,在看,能转发朋友圈就更好了。

加菲猫的vfp倡导用"VFP极简混合开发,少写代码、快速出活,用VFP,但不局限于VFP,各种语言混合开发"

我已经带领一百多名会员成功掌到VFP的黑科技,进入了移动互联网时代,接下来我们要进入物联网领域。

2026年狐友会社群会员继续招募中

社群会员获取的权益有:

祺佑三层开发框架商业版(猫框),终身免费升级,终身技术支持。

开放的录播课程有:

微信小程序,微信公众号开发,H5 APP开发,Extjs BS开发,VFP面向对象进阶,VFP中间层开发,VFP Layui 开发

源码类资源有:

支付组件源码,短信源码,权限组件源码,一些完整系统的源码。这个可以单独出售的,需要的可以联系我。

会员也可以实现群内资源对接,可以接分包,合作等各项商业或技术业务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值