任务说明补齐 23 份;设计器支持窗体改名

- 其余 21 个实验的 task.md:控件名照示例代码,"在平台上怎么试"和评分步骤一致,列出书上的印刷错误和控件名不一致
- 窗体改名:属性窗口里选中窗体可以改名称,类名、构造函数、new X()、Program.cs 和两个文件名一起改;方法名和字符串不变
- 11 个主窗体不叫 Form1 的实验,任务说明提示先改窗体名再双击生成 Load 事件
- 测试:表头只认分隔行上面那一行,数据行里出现"名称"不再被当成表头

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-26 13:55:39 +08:00
1 parent 90b739a2c7
commit d4b8bf9241
29 files changed
+1236 -31

No files matched your search

+15 -1
View File
@@ -10,7 +10,7 @@ import FormDesigner from '../designer/FormDesigner.vue'
import { createDesignerHistory } from '../designer/history'
import { gallery, loadGallery, projectResources, resourcePrefix, resourcesFile, RESOURCES_FILE } from '../designer/resources'
import ResourcesDialog from '../designer/ResourcesDialog.vue'
import { classPathError, formNameTaken, isFormDesigner, newClassFile, newFormFiles, nextFormName, projectNamespace, startupForm } from '../designer/templates'
import { classPathError, formNameTaken, isFormDesigner, newClassFile, newFormFiles, nextFormName, projectNamespace, renameForm, startupForm } from '../designer/templates'
import CodeEditor from '../editor/CodeEditor.vue'
import { api } from '../api'
import { currentUser, logout } from '../auth'
@@ -417,6 +417,18 @@ function deleteForm() {
activeTab.value = forms.value[0]?.tab ?? files.value[0]?.path
}
const checkFormName = (name: string) => (formNameTaken(files.value, name) ? `已经有名为“${name}”的窗体或类` : null)
/** 属性窗口里给窗体改名:类名、引用和两个文件名一起改(这一步不进设计器的撤销历史) */
function renameActiveForm(name: string) {
const form = activeForm.value
if (!form) return
files.value = renameForm(files.value, form.designer, name)
designerHistory.clear(form.designer)
filesChanged()
activeTab.value = DESIGN + form.designer.replace(/[^/]*\.Designer\.cs$/, `${name}.Designer.cs`)
}
/** 设计器改动了 Designer.cs(以及插入事件处理方法时的代码文件) */
function onDesignerUpdate(designerText: string, codeText?: string) {
const form = activeForm.value
@@ -627,7 +639,9 @@ function run() {
@open-code="openCode"
@open-designer-file="activeTab = activeForm.designer"
:resources="designerResources"
:check-form-name="checkFormName"
@add-resource="resourcesOpen = true"
@rename-form="renameActiveForm"
/>
<ResourcesDialog v-model:show="resourcesOpen" :selected="resourceNames" @save="saveResources" />
<CodeEditor