前言

课程设计要求用VFP写一个小程序,承接上一篇用python写的,特此记录

我的部分

我负责3.10,3.4 3.5 3.6是都要写的
图片-1669471363759

建表建库

没什么好说的,把相关字段填进去就行了,这里他说要每个表多建一个TEMP表,这里有个巧方法,先建好原本的表
图片-1669471095573
然后把这些表全都移去
图片-1669471109016
小心不要点到删除了

然后切到vfp项目目录,选取这些表文件,直接复制,粘贴
图片-1669471166671

图片-1669471207050

得到这些副本文件,然后把他们改名为文件名+TEMP,再从vfp项目里面全都添加进去
图片-1669471259015

这样就省去了重复建表的过程
图片-1669471277573

可视化类

先新建一个类
图片-1669471464370
如下创建一个命令按钮组
图片-1669471560440
比较关键的属性ButtonCount
图片-1669471599715
其他省略
最后布局效果如下
图片-1669472473774

添加click代码

首记录click方法

GO top
thisform.Refresh()

上一条click方法

IF BOF() .or. RECNO() = 1
MESSAGEBOX("到头啦",48,"移动记录")
ELSE
SKIP -1
ENDIF
thisform.Refresh()

其中 BOF()解释如下
图片-1669472585425
RECNO()解释如下
图片-1669472642288

也就是说如果到第一张表,就会调用messagebox()方法弹出提示
如果没有到头,那么就会向下移动一条记录
图片-1669472798337

下一条click方法

同理上一条click方法

IF BOF() .or. RECNO() = RECCOUNT()
MESSAGEBOX("到尾啦",48,"移动记录")
ELSE
SKIP
ENDIF
thisform.Refresh()

reccount()方法定义如下
图片-1669472914046

末记录click方法

图片-1669472954253

添加判断逻辑

如果到头了不能让按钮启用,要让按钮变成灰的

* 如果为空或者只有一条记录
IF BOF() .and. EOF() .or. RECCOUNT() = 1
	this.commandtop.Enabled=.f.
	this.commandpre.Enabled=.f.
	this.commandnxt.Enabled=.f.
	this.commandend.Enabled=.f.
ENDIF
* 如果记录在末尾
IF RECNO()=RECCOUNT() .or. EOF()
	this.commandtop.Enabled=.t.
	this.commandpre.Enabled=.t.
	this.commandnxt.Enabled=.f.
	this.commandend.Enabled=.f.
ELSE
* 如果记录在开头
	IF RECNO()=1 .or. EOF()
		this.commandtop.Enabled=.f.
		this.commandpre.Enabled=.f.
		this.commandnxt.Enabled=.t.
		this.commandend.Enabled=.t.
	ELSE
* 如果记录在结尾
		this.commandtop.Enabled=.t.
		this.commandpre.Enabled=.t.
		this.commandnxt.Enabled=.t.
		this.commandend.Enabled=.t.
	ENDIF
ENDIF

权限代码类

图片-1669473584755
按照要求设定属性就行
图片-1669473673684

车辆管理模块

车辆详细信息查询表单

图片-1669473822592
创建以后直接ctrl+s,命名为车辆详细信息查询
图片-1669473894864
加八个标签七个文本框,ctrl+v 15次
图片-1669474004435

布局设计如下(真的尽力了)
图片-1669474988424
然后运行如下
图片-1669476137257
这里照着他写出现问题了,我表里是没有数据的,所有按钮都应该为灰色,但是这里两个亮的,稍微修改一下buttonclass
图片-1669476262776

很简单
buttonclass的init方法代码现在修改如下(就修改了多了一个else)

IF BOF() .and. EOF() .or. RECCOUNT() = 1
	this.commandtop.Enabled=.F.
	this.commandpre.Enabled=.F.
	this.commandnxt.Enabled=.F.
	this.commandend.Enabled=.F.
ELSE
	IF RECNO()=RECCOUNT() .or. EOF()
		this.commandtop.Enabled=.T.
		this.commandpre.Enabled=.T.
		this.commandnxt.Enabled=.F.
		this.commandend.Enabled=.F.
	ELSE
		IF RECNO()=1 .or. EOF()
			this.commandtop.Enabled=.F.
			this.commandpre.Enabled=.F.
			this.commandnxt.Enabled=.T.
			this.commandend.Enabled=.T.
		ELSE
			this.commandtop.Enabled=.T.
			this.commandpre.Enabled=.T.
			this.commandnxt.Enabled=.T.
			this.commandend.Enabled=.T.
		ENDIF
	ENDIF
ENDIF

添加车辆表单

这里由于和上一个表单很相似,直接故技重施
图片-1669476555155

图片-1669476609927

图片-1669476623510

然后按照他的要求,为了保证数据输入的正确性,先将数据输入到车辆temp表中,保证正确以后再确定保存
图片-1669477093065
全都要加个temp
图片-1669477161963
init方法里也要改不然会报错

