════════════════════════════════════════════════════════════════ 背包遍历 → 超级列表框勾选 → 批量上架开店(0925,用户写法风格) ════════════════════════════════════════════════════════════════ 【核心思路】 列表只关心「行号」,另外用一个 背包行表 数组并行保存 「背包格号 + 物品结构体地址」。点按钮时按地址回内存重读 编号 / 唯一码 / 数量,再调已有的 发包开店放入物品。 好处:不用把字节集塞进列表,也不怕过期。 【界面准备】 1. 超级列表框1 · 属性面板 →「取勾选方式」(有的版本叫 勾选方式)设为 1 = 复选框 · 属性面板 →「编辑式」设为 真,单价列可以双击直接改 · 读项目数的写法若编译报错,把 取项目数 () 换成 项目数 2. 编辑框_摊位格 :起始摊位格(抓包见 3/4/5/23…,默认 3) 3. 编辑框_上架数量 :填 0 = 背包有多少放多少;非 0 就按这个数放 4. 按钮_刷新背包 5. 按钮_放入店铺 6. 按钮_确认开店 【用到的内存偏移】(你常量表里已有的) #背包基址值 = 0x03BEF5D0(背包管理器) #背包物品位置值(1340) = P+0x53C 起 36 个指针,下标 = 背包格号 #背包物品名称值(100) = +0x64 BIG5 文本 #背包物品数量值(3404) = +0xD4C #物品分类值(3412) = +0xD54 .版本 2 .支持库 spec .变量 操作序号, 整数型, , "1A 包的放物流水号,每放一件 +1,会话内递增" .变量 背包行表, 背包行, 0, , "行号 → 物品信息,与列表行一一对应" .子程序 初始化列表, , 公开, 建好 6 列表头,窗口创建时跑一次 清除数组 (背包行表) 超级列表框1.清空 () 超级列表框1.插入列 (0, "序号", 45) 超级列表框1.插入列 (1, "背包格", 60) 超级列表框1.插入列 (2, "物品名称", 130) 超级列表框1.插入列 (3, "存量", 55) 超级列表框1.插入列 (4, "单价", 60) 超级列表框1.插入列 (5, "分类", 50) 操作序号 = 1 编辑框_摊位格.内容 = "3" 编辑框_上架数量.内容 = "0" 返回 () .子程序 刷新背包, , 公开, 遍历背包 36 格,非空槽填进列表 .局部变量 i, 整数型, , 计次循环计数器 1~36 .局部变量 n, 整数型, , 实际物品件数,兼作 背包行表 行号 .局部变量 背包基址, 整数型 .局部变量 物品位置, 整数型 .局部变量 名称, 文本型 .局部变量 数量, 整数型 .局部变量 分类, 整数型 定义数组 (背包行表, 0, 50) ' 先预分配 50 行 清除数组 (背包行表) 超级列表框1.禁止绘制 () 超级列表框1.清空 () 背包基址 = 内存_读整数型 (全局_进程句柄, #背包基址值) .如果真 (背包基址 = 0) 写日志 (自定义时间 () + "背包基址读取失败,游戏没登录或没进图" + #换行符) 超级列表框1.允许绘制 () 返回 () .如果真结束 n = 0 计次循环 (36, i) 物品位置 = 内存_读整数型 (全局_进程句柄, 背包基址 + 4 × (i - 1) + #背包物品位置值) .如果真 (物品位置 = 0) ' 空槽指针为 0,跳过 到循环尾 .如果真结束 名称 = 编码_BIG5到简体 (内存_读文本型 (全局_进程句柄, 物品位置 + #背包物品名称值)) 数量 = 内存_读整数型 (全局_进程句柄, 物品位置 + #背包物品数量值) 分类 = 内存_读整数型 (全局_进程句柄, 物品位置 + #物品分类值) n = n + 1 .如果真 (n > 50) ' 超过预分配就扩展 重定义数组 (背包行表, 假, n + 50) .如果真结束 背包行表[n].格子 = i - 1 背包行表[n].地址 = 物品位置 背包行表[n].数量 = 数量 ' ① 主项文本=行号 ② 图标=0 ' ③ 子项1=背包格 ④ 子项2=名称 ⑤ 子项3=存量 ⑥ 子项4=单价(待改) ⑦ 子项5=分类 超级列表框1.插入项 (0, 到文本 (n), 0, 到文本 (i - 1), 名称, 到文本 (数量), "0", 到文本 (分类)) 计次循环尾 () 超级列表框1.允许绘制 () 写日志 (自定义时间 () + "背包刷新完成,共 " + 到文本 (n) + " 件物品" + #换行符) 返回 () .子程序 按钮_放入店铺_被单击, , 公开, 按勾选的行依次上架 .局部变量 i, 整数型 .局部变量 行数, 整数型 .局部变量 摊位格, 整数型 .局部变量 单价, 整数型 .局部变量 上架数量, 整数型 .局部变量 件数, 整数型 行数 = 超级列表框1.取项目数 () .如果真 (行数 ≤ 0) 写日志 (自定义时间 () + "列表是空的,先点「刷新背包」" + #换行符) 返回 () .如果真结束 摊位格 = 到数值 (编辑框_摊位格.内容) 上架数量 = 到数值 (编辑框_上架数量.内容) 件数 = 0 计次循环 (行数, i) .如果真 (超级列表框1.取项目状态 (1, i - 1) ≠ 1) ' 勾选的行返回 1,未勾返回 0 到循环尾 .如果真结束 单价 = 到数值 (超级列表框1.取项目文本 (4, i - 1)) ' 第 4 列 = 单价 .如果真 (单价 ≤ 0) 单价 = 1 ' 没填就按 1 卖 .如果真结束 ' 上架数量传 0 = 背包有多少放多少;要固定数量就传 上架数量 发包开店放入物品 (背包行表[i].格子, 摊位格, 单价, 上架数量, 操作序号) 操作序号 = 操作序号 + 1 摊位格 = 摊位格 + 1 ' 每件自动占下一个摊位格 件数 = 件数 + 1 计次循环尾 () .如果真 (件数 = 0) 写日志 (自定义时间 () + "没有勾选任何物品" + #换行符) 返回 () .如果真结束 写日志 (自定义时间 () + "已上架 " + 到文本 (件数) + " 件,占用摊位格 " + 到文本 (摊位格 - 件数) + " 起" + #换行符) 延迟 (1000) ' 稍微等服务器处理完 发包开店确认 () 返回 () .子程序 按钮_刷新背包_被单击, , 公开 刷新背包 () 返回 () .子程序 按钮_确认开店_被单击, , 公开 发包开店确认 () 返回 () ════════════════════════════════════════════════════════════════ ★★ 初始化列表 · 完整示例(0925,可直接复制)★★ ════════════════════════════════════════════════════════════════ .子程序 初始化列表, , 公开, 建好 6 列表头,只在窗口创建时跑一次 .局部变量 i, 整数型 ' ── ① 属性三件套:缺一个,后面就会出莫名其妙的问题 ─────── ' 取勾选方式 = 1 每项带复选框(若你的版本属性面板里没这一项, ' 就在属性面板找「显示勾选框」设为 真,并删掉这行) 超级列表框1.取勾选方式 = 1 ' 整行选种 = 真 点行内任意位置即选中整行,不必精确点小方框 超级列表框1.整行选种 = 真 ' 编辑式 = 真 单价列可双击改;否则读出来的永远是旧值(会变 1 文清仓) 超级列表框1.编辑式 = 真 ' ── ② 建表头(宽度合计 400,可自行按窗口大小调)────────── 超级列表框1.禁止绘制 () ' 下面的大量操作先不重画,避免闪烁 超级列表框1.清空 () ' 插入列 (列索引, 列标题, 列宽度, 保留, 对齐方式) 对齐:0=左 1=居中 2=右 超级列表框1.插入列 (0, "序号", 45, , 1) 超级列表框1.插入列 (1, "背包格", 60, , 1) 超级列表框1.插入列 (2, "物品名称", 130, , 0) 超级列表框1.插入列 (3, "存量", 55, , 2) 超级列表框1.插入列 (4, "单价", 60, , 2) 超级列表框1.插入列 (5, "分类", 50, , 1) 超级列表框1.允许绘制 () ' ── ③ 默认值 ──────────────────────────────────────────── 操作序号 = 1 编辑框_摊位格.内容 = "3" ' 从摊位格 3 开始摆 编辑框_上架数量.内容 = "0" ' 0 = 背包有多少放多少 写日志 (自定义时间 () + "列表初始化完成,共 6 列" + #换行符) 返回 () ' ── 调用位置:把下面这行放进窗口创建事件 ───────────────── ' .子程序 _启动窗口_创建完毕 ' 初始化列表 () ' 刷新背包 () ' 想一开窗口就看到背包也行 ' ── 可选:全选 / 全不选 两个按钮 ────────────────────────── .子程序 按钮_全选_被单击 .局部变量 i, 整数型 计次循环 (超级列表框1.取项目数 (), i) 超级列表框1.置项目状态 (1, i - 1, 1) ' 索引从 0 起;状态 1=勾 0=不勾 计次循环尾 () 返回 () .子程序 按钮_全不选_被单击 .局部变量 i, 整数型 计次循环 (超级列表框1.取项目数 (), i) 超级列表框1.置项目状态 (1, i - 1, 0) 计次循环尾 () 返回 () ★ 列宽与列序速查(改代码时别错位): 列号 0 序号 45px 插入项第1实参 列号 1 背包格 60px 插入项 子项1 列号 2 物品名称 130px 插入项 子项2 列号 3 存量 55px 插入项 子项3 列号 4 单价 60px 插入项 子项4 ← 按钮里用 取项目文本 (4, …) 读它 列号 5 分类 50px 插入项 子项5 ⇒ 插入项 (0, 到文本(n), 0, 背包格, 名称, 存量, "0", 分类) 一共 8 个实参(索引+主项+图标+5子项),不能再多传, 所以物品结构体地址只能另存到 背包行表,不能塞进列表。 ★ 依赖的既有子程序(前面已交付,别改): 发包开店放入物品 (物品格子, 摊位格, 出售价格, 出售数量, 操作序号) 发包开店确认 () ★ 四个坑: 1.「取勾选方式」必须设成复选框,否则 取项目状态 恒为 0,一件也发不出去 2. 背包行表的行号 n 必须和列表插入顺序一致(上面都是从上往下遍历非空槽), 两边用同一个 n 就对得上,别手工调换顺序 3. 单价列没开「编辑式」就永远是 0,代码会兜底按 1 卖——一定要开编辑式 4. 摊位格超过 35 服务器会拒收,一次别勾太多件 ★ 日志示例: 23:35:01 背包刷新完成,共 30 件物品 23:35:04 开店放入物品:背包格3 → 摊位格3 数量11 价格100 23:35:05 开店放入物品:背包格4 → 摊位格4 数量113 价格200 23:35:06 已上架 2 件,占用摊位格 3 起 ════════════════════════════════════════════════════════════════ ★★ 简化版(推荐用这个,代码量少一半)★★ ════════════════════════════════════════════════════════════════ 砍掉了什么: ✗ 「背包行」自定义数据类型 + 「背包行表」数组 ✗ 「初始化列表」独立子程序(并进窗口创建事件) ✗ 「操作序号」全局变量(用循环变量 i 代替) ✗ 保存物品地址——改成把「背包格号」直接当第 1 列存进列表, 点按钮那一刻按格号回内存重读,既短又不会读到过期数据 界面只需要:超级列表框1(取勾选方式=1、整行选种=真、编辑式=真) 编辑框_摊位格 编辑框_上架数量 按钮_刷新背包 按钮_放入店铺 (不需要「确认开店」按钮,放完脚本自己会确认) .版本 2 .支持库 spec .子程序 _启动窗口_创建完毕, , 公开, 建表头,只跑一次 超级列表框1.取勾选方式 = 1 ' 有复选框,否则取项目状态恒为 0 超级列表框1.整行选种 = 真 超级列表框1.编辑式 = 真 ' 单价列可双击改 超级列表框1.清空 () 超级列表框1.插入列 (0, "序号", 45, , 1) 超级列表框1.插入列 (1, "格号", 0, , 1) ' 宽度 0 = 藏起来,只用来存背包格号 超级列表框1.插入列 (2, "物品名称", 130, , 0) 超级列表框1.插入列 (3, "存量", 55, , 2) 超级列表框1.插入列 (4, "单价", 60, , 2) 超级列表框1.插入列 (5, "分类", 50, , 1) 编辑框_摊位格.内容 = "3" 编辑框_上架数量.内容 = "0" 返回 () .子程序 按钮_刷新背包_被单击, , 公开, 遍历背包 36 格填进列表 .局部变量 i, 整数型 .局部变量 n, 整数型 .局部变量 基址, 整数型 .局部变量 物品位置, 整数型 超级列表框1.禁止绘制 () 超级列表框1.清空 () 基址 = 内存_读整数型 (全局_进程句柄, #背包基址值) n = 0 计次循环 (36, i) 物品位置 = 内存_读整数型 (全局_进程句柄, 基址 + 4 × (i - 1) + #背包物品位置值) .如果真 (物品位置 = 0) ' 空槽指针为 0,跳过 到循环尾 .如果真结束 n = n + 1 超级列表框1.插入项 (0, 到文本 (n), 0, 到文本 (i - 1), 编码_BIG5到简体 (内存_读文本型 (全局_进程句柄, 物品位置 + #背包物品名称值)), 到文本 (内存_读整数型 (全局_进程句柄, 物品位置 + #背包物品数量值)), "1", 到文本 (内存_读整数型 (全局_进程句柄, 物品位置 + #物品分类值))) 计次循环尾 () 超级列表框1.允许绘制 () 返回 () .子程序 按钮_放入店铺_被单击, , 公开, 勾哪个放哪个 .局部变量 i, 整数型 .局部变量 格号, 整数型 .局部变量 单价, 整数型 .局部变量 摊位格, 整数型 摊位格 = 到数值 (编辑框_摊位格.内容) 计次循环 (超级列表框1.取项目数 (), i) .如果真 (超级列表框1.取项目状态 (1, i - 1) ≠ 1) ' 没勾就跳过 到循环尾 .如果真结束 格号 = 到数值 (超级列表框1.取项目文本 (1, i - 1)) ' 第 1 列存着背包格号 单价 = 到数值 (超级列表框1.取项目文本 (4, i - 1)) ' 第 4 列是单价,用户双击改 .如果真 (单价 ≤ 0) 单价 = 1 ' 没填就按 1 卖 .如果真结束 发包开店放入物品 (格号, 摊位格, 单价, 到数值 (编辑框_上架数量.内容), i) 摊位格 = 摊位格 + 1 ' 每件自动占下一格 计次循环尾 () 延迟 (1000) 发包开店确认 () ' 放完统一确认,才算营业 返回 () ★ 三个关键列号(别记错): 第 1 列 = 背包格号(藏起来的,用来回读内存) 第 4 列 = 单价(用户要改的就是它) 行号从 0 算,列表行号 = 循环变量 i - 1 ★ 用法:点「刷新背包」→ 勾上要卖的 → 把单价列改掉 → 点「放入店铺」 ★ 编辑框_上架数量 填 0 = 背包有多少放多少;填具体数字就按那个数放 ════════════════════════════════════════════════════════════════ ★★★ 极简版(就这 3 段,40 行不到)★★★ ════════════════════════════════════════════════════════════════ 界面只有三样:超级列表框1 + 按钮「刷新背包」+ 按钮「放入店铺」 (3 个属性必须设:取勾选方式=1、整行选种=真、编辑式=真) 砍掉了:编辑框_摊位格 / 编辑框_上架数量 / 序号列 / 存量列 / 分类列 摊位格写死从 3 开始,上架数量固定全放(0 = 有多少放多少) 列表只要 3 列: 列0 物品名称(看得见的) 列1 背包格号(宽度 0,藏起来,只用来回读内存) 列2 单价(默认填 1,用户双击改) .版本 2 .支持库 spec .子程序 _启动窗口_创建完毕, , 公开, 只跑一次 超级列表框1.取勾选方式 = 1 ' 没这行,取项目状态恒为 0 超级列表框1.整行选种 = 真 超级列表框1.编辑式 = 真 ' 没这行,单价改不了 超级列表框1.清空 () 超级列表框1.插入列 (0, "物品", 170, , 0) 超级列表框1.插入列 (1, "格号", 0, , 1) ' 宽度 0 = 藏起来 超级列表框1.插入列 (2, "单价", 60, , 2) 返回 () .子程序 按钮_刷新背包_被单击, , 公开, 遍历背包 36 格填进列表 .局部变量 i, 整数型 .局部变量 物品位置, 整数型 超级列表框1.清空 () 计次循环 (36, i) 物品位置 = 内存_读整数型 (全局_进程句柄, 内存_读整数型 (全局_进程句柄, #背包基址值) + 4 × (i - 1) + #背包物品位置值) .如果真 (物品位置 = 0) ' 空槽指针为 0 到循环尾 .如果真结束 超级列表框1.插入项 (-1, 编码_BIG5到简体 (内存_读文本型 (全局_进程句柄, 物品位置 + #背包物品名称值)), 0, 到文本 (i - 1), "1") 计次循环尾 () 返回 () .子程序 按钮_放入店铺_被单击, , 公开, 勾哪个放哪个 .局部变量 i, 整数型 .局部变量 摊位格, 整数型 摊位格 = 3 ' 每次从摊位第 3 格开始放 计次循环 (超级列表框1.取项目数 (), i) .如果真 (超级列表框1.取项目状态 (1, i - 1) ≠ 1) 到循环尾 .如果真结束 发包开店放入物品 (到数值 (超级列表框1.取项目文本 (1, i - 1)), 摊位格, 到数值 (超级列表框1.取项目文本 (2, i - 1)), 0, i) 摊位格 = 摊位格 + 1 计次循环尾 () 延迟 (1000) 发包开店确认 () ' 放完自动确认,才算营业 返回 () ★ 列号速查:第 1 列 = 背包格号(回读内存用),第 2 列 = 单价(用户改的) ★ 行号从 0 算,列表行号 = 循环变量 i - 1 ★ 用法:刷新 → 勾上要卖的 → 把单价列双击改掉 → 放入店铺