Files
StellarX-kaifa/开发记录/Fix/Fix-BUG-20260409-0002-基础控件生命周期与边界条件问题.md
T

89 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Fix-BUG-20260409-0002
> 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。
## 关联信息
- Fix ID: Fix-BUG-20260409-0002
- 关联 BUG ID: BUG-20260409-0002
- 修复目标: 收紧资源所有权,补齐基础边界防御,修正生命周期与接口语义问题
- 状态:已完成 / 待持续回归
- 负责人:Codex 协作修改
- 分支 / 版本:`master`
## 根因分析
- 根因:
- 部分对象持有关系不清晰,析构顺序对 EasyX 上下文敏感。
- `Table / Label` 等基础控件对空状态和动态变化处理不足。
- `MessageBox` 曾通过历史接口越权干预 `Dialog` 初始化。
- 触发条件:
- 析构时机
- 空数据 / 列数不一致
- 动态变更文本
- 为什么之前没发现:
- 很多问题集中在边界输入和静态结构设计,而非主路径功能
## 修复方案
- 修复思路:
- 收紧资源所有权
- 明确析构顺序
- 给空状态和列数不一致加防御
- 让接口更贴合真实职责
- 关键改动:
- `Window` 析构先清空控件树,再 `closegraph()`
- `Control / Window / Button / Table` 中一批资源改为明确所有权
- `Table` 增加空状态、列数规范化、分页下限保护、表高计算
- `Label::setText()` 重新计算尺寸并处理旧快照
- `MessageBox` 移除外层 `setInitialization(true)` 调用
- 涉及文件 / 类 / 函数:
- `Control.h / Control.cpp`
- `Window.h / Window.cpp`
- `Button.h / Button.cpp`
- `Table.h / Table.cpp`
- `Label.cpp`
- `MessageBox.cpp`
- `TextBox.cpp`
- 影响的 API / 行为:
- `Button` 回调 setter 语义收正常
- `MessageBox` 不再依赖外层强制初始化 `Dialog`
- 关键约束 / 不变量:
- 宿主图形上下文必须在控件销毁后再关闭
- 表格行数据必须与表头列数对齐
## 影响评估
- 影响范围:
- 基础控件稳定性与维护性
- 兼容性影响:低
- 行为变化:有(边界输入会被规范化,不再放任异常状态继续传播)
- 性能影响:无明显负担
- 回归风险:
- 主要集中在表格布局与分页按钮链路
## 验证结果
- 验证步骤:
1. 编译 `Window / Control / Table / Label / MessageBox / TextBox` 相关文件。
2. 逻辑推演空表头、长行数据、动态文本变化和窗口关闭链路。
3. 在现有测试用例中回归表格和消息框基本功能。
- 验证结果:
- 已消除确定性越界和明显生命周期风险。
- 回归检查:
- 字符集相关问题暂不在本次修复范围内。
- 验证证据:
- 静态审查 + 编译通过
## 落地信息
- Commit:
- `dde570a` 之后的早期工作区修改
- `4a6e153`
- `7f8431a`
- PR[可选]
- 发布版本:[可选]
- 备注:这部分修复多为基础治理,部分早期修改发生在仓库初始化之前