标题:我也来谈谈我对结构的理解
只看楼主
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
结帖率:97.44%
已结贴  问题点数:20 回复次数:19 
我也来谈谈我对结构的理解
个人觉得结构就是一个格式化的字符串,它和类有些类似,可以继承,但没有封装方法。

如果把结构看做类,那么结构的成员就相当于类的属性。

下面是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编辑过]

搜索更多相关主题的帖子: this struct visual 结构 point 
2022-11-06 15:56
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:10 
最大区别是结构的各成员有严格的存储次序,类属性无此要求

[此贴子已经被作者于2022-11-7 12:21编辑过]

收到的鲜花
  • sam_jiang2022-11-07 14:38 送鲜花  1朵  
2022-11-07 12:19
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
向各位学习!
2022-11-07 15:37
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:10 
回复 楼主 sam_jiang
可以说语句表达形式类似(写法有点像),实质就不是一回事。
结构是不同类型成员紧密有序集合的数据块(同一空间)。
结构还有特别的地方,就拿DBF说,每条记录就是一个结构块,声明一个相同结构的东东,套在记录的上就可以直接按结构成员读写每条记录字段的数据。就好象拿个饼印模在面团上面压盖,就可以压出一个一个一样的饼。这饼印就是结构,饼就是每条记录。


2022-11-07 16:19
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
再来一个rectangle结构

类定义如下:
**************************************************
*-- Class:        rectangle (d:\documents\visual foxpro 项目\myclass.vcx)
*-- ParentClass:  struct (d:\documents\visual foxpro 项目\myclass.vcx)
*-- BaseClass:    custom
*-- Time Stamp:   11/07/22 04:18:08 PM
*
DEFINE CLASS rectangle AS struct

    *-- 左上角x坐标
    x = .F.

    *-- 左上角y坐标
    y = .F.

    PROCEDURE set
        PARAMETERS xorcstruct,y,nwidth,nheight

        DO case
            CASE PARAMETERS()=1 AND VARTYPE(xorcstruct)=="C" && 注意这里的xorcstruct不是数字,而是16字节字符,我并没有对字符串的有效性进行检查。
            this.x=CTOBIN(SUBSTR(xorcstruct,1,4),"4rs")
            this.y=CTOBIN(SUBSTR(xorcstruct,5,4),"4rs")
            this.width=CTOBIN(SUBSTR(xorcstruct,9,4),"4rs")
            this.height=CTOBIN(SUBSTR(xorcstruct,13,4),"4rs")
            this.struct=xorcstruct
        CASE PARAMETERS()=4
            this.x=xorcstruct
            this.y=y
            this.Width=nwidth
            this.Height=nheight
            this.struct=BINTOC(xorcstruct,"4rs")+BINTOC(y,"4rs")+BINTOC(nwidth,"4rs")+BINTOC(nheight,"4rs")
        OTHERWISE
            RETURN .f.
        ENDCASE
    ENDPROC

ENDDEFINE
*
*-- EndDefine: rectangle
**************************************************

获得_screen的rect

*getscreenrect.prg
CLEAR
DECLARE inte GetWindowRect IN WIN32API inte,string@
cstr=REPLICATE(CHR(0),16)
getwindowrect(_screen.HWnd,@cstr)
SET CLASSLIB TO myclass
orect=CREATEOBJECT("rectangle")
orect.set(cstr)
?"获得orect的端点值"
?orect.x
?orect.y
?orect.width
?orect.height
?"获得_screen的端点值,看是否相同"
?_screen.Left
?_screen.Top
?_screen.Width
?_screen.Height
RELEASE orect
CLEAR DLLS
SET CLASSLIB TO
2022-11-07 16:30
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:0 
这样的帖子多多益善!
2022-11-07 17:21
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
回复 4楼 吹水佬
你这个比喻比较形象,一条记录就相当于一个结构体。
2022-11-07 20:50
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
回复 6楼 厨师王德榜
抛砖引玉,在各位大佬面前班门弄斧了。。。
2022-11-07 20:56
zhken
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:273
专家分:594
注 册:2012-9-21
得分:0 
多多益善
2022-11-07 21:23
zhken
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:273
专家分:594
注 册:2012-9-21
得分:0 
多多益善
2022-11-07 21:36



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510569-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.076588 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved