本帖最后由 福仔 于 2022-1-9 15:16 编辑
1. 易语言的 超级列表框, 树型框, 如果按下面的方式清空所有项目的话, 易语言的做法是销毁这个组件, 重新创建一个所以, 想要保证窗口句柄不变的话, 就不能使用下面的方式
影响: 窗口句柄会被改变, 影响还是很大的, 比如子类化这些, 就不得不重新子类化一次
解决方案: 使用组件提供的清空命令
信息框 (超级列表框1. 取窗口句柄 (), 0, , )超级列表框1.报表列 = { }信息框 (超级列表框1. 取窗口句柄 (), 0, , )信息框 (树型框1. 取窗口句柄 (), 0, , )树型框1.项目 = { }信息框 (树型框1. 取窗口句柄 (), 0, , )

2. 易语言的数据结构, 强制4字节对齐, 这个应该说是易语言的特色, 只不过这个特色代价有点大
比如, c++里的一个结构这个结构占用了4个字节, 因为每个成员一个字节, 修改对应的成员就是修改ARGB颜色里对应的颜色通道
直接把这个结构的内存按整数型的方式读出来, 那他就是一个ARGB整数型的颜色值
int argb = *((int*)&ARGB_STRUCT); 这么用是可以直接把结构转换成argb整数型的颜色
[C++] 纯文本查看 复制代码 struct ARGB_STRUCT{
BYTE b;
BYTE g;
BYTE r;
BYTE a;
};
同样的类型, 在易语言里这么定义, 易语言这个结构就占用 16 个字节, 必须使用特定的方法才能把这个结构转换成一个整数型的ARGB颜色
比如: 字节集 = { 结构.b, 结构.g, 结构.r, 结构.a} argb = 取字节集数据(字节集, #整数型)
得这么处理一下才能转换成整数型的argb颜色值
再比如, c++里, 这个结构占用260个字节, 但是在易语言里这么写, 就只是占用4个字节而已, 易语言里的这个成员只是存放一个地址, 这个地址指向这个数组
[C++] 纯文本查看 复制代码 struct TEST{
char buf[260];
};
影响: 和win32 API 不通用, 很多win32 API需要的数据结构在易语言这里都需要二次处理
比如像读取文件的PE结构, 在易语言里处理起来会比较麻烦
因为易语言的数据结构是4字节对齐, 但是pe结构里, 有不少的成员都是只占用1-2个字节的
所以易语言这边修改结构后不好把结构转换成字节集数据
解决方法:
(1). 申请一块内存, 自己往内存里写成员, 缺点是对新手不友好, 优点是速度快
(2). 定义N个内存拷贝API, api的参数类型就写你要拷贝的类型, 优点是简单, 缺点是速度慢, 并且需要声明N个拷贝API
拿上面的颜色结构和颜色值互换来演示, 需要定义几个内存拷贝的api

影响: 如果这个被取反的逻辑型的值最后一位是0, 并且这个逻辑型是真值, 那么取反后结果不变 解决方法: 逻辑值=逻辑值 = 真, 取反(逻辑值) 先把逻辑值重新赋值, 然后再取反 或者: 判断(逻辑值 = 真), 判断(逻辑值 = 假), 不要用取反 因为之前有遇到过一个模块的命令, 判断传递的路径是否为目录, 函数内部是 返回(GetFileAttributesA (文件路径)) 忘了是不是 精易模块了, 至少现在的精易模块的 文件_是否为目录() 不是这样 如果是目录, 那么就是返回16, 然后这个api定义的返回值是逻辑型, 那么这个逻辑型就是16, 输出的值是真 但是16的二进制最后一位是0, 取反后这个值还是真, 那时候就因为这个问题, 不知道排查了多久....然后就记住了这个坑..... 备注: 二进制一般是从右往左的顺序读, 最右边是第0位, 这里方便理解, 就采用从左往右的顺序
写到内存 (2, 取变量地址 (a ), 4 ) 调试输出 (a ) 调试输出 (取反 (a ))
4. 待更新, 有什么坑欢迎跟帖留言, 慢慢把各位踩到的坑做一个汇总....
|