# 【Phase 1 已完成 2026-07-05,使用者實測OK】實作記錄見 doc/UpdateList.md 06:30 條目

# 表單設計模式(SubForm2 所見即所得) — Phase 1 規劃定案
日期: 2026-07-04 深夜定案,待實作

## 進入方式(定案)
- 「雙擊」明細表單的上框線/抬頭處 → 進入設計模式(不占任何熱鍵)
- 離開: ESC = 寫回+重建;可考慮右鍵=放棄不存

## 資料模型(已驗證)
SUBFORM2 每筆 = 表單一個元素,DPI 80/100 兩組各自獨立(filter 已罩):
- NSUBTYPE: 1=可輸入GET 2=唯讀顯示欄 3=水平分段線(NSAYROW=線所在列)
- NSAYROW/NSAYCOL + CSAYSTRING = 標籤:  NGETROW/NGETCOL/NGETWIDTH/CPICTURE = 輸入框
- CORDER = Tab輸入順序(=seek順序鍵,「絕不可因移動位置而改動」)
- 座標為絕對座標(參考 WinFormShiftGets 經驗)

## Phase 1 能力
1. 雙擊上框進入設計模式(提示列: 拖曳:移動 拖GET右緣:調寬 ESC:存檔離開)
2. 移動欄位: type1/2 標籤+GET 成對拖曳(同delta動 NSAYROW/COL+NGETROW/COL)
3. 移動分段線: type3 只能上下拖(只改 NSAYROW)
4. 拖 GET 右緣調寬: NGETWIDTH + @S picture 同步(比照 TABLE SaveTblLayout v3:顯示寬)
5. ESC 一次寫回 SUBFORM2(RLock逐筆,當前DPI組) → ASize(GetList,0) 清空 → 重跑 InitialForm 重建 → aSayReg/熱區重註冊
6. 夾值: nEffTop+1..nEffBottom-1 / nEffCenter+1..nEffRight-1(標籤+GET 視為一組算邊界)

## 已知坑(先列)
- 重建前必 ASize(GetList,0)(WinFormShiftGets 五坑:否則新舊GET混疊)
- InitialForm 讀取端有 GET 截斷邏輯(nCol+1+nGetLength>=nEffRight 時改@S壓縮)——調寬上限對齊
- PartsForm A2/A3 也走 InitialForm——Phase1 只開放標準 WinForm 雙窗;入口 dblclick 判斷情境
- 拖曳預覽用 SaveScreen/RestScreen 虛影(同 PartsWinMove 手法)
- MsBrowseKey/滑鼠路由: dblclick 上框要能到達(參考 aFrameRect 放行經驗:hit-test 沒反應先查上游吞點擊)
- hover 反白: 標籤+GET 同組一起亮;type3 線整條亮

## 試點畫面
Parts/A 明細表單(零件明細資料):分段線/唯讀欄/GET/長短欄齊全

## Phase 2/3(後續)
- 全 WinForm 開放、Shift拖=只動GET不動標籤
- 改標籤文字/調Tab順序(CORDER)/隱藏欄位/新增刪除欄位(視需求)
