编写简单的vfp导航条2007-05-09 本站 从接触FoxPro开始,我们就面对着自己编写“Navigator”(导航条),我与一些朋友都认为:数据库系统开发时,基本的数据导航、添加、删除、修改是很见程序员功力的。实际情况也是这样,无论是 Visual FoxPro 还是其他工具,如:Delphi、PB、VB,虽然都提供了各自的控件,但是实际情况总是复杂的,标准控件往往不能应付。学会编学这些控件应该是很有意义的事情。本文中笔者将介绍用 Visual FoxPro 编写一个简单的导航条。导航条的内容就是“首记录、上一条、下一条、尾记录”。在编写导航条之前,让我们思考一下“导航条”的作用是什么?完成数据浏览工作,即:“首记录、上一条、下一条、尾记录”。2.与应用程序的其他功能配合。譬如“新添、删除、修改”记录时导航条的状态控制、完成这些操作后它的状态控制。根据以上分析,我们建立一个名为“Navigator”的类,其基类是:CommandGroup。放入四个按钮,如图1:

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

下面我就介绍一下这些属性或方法的意义。
属性方法名称 | 描述 | 初始值 |
cursorname(属性) | 被导航光标的名称 | .null. |
workarea(属性) | 被导航光标所在的工作区号,根据cursorname得到 | 0 |
navigate(方法) | 实现光标导航 | |
setcontrol(方法) | 在任何情况下实现对控件enabled属性的控制 | |
setmodi(方法) | 添加、修改等锁定光标操作前,设定所有控件的enabled属性为.F. | |
从cursorname得到workarea在navigate类的Init事件中加入如下代码:with this
local nworkarea
if 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属性状态
endif
endif
endwith大家从代码中可以发现,我这里假设:在设计时指定被控光标名称(cursorname属性),运行时不支持改变被控光标。实现导航功能lpara iaction
*接受参数,取值可能是(1、2、3、4),代表四种动作
with this
do case
case iaction=1 &&首记录
go top in .workarea
case iaction=2 &&上一条记录
if !bof(.workarea)
skip -1 in .workarea
endif
case iaction=3 &&下一条记录
if !eof(.workarea)
skip 1 in .workarea
endif
case iaction=4 &&尾记录
go bottom in .workarea
endcase
endwith在任何情况下实现对控件enabled属性的控制功能with this
if 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
endif
endif
if 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 .workarea
endif
endwith添加、修改等锁定光标操作前,设定所有控件的enabled属性为.F.with this
for i=1 to 4
.buttons(i).enabled=.f.
endfor
endwith在每个commandbutton控件的Click事件中写入如下代码,这里只列示“首记录”按钮:with this.parent
.navigate(1)
.setcontrol
.parent.refresh
endwith使用我们的类——看看效果新建一个表单,把这个自定义控件拖入表单;在数据环境中放入一个表,并将该表名称写入navigate对象的cursorname属性中。运行表单,看看效果。如图:

结合其他操作使用我们的类下面我们演示一下,我们的自定义控件与其它操作的配合。在表单中加入三个button,如上图。在insert按钮的Click事件中,写入下面的代码:with thisform
.navigator1.setmodi
this.enabled=.f.
.command2.enabled=.t.
.command3.enabled=.t.
begin trans
append blank
go bottom
.refresh
endwith在commit按钮的Click事件中,写入下面的代码:end trans
with thisform
.navigator1.setcontrol
.command1.enabled=.t.
this.enabled=.f.
.Command3.enabled=.f.
.refresh
endwith在rollback按钮的Click事件中,写入下面的代码:rollback
with thisform
.navigator1.setcontrol
.Command1.enabled=.t.
.Command2.enabled=.f.
this.enabled=.f.
.refresh
endwith总结以上是一个简单且不完善的例子,没有太多的技巧,只是简单介绍一下Visual FoxPro中可视化类的制作以及常用的导航控件的写法。每一个程序员都应该拥有自己的“类库”,“代码重用”会为我们带来很大的财富。