{"code":0,"data":{"list":[{"id":2091,"user_id":null,"title":"Y++实现Excel 对象类（COM 自动化）使用指南","content":"<div style=\"color: rgb(187, 190, 191); background-color: rgb(18, 19, 20); font-family: Consolas, \"Courier New\", monospace; line-height: 19px; white-space: pre;\"><div><span style=\"color: #79c0ff;font-weight: bold;\"># Excel 对象类（COM 自动化）使用指南<\/span><\/div><br><div>对象类型：<span style=\"color: #c9d1d9;font-weight: bold;\">**对象类**<\/span>。适用于 Windows 上通过 COM 自动化操作已安装的 Microsoft Excel。<\/div><br><div><span style=\"color: #6a9955;\">><\/span><span style=\"color: #7ee787;\"> 前提：运行程序的电脑必须安装 Excel。<\/span><span style=\"color: #79c0ff;\">`Excel.Application`<\/span><span style=\"color: #7ee787;\"> 是 Excel 注册的 COM ProgID，不是文件路径。<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 1. 对象类与 Excel 对象树<\/span><\/div><br><div>常用对象关系：<\/div><br><div>```text<\/div><div>Excel.Application<\/div><div>└─ Workbooks<\/div><div>   └─ Workbook<\/div><div>      └─ Worksheets<\/div><div>         └─ Worksheet<\/div><div>            ├─ Range \/ Cells<\/div><div>            ├─ Rows \/ Columns<\/div><div>            ├─ Font \/ Interior \/ Borders<\/div><div>            ├─ PageSetup<\/div><div>            └─ ChartObjects<\/div><div>```<\/div><br><div>对象类的通用成员：<\/div><br><div>| Y++ 写法 | COM 含义 | 示例 |<\/div><div>|---|---|---|<\/div><div>| <span style=\"color: #79c0ff;\">`创建(ProgID)`<\/span> | 创建 COM 服务器 | <span style=\"color: #79c0ff;\">`Excel.创建(\"Excel.Application\")`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`连接(ProgID)`<\/span> | 连接正在运行的 COM 服务器 | <span style=\"color: #79c0ff;\">`Excel.连接(\"Excel.Application\")`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`取对象(名称, 参数...)`<\/span> | 读取对象属性，或调用返回对象的方法 | <span style=\"color: #79c0ff;\">`表.取对象(\"Range\", \"A1:D10\")`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`取属性(名称, 参数...)`<\/span> | 读取普通值属性 | <span style=\"color: #79c0ff;\">`表.取属性(\"Name\")`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`设置属性(名称, 值)`<\/span> | 设置属性 | <span style=\"color: #79c0ff;\">`单元格.设置属性(\"Value\", \"内容\")`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`调用(名称, 参数...)`<\/span> | 调用方法 | <span style=\"color: #79c0ff;\">`工作簿.调用(\"Save\")`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`是否有效`<\/span> | 是否持有有效 COM 对象 | <span style=\"color: #79c0ff;\">`如果 (!工作表.是否有效)`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`错误信息`<\/span> | 最近一次 COM 错误 | <span style=\"color: #79c0ff;\">`输出(工作表.错误信息)`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`释放()`<\/span> | 释放当前 COM 引用 | <span style=\"color: #79c0ff;\">`区域.释放()`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`设置可见(逻辑)`<\/span> | 设置 Excel <span style=\"color: #79c0ff;\">`Visible`<\/span> | <span style=\"color: #79c0ff;\">`Excel.设置可见(真)`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`查看()`<\/span> | 等价于 <span style=\"color: #79c0ff;\">`设置可见(真)`<\/span> | <span style=\"color: #79c0ff;\">`Excel.查看()`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`设置显示警告(逻辑)`<\/span> | 设置 <span style=\"color: #79c0ff;\">`DisplayAlerts`<\/span> | <span style=\"color: #79c0ff;\">`Excel.设置显示警告(假)`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`退出()`<\/span> | 调用 Excel <span style=\"color: #79c0ff;\">`Quit`<\/span> 并释放 | <span style=\"color: #79c0ff;\">`Excel.退出()`<\/span> |<\/div><br><div>参数目前推荐使用：<span style=\"color: #c9d1d9;font-weight: bold;\">**文本、整数、长整数、小数、逻辑**<\/span>。当前不要把另一个 <span style=\"color: #79c0ff;\">`对象类`<\/span> 直接作为 COM 方法参数；可改用 <span style=\"color: #79c0ff;\">`Range`<\/span>、公式或目标对象自己的方法完成。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 2. 最小示例：启动 Excel<\/span><\/div><br><div>```yc<\/div><div>函数 按钮3.单击(整数 X, 整数 Y) {<\/div><div>    对象类 Excel<\/div><br><div>    如果 (Excel.创建(\"Excel.Application\")) {<\/div><div>        Excel.查看()<\/div><div>        Excel.设置显示警告(假)<\/div><div>    } 否则 {<\/div><div>        输出(\"启动 Excel 失败：\", Excel.错误信息)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`查看()`<\/span> 的含义是显示 Excel 主窗口，不是弹窗显示对象内容。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 3. 创建工作簿并写入单元格<\/span><\/div><br><div>```yc<\/div><div>函数 新建Excel文件() {<\/div><div>    对象类 Excel<\/div><div>    对象类 工作簿集合<\/div><div>    对象类 工作簿<\/div><div>    对象类 工作表<\/div><div>    对象类 单元格<\/div><br><div>    如果 (!Excel.创建(\"Excel.Application\")) {<\/div><div>        输出(Excel.错误信息)<\/div><div>        返回<\/div><div>    }<\/div><br><div>    Excel.设置可见(真)<\/div><div>    Excel.设置显示警告(假)<\/div><br><div>    工作簿集合 = Excel.取对象(\"Workbooks\")<\/div><div>    工作簿 = 工作簿集合.取对象(\"Add\")<\/div><div>    工作表 = Excel.取对象(\"ActiveSheet\")<\/div><br><div>    单元格 = 工作表.取对象(\"Cells\", 1, 1)<\/div><div>    单元格.设置属性(\"Value\", \"你好，Excel\")<\/div><br><div>    工作表.取对象(\"Cells\", 2, 1).设置属性(\"Value\", \"数量\")<\/div><div>    工作表.取对象(\"Cells\", 2, 2).设置属性(\"Value\", 10)<\/div><br><div>    工作簿.调用(\"SaveAs\", \"D:\\\\YPlusPlus_示例.xlsx\", 51)<\/div><div>}<\/div><div>```<\/div><br><div>Excel 的行列序号从 <span style=\"color: #c9d1d9;font-weight: bold;\">**1**<\/span> 开始：<\/div><br><div>```text<\/div><div>Cells(1, 1) = A1<\/div><div>Cells(2, 1) = A2<\/div><div>Cells(1, 2) = B1<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`SaveAs`<\/span> 的常用文件格式编号：<\/div><br><div>| 编号 | 格式 |<\/div><div>|---:|---|<\/div><div>| <span style=\"color: #79c0ff;\">`51`<\/span> | <span style=\"color: #79c0ff;\">`.xlsx`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`52`<\/span> | 含宏 <span style=\"color: #79c0ff;\">`.xlsm`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`56`<\/span> | 旧版 <span style=\"color: #79c0ff;\">`.xls`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`6`<\/span> | <span style=\"color: #79c0ff;\">`.csv`<\/span> |<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 4. 完整销售报表<\/span><\/div><br><div>```yc<\/div><div>函数 生成销售报表() {<\/div><div>    对象类 Excel<\/div><div>    对象类 工作簿<\/div><div>    对象类 工作表<\/div><div>    对象类 区域<\/div><div>    对象类 字体<\/div><div>    对象类 背景<\/div><br><div>    如果 (!Excel.创建(\"Excel.Application\")) {<\/div><div>        输出(\"创建失败：\", Excel.错误信息)<\/div><div>        返回<\/div><div>    }<\/div><br><div>    Excel.设置可见(真)<\/div><div>    Excel.设置显示警告(假)<\/div><div>    工作簿 = Excel.取对象(\"Workbooks\").取对象(\"Add\")<\/div><div>    工作表 = Excel.取对象(\"ActiveSheet\")<\/div><div>    工作表.设置属性(\"Name\", \"销售报表\")<\/div><br><div>    \/\/ 标题<\/div><div>    区域 = 工作表.取对象(\"Range\", \"A1:D1\")<\/div><div>    区域.调用(\"Merge\")<\/div><div>    区域.设置属性(\"Value\", \"2026 年销售统计表\")<\/div><div>    区域.设置属性(\"HorizontalAlignment\", -4108)<\/div><div>    区域.设置属性(\"VerticalAlignment\", -4108)<\/div><div>    区域.设置属性(\"RowHeight\", 34)<\/div><br><div>    字体 = 区域.取对象(\"Font\")<\/div><div>    字体.设置属性(\"Name\", \"微软雅黑\")<\/div><div>    字体.设置属性(\"Size\", 18)<\/div><div>    字体.设置属性(\"Bold\", 真)<\/div><div>    字体.设置属性(\"Color\", 16777215)<\/div><br><div>    背景 = 区域.取对象(\"Interior\")<\/div><div>    背景.设置属性(\"Color\", 10053120)<\/div><br><div>    \/\/ 表头<\/div><div>    工作表.取对象(\"Range\", \"A2\").设置属性(\"Value\", \"商品\")<\/div><div>    工作表.取对象(\"Range\", \"B2\").设置属性(\"Value\", \"单价\")<\/div><div>    工作表.取对象(\"Range\", \"C2\").设置属性(\"Value\", \"数量\")<\/div><div>    工作表.取对象(\"Range\", \"D2\").设置属性(\"Value\", \"销售额\")<\/div><br><div>    区域 = 工作表.取对象(\"Range\", \"A2:D2\")<\/div><div>    区域.设置属性(\"HorizontalAlignment\", -4108)<\/div><div>    区域.设置属性(\"RowHeight\", 26)<\/div><div>    区域.取对象(\"Font\").设置属性(\"Bold\", 真)<\/div><div>    区域.取对象(\"Font\").设置属性(\"Color\", 16777215)<\/div><div>    区域.取对象(\"Interior\").设置属性(\"Color\", 12611584)<\/div><br><div>    \/\/ 数据<\/div><div>    工作表.取对象(\"Cells\", 3, 1).设置属性(\"Value\", \"键盘\")<\/div><div>    工作表.取对象(\"Cells\", 3, 2).设置属性(\"Value\", 199.5)<\/div><div>    工作表.取对象(\"Cells\", 3, 3).设置属性(\"Value\", 12)<\/div><div>    工作表.取对象(\"Cells\", 3, 4).设置属性(\"Formula\", \"=B3*C3\")<\/div><br><div>    工作表.取对象(\"Cells\", 4, 1).设置属性(\"Value\", \"鼠标\")<\/div><div>    工作表.取对象(\"Cells\", 4, 2).设置属性(\"Value\", 89.9)<\/div><div>    工作表.取对象(\"Cells\", 4, 3).设置属性(\"Value\", 25)<\/div><div>    工作表.取对象(\"Cells\", 4, 4).设置属性(\"Formula\", \"=B4*C4\")<\/div><br><div>    工作表.取对象(\"Cells\", 5, 1).设置属性(\"Value\", \"显示器\")<\/div><div>    工作表.取对象(\"Cells\", 5, 2).设置属性(\"Value\", 1299)<\/div><div>    工作表.取对象(\"Cells\", 5, 3).设置属性(\"Value\", 6)<\/div><div>    工作表.取对象(\"Cells\", 5, 4).设置属性(\"Formula\", \"=B5*C5\")<\/div><br><div>    \/\/ 合计与格式<\/div><div>    工作表.取对象(\"Range\", \"C6\").设置属性(\"Value\", \"合计\")<\/div><div>    工作表.取对象(\"Range\", \"D6\").设置属性(\"Formula\", \"=SUM(D3:D5)\")<\/div><div>    工作表.取对象(\"Range\", \"C6:D6\").取对象(\"Font\").设置属性(\"Bold\", 真)<\/div><div>    工作表.取对象(\"Range\", \"B3:B5\").设置属性(\"NumberFormat\", \"￥#,##0.00\")<\/div><div>    工作表.取对象(\"Range\", \"D3:D6\").设置属性(\"NumberFormat\", \"￥#,##0.00\")<\/div><br><div>    工作表.取对象(\"Columns\", \"A:A\").设置属性(\"ColumnWidth\", 18)<\/div><div>    工作表.取对象(\"Columns\", \"B:D\").设置属性(\"ColumnWidth\", 14)<\/div><div>    工作表.取对象(\"Range\", \"A1:D6\").取对象(\"Font\").设置属性(\"Name\", \"微软雅黑\")<\/div><br><div>    工作簿.调用(\"SaveAs\", \"D:\\\\销售统计表.xlsx\", 51)<\/div><div>    输出(\"销售报表生成完成\")<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 5. 打开、读取、修改和关闭已有文件<\/span><\/div><br><div>```yc<\/div><div>函数 修改已有文件() {<\/div><div>    对象类 Excel<\/div><div>    对象类 工作簿<\/div><div>    对象类 工作表集合<\/div><div>    对象类 工作表<\/div><div>    对象类 单元格<\/div><br><div>    如果 (!Excel.创建(\"Excel.Application\")) {<\/div><div>        输出(Excel.错误信息)<\/div><div>        返回<\/div><div>    }<\/div><br><div>    Excel.设置可见(真)<\/div><div>    Excel.设置显示警告(假)<\/div><br><div>    工作簿 = Excel.取对象(\"Workbooks\").取对象(<\/div><div>        \"Open\", \"D:\\\\原始数据.xlsx\"<\/div><div>    )<\/div><div>    如果 (!工作簿.是否有效) {<\/div><div>        输出(\"打开失败：\", 工作簿.错误信息)<\/div><div>        Excel.退出()<\/div><div>        返回<\/div><div>    }<\/div><br><div>    工作表集合 = 工作簿.取对象(\"Worksheets\")<\/div><div>    工作表 = 工作表集合.取对象(\"Item\", 1)<\/div><div>    输出(\"工作表：\", 工作表.取属性(\"Name\"))<\/div><br><div>    单元格 = 工作表.取对象(\"Range\", \"A1\")<\/div><div>    输出(\"A1 原值：\", 单元格.取属性(\"Value\"))<\/div><div>    单元格.设置属性(\"Value\", \"已由 Y++ 修改\")<\/div><br><div>    工作簿.调用(\"Save\")<\/div><div>    工作簿.调用(\"Close\", 真)<\/div><div>    Excel.退出()<\/div><div>}<\/div><div>```<\/div><br><div>连接用户已经打开的 Excel：<\/div><br><div>```yc<\/div><div>对象类 Excel<\/div><div>如果 (Excel.连接(\"Excel.Application\")) {<\/div><div>    输出(\"已经连接到运行中的 Excel\")<\/div><div>} 否则 {<\/div><div>    输出(Excel.错误信息)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 6. 工作表管理<\/span><\/div><br><div>```yc<\/div><div>函数 工作表管理() {<\/div><div>    对象类 Excel<\/div><div>    对象类 工作簿<\/div><div>    对象类 工作表集合<\/div><div>    对象类 新表<\/div><div>    对象类 指定表<\/div><br><div>    Excel.创建(\"Excel.Application\")<\/div><div>    Excel.设置可见(真)<\/div><div>    Excel.设置显示警告(假)<\/div><br><div>    工作簿 = Excel.取对象(\"Workbooks\").取对象(\"Add\")<\/div><div>    工作表集合 = 工作簿.取对象(\"Worksheets\")<\/div><br><div>    输出(\"工作表数量：\", 工作表集合.取属性(\"Count\"))<\/div><br><div>    新表 = 工作表集合.取对象(\"Add\")<\/div><div>    新表.设置属性(\"Name\", \"产品资料\")<\/div><div>    新表.取对象(\"Range\", \"A1\").设置属性(\"Value\", \"产品编号\")<\/div><br><div>    指定表 = 工作表集合.取对象(\"Item\", \"产品资料\")<\/div><div>    指定表.取对象(\"Range\", \"A2\").设置属性(\"Value\", \"P-001\")<\/div><br><div>    \/\/ 删除表前关闭 Excel 确认提示<\/div><div>    Excel.设置显示警告(假)<\/div><div>    \/\/ 指定表.调用(\"Delete\")<\/div><div>}<\/div><div>```<\/div><br><div>复制整个工作表最稳妥的方式是先打开模板文件，然后另存工作簿；当前版本不推荐使用需要把另一个 COM 对象作为 <span style=\"color: #79c0ff;\">`Before\/After`<\/span> 参数的 <span style=\"color: #79c0ff;\">`Worksheet.Copy`<\/span> 写法。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 7. Range、Cells、Rows 与 Columns<\/span><\/div><br><div>```yc<\/div><div>对象类 区域<\/div><br><div>区域 = 工作表.取对象(\"Range\", \"A1:D20\")<\/div><div>区域.设置属性(\"HorizontalAlignment\", -4108)<\/div><div>区域.设置属性(\"VerticalAlignment\", -4108)<\/div><div>区域.设置属性(\"WrapText\", 真)<\/div><br><div>工作表.取对象(\"Rows\", \"1:1\").设置属性(\"RowHeight\", 30)<\/div><div>工作表.取对象(\"Columns\", \"A:A\").设置属性(\"ColumnWidth\", 22)<\/div><div>工作表.取对象(\"Columns\", \"B:D\").调用(\"AutoFit\")<\/div><br><div>\/\/ 清空内容但保留格式<\/div><div>工作表.取对象(\"Range\", \"A2:D100\").调用(\"ClearContents\")<\/div><br><div>\/\/ 内容和格式全部清空<\/div><div>工作表.取对象(\"Range\", \"A2:D100\").调用(\"Clear\")<\/div><br><div>\/\/ 删除整行\/整列<\/div><div>工作表.取对象(\"Rows\", \"5:5\").调用(\"Delete\")<\/div><div>工作表.取对象(\"Columns\", \"C:C\").调用(\"Delete\")<\/div><div>```<\/div><br><div>查找最后使用行的常见写法需要读取 <span style=\"color: #79c0ff;\">`Cells(Rows.Count,1).End(-4162).Row`<\/span>。可逐级取得对象：<\/div><br><div>```yc<\/div><div>对象类 所有行<\/div><div>对象类 最底单元格<\/div><div>对象类 最后单元格<\/div><br><div>所有行 = 工作表.取对象(\"Rows\")<\/div><div>整数 最大行 = 到整数(所有行.取属性(\"Count\"))<\/div><div>最底单元格 = 工作表.取对象(\"Cells\", 最大行, 1)<\/div><div>最后单元格 = 最底单元格.取对象(\"End\", -4162)<\/div><div>整数 最后一行 = 到整数(最后单元格.取属性(\"Row\"))<\/div><div>输出(\"最后一行：\", 最后一行)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`-4162`<\/span> 是 Excel 常量 <span style=\"color: #79c0ff;\">`xlUp`<\/span>。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 8. 字体、背景、对齐与数字格式<\/span><\/div><br><div>```yc<\/div><div>对象类 区域<\/div><div>对象类 字体<\/div><div>对象类 背景<\/div><br><div>区域 = 工作表.取对象(\"Range\", \"A1:D10\")<\/div><br><div>字体 = 区域.取对象(\"Font\")<\/div><div>字体.设置属性(\"Name\", \"微软雅黑\")<\/div><div>字体.设置属性(\"Size\", 12)<\/div><div>字体.设置属性(\"Bold\", 真)<\/div><div>字体.设置属性(\"Italic\", 假)<\/div><div>字体.设置属性(\"Underline\", 2)<\/div><div>字体.设置属性(\"Color\", 255)<\/div><br><div>背景 = 区域.取对象(\"Interior\")<\/div><div>背景.设置属性(\"Color\", 65535)<\/div><br><div>区域.设置属性(\"HorizontalAlignment\", -4108)<\/div><div>区域.设置属性(\"VerticalAlignment\", -4108)<\/div><div>区域.设置属性(\"WrapText\", 真)<\/div><div>区域.设置属性(\"ShrinkToFit\", 假)<\/div><div>```<\/div><br><div>常用数字格式：<\/div><br><div>```yc<\/div><div>工作表.取对象(\"Range\", \"B2:B100\").设置属性(\"NumberFormat\", \"0\")<\/div><div>工作表.取对象(\"Range\", \"C2:C100\").设置属性(\"NumberFormat\", \"0.00\")<\/div><div>工作表.取对象(\"Range\", \"D2:D100\").设置属性(\"NumberFormat\", \"0.00%\")<\/div><div>工作表.取对象(\"Range\", \"E2:E100\").设置属性(\"NumberFormat\", \"￥#,##0.00\")<\/div><div>工作表.取对象(\"Range\", \"F2:F100\").设置属性(\"NumberFormat\", \"yyyy-mm-dd\")<\/div><div>工作表.取对象(\"Range\", \"G2:G100\").设置属性(\"NumberFormat\", \"yyyy-mm-dd hh:mm:ss\")<\/div><div>工作表.取对象(\"Range\", \"H2:H100\").设置属性(\"NumberFormat\", \"@\")<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`@`<\/span> 表示文本格式，适合身份证号、长编号和前导零数据。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 9. 边框<\/span><\/div><br><div>边框编号：<span style=\"color: #79c0ff;\">`7=左`<\/span>、<span style=\"color: #79c0ff;\">`8=上`<\/span>、<span style=\"color: #79c0ff;\">`9=下`<\/span>、<span style=\"color: #79c0ff;\">`10=右`<\/span>、<span style=\"color: #79c0ff;\">`11=内部竖线`<\/span>、<span style=\"color: #79c0ff;\">`12=内部横线`<\/span>。<\/div><br><div>```yc<\/div><div>函数 设置区域边框(对象类 区域) {<\/div><div>    对象类 边框集合<\/div><div>    对象类 边框<\/div><br><div>    边框集合 = 区域.取对象(\"Borders\")<\/div><br><div>    边框 = 边框集合.取对象(\"Item\", 7)<\/div><div>    边框.设置属性(\"LineStyle\", 1)<\/div><div>    边框.设置属性(\"Weight\", 2)<\/div><div>    边框.设置属性(\"Color\", 0)<\/div><br><div>    边框 = 边框集合.取对象(\"Item\", 8)<\/div><div>    边框.设置属性(\"LineStyle\", 1)<\/div><div>    边框.设置属性(\"Weight\", 2)<\/div><br><div>    边框 = 边框集合.取对象(\"Item\", 9)<\/div><div>    边框.设置属性(\"LineStyle\", 1)<\/div><div>    边框.设置属性(\"Weight\", 2)<\/div><br><div>    边框 = 边框集合.取对象(\"Item\", 10)<\/div><div>    边框.设置属性(\"LineStyle\", 1)<\/div><div>    边框.设置属性(\"Weight\", 2)<\/div><br><div>    边框 = 边框集合.取对象(\"Item\", 11)<\/div><div>    边框.设置属性(\"LineStyle\", 1)<\/div><div>    边框.设置属性(\"Weight\", 2)<\/div><br><div>    边框 = 边框集合.取对象(\"Item\", 12)<\/div><div>    边框.设置属性(\"LineStyle\", 1)<\/div><div>    边框.设置属性(\"Weight\", 2)<\/div><div>}<\/div><div>```<\/div><br><div>调用：<\/div><br><div>```yc<\/div><div>对象类 表格区域<\/div><div>表格区域 = 工作表.取对象(\"Range\", \"A2:D20\")<\/div><div>设置区域边框(表格区域)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 10. 公式与计算<\/span><\/div><br><div>```yc<\/div><div>工作表.取对象(\"Range\", \"D2\").设置属性(\"Formula\", \"=B2*C2\")<\/div><div>工作表.取对象(\"Range\", \"D3\").设置属性(\"FormulaR1C1\", \"=RC[-2]*RC[-1]\")<\/div><div>工作表.取对象(\"Range\", \"D10\").设置属性(\"Formula\", \"=SUM(D2:D9)\")<\/div><div>工作表.取对象(\"Range\", \"E2\").设置属性(\"Formula\", \"=IF(D2>=1000,\\\"达标\\\",\\\"未达标\\\")\")<\/div><div>工作表.取对象(\"Range\", \"F2\").设置属性(\"Formula\", \"=TODAY()\")<\/div><br><div>\/\/ 强制计算<\/div><div>Excel.调用(\"Calculate\")<\/div><div>```<\/div><br><div>不同语言版本的 Excel 对 <span style=\"color: #79c0ff;\">`FormulaLocal`<\/span> 可能使用本地函数名；为了跨机器，优先使用英文函数名和 <span style=\"color: #79c0ff;\">`Formula`<\/span>。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 11. 查找与替换<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`Range.Find`<\/span> 返回对象，因此使用 <span style=\"color: #79c0ff;\">`取对象`<\/span>：<\/div><br><div>```yc<\/div><div>对象类 搜索区域<\/div><div>对象类 找到的单元格<\/div><br><div>搜索区域 = 工作表.取对象(\"Range\", \"A1:D1000\")<\/div><div>找到的单元格 = 搜索区域.取对象(\"Find\", \"鼠标\")<\/div><br><div>如果 (找到的单元格.是否有效) {<\/div><div>    输出(\"找到位置：\", 找到的单元格.取属性(\"Address\"))<\/div><div>    找到的单元格.设置属性(\"Value\", \"无线鼠标\")<\/div><div>} 否则 {<\/div><div>    输出(\"没有找到：\", 搜索区域.错误信息)<\/div><div>}<\/div><div>```<\/div><br><div>替换：<\/div><br><div>```yc<\/div><div>\/\/ LookAt：1=完全匹配，2=部分匹配<\/div><div>工作表.取对象(\"Range\", \"A1:D1000\").调用(<\/div><div>    \"Replace\", \"旧文本\", \"新文本\", 2<\/div><div>)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 12. 筛选、排序与冻结窗格<\/span><\/div><br><div>筛选：<\/div><br><div>```yc<\/div><div>对象类 数据区域<\/div><div>数据区域 = 工作表.取对象(\"Range\", \"A1:D100\")<\/div><br><div>\/\/ 启用筛选<\/div><div>数据区域.调用(\"AutoFilter\")<\/div><br><div>\/\/ 第二列大于 100<\/div><div>数据区域.调用(\"AutoFilter\", 2, \">100\")<\/div><br><div>\/\/ 清除筛选箭头<\/div><div>工作表.设置属性(\"AutoFilterMode\", 假)<\/div><div>```<\/div><br><div>简单排序可对目标列调用 <span style=\"color: #79c0ff;\">`Sort`<\/span>：<\/div><br><div>```yc<\/div><div>\/\/ 1=升序，2=降序<\/div><div>工作表.取对象(\"Range\", \"A2:D100\").调用(\"Sort\", 1)<\/div><div>```<\/div><br><div>Excel 的复杂排序 API 常要求把 Range 对象作为参数；当前建议在工作表中建立辅助列，再用简单排序，或通过公式完成。<\/div><br><div>冻结首行：<\/div><br><div>```yc<\/div><div>对象类 窗口<\/div><div>工作表.取对象(\"Range\", \"A2\").调用(\"Select\")<\/div><div>窗口 = Excel.取对象(\"ActiveWindow\")<\/div><div>窗口.设置属性(\"FreezePanes\", 真)<\/div><div>```<\/div><br><div>取消冻结：<\/div><br><div>```yc<\/div><div>Excel.取对象(\"ActiveWindow\").设置属性(\"FreezePanes\", 假)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 13. 数据验证、超链接和批注<\/span><\/div><br><div>数据验证对象：<\/div><br><div>```yc<\/div><div>对象类 验证<\/div><div>验证 = 工作表.取对象(\"Range\", \"B2:B100\").取对象(\"Validation\")<\/div><div>验证.调用(\"Delete\")<\/div><br><div>\/\/ 3=序列验证，1=停止样式，1=介于；最后一个参数是选项列表<\/div><div>验证.调用(\"Add\", 3, 1, 1, \"待处理,处理中,已完成\")<\/div><div>验证.设置属性(\"IgnoreBlank\", 真)<\/div><div>验证.设置属性(\"InCellDropdown\", 真)<\/div><div>```<\/div><br><div>超链接建议使用公式，避免传入 Range 对象参数：<\/div><br><div>```yc<\/div><div>工作表.取对象(\"Range\", \"A10\").设置属性(<\/div><div>    \"Formula\",<\/div><div>    \"=HYPERLINK(\\\"https:\/\/www.example.com\\\",\\\"打开网站\\\")\"<\/div><div>)<\/div><div>```<\/div><br><div>添加批注：<\/div><br><div>```yc<\/div><div>对象类 批注<\/div><div>批注 = 工作表.取对象(\"Range\", \"A2\").取对象(<\/div><div>    \"AddComment\", \"该数据由 Y++ 自动生成\"<\/div><div>)<\/div><div>```<\/div><br><div>删除批注：<\/div><br><div>```yc<\/div><div>对象类 批注<\/div><div>批注 = 工作表.取对象(\"Range\", \"A2\").取对象(\"Comment\")<\/div><div>如果 (批注.是否有效) {<\/div><div>    批注.调用(\"Delete\")<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 14. 图表<\/span><\/div><br><div>下面使用 <span style=\"color: #79c0ff;\">`Shapes.AddChart2`<\/span>，参数全部是普通数值，不需要传递 COM 对象：<\/div><br><div>```yc<\/div><div>函数 添加销售图表(对象类 工作表) {<\/div><div>    对象类 图形集合<\/div><div>    对象类 图表形状<\/div><div>    对象类 图表<\/div><div>    对象类 数据系列集合<\/div><div>    对象类 数据系列<\/div><br><div>    图形集合 = 工作表.取对象(\"Shapes\")<\/div><br><div>    \/\/ 201=图表样式，51=簇状柱形图；后面是 Left、Top、Width、Height<\/div><div>    图表形状 = 图形集合.取对象(\"AddChart2\", 201, 51, 420, 30, 520, 300)<\/div><div>    图表 = 图表形状.取对象(\"Chart\")<\/div><br><div>    \/\/ 新建数据系列并用公式地址指定数据源，避免把 Range 对象作为参数<\/div><div>    数据系列集合 = 图表.取对象(\"SeriesCollection\")<\/div><div>    数据系列 = 数据系列集合.取对象(\"NewSeries\")<\/div><div>    数据系列.设置属性(\"Name\", \"='销售报表'!$D$2\")<\/div><div>    数据系列.设置属性(\"XValues\", \"='销售报表'!$A$3:$A$5\")<\/div><div>    数据系列.设置属性(\"Values\", \"='销售报表'!$D$3:$D$5\")<\/div><br><div>    图表.设置属性(\"HasTitle\", 真)<\/div><div>    图表.取对象(\"ChartTitle\").设置属性(\"Text\", \"商品销售额\")<\/div><div>    图表.设置属性(\"HasLegend\", 真)<\/div><div>}<\/div><div>```<\/div><br><div>不同 Excel 版本对 <span style=\"color: #79c0ff;\">`AddChart2`<\/span> 和图表数据源接口存在差异。如果 <span style=\"color: #79c0ff;\">`SetSourceData`<\/span> 报错，可先在模板文件中做好图表，再只修改图表引用的数据区域。模板方式在生产环境最稳定。<\/div><br><div>常见图表类型：<\/div><br><div>| 编号 | 类型 |<\/div><div>|---:|---|<\/div><div>| <span style=\"color: #79c0ff;\">`51`<\/span> | 簇状柱形图 |<\/div><div>| <span style=\"color: #79c0ff;\">`4`<\/span> | 折线图 |<\/div><div>| <span style=\"color: #79c0ff;\">`5`<\/span> | 饼图 |<\/div><div>| <span style=\"color: #79c0ff;\">`65`<\/span> | 面积图 |<\/div><div>| <span style=\"color: #79c0ff;\">`74`<\/span> | 散点图 |<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 15. 页面设置、打印和 PDF<\/span><\/div><br><div>```yc<\/div><div>对象类 页面设置<\/div><br><div>页面设置 = 工作表.取对象(\"PageSetup\")<\/div><br><div>\/\/ 1=纵向，2=横向<\/div><div>页面设置.设置属性(\"Orientation\", 2)<\/div><div>页面设置.设置属性(\"Zoom\", 假)<\/div><div>页面设置.设置属性(\"FitToPagesWide\", 1)<\/div><div>页面设置.设置属性(\"FitToPagesTall\", 1)<\/div><div>页面设置.设置属性(\"CenterHeader\", \"销售统计报表\")<\/div><div>页面设置.设置属性(\"CenterFooter\", \"第 &P 页，共 &N 页\")<\/div><div>页面设置.设置属性(\"PrintArea\", \"$A$1:$D$20\")<\/div><br><div>\/\/ 打印预览<\/div><div>工作表.调用(\"PrintPreview\")<\/div><br><div>\/\/ 直接打印<\/div><div>\/\/ 工作表.调用(\"PrintOut\")<\/div><br><div>\/\/ 0=PDF，1=XPS<\/div><div>工作表.调用(<\/div><div>    \"ExportAsFixedFormat\",<\/div><div>    0,<\/div><div>    \"D:\\\\销售统计表.pdf\"<\/div><div>)<\/div><div>```<\/div><br><div>Excel 页边距通常使用“磅”而不是厘米。可让 Excel 换算：<\/div><br><div>```yc<\/div><div>小数 左边距 = 到小数(Excel.调用(\"CentimetersToPoints\", 1.5))<\/div><div>页面设置.设置属性(\"LeftMargin\", 左边距)<\/div><div>页面设置.设置属性(\"RightMargin\", 左边距)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 16. 保护工作表和工作簿<\/span><\/div><br><div>```yc<\/div><div>\/\/ 锁定区域<\/div><div>工作表.取对象(\"Range\", \"A1:D20\").设置属性(\"Locked\", 真)<\/div><br><div>\/\/ 允许编辑输入区<\/div><div>工作表.取对象(\"Range\", \"B2:C20\").设置属性(\"Locked\", 假)<\/div><br><div>\/\/ 保护\/取消保护工作表<\/div><div>工作表.调用(\"Protect\", \"123456\")<\/div><div>工作表.调用(\"Unprotect\", \"123456\")<\/div><br><div>\/\/ 保护工作簿结构<\/div><div>工作簿.调用(\"Protect\", \"123456\", 真)<\/div><div>工作簿.调用(\"Unprotect\", \"123456\")<\/div><div>```<\/div><br><div>密码保护不能替代文件加密；敏感文件还应使用 Excel 的“用密码进行加密”。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 17. CSV 导入导出<\/span><\/div><br><div>另存为 CSV：<\/div><br><div>```yc<\/div><div>Excel.设置显示警告(假)<\/div><div>工作簿.调用(\"SaveAs\", \"D:\\\\数据.csv\", 6)<\/div><div>```<\/div><br><div>打开 CSV：<\/div><br><div>```yc<\/div><div>对象类 工作簿<\/div><div>工作簿 = Excel.取对象(\"Workbooks\").取对象(\"Open\", \"D:\\\\数据.csv\")<\/div><div>```<\/div><br><div>CSV 只保存当前工作表，不支持格式、公式结果之外的工作簿功能。中文乱码时，优先使用 <span style=\"color: #79c0ff;\">`.xlsx`<\/span>，或者在 Excel 中选择 UTF-8 CSV 格式。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 18. 错误处理模板<\/span><\/div><br><div>不要只判断最外层 <span style=\"color: #79c0ff;\">`Excel.创建`<\/span>。关键对象和关键写入都应检查：<\/div><br><div>```yc<\/div><div>函数 安全写入单元格(对象类 工作表, 文本 地址, 文本 内容) {<\/div><div>    对象类 单元格<\/div><div>    单元格 = 工作表.取对象(\"Range\", 地址)<\/div><br><div>    如果 (!单元格.是否有效) {<\/div><div>        输出(\"取得单元格失败：\", 地址, \"，\", 单元格.错误信息)<\/div><div>        返回<\/div><div>    }<\/div><br><div>    如果 (!单元格.设置属性(\"Value\", 内容)) {<\/div><div>        输出(\"写入失败：\", 地址, \"，\", 单元格.错误信息)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>完整清理模板：<\/div><br><div>```yc<\/div><div>函数 Excel任务() {<\/div><div>    对象类 Excel<\/div><div>    对象类 工作簿<\/div><br><div>    如果 (!Excel.创建(\"Excel.Application\")) {<\/div><div>        输出(Excel.错误信息)<\/div><div>        返回<\/div><div>    }<\/div><br><div>    Excel.设置显示警告(假)<\/div><div>    工作簿 = Excel.取对象(\"Workbooks\").取对象(\"Add\")<\/div><br><div>    如果 (!工作簿.是否有效) {<\/div><div>        输出(工作簿.错误信息)<\/div><div>        Excel.退出()<\/div><div>        返回<\/div><div>    }<\/div><br><div>    \/\/ ...执行业务...<\/div><br><div>    工作簿.调用(\"Close\", 假)<\/div><div>    工作簿.释放()<\/div><div>    Excel.退出()<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 19. 性能建议<\/span><\/div><br><div>大量写入时先关闭屏幕刷新、事件和自动计算：<\/div><br><div>```yc<\/div><div>Excel.设置属性(\"ScreenUpdating\", 假)<\/div><div>Excel.设置属性(\"EnableEvents\", 假)<\/div><br><div>\/\/ -4135 = xlCalculationManual<\/div><div>Excel.设置属性(\"Calculation\", -4135)<\/div><br><div>\/\/ 批量写入...<\/div><br><div>\/\/ -4105 = xlCalculationAutomatic<\/div><div>Excel.设置属性(\"Calculation\", -4105)<\/div><div>Excel.设置属性(\"EnableEvents\", 真)<\/div><div>Excel.设置属性(\"ScreenUpdating\", 真)<\/div><div>Excel.调用(\"Calculate\")<\/div><div>```<\/div><br><div>建议：<\/div><br><div><span style=\"color: #ffa657;\">1.<\/span> 尽量使用一个连续 <span style=\"color: #79c0ff;\">`Range`<\/span>，少做成千上万次单元格调用。<\/div><div><span style=\"color: #ffa657;\">2.<\/span> 生产报表优先使用预制 <span style=\"color: #79c0ff;\">`.xlsx`<\/span> 模板，只填数据和少量格式。<\/div><div><span style=\"color: #ffa657;\">3.<\/span> 操作过程中关闭 <span style=\"color: #79c0ff;\">`ScreenUpdating`<\/span>，结束时务必恢复。<\/div><div><span style=\"color: #ffa657;\">4.<\/span> 不需要用户看到 Excel 时，不要调用 <span style=\"color: #79c0ff;\">`设置可见(真)`<\/span>。<\/div><div><span style=\"color: #ffa657;\">5.<\/span> 后台任务结束时关闭工作簿并调用 <span style=\"color: #79c0ff;\">`Excel.退出()`<\/span>，避免残留 EXCEL.EXE。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 20. 常用 Excel 常量<\/span><\/div><br><div>Y++ 可直接传对应整数：<\/div><br><div>| 名称 | 值 | 说明 |<\/div><div>|---|---:|---|<\/div><div>| <span style=\"color: #79c0ff;\">`xlCenter`<\/span> | <span style=\"color: #79c0ff;\">`-4108`<\/span> | 居中 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlLeft`<\/span> | <span style=\"color: #79c0ff;\">`-4131`<\/span> | 左对齐 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlRight`<\/span> | <span style=\"color: #79c0ff;\">`-4152`<\/span> | 右对齐 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlTop`<\/span> | <span style=\"color: #79c0ff;\">`-4160`<\/span> | 顶部对齐 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlBottom`<\/span> | <span style=\"color: #79c0ff;\">`-4107`<\/span> | 底部对齐 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlUp`<\/span> | <span style=\"color: #79c0ff;\">`-4162`<\/span> | 向上查找\/移动 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlDown`<\/span> | <span style=\"color: #79c0ff;\">`-4121`<\/span> | 向下查找\/移动 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlToLeft`<\/span> | <span style=\"color: #79c0ff;\">`-4159`<\/span> | 向左 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlToRight`<\/span> | <span style=\"color: #79c0ff;\">`-4161`<\/span> | 向右 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlAscending`<\/span> | <span style=\"color: #79c0ff;\">`1`<\/span> | 升序 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlDescending`<\/span> | <span style=\"color: #79c0ff;\">`2`<\/span> | 降序 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlPortrait`<\/span> | <span style=\"color: #79c0ff;\">`1`<\/span> | 纵向打印 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlLandscape`<\/span> | <span style=\"color: #79c0ff;\">`2`<\/span> | 横向打印 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlCalculationManual`<\/span> | <span style=\"color: #79c0ff;\">`-4135`<\/span> | 手动计算 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlCalculationAutomatic`<\/span> | <span style=\"color: #79c0ff;\">`-4105`<\/span> | 自动计算 |<\/div><div>| <span style=\"color: #79c0ff;\">`xlOpenXMLWorkbook`<\/span> | <span style=\"color: #79c0ff;\">`51`<\/span> | xlsx |<\/div><div>| <span style=\"color: #79c0ff;\">`xlOpenXMLWorkbookMacroEnabled`<\/span> | <span style=\"color: #79c0ff;\">`52`<\/span> | xlsm |<\/div><div>| <span style=\"color: #79c0ff;\">`xlExcel8`<\/span> | <span style=\"color: #79c0ff;\">`56`<\/span> | xls |<\/div><div>| <span style=\"color: #79c0ff;\">`xlCSV`<\/span> | <span style=\"color: #79c0ff;\">`6`<\/span> | CSV |<\/div><div>| <span style=\"color: #79c0ff;\">`xlTypePDF`<\/span> | <span style=\"color: #79c0ff;\">`0`<\/span> | PDF |<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 21. 常见问题<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 调用任意第三方 COM 插件\/ActiveX 服务<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`对象类`<\/span> 不只用于 Excel。只要第三方组件公开了 Automation\/IDispatch 接口并已在 Windows 注册，就可以通过它的 ProgID 调用。<\/div><br><div>假设第三方文档给出的 ProgID 为 <span style=\"color: #79c0ff;\">`Vendor.Device`<\/span>，对象树为 <span style=\"color: #79c0ff;\">`Device → Session → Result`<\/span>：<\/div><br><div>```yc<\/div><div>对象类 插件<\/div><div>对象类 会话<\/div><div>对象类 结果<\/div><br><div>如果 (!插件.创建(\"Vendor.Device\")) {<\/div><div>    输出(\"创建第三方 COM 失败：\" + 插件.错误信息)<\/div><div>    返回<\/div><div>}<\/div><br><div>插件.设置属性(\"Visible\", 假)<\/div><div>插件.设置属性(\"Timeout\", 5000)<\/div><br><div>会话 = 插件.取对象(\"OpenSession\", \"COM3\", 115200)<\/div><div>如果 (!会话.是否有效) {<\/div><div>    输出(会话.错误信息)<\/div><div>    插件.释放()<\/div><div>    返回<\/div><div>}<\/div><br><div>会话.调用(\"WriteText\", \"STATUS?\")<\/div><div>结果 = 会话.取对象(\"ReadResult\")<\/div><div>如果 (结果.是否有效) {<\/div><div>    整数 状态码 = 结果.取属性(\"Code\")<\/div><div>    文本 内容 = 结果.取属性(\"Text\")<\/div><div>    输出(状态码, 内容)<\/div><div>}<\/div><br><div>会话.调用(\"Close\")<\/div><div>结果.释放()<\/div><div>会话.释放()<\/div><div>插件.释放()<\/div><div>```<\/div><br><div>以上成员名只是第三方 COM 文档的示意；实际必须使用供应商类型库\/接口手册中的 ProgID、属性和方法名。<\/div><br><div>连接已运行实例：<\/div><br><div>```yc<\/div><div>对象类 插件<\/div><div>如果 (!插件.连接(\"Vendor.Device\")) {<\/div><div>    输出(\"没有运行中的实例：\" + 插件.错误信息)<\/div><div>}<\/div><div>```<\/div><br><div>接入检查清单：<\/div><br><div><span style=\"color: #ffa657;\">1.<\/span> 使用供应商安装程序或 <span style=\"color: #79c0ff;\">`regsvr32`<\/span> 正确注册 COM 组件；不要只复制 DLL。<\/div><div><span style=\"color: #ffa657;\">2.<\/span> Y++ 程序位数必须与 COM In-Proc DLL 位数一致；x86 DLL 用 x86 目标，x64 DLL 用 x64 目标。EXE 型 COM 服务器通常可跨位数。<\/div><div><span style=\"color: #ffa657;\">3.<\/span> ProgID 可在供应商文档、OLE\/COM Object Viewer 或注册表 <span style=\"color: #79c0ff;\">`HKEY_CLASSES_ROOT`<\/span> 查询。<\/div><div><span style=\"color: #ffa657;\">4.<\/span> <span style=\"color: #79c0ff;\">`创建`<\/span> 对应 <span style=\"color: #79c0ff;\">`CoCreateInstance`<\/span>；<span style=\"color: #79c0ff;\">`连接`<\/span> 对应取得已运行对象。<\/div><div><span style=\"color: #ffa657;\">5.<\/span> 返回子对象的方法用 <span style=\"color: #79c0ff;\">`取对象`<\/span>，普通返回值用 <span style=\"color: #79c0ff;\">`取属性`<\/span>，无返回动作使用 <span style=\"color: #79c0ff;\">`调用`<\/span>。<\/div><div><span style=\"color: #ffa657;\">6.<\/span> 如果第三方 DLL 只导出 C 函数、没有 IDispatch\/类型库，它不是可供 <span style=\"color: #79c0ff;\">`对象类`<\/span> 使用的 COM Automation 组件，应改用 <span style=\"color: #79c0ff;\">`.ypi`<\/span> 声明 DLL API。<\/div><div><span style=\"color: #ffa657;\">7.<\/span> ActiveX 控件若要求嵌入窗口、事件接收或许可证，除了 <span style=\"color: #79c0ff;\">`对象类`<\/span> 调用外还可能需要专用宿主；以厂商要求为准。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`创建(\"Excel.Application\")`<\/span><span style=\"color: #79c0ff;font-weight: bold;\"> 失败<\/span><\/div><br><div><span style=\"color: #ffa657;\">-<\/span> 检查电脑是否安装 Excel。<\/div><div><span style=\"color: #ffa657;\">-<\/span> 检查程序和 Office 的安装是否正常；COM 注册损坏时修复 Office。<\/div><div><span style=\"color: #ffa657;\">-<\/span> 输出 <span style=\"color: #79c0ff;\">`Excel.错误信息`<\/span>，其中包含 HRESULT 和失败成员。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 弹出“COM object”而不是 Excel<\/span><\/div><br><div>这是旧运行库把 <span style=\"color: #79c0ff;\">`查看()`<\/span> 写成提示框的行为。新版 <span style=\"color: #79c0ff;\">`查看()`<\/span> 等价于 <span style=\"color: #79c0ff;\">`设置可见(真)`<\/span>。完全退出旧版 YStudio 后，用新版重新编译项目。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### Excel 进程一直不退出<\/span><\/div><br><div><span style=\"color: #ffa657;\">-<\/span> 关闭工作簿：<span style=\"color: #79c0ff;\">`工作簿.调用(\"Close\", 假)`<\/span>。<\/div><div><span style=\"color: #ffa657;\">-<\/span> 释放区域、工作表、工作簿等对象引用。<\/div><div><span style=\"color: #ffa657;\">-<\/span> 最后调用 <span style=\"color: #79c0ff;\">`Excel.退出()`<\/span>。<\/div><div><span style=\"color: #ffa657;\">-<\/span> 避免仍有全局 <span style=\"color: #79c0ff;\">`对象类`<\/span> 保存着某个 Range\/Worksheet。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 调用成功但文件没有保存<\/span><\/div><br><div><span style=\"color: #ffa657;\">-<\/span> <span style=\"color: #79c0ff;\">`Save`<\/span> 需要工作簿已经有路径。<\/div><div><span style=\"color: #ffa657;\">-<\/span> 新工作簿使用 <span style=\"color: #79c0ff;\">`SaveAs`<\/span> 并传绝对路径。<\/div><div><span style=\"color: #ffa657;\">-<\/span> Windows 路径中的反斜杠写成 <span style=\"color: #79c0ff;\">`\\\\`<\/span>，例如 <span style=\"color: #79c0ff;\">`\"D:\\\\报表.xlsx\"`<\/span>。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 方法到底用 <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`调用`<\/span><span style=\"color: #79c0ff;font-weight: bold;\"> 还是 <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`取对象`<\/span><\/div><br><div><span style=\"color: #ffa657;\">-<\/span> 返回 Excel 对象：用 <span style=\"color: #79c0ff;\">`取对象`<\/span>，如 <span style=\"color: #79c0ff;\">`Workbooks`<\/span>、<span style=\"color: #79c0ff;\">`Add`<\/span>、<span style=\"color: #79c0ff;\">`Range`<\/span>、<span style=\"color: #79c0ff;\">`Font`<\/span>。<\/div><div><span style=\"color: #ffa657;\">-<\/span> 只执行动作：用 <span style=\"color: #79c0ff;\">`调用`<\/span>，如 <span style=\"color: #79c0ff;\">`Save`<\/span>、<span style=\"color: #79c0ff;\">`Close`<\/span>、<span style=\"color: #79c0ff;\">`Delete`<\/span>、<span style=\"color: #79c0ff;\">`AutoFit`<\/span>。<\/div><div><span style=\"color: #ffa657;\">-<\/span> 返回文本\/数字\/逻辑属性：用 <span style=\"color: #79c0ff;\">`取属性`<\/span>。<\/div><div><span style=\"color: #ffa657;\">-<\/span> 写属性：用 <span style=\"color: #79c0ff;\">`设置属性`<\/span>。<\/div><br><div>如果某个 Excel 方法返回对象而使用 <span style=\"color: #79c0ff;\">`调用`<\/span> 得到空文本，应改成 <span style=\"color: #79c0ff;\">`取对象`<\/span>。<\/div><br><\/div>","status":"fixed","is_recycle":0,"is_top":1,"is_bold":1,"is_italic":0,"is_underline":1,"title_color":"#af1908","font_family":"","font_size":"","category":"经验分享","priority":"normal","browser":"","os":"","contact":"","attachment":"","ip":"182.87.162.172","create_time":"2026-08-11 01:51:53","update_time":"2026-08-11 01:51:53","is_featured":0,"view_count":0,"username":"管理员","nickname":"管理员","avatar":null,"level":null,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2090,"user_id":null,"title":"Y++调用 Windows 系统 API 指南","content":"<div style=\"color: rgb(187, 190, 191); background-color: rgb(18, 19, 20); font-family: Consolas, \"Courier New\", monospace; line-height: 19px; white-space: pre;\"><div><span style=\"color: #79c0ff;font-weight: bold;\"># <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`.ypi`<\/span><span style=\"color: #79c0ff;font-weight: bold;\"> 调用 Windows 系统 API 指南<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`.ypi`<\/span> 是<span style=\"color: #c9d1d9;font-weight: bold;\">**声明式 FFI**<\/span>：把 DLL \/ WinAPI 的导出函数声明成可在 Y++ 里直接调用的中文（或英文）命令。  <\/div><div>适合：<span style=\"color: #79c0ff;\">`user32`<\/span> \/ <span style=\"color: #79c0ff;\">`kernel32`<\/span> \/ 自研 DLL \/ 第三方 C 导出。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 文件类型说明（请勿混用）<\/span><\/div><br><div>| 扩展名 | 用途 | 本文是否涉及 |<\/div><div>|--------|------|--------------|<\/div><div>| <span style=\"color: #c9d1d9;font-weight: bold;\">**<\/span><span style=\"color: #79c0ff;font-weight: bold;\">`.ypi`<\/span><span style=\"color: #c9d1d9;font-weight: bold;\">**<\/span> | Windows \/ DLL API 声明（<span style=\"color: #79c0ff;\">`DLL(...)`<\/span>、导出名、中文别名） | <span style=\"color: #c9d1d9;font-weight: bold;\">**本文主体**<\/span> |<\/div><div>| <span style=\"color: #c9d1d9;font-weight: bold;\">**<\/span><span style=\"color: #79c0ff;font-weight: bold;\">`.yc`<\/span><span style=\"color: #c9d1d9;font-weight: bold;\">**<\/span> | 源码中调用已声明的 API | 调用示例 |<\/div><div>| <span style=\"color: #c9d1d9;font-weight: bold;\">**<\/span><span style=\"color: #79c0ff;font-weight: bold;\">`.yt`<\/span><span style=\"color: #c9d1d9;font-weight: bold;\">**<\/span> | API 参数用到的结构体布局 | 结构体示例 |<\/div><div>| <span style=\"color: #c9d1d9;font-weight: bold;\">**<\/span><span style=\"color: #79c0ff;font-weight: bold;\">`.ypp`<\/span><span style=\"color: #c9d1d9;font-weight: bold;\">**<\/span> | 带方法的类 | 不涉及 |<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 1. 文件放哪<\/span><\/div><br><div>```<\/div><div>source\/<\/div><div>  winapi.ypi          ← API 声明<\/div><div>  main.yc             ← 调用代码<\/div><div>  POINT.yt            ← 若参数含结构体，用 .yt 定义<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`.ypi`<\/span> 加入工程后自动加载，无需 <span style=\"color: #79c0ff;\">`#include`<\/span>。  <\/div><div>其中声明的 API（英文导出名与中文别名）在<span style=\"color: #c9d1d9;font-weight: bold;\">**本工程所有**<\/span> <span style=\"color: #79c0ff;\">`.yc`<\/span> \/ <span style=\"color: #79c0ff;\">`.ypp`<\/span> \/ 其它可编译源文件中都可直接调用，相当于工程级全局命令，不必每个文件重复声明。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 2. 最小例子：MessageBoxW<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`source\/winapi.ypi`<\/span>：<\/div><br><div>```ypi<\/div><div>DLL(\"user32.dll\", \"stdcall\")<\/div><br><div>整数 MessageBoxW(整数 hWnd, 文本 内容, 文本 标题, 整数 类型) 信息框<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`source\/main.yc`<\/span>：<\/div><br><div>```yc<\/div><div>函数 按钮1.单击(整数 X, 整数 Y) {<\/div><div>    信息框(0, \"你好，Windows API\", \"提示\", 0)<\/div><div>}<\/div><div>```<\/div><br><div>说明：<\/div><br><div><span style=\"color: #ffa657;\">-<\/span> <span style=\"color: #79c0ff;\">`DLL(\"user32.dll\", \"stdcall\")`<\/span>：指定模块与调用约定  <\/div><div><span style=\"color: #ffa657;\">-<\/span> 最后的 <span style=\"color: #79c0ff;\">`信息框`<\/span> 是<span style=\"color: #c9d1d9;font-weight: bold;\">**中文别名**<\/span>（推荐，便于补全与调用）  <\/div><div><span style=\"color: #ffa657;\">-<\/span> <span style=\"color: #79c0ff;\">`文本`<\/span> 对应宽字符 <span style=\"color: #79c0ff;\">`LPCWSTR`<\/span>（UTF-16）<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 3. 声明语法<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 3.1 模块头<\/span><\/div><br><div>```ypi<\/div><div>DLL(\"user32.dll\", \"stdcall\")<\/div><div>DLL(\"kernel32.dll\", \"stdcall\")<\/div><div>```<\/div><br><div><span style=\"color: #ffa657;\">-<\/span> 第一参数：DLL 文件名或路径（系统目录 DLL 可只写文件名）  <\/div><div><span style=\"color: #ffa657;\">-<\/span> 第二参数：<span style=\"color: #79c0ff;\">`stdcall`<\/span>（WinAPI 常用）或 <span style=\"color: #79c0ff;\">`cdecl`<\/span>  <\/div><div><span style=\"color: #ffa657;\">-<\/span> x64 下约定差异较小，仍建议与头文件一致  <\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 3.2 函数行<\/span><\/div><br><div>```ypi<\/div><div>[返回类型] 英文导出名(参数列表) 中文别名<\/div><div>```<\/div><br><div>示例：<\/div><br><div>```ypi<\/div><div>逻辑 Beep(整数 频率, 整数 时长) 蜂鸣<\/div><div>整数 GetTickCount() 取启动毫秒<\/div><div>整数 FindWindowW(文本 类名, 文本 标题) 寻找窗口<\/div><div>逻辑 SetWindowTextW(整数 hWnd, 文本 标题) 置窗口标题<\/div><div>整数 GetWindowTextW(整数 hWnd, 文本缓冲W 缓冲, 整数 最大字符数) 取窗口标题<\/div><div>```<\/div><br><div>规则：<\/div><br><div><span style=\"color: #ffa657;\">-<\/span> <span style=\"color: #c9d1d9;font-weight: bold;\">**英文导出名**<\/span>必须是 DLL 真实导出（通常 ASCII）  <\/div><div><span style=\"color: #ffa657;\">-<\/span> <span style=\"color: #c9d1d9;font-weight: bold;\">**中文别名**<\/span>建议必填，供 Y++ 源码调用  <\/div><div><span style=\"color: #ffa657;\">-<\/span> 参数名仅作文档，调用时按位置传参  <\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 3.3 现代简写（无 DLL 行时）<\/span><\/div><br><div>部分工程也支持直接：<\/div><br><div>```ypi<\/div><div>逻辑 StartMouseTrail(整数 length, 单浮点 width, 文本A colorHex) 启动鼠标轨迹<\/div><div>```<\/div><br><div>再配合 <span style=\"color: #79c0ff;\">`设置DLL路径`<\/span> \/ <span style=\"color: #79c0ff;\">`置DLL约定`<\/span>（见下文多 DLL）。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 4. 类型对照（WinAPI）<\/span><\/div><br><div>| C \/ WinAPI | <span style=\"color: #79c0ff;\">`.ypi`<\/span> 类型 | 说明 |<\/div><div>|------------|-------------|------|<\/div><div>| <span style=\"color: #79c0ff;\">`BOOL`<\/span> | <span style=\"color: #79c0ff;\">`逻辑`<\/span> | |<\/div><div>| <span style=\"color: #79c0ff;\">`int`<\/span> \/ <span style=\"color: #79c0ff;\">`INT`<\/span> \/ <span style=\"color: #79c0ff;\">`DWORD`<\/span> \/ <span style=\"color: #79c0ff;\">`LONG`<\/span> | <span style=\"color: #79c0ff;\">`整数`<\/span> | 4 字节 |<\/div><div>| <span style=\"color: #79c0ff;\">`HWND`<\/span> \/ <span style=\"color: #79c0ff;\">`HANDLE`<\/span> \/ 指针地址 | <span style=\"color: #79c0ff;\">`整数`<\/span> 或 <span style=\"color: #79c0ff;\">`长整数`<\/span> | 句柄作整数传；64 位地址优先 <span style=\"color: #79c0ff;\">`长整数`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`int64_t`<\/span> \/ <span style=\"color: #79c0ff;\">`LONGLONG`<\/span> | <span style=\"color: #79c0ff;\">`长整数`<\/span> | 8 字节 |<\/div><div>| <span style=\"color: #79c0ff;\">`SHORT`<\/span> \/ <span style=\"color: #79c0ff;\">`WORD`<\/span> | <span style=\"color: #79c0ff;\">`短整数`<\/span> | |<\/div><div>| <span style=\"color: #79c0ff;\">`BYTE`<\/span> | <span style=\"color: #79c0ff;\">`字节`<\/span> | |<\/div><div>| <span style=\"color: #79c0ff;\">`float`<\/span> | <span style=\"color: #79c0ff;\">`单浮点`<\/span> | |<\/div><div>| <span style=\"color: #79c0ff;\">`double`<\/span> | <span style=\"color: #79c0ff;\">`双浮点`<\/span> | |<\/div><div>| <span style=\"color: #79c0ff;\">`LPCWSTR`<\/span> \/ <span style=\"color: #79c0ff;\">`const wchar_t*`<\/span> | <span style=\"color: #79c0ff;\">`文本`<\/span> | UTF-16 |<\/div><div>| <span style=\"color: #79c0ff;\">`LPCSTR`<\/span> \/ <span style=\"color: #79c0ff;\">`const char*`<\/span> | <span style=\"color: #79c0ff;\">`文本A`<\/span> | UTF-8（声明式路径） |<\/div><div>| 可写 <span style=\"color: #79c0ff;\">`wchar_t*`<\/span> 缓冲 | <span style=\"color: #79c0ff;\">`文本缓冲W`<\/span> | |<\/div><div>| 可写 <span style=\"color: #79c0ff;\">`char*`<\/span> 缓冲 | <span style=\"color: #79c0ff;\">`文本缓冲A`<\/span> | |<\/div><div>| <span style=\"color: #79c0ff;\">`int*`<\/span> 等出参 | <span style=\"color: #79c0ff;\">`整数指针`<\/span> 等 | 直接传变量，勿再 <span style=\"color: #79c0ff;\">`取变量地址`<\/span> |<\/div><div>| 回调 | <span style=\"color: #79c0ff;\">`子程序指针`<\/span> | 传 <span style=\"color: #79c0ff;\">`&函数名`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`void`<\/span> | <span style=\"color: #79c0ff;\">`空`<\/span> \/ <span style=\"color: #79c0ff;\">`无`<\/span> | |<\/div><div>| 结构体指针 | <span style=\"color: #79c0ff;\">`.yt`<\/span> 类型名 | 先定义 <span style=\"color: #79c0ff;\">`.yt`<\/span> |<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 5. 结构体参数（配合 <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`.yt`<\/span><span style=\"color: #79c0ff;font-weight: bold;\">）<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`source\/几何.yt`<\/span>：<\/div><br><div>```yt<\/div><div>POINT {<\/div><div>    整数 x<\/div><div>    整数 y<\/div><div>}<\/div><br><div>RECT {<\/div><div>    整数 left<\/div><div>    整数 top<\/div><div>    整数 right<\/div><div>    整数 bottom<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`source\/winapi.ypi`<\/span>：<\/div><br><div>```ypi<\/div><div>DLL(\"user32.dll\", \"stdcall\")<\/div><br><div>逻辑 PtInRect(RECT 矩形, POINT 点) 点在矩形内<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`source\/main.yc`<\/span>：<\/div><br><div>```yc<\/div><div>函数 按钮1.单击(整数 X, 整数 Y) {<\/div><div>    RECT r<\/div><div>    r.left = 0<\/div><div>    r.top = 0<\/div><div>    r.right = 100<\/div><div>    r.bottom = 50<\/div><br><div>    POINT p<\/div><div>    p.x = 10<\/div><div>    p.y = 20<\/div><br><div>    如果 (点在矩形内(r, p)) {<\/div><div>        输出(\"在内\")<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>注意：<span style=\"color: #79c0ff;\">`.yt`<\/span> 字段顺序\/宽度必须与 SDK 一致；<span style=\"color: #79c0ff;\">`整数`<\/span>\/<span style=\"color: #79c0ff;\">`逻辑`<\/span> 在 <span style=\"color: #79c0ff;\">`.yt`<\/span> 中按 4 字节布局。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 6. 文本与缓冲<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 6.1 只读宽字符（最常见）<\/span><\/div><br><div>```ypi<\/div><div>逻辑 SetWindowTextW(整数 hWnd, 文本 标题) 置窗口标题<\/div><div>```<\/div><br><div>```ypp<\/div><div>置窗口标题(窗口句柄, \"新标题\")<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 6.2 需要写出缓冲（取文本）<\/span><\/div><br><div>```ypi<\/div><div>整数 GetWindowTextW(整数 hWnd, 文本缓冲W 缓冲, 整数 最大字符数) 取窗口标题W<\/div><div>```<\/div><br><div>调用时通常配合缓冲创建命令（以支持库实际命令为准），例如：<\/div><br><div>```ypp<\/div><div>\/\/ 概念示例：先创建宽字符缓冲，再传入取标题 API，再读回文本<\/div><div>```<\/div><br><div>窄字符 API 用 <span style=\"color: #79c0ff;\">`文本A`<\/span> \/ <span style=\"color: #79c0ff;\">`文本缓冲A`<\/span>。中文场景优先 <span style=\"color: #c9d1d9;font-weight: bold;\">**W 版 API**<\/span>。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 7. 回调（子程序指针）<\/span><\/div><br><div>```ypi<\/div><div>DLL(\"user32.dll\", \"stdcall\")<\/div><br><div>整数 EnumWindows(子程序指针 回调, 整数 lParam) 枚举窗口<\/div><div>```<\/div><br><div>```ypp<\/div><div>函数 枚举回调(整数 hWnd, 整数 lParam) 逻辑 {<\/div><div>    输出(hWnd)<\/div><div>    返回(真)   \/\/ 继续枚举<\/div><div>}<\/div><br><div>函数 按钮1.单击(整数 X, 整数 Y) {<\/div><div>    枚举窗口(&枚举回调, 0)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #ffa657;\">-<\/span> 传 <span style=\"color: #79c0ff;\">`&函数名`<\/span>  <\/div><div><span style=\"color: #ffa657;\">-<\/span> 回调形参类型必须与原生原型一致  <\/div><div><span style=\"color: #ffa657;\">-<\/span> 默认按 stdcall 桥接；若 DLL 要求 cdecl，按文档使用 <span style=\"color: #79c0ff;\">`DLL_回调(&函数名, \"cdecl\")`<\/span> 一类写法  <\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 8. 多 DLL \/ 自定义路径<\/span><\/div><br><div>```ypp<\/div><div>函数 主窗口.创建完毕() {<\/div><div>    设置DLL路径(系统_取运行目录() + \"\\\\plugins\\\\mydll.dll\")<\/div><div>    置DLL约定(\"mydll.dll\")   \/\/ 省略约定参数时多为 stdcall<\/div><div>    我的初始化()<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #ffa657;\">-<\/span> 系统 DLL（<span style=\"color: #79c0ff;\">`user32.dll`<\/span>）一般只需在 <span style=\"color: #79c0ff;\">`.ypi`<\/span> 写模块名  <\/div><div><span style=\"color: #ffa657;\">-<\/span> 自研 DLL：保证运行目录能找到，或 <span style=\"color: #79c0ff;\">`设置DLL路径`<\/span>  <\/div><div><span style=\"color: #ffa657;\">-<\/span> 资源路径 <span style=\"color: #79c0ff;\">`:\/xxx.dll`<\/span>：会按规则内存加载或写出到 exe 旁再加载  <\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 9. 与 <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`调用函数Ex`<\/span><span style=\"color: #79c0ff;font-weight: bold;\"> 的区别<\/span><\/div><br><div>| 方式 | 优点 | 缺点 |<\/div><div>|------|------|------|<\/div><div>| <span style=\"color: #79c0ff;\">`.ypi`<\/span> 声明 | 类型安全、补全、可读 | 需先写声明 |<\/div><div>| <span style=\"color: #79c0ff;\">`调用函数Ex`<\/span> \/ <span style=\"color: #79c0ff;\">`LoadLibrary`<\/span> | 灵活、临时探测 | 易错、文本编码默认 ACP |<\/div><br><div>正式工程优先 <span style=\"color: #79c0ff;\">`.ypi`<\/span>。临时调试可用动态调用，注意 A\/W 编码。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 10. 实用 WinAPI 声明片段<\/span><\/div><br><div>```ypi<\/div><div>DLL(\"user32.dll\", \"stdcall\")<\/div><br><div>整数 MessageBoxW(整数 hWnd, 文本 内容, 文本 标题, 整数 类型) 信息框<\/div><div>整数 FindWindowW(文本 类名, 文本 标题) 寻找窗口<\/div><div>逻辑 ShowWindow(整数 hWnd, 整数 命令) 显示窗口<\/div><div>逻辑 SetWindowPos(整数 hWnd, 整数 hWndInsertAfter, 整数 x, 整数 y, 整数 cx, 整数 cy, 整数 flags) 置窗口位置<\/div><div>逻辑 GetWindowRect(整数 hWnd, RECT 矩形) 取窗口矩形<\/div><br><div>DLL(\"kernel32.dll\", \"stdcall\")<\/div><br><div>整数 GetTickCount() 取启动毫秒<\/div><div>逻辑 Beep(整数 频率, 整数 时长) 蜂鸣<\/div><div>整数 GetCurrentProcessId() 取当前进程ID<\/div><div>```<\/div><br><div>（<span style=\"color: #79c0ff;\">`RECT`<\/span> 需在 <span style=\"color: #79c0ff;\">`.yt`<\/span> 中定义。）<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 11. 排错<\/span><\/div><br><div>| 现象 | 排查 |<\/div><div>|------|------|<\/div><div>| 找不到命令 | <span style=\"color: #79c0ff;\">`.ypi`<\/span> 是否加入工程；别名是否写对 |<\/div><div>| 调用崩溃 | stdcall\/cdecl、参数个数\/类型、A\/W 版本是否匹配 |<\/div><div>| 中文乱码 | 改用 W API + <span style=\"color: #79c0ff;\">`文本`<\/span>；避免窄字符 ACP 路径 |<\/div><div>| 结构体不对 | 检查 <span style=\"color: #79c0ff;\">`.yt`<\/span> 字段顺序与 4 字节整数布局 |<\/div><div>| 找不到 DLL | 路径、位数（x86\/x64）是否与程序一致 |<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">---<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 12. 与其它文档<\/span><\/div><br><div><span style=\"color: #ffa657;\">-<\/span> 纯数据结构：<span style=\"color: #79c0ff;\">`自定义数据类型_yt使用指南.md`<\/span>  <\/div><div><span style=\"color: #ffa657;\">-<\/span> 带方法的类：<span style=\"color: #79c0ff;\">`自定义类_ypp使用指南.md`<\/span>  <\/div><div><span style=\"color: #ffa657;\">-<\/span> 更完整的第三方 DLL \/ 元数据说明：仓库 <span style=\"color: #79c0ff;\">`docs\/Y++调用外部DLL开发文档.md`<\/span><\/div><br><\/div>","status":"fixed","is_recycle":0,"is_top":1,"is_bold":1,"is_italic":0,"is_underline":1,"title_color":"#ba0808","font_family":"","font_size":"16px","category":"经验分享","priority":"normal","browser":"","os":"","contact":"","attachment":"","ip":"182.87.162.172","create_time":"2026-08-11 01:50:46","update_time":"2026-08-11 01:50:46","is_featured":0,"view_count":0,"username":"管理员","nickname":"管理员","avatar":null,"level":null,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2089,"user_id":null,"title":"Y++ 自写类及继承语法说明","content":"<div style=\"color: rgb(187, 190, 191); background-color: rgb(18, 19, 20); font-family: Consolas, \"Courier New\", monospace; line-height: 19px; white-space: pre;\"><div><span style=\"color: #79c0ff;font-weight: bold;\"># Y++ 自写类及继承语法说明<\/span><\/div><br><div>自写类使用 <span style=\"color: #79c0ff;\">`.ypp`<\/span> 文件，适合封装状态、属性、方法、构造逻辑和继承关系。事件入口仍写在 <span style=\"color: #79c0ff;\">`.yc`<\/span>，纯数据布局使用 <span style=\"color: #79c0ff;\">`.yt`<\/span>。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 1. 最小类定义<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`source\/classes\/计数器.ypp`<\/span>：<\/div><br><div>```ypp<\/div><div>类 计数器 {<\/div><div>    属性 整数 当前值 = 0<\/div><br><div>    方法 增加() {<\/div><div>        当前值 = 当前值 + 1<\/div><div>    }<\/div><br><div>    方法 取值() 整数 {<\/div><div>        返回(当前值)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>调用：<\/div><br><div>```yc<\/div><div>函数 主窗口.创建完毕() {<\/div><div>    计数器 c<\/div><div>    c.增加()<\/div><div>    c.增加()<\/div><div>    输出(c.取值())<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 2. 属性<\/span><\/div><br><div>```ypp<\/div><div>类 用户 {<\/div><div>    属性 整数 编号 = 0<\/div><div>    属性 文本 姓名 = \"\"<\/div><div>    属性 逻辑 启用 = 真<\/div><div>    属性 文本 标签[] = []<\/div><div>}<\/div><div>```<\/div><br><div>类外访问：<\/div><br><div>```yc<\/div><div>用户 u<\/div><div>u.编号 = 1001<\/div><div>u.姓名 = \"张三\"<\/div><div>数组添加(u.标签, \"管理员\")<\/div><div>输出(u.姓名)<\/div><div>```<\/div><br><div>属性类型也可以是 <span style=\"color: #79c0ff;\">`.yt`<\/span> 自定义数据类型：<\/div><br><div>```ypp<\/div><div>类 客户档案 {<\/div><div>    属性 学生 基本信息<\/div><div>    属性 地址 联系地址<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>客户档案 档案<\/div><div>档案.基本信息.姓名 = \"李四\"<\/div><div>档案.联系地址.市 = \"杭州\"<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 3. 方法参数和返回值<\/span><\/div><br><div>```ypp<\/div><div>类 数学工具 {<\/div><div>    方法 相加(整数 a, 整数 b) 整数 {<\/div><div>        返回(a + b)<\/div><div>    }<\/div><br><div>    方法 格式化(文本 名称, 整数 数量) 文本 {<\/div><div>        返回(名称 + \" × \" + 到文本(数量))<\/div><div>    }<\/div><br><div>    方法 是否有效(整数 数值) 逻辑 {<\/div><div>        返回(数值 >= 0)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>数学工具 工具<\/div><div>整数 合计 = 工具.相加(10, 20)<\/div><div>文本 标题 = 工具.格式化(\"苹果\", 3)<\/div><div>如果 (工具.是否有效(合计)) {<\/div><div>    输出(标题)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 4. 构造方法<\/span><\/div><br><div>无参构造：<\/div><br><div>```ypp<\/div><div>类 日志器 {<\/div><div>    属性 文本 前缀<\/div><br><div>    方法 构造() {<\/div><div>        前缀 = \"[程序]\"<\/div><div>    }<\/div><br><div>    方法 写入(文本 内容) {<\/div><div>        输出(前缀 + 内容)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>日志器 日志<\/div><div>日志.写入(\"启动完成\")<\/div><div>```<\/div><br><div>需要参数的初始化：<\/div><br><div>```ypp<\/div><div>类 矩形模型 {<\/div><div>    属性 整数 宽 = 0<\/div><div>    属性 整数 高 = 0<\/div><br><div>    方法 初始化(整数 初始宽, 整数 初始高) {<\/div><div>        宽 = 初始宽<\/div><div>        高 = 初始高<\/div><div>    }<\/div><br><div>    方法 面积() 整数 {<\/div><div>        返回(宽 * 高)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>矩形模型 r<\/div><div>r.初始化(10, 20)<\/div><div>输出(r.面积())<\/div><div>```<\/div><br><div>类实例使用“类名 对象名”声明。需要传入初始数据时，定义普通初始化方法并在声明后调用；不要写成 <span style=\"color: #79c0ff;\">`矩形模型 r(10, 20)`<\/span>，也不要混用其它语言的 <span style=\"color: #79c0ff;\">`new`<\/span> 语法。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 5. 类中使用 <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`.yt`<\/span><span style=\"color: #79c0ff;font-weight: bold;\"> 数据<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`source\/types\/学生.yt`<\/span>：<\/div><br><div>```yt<\/div><div>学生 {<\/div><div>    整数 学号 = 0<\/div><div>    文本 姓名<\/div><div>    整数 分数[] = []<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`source\/classes\/学籍服务.ypp`<\/span>：<\/div><br><div>```ypp<\/div><div>类 学籍服务 {<\/div><div>    属性 学生 学生列表[] = []<\/div><br><div>    方法 添加(学生 新学生) {<\/div><div>        数组添加(学生列表, 新学生)<\/div><div>    }<\/div><br><div>    方法 取学生(整数 下标) 学生 {<\/div><div>        返回(学生列表[下标])<\/div><div>    }<\/div><br><div>    方法 修改姓名(整数 下标, 文本 新姓名) {<\/div><div>        学生 s = 学生列表[下标]<\/div><div>        s.姓名 = 新姓名<\/div><div>        学生列表[下标] = s<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>学籍服务 服务<\/div><div>学生 s<\/div><div>s.学号 = 1001<\/div><div>s.姓名 = \"张三\"<\/div><div>服务.添加(s)<\/div><div>服务.修改姓名(0, \"张小三\")<\/div><div>输出(服务.取学生(0).姓名)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 6. 方法文档注释<\/span><\/div><br><div>紧邻方法写说明，IDE 调用提示可读取：<\/div><br><div>```ypp<\/div><div>类 人员服务 {<\/div><div>    \/\/\/ @说明 根据编号查找人员，找不到时返回空名称人员<\/div><div>    \/\/\/ 参数 @编号 要查找的人员编号<\/div><div>    方法 查找(整数 编号) 学生 {<\/div><div>        学生 空结果<\/div><div>        返回(空结果)<\/div><div>    }<\/div><br><div>    \/\/\/ @说明 修改人员姓名<\/div><div>    \/\/\/ 参数 @人员 原人员数据<\/div><div>    \/\/\/ 参数 @新姓名 修改后的姓名<\/div><div>    方法 改名(学生 人员, 文本 新姓名) 学生 {<\/div><div>        人员.姓名 = 新姓名<\/div><div>        返回(人员)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>注释参数名必须与方法形参一致，注释与方法之间不要插入其它声明。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 7. 基本继承<\/span><\/div><br><div>```ypp<\/div><div>类 动物 {<\/div><div>    属性 文本 名称<\/div><br><div>    方法 显示名称() {<\/div><div>        输出(\"名称：\" + 名称)<\/div><div>    }<\/div><br><div>    方法 发声() {<\/div><div>        输出(\"动物声音\")<\/div><div>    }<\/div><div>}<\/div><br><div>类 狗 : 动物 {<\/div><div>    属性 文本 品种<\/div><br><div>    方法 发声() {<\/div><div>        输出(\"汪汪\")<\/div><div>    }<\/div><br><div>    方法 显示资料() {<\/div><div>        显示名称()<\/div><div>        输出(\"品种：\" + 品种)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>狗 小狗<\/div><div>小狗.名称 = \"旺财\"<\/div><div>小狗.品种 = \"中华田园犬\"<\/div><div>小狗.显示名称()<\/div><div>小狗.显示资料()<\/div><div>小狗.发声()<\/div><div>```<\/div><br><div>子类可访问继承得到的可见属性和方法。子类声明同名方法时，调用子类对象会使用子类方法。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 8. 多层继承<\/span><\/div><br><div>```ypp<\/div><div>类 设备 {<\/div><div>    属性 文本 名称<\/div><br><div>    方法 启动() {<\/div><div>        输出(名称 + \" 启动\")<\/div><div>    }<\/div><div>}<\/div><br><div>类 网络设备 : 设备 {<\/div><div>    属性 文本 IP<\/div><br><div>    方法 显示网络() {<\/div><div>        输出(IP)<\/div><div>    }<\/div><div>}<\/div><br><div>类 摄像机 : 网络设备 {<\/div><div>    属性 整数 通道 = 1<\/div><br><div>    方法 拍照() {<\/div><div>        输出(名称 + \" 通道 \" + 到文本(通道) + \" 拍照\")<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>摄像机 相机<\/div><div>相机.名称 = \"入口相机\"<\/div><div>相机.IP = \"192.168.1.20\"<\/div><div>相机.通道 = 2<\/div><div>相机.启动()<\/div><div>相机.显示网络()<\/div><div>相机.拍照()<\/div><div>```<\/div><br><div>继承层级不要过深；业务组合能解决的问题可优先使用属性持有其它对象。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 9. 组合优于继承的场景<\/span><\/div><br><div>```ypp<\/div><div>类 日志服务 {<\/div><div>    方法 写(文本 内容) {<\/div><div>        输出(\"[日志] \" + 内容)<\/div><div>    }<\/div><div>}<\/div><br><div>类 用户服务 {<\/div><div>    属性 日志服务 日志<\/div><br><div>    方法 登录(文本 用户名) 逻辑 {<\/div><div>        日志.写(\"登录：\" + 用户名)<\/div><div>        返回(用户名 != \"\")<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>用户服务 服务<\/div><div>如果 (服务.登录(\"admin\")) {<\/div><div>    输出(\"登录成功\")<\/div><div>}<\/div><div>```<\/div><br><div>“用户服务使用日志服务”是组合关系，不需要让用户服务继承日志服务。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 10. 类数组和对象数组<\/span><\/div><br><div>```yc<\/div><div>用户 用户列表[] = []<\/div><br><div>用户 a<\/div><div>a.编号 = 1<\/div><div>a.姓名 = \"张三\"<\/div><div>数组添加(用户列表, a)<\/div><br><div>用户 b<\/div><div>b.编号 = 2<\/div><div>b.姓名 = \"李四\"<\/div><div>数组添加(用户列表, b)<\/div><br><div>整数 i = 0<\/div><div>循环 (数组长度(用户列表), i) {<\/div><div>    输出(用户列表[i].姓名)<\/div><div>}<\/div><div>```<\/div><br><div>类对象作为另一类属性：<\/div><br><div>```ypp<\/div><div>类 订单服务 {<\/div><div>    属性 用户 当前用户<\/div><div>    属性 订单 当前订单<\/div><br><div>    方法 显示() {<\/div><div>        输出(当前用户.姓名)<\/div><div>        输出(当前订单.编号)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 11. 需要共享状态时使用全局类对象<\/span><\/div><br><div>当前自写类语法不要套用 C++ 的 <span style=\"color: #79c0ff;\">`static`<\/span> 或 <span style=\"color: #79c0ff;\">`类名::成员`<\/span>。需要全工程共享一个服务状态时，在 <span style=\"color: #79c0ff;\">`source\/globals.yc`<\/span> 声明一个类对象：<\/div><br><div>```yc<\/div><div>编号生成器 全局编号器<\/div><div>```<\/div><br><div>类本身使用普通属性和方法：<\/div><br><div>```ypp<\/div><div>类 编号生成器 {<\/div><div>    属性 整数 下一个编号 = 1<\/div><br><div>    方法 取新编号() 整数 {<\/div><div>        整数 当前 = 下一个编号<\/div><div>        下一个编号 = 下一个编号 + 1<\/div><div>        返回(当前)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>其它文件调用同一个全局对象：<\/div><br><div>```yc<\/div><div>整数 新编号 = 全局编号器.取新编号()<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 12. 类封装支持库对象<\/span><\/div><br><div>```ypp<\/div><div>类 配置服务 {<\/div><div>    属性 JSON类 文档<\/div><div>    属性 文本 文件路径<\/div><br><div>    方法 构造() {<\/div><div>        文件路径 = 系统_取运行目录() + \"\\\\config.json\"<\/div><div>    }<\/div><br><div>    方法 设置服务器(文本 地址, 整数 端口) {<\/div><div>        文档.置文本(\"地址\", 地址)<\/div><div>        文档.置整数(\"端口\", 端口)<\/div><div>    }<\/div><br><div>    方法 保存() {<\/div><div>        写文件(文件路径, 文档.到文本())<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>配置服务 配置<\/div><div>配置.设置服务器(\"127.0.0.1\", 8080)<\/div><div>配置.保存()<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 13. 类与窗口事件组合<\/span><\/div><br><div>```ypp<\/div><div>类 登录服务 {<\/div><div>    属性 文本 最后错误<\/div><br><div>    方法 验证(文本 用户名, 文本 密码) 逻辑 {<\/div><div>        如果 (用户名 == \"\") {<\/div><div>            最后错误 = \"用户名不能为空\"<\/div><div>            返回(假)<\/div><div>        }<\/div><div>        如果 (密码 == \"\") {<\/div><div>            最后错误 = \"密码不能为空\"<\/div><div>            返回(假)<\/div><div>        }<\/div><div>        最后错误 = \"\"<\/div><div>        返回(真)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>登录服务 登录逻辑<\/div><br><div>函数 登录按钮.单击(整数 X, 整数 Y) {<\/div><div>    如果 (登录逻辑.验证(用户名框.标题, 密码框.标题)) {<\/div><div>        状态标签.标题 = \"登录成功\"<\/div><div>    } 否则 {<\/div><div>        状态标签.标题 = 登录逻辑.最后错误<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 14. 错误写法与正确写法<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：把类写在 <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`.yt`<\/span><\/div><br><div>```yt<\/div><div>\/\/ 错误<\/div><div>类 用户服务 {<\/div><div>    方法 登录() { }<\/div><div>}<\/div><div>```<\/div><br><div>正确：类写在 <span style=\"color: #79c0ff;\">`.ypp`<\/span>。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：套用其它语言的 <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`new`<\/span><span style=\"color: #79c0ff;font-weight: bold;\"> 或构造赋值<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>用户 a = new 用户()<\/div><br><div>\/\/ 正确<\/div><div>用户 a<\/div><div>```<\/div><br><div>带参构造按 <span style=\"color: #79c0ff;\">`用户 a(参数)`<\/span> 形式，并以 IDE 补全为准。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：套用 C++ 静态成员语法<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>整数 编号 = 编号生成器::取新编号()<\/div><div>```<\/div><br><div>正确：在 <span style=\"color: #79c0ff;\">`globals.yc`<\/span> 声明共享对象，调用 <span style=\"color: #79c0ff;\">`全局编号器.取新编号()`<\/span>。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：调用方法漏对象<\/span><\/div><br><div>```yc<\/div><div>用户服务 服务<\/div><br><div>\/\/ 错误<\/div><div>登录(\"admin\")<\/div><br><div>\/\/ 正确<\/div><div>服务.登录(\"admin\")<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：把属性当方法<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>输出(用户.姓名())<\/div><br><div>\/\/ 正确<\/div><div>输出(用户.姓名)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：把方法当属性<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>整数 值 = 计数器.取值<\/div><br><div>\/\/ 正确<\/div><div>整数 值 = 计数器.取值()<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：方法返回类型与返回值不一致<\/span><\/div><br><div>```ypp<\/div><div>\/\/ 错误<\/div><div>方法 取数量() 整数 {<\/div><div>    返回(\"10\")<\/div><div>}<\/div><br><div>\/\/ 正确<\/div><div>方法 取数量() 整数 {<\/div><div>    返回(10)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：声明继承但父类不存在<\/span><\/div><br><div>```ypp<\/div><div>\/\/ 错误<\/div><div>类 狗 : 未定义动物 { }<\/div><div>```<\/div><br><div>正确：先定义父类并确保父类 <span style=\"color: #79c0ff;\">`.ypp`<\/span> 已加入项目。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：循环继承<\/span><\/div><br><div>```ypp<\/div><div>\/\/ 错误<\/div><div>类 A : B { }<\/div><div>类 B : A { }<\/div><div>```<\/div><br><div>正确：继承关系必须单向且无环。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：用继承表达“拥有”<\/span><\/div><br><div>```ypp<\/div><div>\/\/ 不合理：汽车不是发动机<\/div><div>类 汽车 : 发动机 { }<\/div><div>```<\/div><br><div>正确：使用组合：<\/div><br><div>```ypp<\/div><div>类 汽车 {<\/div><div>    属性 发动机 动力<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：文档参数名和方法形参不一致<\/span><\/div><br><div>```ypp<\/div><div>\/\/\/ 参数 @用户名 用户名<\/div><div>方法 登录(文本 账号) { }<\/div><div>```<\/div><br><div>正确：注释写 <span style=\"color: #79c0ff;\">`@账号`<\/span>，与形参一致。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：在函数外直接执行方法<\/span><\/div><br><div>```yc<\/div><div>用户服务 服务<\/div><div>\/\/ 错误：顶层不能写运行语句<\/div><div>服务.登录(\"admin\")<\/div><div>```<\/div><br><div>正确：放入事件或函数：<\/div><br><div>```yc<\/div><div>函数 主窗口.创建完毕() {<\/div><div>    服务.登录(\"admin\")<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 15. 排查顺序<\/span><\/div><br><div><span style=\"color: #ffa657;\">1.<\/span> 类文件扩展名必须是 <span style=\"color: #79c0ff;\">`.ypp`<\/span>，并已出现在项目树。<\/div><div><span style=\"color: #ffa657;\">2.<\/span> 检查类名、对象名、属性名和方法名是否混淆。<\/div><div><span style=\"color: #ffa657;\">3.<\/span> 属性不用括号，方法必须写括号。<\/div><div><span style=\"color: #ffa657;\">4.<\/span> 方法参数、返回类型和 <span style=\"color: #79c0ff;\">`返回(...)`<\/span> 的值要一致。<\/div><div><span style=\"color: #ffa657;\">5.<\/span> 父类必须先可解析，继承链不能循环。<\/div><div><span style=\"color: #ffa657;\">6.<\/span> 调用说明不显示时检查 <span style=\"color: #79c0ff;\">`\/\/\/`<\/span> 注释是否紧邻方法、参数名是否一致。<\/div><br><\/div>","status":"fixed","is_recycle":0,"is_top":1,"is_bold":1,"is_italic":0,"is_underline":1,"title_color":"#a30a0a","font_family":"","font_size":"16px","category":"经验分享","priority":"normal","browser":"","os":"","contact":"","attachment":"","ip":"182.87.162.172","create_time":"2026-08-11 01:50:04","update_time":"2026-08-11 01:50:04","is_featured":0,"view_count":0,"username":"管理员","nickname":"管理员","avatar":null,"level":null,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2088,"user_id":null,"title":"Y++ 自定义数据类型语法说明","content":"<div style=\"color: rgb(187, 190, 191); background-color: rgb(18, 19, 20); font-family: Consolas, \"Courier New\", monospace; line-height: 19px; white-space: pre;\"><div><span style=\"color: #79c0ff;font-weight: bold;\"># Y++ 自定义数据类型语法说明<\/span><\/div><br><div>自定义数据类型使用 <span style=\"color: #79c0ff;\">`.yt`<\/span> 文件，适合保存一组字段、嵌套数据和与 DLL 对应的结构体布局。<span style=\"color: #79c0ff;\">`.yt`<\/span> 只定义数据，不写事件、执行语句、方法或继承。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 1. 文件和基本定义<\/span><\/div><br><div>文件放在项目 <span style=\"color: #79c0ff;\">`source\/`<\/span> 或其子目录：<\/div><br><div>```text<\/div><div>source\/types\/学生.yt<\/div><div>```<\/div><br><div>简写语法：<\/div><br><div>```yt<\/div><div>学生 {<\/div><div>    整数 学号 = 0<\/div><div>    文本 姓名<\/div><div>    逻辑 启用 = 真<\/div><div>}<\/div><div>```<\/div><br><div>结构体写法：<\/div><br><div>```yt<\/div><div>结构体 矩形 {<\/div><div>    整数 左 = 0<\/div><div>    整数 上 = 0<\/div><div>    整数 右 = 0<\/div><div>    整数 下 = 0<\/div><div>}<\/div><div>```<\/div><br><div>两种写法都表示纯字段类型。加入项目后在 <span style=\"color: #79c0ff;\">`.yc`<\/span>、<span style=\"color: #79c0ff;\">`.ypp`<\/span> 和其它 <span style=\"color: #79c0ff;\">`.yt`<\/span> 中直接使用，无需 <span style=\"color: #79c0ff;\">`#include`<\/span>。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 2. 字段类型和默认值<\/span><\/div><br><div>```yt<\/div><div>任务信息 {<\/div><div>    整数 编号 = 0<\/div><div>    长整数 文件大小 = 0<\/div><div>    小数 进度 = 0<\/div><div>    文本 标题 = \"\"<\/div><div>    逻辑 已完成 = 假<\/div><div>    字节集 原始数据<\/div><div>}<\/div><div>```<\/div><br><div>基础字段可给默认值。字段名在同一类型中不能重复。<\/div><br><div>使用：<\/div><br><div>```yc<\/div><div>任务信息 任务<\/div><div>任务.编号 = 1001<\/div><div>任务.标题 = \"导入数据\"<\/div><div>任务.进度 = 0.5<\/div><div>输出(任务.标题)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 3. 嵌套自定义类型<\/span><\/div><br><div>```yt<\/div><div>坐标 {<\/div><div>    小数 X = 0<\/div><div>    小数 Y = 0<\/div><div>}<\/div><br><div>地址 {<\/div><div>    文本 省<\/div><div>    文本 市<\/div><div>    文本 街道<\/div><div>    坐标 门牌坐标<\/div><div>}<\/div><br><div>人员 {<\/div><div>    文本 姓名<\/div><div>    地址 家庭住址<\/div><div>}<\/div><div>```<\/div><br><div>逐层赋值和读取：<\/div><br><div>```yc<\/div><div>人员 张三<\/div><div>张三.姓名 = \"张三\"<\/div><div>张三.家庭住址.省 = \"广东\"<\/div><div>张三.家庭住址.市 = \"深圳\"<\/div><div>张三.家庭住址.门牌坐标.X = 113.9<\/div><div>张三.家庭住址.门牌坐标.Y = 22.5<\/div><br><div>输出(张三.家庭住址.市)<\/div><div>输出(张三.家庭住址.门牌坐标.X)<\/div><div>```<\/div><br><div>也可以先构造内层对象再整体赋值：<\/div><br><div>```yc<\/div><div>地址 新地址<\/div><div>新地址.省 = \"浙江\"<\/div><div>新地址.市 = \"杭州\"<\/div><br><div>人员 李四<\/div><div>李四.姓名 = \"李四\"<\/div><div>李四.家庭住址 = 新地址<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 4. 动态数组和限长数组<\/span><\/div><br><div>类型数组：<\/div><br><div>```yc<\/div><div>人员 成员[] = []<\/div><br><div>人员 张三<\/div><div>张三.姓名 = \"张三\"<\/div><div>数组添加(成员, 张三)<\/div><br><div>人员 李四<\/div><div>李四.姓名 = \"李四\"<\/div><div>数组添加(成员, 李四)<\/div><br><div>输出(成员[0].姓名)<\/div><div>输出(成员[1].姓名)<\/div><div>```<\/div><br><div>限制最大数量：<\/div><br><div>```yc<\/div><div>人员 成员[40] = []<\/div><div>```<\/div><br><div>预分配元素：<\/div><br><div>```yc<\/div><div>人员 成员[40]<\/div><div>成员[0].姓名 = \"张三\"<\/div><div>```<\/div><br><div>下标从 0 开始。访问前应确认数组长度：<\/div><br><div>```yc<\/div><div>如果 (数组长度(成员) > 0) {<\/div><div>    输出(成员[0].姓名)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 5. 类型内部的数组字段<\/span><\/div><br><div>```yt<\/div><div>学生 {<\/div><div>    文本 姓名<\/div><div>    整数 成绩[] = []<\/div><div>}<\/div><br><div>班级 {<\/div><div>    文本 名称<\/div><div>    学生 成员[] = []<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>学生 张三<\/div><div>张三.姓名 = \"张三\"<\/div><div>数组添加(张三.成绩, 96)<\/div><div>数组添加(张三.成绩, 88)<\/div><br><div>班级 一班<\/div><div>一班.名称 = \"软件一班\"<\/div><div>数组添加(一班.成员, 张三)<\/div><br><div>输出(一班.成员[0].姓名)<\/div><div>输出(一班.成员[0].成绩[1])<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 6. 多层数组嵌套完整示例<\/span><\/div><br><div>```yt<\/div><div>坐标 {<\/div><div>    小数 X = 0<\/div><div>    小数 Y = 0<\/div><div>}<\/div><br><div>家庭地址 {<\/div><div>    文本 市<\/div><div>    坐标 门牌坐标<\/div><div>}<\/div><br><div>学生 {<\/div><div>    文本 姓名<\/div><div>    家庭地址 家庭住址<\/div><div>}<\/div><br><div>班级 {<\/div><div>    学生 成员[] = []<\/div><div>}<\/div><br><div>学校 {<\/div><div>    文本 校名<\/div><div>    班级 班级列表[] = []<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>函数 创建学校() 学校 {<\/div><div>    学生 新学生<\/div><div>    新学生.姓名 = \"张三\"<\/div><div>    新学生.家庭住址.市 = \"深圳\"<\/div><div>    新学生.家庭住址.门牌坐标.X = 100.5<\/div><br><div>    班级 新班级<\/div><div>    数组添加(新班级.成员, 新学生)<\/div><br><div>    学校 我校<\/div><div>    我校.校名 = \"示例学校\"<\/div><div>    数组添加(我校.班级列表, 新班级)<\/div><div>    返回(我校)<\/div><div>}<\/div><br><div>函数 主窗口.创建完毕() {<\/div><div>    学校 我校 = 创建学校()<\/div><div>    输出(我校.班级列表[0].成员[0].姓名)<\/div><div>    输出(我校.班级列表[0].成员[0].家庭住址.市)<\/div><div>    输出(我校.班级列表[0].成员[0].家庭住址.门牌坐标.X)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 7. 按添加时的变量名访问<\/span><\/div><br><div>通过 <span style=\"color: #79c0ff;\">`数组添加(数组, 变量名)`<\/span> 加入的对象可按下标访问；支持命名访问的数组也可写：<\/div><br><div>```yc<\/div><div>学生 学生列表[] = []<\/div><div>学生 张三<\/div><div>张三.姓名 = \"张三\"<\/div><div>数组添加(学生列表, 张三)<\/div><br><div>输出(学生列表[0].姓名)<\/div><div>输出(学生列表.张三.姓名)<\/div><div>```<\/div><br><div>动态下标适合循环，命名访问适合固定配置成员。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 8. 作为函数参数<\/span><\/div><br><div>值参数：<\/div><br><div>```yc<\/div><div>函数 打印学生(学生 s) {<\/div><div>    输出(s.姓名)<\/div><div>}<\/div><br><div>学生 张三<\/div><div>张三.姓名 = \"张三\"<\/div><div>打印学生(张三)<\/div><div>```<\/div><br><div>多个自定义类型参数：<\/div><br><div>```yc<\/div><div>函数 是否同城(学生 a, 学生 b) 逻辑 {<\/div><div>    返回(a.家庭住址.市 == b.家庭住址.市)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 9. 作为函数返回值<\/span><\/div><br><div>```yc<\/div><div>函数 新建学生(文本 姓名, 文本 城市) 学生 {<\/div><div>    学生 s<\/div><div>    s.姓名 = 姓名<\/div><div>    s.家庭住址.市 = 城市<\/div><div>    返回(s)<\/div><div>}<\/div><br><div>学生 新同学 = 新建学生(\"王五\", \"广州\")<\/div><div>输出(新同学.家庭住址.市)<\/div><div>```<\/div><br><div>修改后返回并回写：<\/div><br><div>```yc<\/div><div>函数 修改城市(学生 s, 文本 城市) 学生 {<\/div><div>    s.家庭住址.市 = 城市<\/div><div>    返回(s)<\/div><div>}<\/div><br><div>新同学 = 修改城市(新同学, \"佛山\")<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 10. 全局自定义类型变量<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`source\/globals.yc`<\/span>：<\/div><br><div>```yc<\/div><div>学校 当前学校<\/div><div>学生 在线学生[] = []<\/div><div>```<\/div><br><div>其它文件直接使用：<\/div><br><div>```yc<\/div><div>函数 主窗口.创建完毕() {<\/div><div>    当前学校.校名 = \"第一中学\"<\/div><div>    输出(当前学校.校名)<\/div><div>}<\/div><div>```<\/div><br><div>不要在多个文件重复声明同名全局对象。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 11. 与自写类组合<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`.yt`<\/span> 负责数据，<span style=\"color: #79c0ff;\">`.ypp`<\/span> 负责行为：<\/div><br><div>```ypp<\/div><div>类 学生服务 {<\/div><div>    方法 修改姓名(学生 s, 文本 新姓名) 学生 {<\/div><div>        s.姓名 = 新姓名<\/div><div>        返回(s)<\/div><div>    }<\/div><br><div>    方法 显示(学生 s) {<\/div><div>        输出(s.姓名 + \" \/ \" + s.家庭住址.市)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>学生服务 服务<\/div><div>学生 s = 新建学生(\"赵六\", \"东莞\")<\/div><div>s = 服务.修改姓名(s, \"赵小六\")<\/div><div>服务.显示(s)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 12. 与 <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`.ypi`<\/span><span style=\"color: #79c0ff;font-weight: bold;\"> API 组合<\/span><\/div><br><div>结构体字段顺序、类型宽度必须与第三方 DLL 头文件一致：<\/div><br><div>```yt<\/div><div>结构体 原生矩形 {<\/div><div>    整数 left<\/div><div>    整数 top<\/div><div>    整数 right<\/div><div>    整数 bottom<\/div><div>}<\/div><div>```<\/div><br><div>```ypi<\/div><div>DLL(\"user32.dll\", \"stdcall\")<\/div><div>逻辑 GetWindowRect(长整数 窗口句柄, 原生矩形 结果) 读取原生窗口矩形<\/div><div>```<\/div><br><div>```yc<\/div><div>原生矩形 r<\/div><div>如果 (读取原生窗口矩形(窗口句柄, r)) {<\/div><div>    输出(\"宽=\" + 到文本(r.right - r.left))<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 13. 错误写法与正确写法<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：在 <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`.yc`<\/span><span style=\"color: #79c0ff;font-weight: bold;\"> 中临时定义类型<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>学生 {<\/div><div>    文本 姓名<\/div><div>}<\/div><div>```<\/div><br><div>正确做法：放到 <span style=\"color: #79c0ff;\">`.yt`<\/span> 文件。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：在 <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`.yt`<\/span><span style=\"color: #79c0ff;font-weight: bold;\"> 中写方法<\/span><\/div><br><div>```yt<\/div><div>\/\/ 错误<\/div><div>学生 {<\/div><div>    文本 姓名<\/div><div>    方法 打印() { }<\/div><div>}<\/div><div>```<\/div><br><div>正确做法：数据放 <span style=\"color: #79c0ff;\">`.yt`<\/span>，方法放 <span style=\"color: #79c0ff;\">`.ypp`<\/span> 类。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：类型和变量顺序写反<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>张三 学生<\/div><br><div>\/\/ 正确<\/div><div>学生 张三<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：漏写数组下标<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误：成员是数组<\/div><div>我校.班级列表.成员.姓名<\/div><br><div>\/\/ 正确<\/div><div>我校.班级列表[0].成员[0].姓名<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：数组越界<\/span><\/div><br><div>```yc<\/div><div>学生 成员[] = []<\/div><div>\/\/ 错误：数组仍为空<\/div><div>输出(成员[0].姓名)<\/div><div>```<\/div><br><div>正确做法：先 <span style=\"color: #79c0ff;\">`数组添加`<\/span>，或检查 <span style=\"color: #79c0ff;\">`数组长度`<\/span>。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：字段不存在<\/span><\/div><br><div>```yc<\/div><div>\/\/ 学生类型未定义“年龄”<\/div><div>张三.年龄 = 20<\/div><div>```<\/div><br><div>正确做法：在 <span style=\"color: #79c0ff;\">`.yt`<\/span> 增加字段并保存，或使用真实字段名。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：把自定义类型当类方法调用<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误：纯 .yt 类型没有方法<\/div><div>张三.保存()<\/div><div>```<\/div><br><div>正确做法：定义 <span style=\"color: #79c0ff;\">`学生服务`<\/span> 类并写 <span style=\"color: #79c0ff;\">`服务.保存(张三)`<\/span>。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：原生结构体字段宽度错误<\/span><\/div><br><div>```yt<\/div><div>\/\/ x64 指针字段错误使用整数，地址可能被截断<\/div><div>结构体 原生数据 {<\/div><div>    整数 地址<\/div><div>}<\/div><div>```<\/div><br><div>正确做法：x64 地址、指针、句柄使用 <span style=\"color: #79c0ff;\">`长整数`<\/span>，并逐字段核对 DLL 文档。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：修改值参数后认为原对象一定变化<\/span><\/div><br><div>```yc<\/div><div>函数 改名(学生 s) {<\/div><div>    s.姓名 = \"新名字\"<\/div><div>}<\/div><div>```<\/div><br><div>稳妥写法是返回并回写：<\/div><br><div>```yc<\/div><div>函数 改名(学生 s) 学生 {<\/div><div>    s.姓名 = \"新名字\"<\/div><div>    返回(s)<\/div><div>}<\/div><br><div>张三 = 改名(张三)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 14. 排查顺序<\/span><\/div><br><div><span style=\"color: #ffa657;\">1.<\/span> 确认 <span style=\"color: #79c0ff;\">`.yt`<\/span> 已出现在项目树并已保存。<\/div><div><span style=\"color: #ffa657;\">2.<\/span> 检查类型名、变量名、字段名有没有写反或拼错。<\/div><div><span style=\"color: #ffa657;\">3.<\/span> 点号链每遇到数组都先写 <span style=\"color: #79c0ff;\">`[下标]`<\/span>。<\/div><div><span style=\"color: #ffa657;\">4.<\/span> 如果点号出现不相关成员，先检查链条前一段的类型是否可解析。<\/div><div><span style=\"color: #ffa657;\">5.<\/span> 原生 API 结构体逐字段核对顺序、宽度和 x86\/x64 差异。<\/div><br><br><\/div>","status":"fixed","is_recycle":0,"is_top":1,"is_bold":1,"is_italic":0,"is_underline":1,"title_color":"#b80505","font_family":"","font_size":"16px","category":"经验分享","priority":"normal","browser":"","os":"","contact":"","attachment":"","ip":"182.87.162.172","create_time":"2026-08-11 01:49:19","update_time":"2026-08-11 01:49:19","is_featured":0,"view_count":0,"username":"管理员","nickname":"管理员","avatar":null,"level":null,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2087,"user_id":null,"title":"Y++ 窗口组件语法说明","content":"<div style=\"color: rgb(187, 190, 191); background-color: rgb(18, 19, 20); font-family: Consolas, \"Courier New\", monospace; line-height: 19px; white-space: pre;\"><div><span style=\"color: #79c0ff;font-weight: bold;\"># Y++ 窗口组件语法说明<\/span><\/div><br><div>本文说明 D2D 高级自绘项目中窗口、组件、属性、方法和事件的代码写法。组件必须先在设计器中存在，并以属性面板中的“名称”作为代码标识符。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 1. 窗口和组件名称<\/span><\/div><br><div>设计器中有以下名称：<\/div><br><div>```text<\/div><div>主窗口<\/div><div>用户名输入框<\/div><div>登录按钮<\/div><div>状态标签<\/div><div>用户表格<\/div><div>刷新定时器<\/div><div>```<\/div><br><div>代码通过名称访问：<\/div><br><div>```yc<\/div><div>用户名输入框.标题 = \"\"<\/div><div>状态标签.标题 = \"等待登录\"<\/div><div>登录按钮.可用 = 真<\/div><div>```<\/div><br><div>名称修改后，事件函数和所有点号调用必须同步修改。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 2. 属性读取与赋值<\/span><\/div><br><div>通用格式：<\/div><br><div>```yc<\/div><div>组件.属性 = 值<\/div><div>变量 = 组件.属性<\/div><div>```<\/div><br><div>示例一：初始化窗口内容：<\/div><br><div>```yc<\/div><div>函数 主窗口.创建完毕() {<\/div><div>    主窗口.标题 = \"用户管理\"<\/div><div>    用户名输入框.标题 = \"\"<\/div><div>    状态标签.标题 = \"请输入用户名\"<\/div><div>    登录按钮.可用 = 真<\/div><div>    登录按钮.可视 = 真<\/div><div>}<\/div><div>```<\/div><br><div>示例二：读取输入并更新标签：<\/div><br><div>```yc<\/div><div>函数 登录按钮.单击(整数 X, 整数 Y) {<\/div><div>    文本 用户名 = 用户名输入框.标题<\/div><div>    如果 (用户名 == \"\") {<\/div><div>        状态标签.标题 = \"用户名不能为空\"<\/div><div>        返回()<\/div><div>    }<\/div><div>    状态标签.标题 = \"欢迎：\" + 用户名<\/div><div>}<\/div><div>```<\/div><br><div>示例三：位置和尺寸：<\/div><br><div>```yc<\/div><div>函数 放大按钮.单击(整数 X, 整数 Y) {<\/div><div>    状态标签.宽度 = 400<\/div><div>    状态标签.高度 = 40<\/div><div>    状态标签.X坐标 = 20<\/div><div>    状态标签.Y坐标 = 60<\/div><div>}<\/div><div>```<\/div><br><div>属性名称和类型因组件而异。标签、编辑框的文本属性可能在 IDE 中显示为“标题”或对应组件的专用名称，应使用补全实际给出的成员。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 3. 组件方法调用<\/span><\/div><br><div>格式：<\/div><br><div>```yc<\/div><div>组件.方法(参数)<\/div><div>```<\/div><br><div>示例一：表格写入和读取：<\/div><br><div>```yc<\/div><div>函数 主窗口.创建完毕() {<\/div><div>    用户表格.清空()<\/div><div>    用户表格.添加列(\"编号\", 80)<\/div><div>    用户表格.添加列(\"姓名\", 120)<\/div><div>    用户表格.添加列(\"状态\", 100)<\/div><div>    用户表格.添加行(\"1001\", \"张三\", \"正常\")<\/div><div>    用户表格.添加行(\"1002\", \"李四\", \"停用\")<\/div><div>}<\/div><br><div>函数 用户表格.双击(整数 行, 整数 列) {<\/div><div>    文本 内容 = 用户表格.取项目文本(行, 列)<\/div><div>    状态标签.标题 = \"双击内容：\" + 内容<\/div><div>}<\/div><div>```<\/div><br><div>表格具体方法名和参数以当前 IDE 表格组件补全为准；列、行下标通常从 0 开始。<\/div><br><div>示例二：列表框：<\/div><br><div>```yc<\/div><div>函数 加载分类() {<\/div><div>    分类列表.清空()<\/div><div>    分类列表.添加项目(\"全部\")<\/div><div>    分类列表.添加项目(\"启用\")<\/div><div>    分类列表.添加项目(\"停用\")<\/div><div>    分类列表.选中索引 = 0<\/div><div>}<\/div><div>```<\/div><br><div>示例三：Web 浏览器：<\/div><br><div>```yc<\/div><div>函数 打开网页按钮.单击(整数 X, 整数 Y) {<\/div><div>    文本 地址 = 地址输入框.标题<\/div><div>    如果 (地址 == \"\") {<\/div><div>        地址 = \"https:\/\/www.example.com\"<\/div><div>    }<\/div><div>    网页浏览器.打开网页(地址)<\/div><div>}<\/div><br><div>函数 后退按钮.单击(整数 X, 整数 Y) {<\/div><div>    网页浏览器.后退()<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 4. 事件函数<\/span><\/div><br><div>格式：<\/div><br><div>```yc<\/div><div>函数 组件名.事件名(事件参数) {<\/div><div>    \/\/ 事件处理<\/div><div>}<\/div><div>```<\/div><br><div>常见窗口事件：<\/div><br><div>```yc<\/div><div>函数 主窗口.创建完毕() {<\/div><div>    输出(\"窗口已经创建\")<\/div><div>}<\/div><br><div>函数 主窗口.窗口关闭() {<\/div><div>    输出(\"窗口已经关闭\")<\/div><div>}<\/div><br><div>函数 主窗口.关闭前() 逻辑 {<\/div><div>    \/\/ 返回真允许关闭，返回假取消关闭<\/div><div>    返回(真)<\/div><div>}<\/div><div>```<\/div><br><div>按钮单击：<\/div><br><div>```yc<\/div><div>函数 保存按钮.单击(整数 X, 整数 Y) {<\/div><div>    输出(\"点击坐标：\" + 到文本(X) + \",\" + 到文本(Y))<\/div><div>}<\/div><div>```<\/div><br><div>有些组件的单击事件是零参数，有些提供坐标、行列或按键参数。窗口也可能同时提供“关闭前”“窗口关闭”“关闭询问”等事件，它们的返回值和触发时机不同。不要把一个组件的事件签名复制给另一个组件，应从设计器事件面板生成，或按 IDE 补全\/F1 提示书写。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 5. 多种组件事件示例<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 编辑框内容变化<\/span><\/div><br><div>```yc<\/div><div>函数 搜索输入框.内容改变() {<\/div><div>    文本 关键字 = 搜索输入框.标题<\/div><div>    状态标签.标题 = \"正在搜索：\" + 关键字<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 定时器周期事件<\/span><\/div><br><div>```yc<\/div><div>整数 刷新次数 = 0<\/div><br><div>函数 刷新定时器.周期事件() {<\/div><div>    刷新次数 = 刷新次数 + 1<\/div><div>    状态标签.标题 = \"刷新次数：\" + 到文本(刷新次数)<\/div><div>}<\/div><br><div>函数 主窗口.创建完毕() {<\/div><div>    刷新定时器.周期 = 1000<\/div><div>    刷新定时器.启动()<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 表格行列事件<\/span><\/div><br><div>```yc<\/div><div>函数 用户表格.单击(整数 行, 整数 列) {<\/div><div>    输出(\"行=\" + 到文本(行) + \"，列=\" + 到文本(列))<\/div><div>}<\/div><br><div>函数 用户表格.右键单击(整数 行, 整数 列, 整数 X, 整数 Y) {<\/div><div>    输出(\"右键行=\" + 到文本(行))<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 鼠标事件<\/span><\/div><br><div>```yc<\/div><div>函数 绘图区域.鼠标按下(整数 X, 整数 Y, 逻辑 按下) {<\/div><div>    如果 (按下) {<\/div><div>        状态标签.标题 = \"按下：\" + 到文本(X) + \",\" + 到文本(Y)<\/div><div>    }<\/div><div>}<\/div><br><div>函数 绘图区域.鼠标移动(整数 X, 整数 Y) {<\/div><div>    坐标标签.标题 = 到文本(X) + \",\" + 到文本(Y)<\/div><div>}<\/div><div>```<\/div><br><div>事件参数必须以当前组件帮助显示的签名为准。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 6. 一个完整表单示例<\/span><\/div><br><div>设计器组件：<span style=\"color: #79c0ff;\">`姓名输入框`<\/span>、<span style=\"color: #79c0ff;\">`年龄输入框`<\/span>、<span style=\"color: #79c0ff;\">`保存按钮`<\/span>、<span style=\"color: #79c0ff;\">`清空按钮`<\/span>、<span style=\"color: #79c0ff;\">`结果标签`<\/span>。<\/div><br><div>```yc<\/div><div>函数 清空表单() {<\/div><div>    姓名输入框.标题 = \"\"<\/div><div>    年龄输入框.标题 = \"\"<\/div><div>    结果标签.标题 = \"等待输入\"<\/div><div>    姓名输入框.设置焦点()<\/div><div>}<\/div><br><div>函数 主窗口.创建完毕() {<\/div><div>    主窗口.标题 = \"人员登记\"<\/div><div>    清空表单()<\/div><div>}<\/div><br><div>函数 保存按钮.单击(整数 X, 整数 Y) {<\/div><div>    文本 姓名 = 姓名输入框.标题<\/div><div>    整数 年龄 = 到整数(年龄输入框.标题)<\/div><br><div>    如果 (姓名 == \"\") {<\/div><div>        结果标签.标题 = \"姓名不能为空\"<\/div><div>        返回()<\/div><div>    }<\/div><div>    如果 (年龄 <= 0) {<\/div><div>        结果标签.标题 = \"年龄必须大于 0\"<\/div><div>        返回()<\/div><div>    }<\/div><br><div>    结果标签.标题 = \"已保存：\" + 姓名 + \"，\" + 到文本(年龄) + \" 岁\"<\/div><div>}<\/div><br><div>函数 清空按钮.单击(整数 X, 整数 Y) {<\/div><div>    清空表单()<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 7. 多窗口调用<\/span><\/div><br><div>窗口必须已经加入项目。打开或加载窗口时使用 IDE 支持的窗口命令，不要把窗口文件路径当作组件对象：<\/div><br><div>```yc<\/div><div>函数 打开设置按钮.单击(整数 X, 整数 Y) {<\/div><div>    设置窗口.显示()<\/div><div>    设置窗口.激活()<\/div><div>}<\/div><div>```<\/div><br><div>如果当前补全提供的是窗口对象形式，应按补全显示的方法调用。窗口名称、文件名和代码中的名称要一致。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 8. 组件与支持库对象的区别<\/span><\/div><br><div>组件来自设计器，不需要在 <span style=\"color: #79c0ff;\">`.yc`<\/span> 再声明：<\/div><br><div>```yc<\/div><div>\/\/ 设计器已有 状态标签，直接使用<\/div><div>状态标签.标题 = \"完成\"<\/div><div>```<\/div><br><div>支持库类对象需要声明：<\/div><br><div>```yc<\/div><div>JSON类 数据<\/div><div>数据.置文本(\"状态\", \"完成\")<\/div><div>```<\/div><br><div>不要在源码里重新声明与组件同名的变量或对象。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 9. 后台任务更新界面<\/span><\/div><br><div>耗时任务可在线程执行，但不要长期阻塞创建完毕、单击等界面事件，也不要从后台线程直接连续修改组件。推荐后台取得数据，再通过界面调度或定时器在界面线程更新：<\/div><br><div>```yc<\/div><div>文本 后台结果 = \"\"<\/div><div>逻辑 已完成 = 假<\/div><br><div>函数 读取后台数据() {<\/div><div>    后台结果 = 读文件(\"D:\/data\/report.txt\")<\/div><div>    已完成 = 真<\/div><div>}<\/div><br><div>函数 检查定时器.周期事件() {<\/div><div>    如果 (已完成) {<\/div><div>        结果多行框.标题 = 后台结果<\/div><div>        检查定时器.停止()<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 10. 错误写法与正确写法<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：组件名称不存在<\/span><\/div><br><div>```yc<\/div><div>\/\/ 设计器实际名称是 状态标签<\/div><div>标签1.标题 = \"完成\"<\/div><br><div>\/\/ 正确<\/div><div>状态标签.标题 = \"完成\"<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：重复声明组件<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误：登录按钮已经由设计器生成<\/div><div>按钮 登录按钮<\/div><br><div>\/\/ 正确：直接调用<\/div><div>登录按钮.可用 = 真<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：把属性写成方法<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>状态标签.标题(\"完成\")<\/div><br><div>\/\/ 正确<\/div><div>状态标签.标题 = \"完成\"<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：把方法写成属性<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>用户表格.清空 = 真<\/div><br><div>\/\/ 正确<\/div><div>用户表格.清空()<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：事件写成赋值<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>登录按钮.单击 = 登录处理<\/div><br><div>\/\/ 正确<\/div><div>函数 登录按钮.单击(整数 X, 整数 Y) {<\/div><div>    登录处理()<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：复制了不属于该组件的事件参数<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误：普通按钮事件不一定有“行、列”<\/div><div>函数 登录按钮.单击(整数 行, 整数 列) { }<\/div><br><div>\/\/ 正确：使用按钮补全给出的签名<\/div><div>函数 登录按钮.单击(整数 X, 整数 Y) { }<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：组件属性类型不匹配<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>登录按钮.可用 = \"是\"<\/div><br><div>\/\/ 正确<\/div><div>登录按钮.可用 = 真<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：在设计器改名后仍用旧名称<\/span><\/div><br><div>```yc<\/div><div>\/\/ 组件已从 按钮1 改名为 保存按钮，旧事件不会绑定<\/div><div>函数 按钮1.单击() { }<\/div><br><div>\/\/ 正确<\/div><div>函数 保存按钮.单击() { }<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：在函数外执行组件赋值<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误：文件顶层不能放运行语句<\/div><div>状态标签.标题 = \"启动\"<\/div><br><div>\/\/ 正确<\/div><div>函数 主窗口.创建完毕() {<\/div><div>    状态标签.标题 = \"启动\"<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 11. 排查顺序<\/span><\/div><br><div><span style=\"color: #ffa657;\">1.<\/span> 在设计器确认组件名称和组件类型。<\/div><div><span style=\"color: #ffa657;\">2.<\/span> 保存窗口文件后再编译，避免运行旧布局。<\/div><div><span style=\"color: #ffa657;\">3.<\/span> 输入 <span style=\"color: #79c0ff;\">`组件名.`<\/span> 查看只属于该类型的属性、方法和事件。<\/div><div><span style=\"color: #ffa657;\">4.<\/span> 从事件面板生成事件函数，避免手写错参数。<\/div><div><span style=\"color: #ffa657;\">5.<\/span> 属性用 <span style=\"color: #79c0ff;\">`=`<\/span>，方法用 <span style=\"color: #79c0ff;\">`()`<\/span>，事件用 <span style=\"color: #79c0ff;\">`函数 组件.事件(...) {}`<\/span>。<\/div><div><span style=\"color: #ffa657;\">6.<\/span> 多窗口项目确认目标窗口已经加入项目并保存。<\/div><br><\/div>","status":"fixed","is_recycle":0,"is_top":1,"is_bold":1,"is_italic":0,"is_underline":1,"title_color":"#a30a0a","font_family":"","font_size":"16px","category":"经验分享","priority":"normal","browser":"","os":"","contact":"","attachment":"","ip":"182.87.162.172","create_time":"2026-08-11 01:48:43","update_time":"2026-08-11 01:48:43","is_featured":0,"view_count":0,"username":"管理员","nickname":"管理员","avatar":null,"level":null,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2086,"user_id":null,"title":"Y++ 支持库命令语法说明","content":"<div style=\"color: rgb(187, 190, 191); background-color: rgb(18, 19, 20); font-family: Consolas, \"Courier New\", monospace; line-height: 19px; white-space: pre;\"><div><span style=\"color: #79c0ff;font-weight: bold;\"># Y++ 支持库命令语法说明<\/span><\/div><br><div>本文说明 Y++ 中支持库命令、支持库类、回调、返回值、可选参数和组合调用的写法。具体命令是否存在、参数类型及所属支持库，以 IDE 输入补全和光标处 F1 帮助为准。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 1. 普通命令调用<\/span><\/div><br><div>基本格式：<\/div><br><div>```yc<\/div><div>命令名(参数1, 参数2)<\/div><div>```<\/div><br><div>无参数命令也要写括号：<\/div><br><div>```yc<\/div><div>文本 运行目录 = 系统_取运行目录()<\/div><div>整数 鼠标X = 取鼠标X()<\/div><div>整数 鼠标Y = 取鼠标Y()<\/div><div>```<\/div><br><div>有返回值时可直接赋给同类型变量，也可放进表达式：<\/div><br><div>```yc<\/div><div>整数 数量 = 数组长度(文件列表)<\/div><div>文本 配置路径 = 系统_取运行目录() + \"\\\\config\\\\app.json\"<\/div><br><div>如果 (文件是否存在(配置路径)) {<\/div><div>    输出(\"配置文件存在\")<\/div><div>}<\/div><div>```<\/div><br><div>不关心返回值时可以直接调用：<\/div><br><div>```yc<\/div><div>输出(\"程序开始\")<\/div><div>移动鼠标(100, 200)<\/div><div>延时(300)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 2. 参数写法<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 2.1 字面量、变量和表达式<\/span><\/div><br><div>```yc<\/div><div>输出(\"固定文本\")<\/div><br><div>文本 用户名 = \"张三\"<\/div><div>输出(用户名)<\/div><br><div>整数 宽 = 800<\/div><div>整数 高 = 600<\/div><div>输出(\"面积=\" + 到文本(宽 * 高))<\/div><div>```<\/div><br><div>字符串使用双引号。Windows 路径中的反斜杠写成 <span style=\"color: #79c0ff;\">`\\\\`<\/span>：<\/div><br><div>```yc<\/div><div>文本 文件 = \"D:\\\\data\\\\users.json\"<\/div><div>```<\/div><br><div>也可以使用 <span style=\"color: #79c0ff;\">`\/`<\/span>：<\/div><br><div>```yc<\/div><div>文本 文件 = \"D:\/data\/users.json\"<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 2.2 可选参数<\/span><\/div><br><div>帮助中使用方括号标出的参数可以省略。例如帮助若显示：<\/div><br><div>```text<\/div><div>某命令(文本 内容, [整数 超时=3000], [逻辑 显示详情=假])<\/div><div>```<\/div><br><div>可按顺序调用：<\/div><br><div>```yc<\/div><div>某命令(\"测试\")<\/div><div>某命令(\"测试\", 5000)<\/div><div>某命令(\"测试\", 5000, 真)<\/div><div>```<\/div><br><div>不能跳过中间参数只填写最后一个参数，除非该命令帮助明确支持其它写法。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 2.3 类型转换<\/span><\/div><br><div>参数类型不一致时先显式转换：<\/div><br><div>```yc<\/div><div>文本 数量文字 = \"128\"<\/div><div>整数 数量 = 到整数(数量文字)<\/div><div>输出(\"数量=\" + 到文本(数量))<\/div><div>```<\/div><br><div>不要依赖文本、整数、逻辑之间的隐式转换。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 3. 支持库类和对象方法<\/span><\/div><br><div>支持库中带“类”的功能通常先声明对象，再用点号调用方法：<\/div><br><div>```yc<\/div><div>JSON类 文档<\/div><div>HTTP类 请求器<\/div><div>SQLite类 数据库<\/div><div>```<\/div><br><div>方法格式：<\/div><br><div>```yc<\/div><div>对象.方法(参数)<\/div><div>```<\/div><br><div>属性格式：<\/div><br><div>```yc<\/div><div>对象.属性<\/div><div>对象.属性 = 值<\/div><div>```<\/div><br><div>示例一：JSON 类组合调用：<\/div><br><div>```yc<\/div><div>函数 生成用户JSON() 文本 {<\/div><div>    JSON类 根<\/div><div>    根.置文本(\"姓名\", \"张三\")<\/div><div>    根.置整数(\"年龄\", 28)<\/div><div>    根.置逻辑(\"启用\", 真)<\/div><div>    返回(根.到文本())<\/div><div>}<\/div><div>```<\/div><br><div>示例二：对象之间传递结果：<\/div><br><div>```yc<\/div><div>函数 保存配置() {<\/div><div>    JSON类 配置<\/div><div>    配置.置文本(\"服务器\", \"127.0.0.1\")<\/div><div>    配置.置整数(\"端口\", 8080)<\/div><br><div>    文本 内容 = 配置.到文本()<\/div><div>    写文件(系统_取运行目录() + \"\\\\config.json\", 内容)<\/div><div>}<\/div><div>```<\/div><br><div>示例三：读取对象属性和事件属性：<\/div><br><div>```yc<\/div><div>MQTT类 客户端<\/div><br><div>函数 收到消息() {<\/div><div>    输出(\"主题：\" + 客户端.事件主题)<\/div><div>    输出(\"正文：\" + 客户端.事件文本)<\/div><div>}<\/div><br><div>函数 主窗口.创建完毕() {<\/div><div>    客户端.消息到达(&收到消息)<\/div><div>    客户端.连接(\"127.0.0.1\", 1883, \"YPPClient\")<\/div><div>    客户端.启动事件循环(20)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 4. 回调函数和函数地址<\/span><\/div><br><div>支持库要求回调时，一般传 <span style=\"color: #79c0ff;\">`&函数名`<\/span>：<\/div><br><div>```yc<\/div><div>函数 下载完成() {<\/div><div>    输出(\"下载完成\")<\/div><div>}<\/div><br><div>函数 开始下载() {<\/div><div>    下载器.完成(&下载完成)<\/div><div>}<\/div><div>```<\/div><br><div>回调形参必须与命令帮助一致。帮助要求零参数回调时不要自行增加参数；事件数据通常从对象的 <span style=\"color: #79c0ff;\">`事件文本`<\/span>、<span style=\"color: #79c0ff;\">`事件字节集`<\/span>、<span style=\"color: #79c0ff;\">`错误信息`<\/span> 等属性读取。<\/div><br><div>```yc<\/div><div>串口类 串口<\/div><br><div>函数 串口收到数据() {<\/div><div>    字节集 数据 = 串口.事件字节集<\/div><div>    输出(\"收到字节数=\" + 到文本(字节集长度(数据)))<\/div><div>}<\/div><div>```<\/div><br><div>一个回调可登记到对象，多个对象应分别读取各自的事件属性：<\/div><br><div>```yc<\/div><div>MQTT类 生产连接<\/div><div>MQTT类 测试连接<\/div><br><div>函数 生产消息() {<\/div><div>    输出(\"生产：\" + 生产连接.事件文本)<\/div><div>}<\/div><br><div>函数 测试消息() {<\/div><div>    输出(\"测试：\" + 测试连接.事件文本)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 5. 数组作为参数和返回值<\/span><\/div><br><div>```yc<\/div><div>数组 文件列表[] = 取文件列表(\"D:\/data\", \"*.*\", 假, 真)<\/div><div>整数 i = 0<\/div><div>循环 (数组长度(文件列表), i) {<\/div><div>    输出(文件列表[i])<\/div><div>}<\/div><div>```<\/div><br><div>向动态数组添加数据：<\/div><br><div>```yc<\/div><div>文本 名称[] = []<\/div><div>数组添加(名称, \"张三\")<\/div><div>数组添加(名称, \"李四\")<\/div><div>输出(名称[0])<\/div><div>```<\/div><br><div>二维、三维数组或自定义类型数组是否适用于某个命令，要按该命令的参数类型使用，不能看到“数组”就传任意元素类型。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 6. 命令嵌套与拆分<\/span><\/div><br><div>简单返回值可以嵌套：<\/div><br><div>```yc<\/div><div>输出(到文本(数组长度(文件列表)))<\/div><div>```<\/div><br><div>涉及网络、文件、数据库或多步状态时建议拆开，便于检查失败位置：<\/div><br><div>```yc<\/div><div>文本 路径 = 系统_取运行目录() + \"\\\\data.json\"<\/div><div>逻辑 存在 = 文件是否存在(路径)<\/div><div>如果 (!存在) {<\/div><div>    输出(\"文件不存在：\" + 路径)<\/div><div>    返回()<\/div><div>}<\/div><br><div>文本 内容 = 读文件(路径)<\/div><div>如果 (内容 == \"\") {<\/div><div>    输出(\"文件为空或读取失败\")<\/div><div>    返回()<\/div><div>}<\/div><div>输出(内容)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 7. 条件、循环和错误处理中的命令<\/span><\/div><br><div>```yc<\/div><div>函数 查找名称(文本 名称列表[], 文本 目标) 整数 {<\/div><div>    整数 i = 0<\/div><div>    循环 (数组长度(名称列表), i) {<\/div><div>        如果 (名称列表[i] == 目标) {<\/div><div>            返回(i)<\/div><div>        }<\/div><div>    }<\/div><div>    返回(-1)<\/div><div>}<\/div><div>```<\/div><br><div>```yc<\/div><div>函数 安全读取(文本 路径) 文本 {<\/div><div>    尝试 {<\/div><div>        返回(读文件(路径))<\/div><div>    } 捕获 {<\/div><div>        输出(\"读取失败：\" + 路径)<\/div><div>        返回(\"\")<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 8. 多线程中调用支持库<\/span><\/div><br><div>耗时的文件、网络和计算可放到线程或线程池；窗口组件属性不要在后台线程直接修改，应回到界面事件或使用支持库提供的界面调度方式。<\/div><br><div>```yc<\/div><div>函数 后台任务() {<\/div><div>    文本 内容 = 读文件(\"D:\/data\/big.json\")<\/div><div>    输出(\"后台读取完成，字符数=\" + 到文本(文本长度(内容)))<\/div><div>}<\/div><br><div>函数 开始按钮.单击(整数 X, 整数 Y) {<\/div><div>    整数 线程句柄 = 启动线程(&后台任务)<\/div><div>    如果 (线程句柄 == 0) {<\/div><div>        输出(\"线程启动失败\")<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 9. 常量与支持库命令<\/span><\/div><br><div>支持库内置常量通常以 <span style=\"color: #79c0ff;\">`#`<\/span> 开头：<\/div><br><div>```yc<\/div><div>如果 (按键 == #回车键) {<\/div><div>    输出(\"按下回车\")<\/div><div>}<\/div><br><div>模拟鼠标点击(#鼠标左键, 100, 200)<\/div><div>```<\/div><br><div>常量不是函数，不要在后面加括号。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 10. 错误写法与正确写法<\/span><\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：无参数命令漏括号<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>文本 路径 = 系统_取运行目录<\/div><br><div>\/\/ 正确<\/div><div>文本 路径 = 系统_取运行目录()<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：把普通命令当对象方法<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误：输出不是“系统”对象的方法<\/div><div>系统.输出(\"你好\")<\/div><br><div>\/\/ 正确<\/div><div>输出(\"你好\")<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：把类方法当普通命令<\/span><\/div><br><div>```yc<\/div><div>JSON类 数据<\/div><br><div>\/\/ 错误<\/div><div>置文本(\"姓名\", \"张三\")<\/div><br><div>\/\/ 正确<\/div><div>数据.置文本(\"姓名\", \"张三\")<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：回调漏写 <\/span><span style=\"color: #79c0ff;font-weight: bold;\">`&`<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误：这会立即调用函数，或产生参数类型错误<\/div><div>客户端.消息到达(收到消息())<\/div><br><div>\/\/ 正确：传函数地址<\/div><div>客户端.消息到达(&收到消息)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：自行改变回调参数<\/span><\/div><br><div>```yc<\/div><div>\/\/ 帮助要求零参数时，以下写法错误<\/div><div>函数 收到消息(文本 主题, 文本 内容) { }<\/div><br><div>\/\/ 正确<\/div><div>函数 收到消息() {<\/div><div>    输出(客户端.事件主题)<\/div><div>    输出(客户端.事件文本)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：返回类型不匹配<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>整数 数量 = \"10\"<\/div><br><div>\/\/ 正确<\/div><div>整数 数量 = 到整数(\"10\")<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：将支持库常量写成函数<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误<\/div><div>整数 键 = #回车键()<\/div><br><div>\/\/ 正确<\/div><div>整数 键 = #回车键<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">### 错误：使用不存在的重载<\/span><\/div><br><div>```yc<\/div><div>\/\/ 错误：根据其它语言经验随意添加参数<\/div><div>移动鼠标(100, 200, 500, \"平滑\")<\/div><br><div>\/\/ 正确：只按 IDE 参数提示调用<\/div><div>移动鼠标(100, 200)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 11. 排查顺序<\/span><\/div><br><div><span style=\"color: #ffa657;\">1.<\/span> 输入命令名后查看补全，确认支持库已经加载。<\/div><div><span style=\"color: #ffa657;\">2.<\/span> 将光标放在命令或方法上按 F1，确认参数数量、类型、返回值和示例。<\/div><div><span style=\"color: #ffa657;\">3.<\/span> 类方法必须由正确类型的对象通过点号调用。<\/div><div><span style=\"color: #ffa657;\">4.<\/span> 回调必须核对函数参数，并使用 <span style=\"color: #79c0ff;\">`&函数名`<\/span>。<\/div><div><span style=\"color: #ffa657;\">5.<\/span> 同名命令冲突时删除重复 <span style=\"color: #79c0ff;\">`.ypi`<\/span> 声明，或给 API 使用不同中文别名。<\/div><br><\/div>","status":"fixed","is_recycle":0,"is_top":1,"is_bold":1,"is_italic":0,"is_underline":1,"title_color":"#aa0808","font_family":"","font_size":"16px","category":"经验分享","priority":"normal","browser":"","os":"","contact":"","attachment":"","ip":"182.87.162.172","create_time":"2026-08-11 01:48:03","update_time":"2026-08-11 01:48:03","is_featured":0,"view_count":0,"username":"管理员","nickname":"管理员","avatar":null,"level":null,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2085,"user_id":null,"title":"Y语言-Y++基础语法说明","content":"<div style=\"color: rgb(187, 190, 191); background-color: rgb(18, 19, 20); font-family: Consolas, \"Courier New\", monospace; line-height: 19px; white-space: pre;\"><div><span style=\"color: #79c0ff;font-weight: bold;\"># Y++ 基础语法说明<\/span><\/div><br><div>本文说明 D2D 项目中最常用的 Y++ 基础语法：变量、常量、数据类型、类型转换、运算符、数组、函数、作用域、条件和循环。支持库命令、窗口组件、<span style=\"color: #79c0ff;\">`.yt`<\/span>、<span style=\"color: #79c0ff;\">`.ypi`<\/span>、<span style=\"color: #79c0ff;\">`.ypp`<\/span> 的专门写法请继续查看同目录对应文档。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 1. 源文件与代码结构<\/span><\/div><br><div>常用文件：<\/div><br><div>| 文件 | 用途 |<\/div><div>|---|---|<\/div><div>| <span style=\"color: #79c0ff;\">`source\/main.yc`<\/span> | 窗口事件和主要业务代码 |<\/div><div>| <span style=\"color: #79c0ff;\">`source\/globals.yc`<\/span> | 全工程共享变量，项目自动引用 |<\/div><div>| <span style=\"color: #79c0ff;\">`source\/constants.yc`<\/span> | 全工程共享常量，项目自动引用 |<\/div><div>| <span style=\"color: #79c0ff;\">`source\/结构体文件\/*.yt`<\/span> | 自定义数据类型和结构体 |<\/div><div>| <span style=\"color: #79c0ff;\">`source\/类文件\/*.ypp`<\/span> | 自写类、属性、方法和继承 |<\/div><div>| <span style=\"color: #79c0ff;\">`source\/API声明\/*.ypi`<\/span> | DLL、Windows API 和第三方 C 接口声明 |<\/div><br><div>语句通常一行一条；代码块使用英文半角 <span style=\"color: #79c0ff;\">`{`<\/span> 和 <span style=\"color: #79c0ff;\">`}`<\/span>：<\/div><br><div>```yc<\/div><div>函数 演示() {<\/div><div>    整数 数量 = 10<\/div><div>    输出(数量)<\/div><div>}<\/div><div>```<\/div><br><div>错误写法：<\/div><br><div>```yc<\/div><div>\/\/ 错误：使用中文全角括号和花括号可能造成解析失败<\/div><div>函数 演示（整数 数量）｛<\/div><div>    输出（数量）<\/div><div>｝<\/div><div>```<\/div><br><div>应使用 IDE 自动转换后的英文半角标点。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 2. 标识符与注释<\/span><\/div><br><div>变量、函数、类型、类和方法可使用中文名、英文字母、数字及下划线，但名称不能以数字开头，也不能与关键字冲突。<\/div><br><div>```yc<\/div><div>整数 用户数量 = 0<\/div><div>文本 user_name = \"张三\"<\/div><div>逻辑 已登录 = 假<\/div><div>```<\/div><br><div>单行注释：<\/div><br><div>```yc<\/div><div>\/\/ 这是一行注释<\/div><div>整数 次数 = 3 \/\/ 行尾注释<\/div><div>```<\/div><br><div>多行注释：<\/div><br><div>```yc<\/div><div>\/*<\/div><div>这里是多行说明。<\/div><div>可用于暂时屏蔽多行代码。<\/div><div>*\/<\/div><div>```<\/div><br><div>错误写法：<\/div><br><div>```yc<\/div><div>整数 2号用户 = 0     \/\/ 错误：数字开头<\/div><div>整数 如果 = 1        \/\/ 错误：使用关键字作为名称<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 3. 变量定义<\/span><\/div><br><div>基本格式：<\/div><br><div>```text<\/div><div>类型 变量名<\/div><div>类型 变量名 = 初始值<\/div><div>```<\/div><br><div>常见变量：<\/div><br><div>```yc<\/div><div>整数 年龄 = 18<\/div><div>短整数 状态码 = 200<\/div><div>长整数 文件大小 = 4294967296<\/div><div>小数 温度 = 36.5<\/div><div>单浮点 比例 = 0.75<\/div><div>双浮点 金额 = 1234.56<\/div><div>文本 姓名 = \"张三\"<\/div><div>逻辑 已完成 = 假<\/div><div>字节 一个字节 = 65<\/div><div>字节集 文件数据 = 创建字节集(1024)<\/div><div>通用 任意值 = \"开始是文本\"<\/div><div>```<\/div><br><div>先声明后赋值：<\/div><br><div>```yc<\/div><div>整数 总数<\/div><div>总数 = 10<\/div><div>总数 = 总数 + 5<\/div><div>```<\/div><br><div>一次只声明一个名称，最利于补全、错误定位和 AI 生成：<\/div><br><div>```yc<\/div><div>整数 左 = 10<\/div><div>整数 上 = 20<\/div><div>整数 宽 = 800<\/div><div>整数 高 = 600<\/div><div>```<\/div><br><div>错误写法：<\/div><br><div>```yc<\/div><div>年龄 整数 = 18       \/\/ 不推荐：统一使用“类型 名称”<\/div><div>整数 = 18            \/\/ 错误：缺少变量名<\/div><div>整数 年龄 = \"十八\"   \/\/ 错误：文本不能直接赋给整数<\/div><div>```<\/div><br><div>需要把文本年龄变成整数时显式转换：<\/div><br><div>```yc<\/div><div>整数 年龄 = 到整数(\"18\")<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 4. 基本数据类型怎么选择<\/span><\/div><br><div>| 类型 | 常见用途 | 示例 |<\/div><div>|---|---|---|<\/div><div>| <span style=\"color: #79c0ff;\">`整数`<\/span> | 计数、索引、状态码 | <span style=\"color: #79c0ff;\">`整数 行 = 0`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`短整数`<\/span> | 明确需要较小整数的原生接口 | <span style=\"color: #79c0ff;\">`短整数 端口片段 = 80`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`长整数`<\/span> | 文件大小、时间戳、句柄、地址 | <span style=\"color: #79c0ff;\">`长整数 句柄 = 0`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`小数`<\/span> \/ <span style=\"color: #79c0ff;\">`双浮点`<\/span> | 金额、坐标、测量值 | <span style=\"color: #79c0ff;\">`小数 单价 = 9.9`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`单浮点`<\/span> | 第三方接口明确要求 float | <span style=\"color: #79c0ff;\">`单浮点 透明度 = 0.5`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`文本`<\/span> | Unicode 字符串 | <span style=\"color: #79c0ff;\">`文本 标题 = \"主页\"`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`逻辑`<\/span> | 真\/假状态 | <span style=\"color: #79c0ff;\">`逻辑 运行中 = 真`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`字节`<\/span> | 单个 0～255 数据 | <span style=\"color: #79c0ff;\">`字节 标记 = 255`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`字节集`<\/span> | 文件、图片、网络二进制 | <span style=\"color: #79c0ff;\">`字节集 图片 = 读文件(路径)`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`通用`<\/span> | 类型不固定的数据 | <span style=\"color: #79c0ff;\">`通用 值 = 123`<\/span> |<\/div><br><div>能确定类型时优先使用明确类型。<span style=\"color: #79c0ff;\">`通用`<\/span> 适合动态数据，但会降低类型检查和成员补全的准确性。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 5. 文本与转义<\/span><\/div><br><div>文本使用英文双引号：<\/div><br><div>```yc<\/div><div>文本 标题 = \"Y++ IDE\"<\/div><div>文本 路径 = \"D:\\\\data\\\\config.json\"<\/div><div>文本 换行内容 = \"第一行\\n第二行\"<\/div><div>文本 制表内容 = \"名称\\t数量\"<\/div><div>文本 引号内容 = \"他说：\\\"你好\\\"\"<\/div><div>```<\/div><br><div>Windows 路径也可使用 <span style=\"color: #79c0ff;\">`\/`<\/span>，可减少转义：<\/div><br><div>```yc<\/div><div>文本 路径 = \"D:\/data\/config.json\"<\/div><div>```<\/div><br><div>拼接不同类型时显式转换：<\/div><br><div>```yc<\/div><div>文本 姓名 = \"张三\"<\/div><div>整数 年龄 = 18<\/div><div>文本 简介 = 姓名 + \"，年龄=\" + 到文本(年龄)<\/div><div>```<\/div><br><div>错误写法：<\/div><br><div>```yc<\/div><div>文本 路径 = \"D:\\data\\new\" \/\/ 错误风险：\\n 会被解释成换行<\/div><div>文本 简介 = \"年龄=\" + 年龄 \/\/ 不要依赖隐式转换<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 6. 类型转换与类型判断<\/span><\/div><br><div>常用转换命令：<\/div><br><div>```yc<\/div><div>整数 数量 = 到整数(\"123\")<\/div><div>小数 单价 = 到小数(\"19.95\")<\/div><div>文本 数量文本 = 到文本(数量)<\/div><div>逻辑 开关 = 到逻辑(1)<\/div><div>字节集 数据 = 到字节集(\"你好\")<\/div><div>文本 当前类型 = 取类型(数量)<\/div><div>```<\/div><br><div>组合示例：读取文本框并校验：<\/div><br><div>```yc<\/div><div>函数 保存按钮.单击(整数 X, 整数 Y) {<\/div><div>    文本 原始年龄 = 年龄输入框.标题<\/div><div>    整数 年龄 = 到整数(原始年龄)<\/div><div>    如果 (年龄 <= 0) {<\/div><div>        输出(\"年龄必须是正整数\")<\/div><div>        返回<\/div><div>    }<\/div><div>    输出(\"保存年龄：\" + 到文本(年龄))<\/div><div>}<\/div><div>```<\/div><br><div>小数转整数会去掉小数部分：<\/div><br><div>```yc<\/div><div>整数 a = 到整数(3.9)   \/\/ 结果为 3<\/div><div>整数 b = 到整数(-3.9)  \/\/ 向零截断<\/div><div>```<\/div><br><div>错误写法：<\/div><br><div>```yc<\/div><div>整数 数量 = \"123\"          \/\/ 错误：没有转换<\/div><div>整数 数量 = 到文本(123)     \/\/ 错误：转换结果仍是文本<\/div><div>小数 金额 = 到整数(\"9.9\")  \/\/ 结果先被截断，不符合金额用途<\/div><div>```<\/div><br><div>正确写法：<\/div><br><div>```yc<\/div><div>整数 数量 = 到整数(\"123\")<\/div><div>小数 金额 = 到小数(\"9.9\")<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 7. 常量<\/span><\/div><br><div>局部常量：<\/div><br><div>```yc<\/div><div>函数 计算() {<\/div><div>    常量 整数 每页数量 = 50<\/div><div>    输出(每页数量)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`source\/constants.yc`<\/span> 中的项目常量：<\/div><br><div>```yc<\/div><div>全局常量 文本 程序版本 = \"2.6.0\"<\/div><div>全局常量 整数 默认端口 = 8080<\/div><div>全局常量 逻辑 启用日志 = 真<\/div><div>```<\/div><br><div>其它文件使用项目全局常量：<\/div><br><div>```yc<\/div><div>输出(\"版本=\" + #程序版本)<\/div><div>整数 端口 = #默认端口<\/div><div>```<\/div><br><div>错误写法：<\/div><br><div>```yc<\/div><div>#默认端口 = 9000 \/\/ 错误：常量不能重新赋值<\/div><div>输出(默认端口)   \/\/ 跨文件项目常量漏写 #<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 8. 局部变量、全局变量和作用域<\/span><\/div><br><div>函数或方法内部定义的是局部变量，只在当前代码块所属函数或方法中使用：<\/div><br><div>```yc<\/div><div>函数 计算总价(整数 数量, 小数 单价) 小数 {<\/div><div>    小数 总价 = 数量 * 单价<\/div><div>    返回(总价)<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`source\/globals.yc`<\/span> 中定义全局变量：<\/div><br><div>```yc<\/div><div>整数 登录次数 = 0<\/div><div>逻辑 程序运行中 = 真<\/div><div>文本 当前用户 = \"\"<\/div><div>学生 学生列表[]<\/div><div>```<\/div><br><div>其它 <span style=\"color: #79c0ff;\">`.yc`<\/span>、<span style=\"color: #79c0ff;\">`.ypp`<\/span> 文件可直接使用这些全局变量。<\/div><br><div>方法参数也属于当前方法的局部变量：<\/div><br><div>```ypp<\/div><div>类 日志器 {<\/div><div>    方法 写入(文本 内容, 整数 级别) {<\/div><div>        \/\/ 内容、级别在本方法内应参与代码补全<\/div><div>        输出(\"[\" + 到文本(级别) + \"] \" + 内容)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>错误写法：<\/div><br><div>```yc<\/div><div>函数 A() {<\/div><div>    整数 临时值 = 10<\/div><div>}<\/div><br><div>函数 B() {<\/div><div>    输出(临时值) \/\/ 错误：A 的局部变量在 B 中不可见<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 9. 赋值与运算符<\/span><\/div><br><div>```yc<\/div><div>整数 a = 10<\/div><div>整数 b = 3<\/div><br><div>整数 和 = a + b<\/div><div>整数 差 = a - b<\/div><div>整数 积 = a * b<\/div><div>整数 商 = a \/ b<\/div><div>整数 余数 = a % b<\/div><br><div>a += 2<\/div><div>a -= 1<\/div><div>a *= 3<\/div><div>a \/= 2<\/div><div>a++<\/div><div>b--<\/div><div>```<\/div><br><div>比较与逻辑：<\/div><br><div>```yc<\/div><div>逻辑 相等 = (a == b)<\/div><div>逻辑 不等 = (a != b)<\/div><div>逻辑 大于 = (a > b)<\/div><div>逻辑 范围内 = (a >= 1 && a <= 100)<\/div><div>逻辑 任一成立 = (a == 0 || b == 0)<\/div><div>逻辑 未完成 = !已完成<\/div><div>```<\/div><br><div>不要把比较 <span style=\"color: #79c0ff;\">`==`<\/span> 写成赋值 <span style=\"color: #79c0ff;\">`=`<\/span>：<\/div><br><div>```yc<\/div><div>如果 (状态 = 1) { }  \/\/ 错误：条件中误用了赋值<\/div><div>如果 (状态 == 1) { } \/\/ 正确：比较是否相等<\/div><div>```<\/div><br><div>复杂表达式用括号明确顺序：<\/div><br><div>```yc<\/div><div>小数 平均值 = (总分 + 加分) \/ 人数<\/div><div>逻辑 可提交 = 已登录 && (数量 > 0) && (金额 <= 余额)<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 10. 一维数组<\/span><\/div><br><div>强类型数组：<\/div><br><div>```yc<\/div><div>整数 分数[] = [90, 85, 100]<\/div><div>文本 姓名[] = [\"张三\", \"李四\"]<\/div><div>学生 学生列表[]<\/div><div>```<\/div><br><div>固定初始容量或长度提示：<\/div><br><div>```yc<\/div><div>多线程 dxc[10] = []<\/div><div>```<\/div><br><div>访问下标从 <span style=\"color: #79c0ff;\">`0`<\/span> 开始：<\/div><br><div>```yc<\/div><div>输出(分数[0])<\/div><div>分数[1] = 88<\/div><div>数组添加(姓名, \"王五\")<\/div><div>整数 人数 = 数组长度(姓名)<\/div><div>```<\/div><br><div>遍历：<\/div><br><div>```yc<\/div><div>整数 i = 0<\/div><div>当 (i < 数组长度(姓名)) {<\/div><div>    输出(到文本(i) + \":\" + 姓名[i])<\/div><div>    i++<\/div><div>}<\/div><div>```<\/div><br><div>错误写法：<\/div><br><div>```yc<\/div><div>输出(姓名[2]) \/\/ 如果当前只有两个元素，下标越界<\/div><div>姓名[0] = 123 \/\/ 错误：文本数组元素不能直接放整数<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 11. 二维、三维及嵌套数组<\/span><\/div><br><div>```yc<\/div><div>整数 表格[][] = [[1, 2], [3, 4]]<\/div><div>输出(表格[0][1])<\/div><br><div>文本 立方体[][][] = [<\/div><div>    [[\"A\", \"B\"], [\"C\", \"D\"]]<\/div><div>]<\/div><div>输出(立方体[0][1][0])<\/div><div>```<\/div><br><div>自定义类型数组可继续访问成员：<\/div><br><div>```yc<\/div><div>学校 我校<\/div><div>输出(我校.班级列表[0].成员[0].姓名)<\/div><div>输出(我校.班级列表[0].成员[0].家庭住址.门牌坐标.X)<\/div><div>```<\/div><br><div>类型数组元素里包含类对象时也可继续调用方法：<\/div><br><div>```yc<\/div><div>多线程 dxc[10] = []<\/div><div>dxc[0].主OL.我是ola第一个方法(\"任务一\")<\/div><div>```<\/div><br><div>这类写法要求每一层都有明确类型：<span style=\"color: #79c0ff;\">`dxc`<\/span> 是 <span style=\"color: #79c0ff;\">`多线程[]`<\/span>、<span style=\"color: #79c0ff;\">`主OL`<\/span> 是 <span style=\"color: #79c0ff;\">`ola`<\/span>、目标方法属于 <span style=\"color: #79c0ff;\">`ola`<\/span>。若中间一层声明成 <span style=\"color: #79c0ff;\">`通用`<\/span>，IDE 无法可靠推出后续成员。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 12. 条件语句<\/span><\/div><br><div>```yc<\/div><div>如果 (分数 >= 90) {<\/div><div>    输出(\"优秀\")<\/div><div>} 否则如果 (分数 >= 60) {<\/div><div>    输出(\"及格\")<\/div><div>} 否则 {<\/div><div>    输出(\"不及格\")<\/div><div>}<\/div><div>```<\/div><br><div>嵌套条件：<\/div><br><div>```yc<\/div><div>如果 (已登录) {<\/div><div>    如果 (权限级别 >= 10) {<\/div><div>        输出(\"管理员\")<\/div><div>    } 否则 {<\/div><div>        输出(\"普通用户\")<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div>错误写法：<\/div><br><div>```yc<\/div><div>如果 分数 >= 60 {       \/\/ 错误：条件缺少括号<\/div><div>    输出(\"及格\")<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 13. 循环、跳出和继续<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`当`<\/span> 循环：<\/div><br><div>```yc<\/div><div>整数 i = 0<\/div><div>当 (i < 10) {<\/div><div>    i++<\/div><div>    如果 (i == 3) {<\/div><div>        继续<\/div><div>    }<\/div><div>    如果 (i > 8) {<\/div><div>        跳出<\/div><div>    }<\/div><div>    输出(i)<\/div><div>}<\/div><div>```<\/div><br><div>循环必须保证条件最终会改变：<\/div><br><div>```yc<\/div><div>整数 i = 0<\/div><div>当 (i < 10) {<\/div><div>    输出(i)<\/div><div>    \/\/ 错误：漏写 i++，将形成无限循环<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 14. 函数定义、参数和返回值<\/span><\/div><br><div>无参数、无返回值：<\/div><br><div>```yc<\/div><div>函数 显示欢迎() {<\/div><div>    输出(\"欢迎使用 Y++\")<\/div><div>}<\/div><br><div>显示欢迎()<\/div><div>```<\/div><br><div>带参数：<\/div><br><div>```yc<\/div><div>函数 显示用户(文本 姓名, 整数 年龄) {<\/div><div>    输出(姓名 + \"，\" + 到文本(年龄) + \"岁\")<\/div><div>}<\/div><br><div>显示用户(\"张三\", 18)<\/div><div>```<\/div><br><div>带返回值：<\/div><br><div>```yc<\/div><div>函数 计算面积(整数 宽, 整数 高) 整数 {<\/div><div>    返回(宽 * 高)<\/div><div>}<\/div><br><div>整数 面积 = 计算面积(800, 600)<\/div><div>```<\/div><br><div>提前返回：<\/div><br><div>```yc<\/div><div>函数 保存(文本 路径) 逻辑 {<\/div><div>    如果 (路径 == \"\") {<\/div><div>        输出(\"路径不能为空\")<\/div><div>        返回(假)<\/div><div>    }<\/div><div>    写文件(路径, \"内容\")<\/div><div>    返回(真)<\/div><div>}<\/div><div>```<\/div><br><div>错误写法：<\/div><br><div>```yc<\/div><div>函数 相加(整数 a, 整数 b) 整数 {<\/div><div>    输出(a + b)<\/div><div>} \/\/ 错误：声明返回整数但没有返回值<\/div><br><div>相加(\"1\", \"2\") \/\/ 错误：参数类型不匹配<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 15. 窗口事件中的变量<\/span><\/div><br><div>事件参数由组件事件签名决定：<\/div><br><div>```yc<\/div><div>函数 按钮1.单击(整数 X, 整数 Y) {<\/div><div>    文本 坐标 = 到文本(X) + \",\" + 到文本(Y)<\/div><div>    输出(坐标)<\/div><div>}<\/div><div>```<\/div><br><div>不要自行复制另一种组件的参数签名，应从设计器事件面板生成：<\/div><br><div>```yc<\/div><div>\/\/ 错误示意：当前组件的单击事件可能并不提供“行、列”<\/div><div>函数 按钮1.单击(整数 行, 整数 列, 文本 内容) {<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 16. 自定义数据类型变量<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`.yt`<\/span>：<\/div><br><div>```yt<\/div><div>地址 {<\/div><div>    文本 省<\/div><div>    文本 市<\/div><div>}<\/div><br><div>学生 {<\/div><div>    文本 姓名<\/div><div>    整数 年龄<\/div><div>    地址 家庭住址<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`.yc`<\/span>：<\/div><br><div>```yc<\/div><div>学生 张三<\/div><div>张三.姓名 = \"张三\"<\/div><div>张三.年龄 = 18<\/div><div>张三.家庭住址.省 = \"广东省\"<\/div><div>张三.家庭住址.市 = \"深圳市\"<\/div><div>输出(张三.家庭住址.市)<\/div><div>```<\/div><br><div>错误写法：<\/div><br><div>```yc<\/div><div>张三.家庭地址.市 = \"深圳市\" \/\/ 错误：声明的成员叫“家庭住址”<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 17. 自写类变量和方法参数<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`.ypp`<\/span>：<\/div><br><div>```ypp<\/div><div>类 订单服务 {<\/div><div>    文本 当前用户 = \"\"<\/div><br><div>    方法 设置用户(文本 用户名) {<\/div><div>        当前用户 = 用户名<\/div><div>    }<\/div><br><div>    方法 计算金额(整数 数量, 小数 单价) 小数 {<\/div><div>        小数 金额 = 数量 * 单价<\/div><div>        返回(金额)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`.yc`<\/span>：<\/div><br><div>```yc<\/div><div>订单服务 服务<\/div><div>服务.设置用户(\"张三\")<\/div><div>小数 金额 = 服务.计算金额(3, 19.9)<\/div><div>```<\/div><br><div>方法形参 <span style=\"color: #79c0ff;\">`用户名`<\/span>、<span style=\"color: #79c0ff;\">`数量`<\/span>、<span style=\"color: #79c0ff;\">`单价`<\/span> 只在各自方法体内有效，并应像局部变量一样参与代码补全。<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 18. 通用类型的使用边界<\/span><\/div><br><div>```yc<\/div><div>通用 值 = 123<\/div><div>输出(取类型(值))<\/div><div>值 = \"文本\"<\/div><div>输出(取类型(值))<\/div><div>```<\/div><br><div>不要用 <span style=\"color: #79c0ff;\">`通用`<\/span> 代替本来明确的自定义类型：<\/div><br><div>```yc<\/div><div>通用 学生值<\/div><div>\/\/ 学生值.姓名  \/\/ IDE 无法保证成员类型和补全<\/div><br><div>学生 学生值2<\/div><div>学生值2.姓名 = \"张三\"<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 19. 常见错误对照<\/span><\/div><br><div>| 错误写法 | 原因 | 正确写法 |<\/div><div>|---|---|---|<\/div><div>| <span style=\"color: #79c0ff;\">`整数 = 1`<\/span> | 缺少变量名 | <span style=\"color: #79c0ff;\">`整数 数量 = 1`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`整数 数量 = \"1\"`<\/span> | 类型不同 | <span style=\"color: #79c0ff;\">`整数 数量 = 到整数(\"1\")`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`如果 (a = 1)`<\/span> | 把赋值写成比较 | <span style=\"color: #79c0ff;\">`如果 (a == 1)`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`输出(未声明变量)`<\/span> | 名称不在作用域 | 先声明或放入 <span style=\"color: #79c0ff;\">`globals.yc`<\/span> |<\/div><div>| <span style=\"color: #79c0ff;\">`数组[数组长度(数组)]`<\/span> | 下标越界 | 最后一个下标是长度减一 |<\/div><div>| <span style=\"color: #79c0ff;\">`#常量 = 新值`<\/span> | 常量不可修改 | 改用全局变量 |<\/div><div>| <span style=\"color: #79c0ff;\">`对象.不存在成员`<\/span> | 名称或类型链错误 | 按 <span style=\"color: #79c0ff;\">`.yt`<\/span>\/<span style=\"color: #79c0ff;\">`.ypp`<\/span> 声明逐层访问 |<\/div><div>| <span style=\"color: #79c0ff;\">`类名 对象(参数)`<\/span> | 当前声明语法不接收该写法 | 先 <span style=\"color: #79c0ff;\">`类名 对象`<\/span>，再调用初始化方法 |<\/div><div>| <span style=\"color: #79c0ff;\">`用户 a = new 用户()`<\/span> | 混入其它语言语法 | <span style=\"color: #79c0ff;\">`用户 a`<\/span> |<\/div><div>| 方法参数在方法外使用 | 已离开参数作用域 | 传给其它函数或保存到类属性 |<\/div><br><div><span style=\"color: #79c0ff;font-weight: bold;\">## 20. 综合示例<\/span><\/div><br><div><span style=\"color: #79c0ff;\">`source\/types\/订单.yt`<\/span>：<\/div><br><div>```yt<\/div><div>订单项 {<\/div><div>    文本 商品名<\/div><div>    整数 数量<\/div><div>    小数 单价<\/div><div>}<\/div><br><div>订单数据 {<\/div><div>    文本 编号<\/div><div>    订单项 项目[]<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`source\/classes\/订单计算器.ypp`<\/span>：<\/div><br><div>```ypp<\/div><div>类 订单计算器 {<\/div><div>    方法 计算总额(订单数据 订单) 小数 {<\/div><div>        小数 总额 = 0<\/div><div>        整数 i = 0<\/div><div>        当 (i < 数组长度(订单.项目)) {<\/div><div>            总额 += 订单.项目[i].数量 * 订单.项目[i].单价<\/div><div>            i++<\/div><div>        }<\/div><div>        返回(总额)<\/div><div>    }<\/div><div>}<\/div><div>```<\/div><br><div><span style=\"color: #79c0ff;\">`source\/main.yc`<\/span>：<\/div><br><div>```yc<\/div><div>函数 计算按钮.单击(整数 X, 整数 Y) {<\/div><div>    订单数据 订单<\/div><div>    订单.编号 = \"NO-1001\"<\/div><br><div>    订单项 商品<\/div><div>    商品.商品名 = \"键盘\"<\/div><div>    商品.数量 = 到整数(数量输入框.标题)<\/div><div>    商品.单价 = 到小数(单价输入框.标题)<\/div><div>    数组添加(订单.项目, 商品)<\/div><br><div>    订单计算器 计算器<\/div><div>    小数 总额 = 计算器.计算总额(订单)<\/div><div>    结果标签.标题 = \"订单\" + 订单.编号 + \"，总额=\" + 到文本(总额)<\/div><div>}<\/div><div>```<\/div><br><div>这个示例同时使用了事件参数、局部变量、文本转整数、小数转换、自定义数据类型、类型数组、自写类方法、循环和返回值。<\/div><br><\/div>","status":"fixed","is_recycle":0,"is_top":1,"is_bold":1,"is_italic":0,"is_underline":1,"title_color":"#a81a0b","font_family":"","font_size":"16px","category":"经验分享","priority":"normal","browser":"","os":"","contact":"","attachment":"","ip":"182.87.162.172","create_time":"2026-08-11 01:42:35","update_time":"2026-08-11 01:42:35","is_featured":1,"view_count":1,"username":"管理员","nickname":"管理员","avatar":null,"level":null,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2084,"user_id":1105,"title":"RC4加密变日初4加密","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>v1.0.0.5<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260731182826_caf939ec478b7017.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>错误\tD:\/Y++_sources\/MyProject\/source\/main.yc\t26\t1\t第26行 日初4加密 命令 找不到定义<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>RC4加密()会自动变成日出4加密()，导致找不到定义<\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"urgent","browser":"v1.0.0.5","os":"","contact":"","attachment":"\/storage\/attachments\/20260731182826_caf939ec478b7017.webp","ip":"112.245.191.167","create_time":"2026-07-31 18:29:15","update_time":"2026-08-05 10:07:11","is_featured":0,"view_count":17,"username":"bailandai","nickname":"摆烂呆","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2083,"user_id":1105,"title":"标准窗口位置改变函数报错","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>v1.0.0.5<\/p><\/div><div class=\"post-section\"><h3>问题代码<\/h3><pre><code>\/\/ MyProject1 - 主程序\n\/\/ 创建时间:\n\n\/\/ 主窗口 的 创建完毕 事件处理函数\n函数 主窗口.创建完毕 () {\n    \/\/ 在此处编写 主窗口 创建完毕 事件的代码\n\n}\n\n\n\/\/ 主窗口 的 位置改变 事件处理函数\n函数 主窗口.位置改变 () {\n\t\n}<\/code><\/pre><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>错误\tD:\/Y++_sources\/MyProject1\/source\/main.yc\t0\t0\t第 1 行：Y++ 编译失败。请检查最近修改的命令、变量、函数参数、数组下标或括号匹配；如果确认 Y++ 写法无误，请提交项目用于定位。<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>标准窗口添加窗口位置改变事件函数运行会报错<\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"v1.0.0.5","os":"","contact":"","attachment":"","ip":"112.245.191.167","create_time":"2026-07-31 17:05:28","update_time":"2026-08-05 10:07:12","is_featured":0,"view_count":7,"username":"bailandai","nickname":"摆烂呆","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2082,"user_id":1105,"title":"空格无法快速键入代码","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>v1.0.0.5<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260730223148_9347e0399274b5e9.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>无<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>只能手动点击代码快速键入，空格不会快速键入。例如图片里的那个“真”，输入“z”再空格会变成“z ”而不是“真”<\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"high","browser":"v1.0.0.5","os":"","contact":"","attachment":"\/storage\/attachments\/20260730223148_9347e0399274b5e9.webp","ip":"112.245.191.167","create_time":"2026-07-30 22:33:09","update_time":"2026-08-05 10:07:13","is_featured":0,"view_count":5,"username":"bailandai","nickname":"摆烂呆","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2081,"user_id":1105,"title":"生成的窗口大小可以随意拖到","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>v1.0.0.5<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260730222008_0c68509196d114e5.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>无<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>生成的程序程序大小可以随意拖动，甚至可以让窗口大小变成0(看不见也点不到，彻底消失)<\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"urgent","browser":"v1.0.0.5","os":"","contact":"","attachment":"\/storage\/attachments\/20260730222008_0c68509196d114e5.webp","ip":"112.245.191.167","create_time":"2026-07-30 22:20:53","update_time":"2026-08-05 10:07:18","is_featured":0,"view_count":7,"username":"bailandai","nickname":"摆烂呆","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2080,"user_id":1105,"title":"显示加载动画BUG","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>v1.0.0.5<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260730221605_cfa94474cc8a2956.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>无<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3><span>显示加载动画拖动窗口不跟着走啊，而且动画也与填的数字也不相符<\/span><\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"v1.0.0.5","os":"","contact":"","attachment":"\/storage\/attachments\/20260730221605_cfa94474cc8a2956.webp","ip":"112.245.191.167","create_time":"2026-07-30 22:16:22","update_time":"2026-08-05 10:07:19","is_featured":0,"view_count":3,"username":"bailandai","nickname":"摆烂呆","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2079,"user_id":1067,"title":"输出调试信息（）函数没有控制台打印效果","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>1.0.0.5<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260728083134_e0f6292db4782757.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>问题代码<\/h3><pre><code>输出调试信息（）函数没有控制台打印效果<\/code><\/pre><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>未报错<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>输出调试信息（）函数没有控制台打印效果<\/div>","status":"processing","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"1.0.0.5","os":"","contact":"","attachment":"\/storage\/attachments\/20260728083134_e0f6292db4782757.webp","ip":"58.34.44.29","create_time":"2026-07-28 08:32:38","update_time":"2026-08-05 10:07:21","is_featured":0,"view_count":13,"username":"ovo555","nickname":"allen","avatar":"","level":1,"reply_count":1,"like_count":0,"favorite_count":0,"last_reply_time":"2026-08-01 11:22:38"},{"id":2078,"user_id":1099,"title":"BUG提交","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>1.0.0.4<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260724160957_2bd926edaf28d556.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>问题代码<\/h3><pre><code>BUG<\/code><\/pre><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>程序底部留白<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3><span>程序底部留白<\/span><\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"1.0.0.4","os":"","contact":"","attachment":"\/storage\/attachments\/20260724160957_2bd926edaf28d556.webp","ip":"124.129.248.66","create_time":"2026-07-24 16:10:40","update_time":"2026-08-05 10:07:25","is_featured":0,"view_count":16,"username":"ss5921wanmei","nickname":"苏小七","avatar":"\/storage\/attachments\/20260723091615_708e13f0ae1051ed.webp","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2077,"user_id":1090,"title":"输出（）命令不能执行？","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>2.4.2.1\/2.4.2.0<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260719105100_a69439606b71003c.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>&quot;编译&quot;、”运行”页面打开都没有啊，试了2.4.2.1版本和2.4.2.0版本都不行啊。在qq群里说要“输出命令已经改版”？？<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>还是无法输出问题，\"编译\"、”运行”页面打开都没有啊，试了2.4.2.1版本和2.4.2.0<p><img src=\"\/storage\/attachments\/20260719103124_bda5bce8d866d6f2.webp\" alt=\"73ba3a85bc3cb23c4aa55b6cd2eb8f4.jpg\"><\/p><p><br><\/p>版本都不行啊。在qq群里说要“输出命令已经改版”？？<\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"2.4.2.1\/2.4.2.0","os":"","contact":"","attachment":"\/storage\/attachments\/20260719105100_a69439606b71003c.webp","ip":"111.182.121.86","create_time":"2026-07-19 10:51:05","update_time":"2026-08-05 10:07:28","is_featured":0,"view_count":41,"username":"ssshill","nickname":"hill","avatar":"","level":1,"reply_count":5,"like_count":0,"favorite_count":0,"last_reply_time":"2026-07-20 19:26:05"},{"id":2076,"user_id":1090,"title":"试用写一个helloworld，弹窗可以，输出()不知道显示到哪儿了？","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>2.4.2.1<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260718103032_3fdadb21e1fdc274.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>试用写一个helloworld，弹窗可以，输出()不知道显示到哪儿了？<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3><div>1、试用写一个helloworld，弹窗可以，输出()不知道显示到哪儿了？<\/div><div><span>2、提示框 () 这个命令不知道怎么用？根据提示0参数？放不放参数都不行？<\/span><\/div><div><div>3、编译一个helloworld体积有2349k，真不小啊，时间也不短4264ms<\/div><div>4、有错误不知道在哪儿？显示0行0列，只能删了重写。<\/div><\/div><div>5、总体还不错，继续加油！<\/div><\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"2.4.2.1","os":"","contact":"","attachment":"\/storage\/attachments\/20260718103032_3fdadb21e1fdc274.webp","ip":"111.182.121.86","create_time":"2026-07-18 10:31:45","update_time":"2026-07-18 16:27:51","is_featured":0,"view_count":33,"username":"ssshill","nickname":"hill","avatar":"","level":1,"reply_count":1,"like_count":0,"favorite_count":0,"last_reply_time":"2026-07-18 16:26:55"},{"id":2075,"user_id":1089,"title":"单击已有函数名会出现候选命令","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>v1.0.0.2<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260718035951_6da80a9c8ccc049f.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>单击已有函数名会出现候选命令 经常会误点导致命令给插入到光标位置 能否修复下<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>单击已有函数名会出现候选命令 经常会误点导致命令给插入到光标位置 能否修复下&nbsp;<\/div>","status":"processing","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"v1.0.0.2","os":"","contact":"","attachment":"\/storage\/attachments\/20260718035951_6da80a9c8ccc049f.webp","ip":"78.92.153.145","create_time":"2026-07-18 03:59:55","update_time":"2026-07-18 16:27:52","is_featured":0,"view_count":13,"username":"w3516330","nickname":"xiahaha","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2074,"user_id":1035,"title":"建议：运行过后还是要支持撤销（像易语言那样），不然不知道修改后的代码是否正确","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>x64 1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题代码<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>.<\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"x64 1.0.0.1","os":"","contact":"","attachment":"","ip":"119.0.31.174","create_time":"2026-07-16 23:48:40","update_time":"2026-07-18 16:27:56","is_featured":0,"view_count":18,"username":"12392841","nickname":"小九","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2073,"user_id":1085,"title":"撤销功能会引发ide闪退","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>v1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题代码<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>撤销多了直接就闪退了<\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"high","browser":"v1.0.0.1","os":"","contact":"","attachment":"","ip":"125.70.99.234","create_time":"2026-07-16 21:51:22","update_time":"2026-07-17 08:37:05","is_featured":0,"view_count":5,"username":"494437673","nickname":"殇","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2072,"user_id":1035,"title":"点击IDE左上角保存按钮不生效","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>x64 1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260716201616_2323567ec71bed21.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>点击保存按钮不生效&nbsp; 点击关闭IDE的时候还是会提示是否保存<\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"x64 1.0.0.1","os":"","contact":"","attachment":"\/storage\/attachments\/20260716201616_2323567ec71bed21.webp","ip":"119.0.31.174","create_time":"2026-07-16 20:16:37","update_time":"2026-07-17 08:37:08","is_featured":0,"view_count":8,"username":"12392841","nickname":"小九","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2071,"user_id":1035,"title":"表格清空命令无效，正常应该清空所有行","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>x64 1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题代码<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>.<\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"x64 1.0.0.1","os":"","contact":"","attachment":"","ip":"119.0.31.174","create_time":"2026-07-16 20:15:20","update_time":"2026-07-17 08:37:09","is_featured":0,"view_count":5,"username":"12392841","nickname":"小九","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2070,"user_id":1085,"title":"新建项目建议检测目标文件夹是否有同名项目","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>v1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题代码<\/h3><pre><code>无<\/code><\/pre><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>奇怪得报错信息<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>如果已有同名项目新建得项目会出错!<\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"high","browser":"v1.0.0.1","os":"","contact":"","attachment":"","ip":"125.70.99.234","create_time":"2026-07-16 20:14:21","update_time":"2026-07-17 08:37:11","is_featured":0,"view_count":4,"username":"494437673","nickname":"殇","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2069,"user_id":1085,"title":"空程序报错","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>v1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260716200618_bfe0c4bd318803b1.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>问题代码<\/h3><pre><code>无代码<\/code><\/pre><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.8def.5f84.2e9a2bd9”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t第 1 行：Y++ 编译失败。请检查最近修改的命令、变量、函数参数、数组下标或括号匹配；如果确认 Y++ 写法无误，请提交项目用于定位。\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.5b9e.4f8b.2e940411”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.8def.5f84.2e9a2bd9”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.5b9e.4f8b.2e940411”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.8def.5f84.2e9a2bd9”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.8def.5f84.2e9a2bd9”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.8def.5f84.2e9a2bd9”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.8def.5f84.2e9a2bd9”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.8def.5f84.2e9a2bd9”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.5b9e.4f8b.2e940411”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.8def.5f84.2e9a2bd9”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.5b9e.4f8b.2e940411”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.8def.5f84.2e9a2bd9”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.5b9e.4f8b.2e940411”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.8def.5f84.2e9a2bd9”: 未声明的标识符\n错误\tF:\/y++\/MyProject\/source\/main.yc\t0\t0\t“ysv..63d2.4ef6.5b9e.4f8b.2e940411”: 未声明的标识符<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>空程序 设置了一些菜单选项<\/div>","status":"fixed","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"v1.0.0.1","os":"","contact":"","attachment":"\/storage\/attachments\/20260716200618_bfe0c4bd318803b1.webp","ip":"125.70.99.234","create_time":"2026-07-16 20:06:46","update_time":"2026-07-17 08:37:12","is_featured":0,"view_count":4,"username":"494437673","nickname":"殇","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2068,"user_id":1035,"title":"已经收缩的函数，运行后会全部自动展开","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>x64 1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题代码<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>.<\/div>","status":"processing","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"x64 1.0.0.1","os":"","contact":"","attachment":"","ip":"119.0.31.174","create_time":"2026-07-16 20:00:29","update_time":"2026-07-17 08:37:21","is_featured":0,"view_count":4,"username":"12392841","nickname":"小九","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2067,"user_id":1035,"title":"搜索支持库以后运行，支持库大部分会全部展开，并且会跳到其他地方，然后直接删除搜索重新输入","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>x64 1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260716195206_6f86547af9d77761.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>搜索支持库以后运行，支持库大部分会全部展开，并且会跳到其他地方，然后直接删除搜索重新输入<\/div>","status":"processing","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"x64 1.0.0.1","os":"","contact":"","attachment":"\/storage\/attachments\/20260716195206_6f86547af9d77761.webp","ip":"119.0.31.174","create_time":"2026-07-16 19:52:29","update_time":"2026-07-17 08:37:40","is_featured":0,"view_count":5,"username":"12392841","nickname":"小九","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2066,"user_id":1035,"title":"已完整代码还提示可选代码，需优化，具体看图","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>x64 1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260716194610_b6c2a8497456561e.gif\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>已完整代码不再弹出可选择代码，或再次点击代码 不会错误插入<\/div>","status":"processing","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"x64 1.0.0.1","os":"","contact":"","attachment":"\/storage\/attachments\/20260716194610_b6c2a8497456561e.gif","ip":"119.0.31.174","create_time":"2026-07-16 19:46:53","update_time":"2026-07-17 08:37:39","is_featured":0,"view_count":7,"username":"12392841","nickname":"小九","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2065,"user_id":1035,"title":"函数缩回以后按回车还是在函数内部增加了空格，具体看图","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>x64 1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260716193705_b0f8b70fb832b299.gif\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>正常应该是在花括号下面<\/div>","status":"open","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"x64 1.0.0.1","os":"","contact":"","attachment":"\/storage\/attachments\/20260716193705_b0f8b70fb832b299.gif","ip":"119.0.31.174","create_time":"2026-07-16 19:37:57","update_time":"2026-07-16 19:37:57","is_featured":0,"view_count":6,"username":"12392841","nickname":"小九","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2064,"user_id":1035,"title":"建议：取出窗口上Y++标题","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>x64 1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260716193111_1f165c1779d767c3.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>.<\/div>","status":"processing","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"x64 1.0.0.1","os":"","contact":"","attachment":"\/storage\/attachments\/20260716193111_1f165c1779d767c3.webp","ip":"119.0.31.174","create_time":"2026-07-16 19:31:23","update_time":"2026-07-17 08:37:49","is_featured":0,"view_count":9,"username":"12392841","nickname":"小九","avatar":"","level":1,"reply_count":1,"like_count":0,"favorite_count":0,"last_reply_time":"2026-07-16 20:22:36"},{"id":2063,"user_id":1035,"title":"取进程路径错误传参不报错问题","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>x64 1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260716192044_32df1edcee44cfb7.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>单独使用这个命令传入文本型会报错，用文本分割 数组成员传入就不会报错<\/div>","status":"open","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"x64 1.0.0.1","os":"","contact":"","attachment":"\/storage\/attachments\/20260716192044_32df1edcee44cfb7.webp","ip":"119.0.31.174","create_time":"2026-07-16 19:22:16","update_time":"2026-07-16 19:22:16","is_featured":0,"view_count":5,"username":"12392841","nickname":"小九","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null},{"id":2062,"user_id":1035,"title":"IDE设计窗口组件超出没有限制，下方","content":"<div class=\"post-section\"><h3>版本号<\/h3><p>x64 1.0.0.1<\/p><\/div><div class=\"post-section\"><h3>问题截图<\/h3><p><img src=\"\/storage\/attachments\/20260716185504_aa0c42c1978b57b3.webp\" alt=\"问题截图\"><\/p><\/div><div class=\"post-section\"><h3>报错信息<\/h3><pre><code>.<\/code><\/pre><\/div><div class=\"post-section\"><h3>问题描述<\/h3>上左右可以不超出，下方能超出<\/div>","status":"processing","is_recycle":0,"is_top":0,"is_bold":0,"is_italic":0,"is_underline":0,"title_color":"","font_family":"","font_size":"","category":"BUG反馈","priority":"normal","browser":"x64 1.0.0.1","os":"","contact":"","attachment":"\/storage\/attachments\/20260716185504_aa0c42c1978b57b3.webp","ip":"119.0.31.174","create_time":"2026-07-16 18:55:30","update_time":"2026-07-17 08:37:57","is_featured":0,"view_count":6,"username":"12392841","nickname":"小九","avatar":"","level":1,"reply_count":0,"like_count":0,"favorite_count":0,"last_reply_time":null}],"total":78,"page":1,"limit":30,"has_more":true}}