我也来谈谈我对结构的理解
个人觉得结构就是一个格式化的字符串,它和类有些类似,可以继承,但没有封装方法。如果把结构看做类,那么结构的成员就相当于类的属性。
下面是point结构的一个定义
Type POINTAPI
x As Long
y As Long
End Type
通过point.x来访问结构的成员x,这跟我们的类不是很像吗?
我们来构建一个point类吧。
第一步,构建一个通用类struct
**************************************************
*-- Class: struct (d:\documents\visual foxpro 项目\myclass.vcx)
*-- ParentClass: custom
*-- BaseClass: custom
*-- Time Stamp: 11/03/22 11:51:11 AM
*****************设置一个通用类*******************
DEFINE CLASS struct AS custom
*-- 用以储存或设置结构体数据
struct = ""
Name = "struct"
*-- 设置结构体
PROCEDURE set
ENDPROC
ENDDEFINE
*
*-- EndDefine: struct
**************************************************
第二步,构建point类
*****************************************************
*-- Class: _point (d:\documents\visual foxpro 项目\myclass.vcx)
*-- ParentClass: struct (d:\documents\visual foxpro 项目\myclass.vcx)
*-- BaseClass: custom
*-- Time Stamp: 11/03/22 08:59:09 PM
********point类和系统同名,所以加了条下划线**********
DEFINE CLASS _point AS struct
*-- x坐标
x = .F.
*-- Y坐标
y = .F.
*!* PROCEDURE struct_assign
*!* LPARAMETERS vNewVal
*!* *To do: Modify this routine for the Assign method
*!* THIS.struct = m.vNewVal
*!* this.x=CTOBIN(SUBSTR(m.vnewval,1,4),"4rs")
*!* this.y=CTOBIN(SUBSTR(m.vnewval,5,4),"4rs")
*!* ENDPROC
PROCEDURE Init
this.struct=REPLICATE(CHR(0),8) &&初始化结构体
ENDPROC
PROCEDURE set
PARAMETERS xorcstruct,y
DO case
CASE PARAMETERS()=1 AND VARTYPE(xorcstruct)=="C" && 注意这里的xorcstruct不是数字,而是8字节字符,我并没有对字符串的有效性进行检查。
this.x=CTOBIN(SUBSTR(xorcstruct,1,4),"4rs")
this.y=CTOBIN(SUBSTR(xorcstruct,5,4),"4rs")
this.struct=xorcstruct
CASE PARAMETERS()=2
this.x=xorcstruct
this.y=y
this.struct=BINTOC(xorcstruct,"4rs")+BINTOC(y,"4rs")
ENDCASE
*!*PARAMETERS x,y
*!*this.struct=BINTOC(x,"4rs")+BINTOC(y,"4rs")
ENDPROC
ENDDEFINE
*
*-- EndDefine: _point
**************************************************
第三步,实例化
*!* pointstructtest.prg
CLEAR
DECLARE integer GetCursorPos IN WIN32API string@
SET CLASSLIB TO "D:\Documents\Visual FoxPro 项目\myclass.VCX"
opoint=CREATEOBJECT("_point")
cstruct=opoint.struct
getcursorpos(@cstruct)
opoint.struct=cstruct
opoint.set(cstruct)
?opoint.x
?opoint.y
release opoint
clear dlls
************end**************
不知道这样的理解对大家有没有帮助???
[此贴子已经被作者于2022-11-6 16:01编辑过]