Featured image of post VFP车辆管理系统

VFP车辆管理系统

vfp制作一个车辆管理系统

前言

课程设计要求用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方法

1
2
GO top
thisform.Refresh()

上一条click方法

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

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

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

下一条click方法

同理上一条click方法

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

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

末记录click方法

图片-1669472954253

添加判断逻辑

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
* 如果为空或者只有一条记录
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)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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 然后发现是我的括号位置写错了,应该这么写

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

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

添加数据click代码

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

然后代码都可以理解了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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()

剩余两个按钮

重写按钮

1
2
3
4
5
6
7
8
* 把所有清空
thisform.txt编号.Value = ""
thisform.txt品牌.Value = ""
thisform.txt发动机.Value = ""
thisform.txt型号.Value = ""
thisform.txt底盘.Value = ""
thisform.txt号码.Value = ""
thisform.Refresh()

取消添加按钮

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

车辆信息修改表单

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

修改数据按钮代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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的修改状态如何

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
* 创建一个本地变量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

关闭按钮

经典的

1
thisform.release()

写完咯!

后记

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

宝贝真可爱 图片-1669481640164

图片-1669481649356

图片-1669481670675