写到这里的时候报错了
图片-1669477379520

查看replace和right函数的定义
图片-1669477532563
然后发现是我的括号位置写错了,应该这么写

REPLACE 内部编号 WITH RIGHT("00000000"+ALLTRIM(STR(K + 1)),6)

图片-1669477567524
这里可以看出来select+use的用法是规定表的次序,1为车辆temp,2为车辆表

添加数据click代码

首先看一下messagebox函数的定义
图片-1669477722671
这个第二个参数规定了messagebox的按钮方式

然后代码都可以理解了

IF LEN(ALLTRIM(thisform.txt品牌.Value))=0
	MESSAGEBOX("品牌输入错误",46+2,"错误")
	thisform.txt品牌.SetFocus
ELSE
	IF LEN(ALLTRIM(thisform.txt型号.Value))=0
		MESSAGEBOX("型号输入错误",46+2,"错误")
		thisform.txt型号.SetFocus
	ELSE
		IF LEN(ALLTRIM(thisform.txt底盘.Value))=0
			MESSAGEBOX("底盘号输入错误",46+2,"错误")
			thisform.txt底盘.SetFocus
		ELSE
			IF LEN(ALLTRIM(thisform.txt发动机.Value))=0
				MESSAGEBOX("发动机号输入错误",46+2,"错误")
				thisform.txt发动机.SetFocus
			else
				SELECT 车辆信息
				APPEND FROM 车辆信息temp
				k = RECCOUNT()
				SELECT 车辆信息temp
				ZAP
				APPEND BLANK
				replace 内部编号 WITH RIGHT("0000000"+ALLTRIM(STR(k + 1)),6)
			ENDIF
		ENDIF
	ENDIF
ENDIF
thisform.Refresh()

剩余两个按钮

重写按钮

* 把所有清空
thisform.txt编号.Value = ""
thisform.txt品牌.Value = ""
thisform.txt发动机.Value = ""
thisform.txt型号.Value = ""
thisform.txt底盘.Value = ""
thisform.txt号码.Value = ""
thisform.Refresh()

取消添加按钮

* 明显是关闭表单
thisform.Release()

车辆信息修改表单

故技重施!
图片-1669478753746
他这里要求按钮复用
把删除数据按钮作为一个复用按钮,在点击修改数据后,删除数据变为保存数据,然后进行相应的逻辑
这里把删除数据的对象名改为cmdoperate

修改数据按钮代码

thisform.cmdoperate.Caption = "保存数据"
*thisform.txt编号.ReadOnly = .f.
thisform.txt底盘.ReadOnly = .f.
thisform.txt发动机.ReadOnly = .f.
thisform.txt号码.ReadOnly = .f.
thisform.txt品牌.ReadOnly = .f.
thisform.txt型号.ReadOnly = .f.
* 关闭修改数据按钮以防耗费资源误操作
thisform.cmdOperate1.Enabled = .f.
thisform.Refresh()


删除数据按钮代码

用一个if else作为大判断,判断当前cmdoperate的修改状态如何

* 创建一个本地变量sure
LOCAL sure
IF thisform.cmdOperate.Caption = "保存数据"
	sure = MESSAGEBOX("确定修改数据吗",4+32,"提示")
	IF sure = 6
		replace 车辆品牌 WITH ALLTRIM(thisform.txt品牌.Value)
		replace 发动机编号 WITH ALLTRIM(thisform.txt品牌.Value)
		replace 车牌号码 WITH ALLTRIM(thisform.txt号码.Value)
		replace 底盘编号 WITH ALLTRIM(thisform.txt底盘.Value)
		replace 车辆型号 WITH ALLTRIM(thisform.txt型号.Value)
		* 恢复控件状态
		thisform.cmdoperate.Caption = "删除数据"
		*thisform.txt编号.ReadOnly = .f.
		thisform.txt底盘.ReadOnly = .t.
		thisform.txt发动机.ReadOnly = .t.
		thisform.txt号码.ReadOnly = .t.
		thisform.txt品牌.ReadOnly = .t.
		thisform.txt型号.ReadOnly = .t.
		* 开启修改数据按钮
		thisform.cmdOperate1.Enabled = .t.
		thisform.Refresh()
	ENDIF
ELSE
	sure = MESSAGEBOX("确定删除数据吗",4+32,"提示")
	IF sure = 6
		k = thisform.txt编号.Value
		DELETE FOR 内部编号 = K
		PACK
		k = RECCOUNT()
		thisform.txt总数.Value = k
		thisform.Refresh()
	ENDIF
ENDIF

关闭按钮

经典的

thisform.release()

写完咯!

后记

我在写的时候我的宝贝偷拍我给我拍了张照片
真能捣蛋
图片-1669481293951

宝贝真可爱
图片-1669481640164

图片-1669481649356

图片-1669481670675