VFP封装结构类型示例(二)
前一贴:VFP封装结构类型示例 https://bbs.bccn.net/thread-508553-1-1.html
前一贴以 PARAFORMAT2 结构简单探讨了一下VFP封装结构类型的问题,引起不少FOX友的关注和热烈讨论。
现在继续探讨VFP封装结构类型的问题:结构体的嵌套。
1、在结构体中包含其他结构体类型。
2、在结构体中包含指向其他结构体的指针。
先看看下面两个结构 NMHDR 和 OFNOTIFYA 的原形
程序代码:
typedef struct _nmhdr { HWND hwndFrom; UINT idFrom; UINT code; } NMHDR; typedef struct _OFNOTIFYA { NMHDR hdr; LPOPENFILENAMEA lpOFN; LPSTR pszFile; } OFNOTIFYA
OFNOTIFYA 结构体成员 hdr 是一个 NMHDR 结构体;成员 lpOFN 是一个指向 OPENFILENAMEA 结构体的指针。
NMHDR 结构类
程序代码:
DEFINE CLASS NMHDR as STRUCT_CLASS PROCEDURE init DIMENSION this.aSTRUCT[3,4] this.stInit(1, "hwndFrom", "I",4) && 有符号整数 this.stInit(2, "idFrom", "U",4) && 无符号整数 this.stInit(3, "code", "U",4) STRUCT_CLASS::init ENDPROC ENDDEFINE
OFNOTIFYA 结构类可以有两种形式
形式一、直接将 NMHDR 与 OFNOTIFYA 的成员名合并,变成简单的结构体
程序代码:
DEFINE CLASS OFNOTIFYA as STRUCT_CLASS PROCEDURE init DIMENSION this.aSTRUCT[5,4] * NMHDR 结构 this.stInit(1, "hwndFrom", "I",4) this.stInit(2, "idFrom", "U",4) this.stInit(3, "code", "U",4) this.stInit(4, "lpOFN", "U",4) && OPENFILENAMEA 结构指针 this.stInit(5, "pszFile", "U",4) STRUCT_CLASS::init ENDPROC ENDDEFINE
形式二、将 NMHDR 以字符串形式来表达 OFNOTIFYA 的 hdr 成员
程序代码:
DEFINE CLASS OFNOTIFYA as STRUCT_CLASS PROCEDURE init DIMENSION this.aSTRUCT[3,4] this.stInit(1, "hdr", "C",12) && NMHDR 结构 this.stInit(2, "lpOFN", "U",4) && OPENFILENAMEA 结构指针 this.stInit(3, "pszFile", "U",4) STRUCT_CLASS::init ENDPROC ENDDEFINE
以形式二简单的操作示例
程序代码:
cDefPath = ADDBS(JUSTPATH(SYS(16))) SET DEFAULT TO (cDefPath) #INCLUDE apiFuns.h SET PROCEDURE TO apiFuns.prg, StructClass.prg ADDITIVE LoadApi() nm = CREATEOBJECT("NMHDR") of = CREATEOBJECT("OFNOTIFYA") op = CREATEOBJECT("OPENFILENAMEA") op.setValue("lStructSize", op.size) of.setValue("lpOFN", op.addr) nm.setValue("code", 123, of.getMemberAddr("hdr")) ? "OFNOTIFYA.hdr.code", nm.getValue("code", of.getMemberAddr("hdr")) ? "OFNOTIFYA.hdr.code", C2UINT(sys(2600, of.addr+8, 4)) && 验证一下 SET PROCEDURE TO CLEAR ALL RETURN
相关代码打包
StructClass_demo.rar
(7.28 KB)
[此贴子已经被作者于2022-3-26 23:00编辑过]