From 508bc7bdccb1de1f48c9d2f8062d195269f45f31 Mon Sep 17 00:00:00 2001
From: curtis <curtis@i-mps.com>
Date: 星期一, 30 三月 2026 10:48:29 +0800
Subject: [PATCH] feat: mermaid chart
---
reassemble/mermaid/omr/OMRCheckCase.md | 31 ++
reassemble/mermaid/omr/OMRErrini2List.md | 17 +
reassemble/bloc/mermaid/SetUseCase.md | 12 +
reassemble/img/mermaid/GetSiteOMR.md | 39 +++
reassemble/mermaid/omr/DistinctFormCode.md | 26 ++
reassemble/img/mermaid/ImageReSize_FormID.md | 36 +++
reassemble/scan/mermaid/R_W_Scanini.md | 15 +
reassemble/scan/mermaid/PageEnd.md | 38 +++
reassemble/bloc/mermaid/BarCode2FormID.md | 19 +
reassemble/img/mermaid/CheckNeedCrop.md | 22 ++
reassemble/bloc/mermaid/GetUseCase.md | 12 +
reassemble/img/mermaid/ImageReSize_tmp.md | 20 +
reassemble/mermaid/omr/OMRErrini2ListForLog.md | 21 +
reassemble/scan/mermaid/OnAcquire.md | 39 +++
doc/curtis/prompt/scanimpl_analysis/05/scanimpl_flow_chart.md | 24 ++
reassemble/mermaid/omr/CheckRule2OMRErrInfo.md | 24 ++
reassemble/view/mermaid/lfcycle/Timer1Timer.md | 38 +++
reassemble/view/mermaid/msger/DataLoading.md | 23 ++
reassemble/bloc/mermaid/BarCode2CaseID.md | 13 +
reassemble/view/mermaid/msger/StatusBar1DblClick.md | 9
reassemble/view/mermaid/lfcycle/InitialLanguage.md | 22 ++
reassemble/view/mermaid/lfcycle/DestroyEvent.md | 14 +
reassemble/scan/mermaid/initkscan.md | 21 +
reassemble/view/mermaid/lfcycle/Timer2Timer.md | 9
reassemble/scan/mermaid/StatrTwainScan.md | 35 +++
reassemble/scan/mermaid/GetDefScanIni.md | 23 ++
reassemble/mermaid/omr/OMRErr2ini.md | 10
reassemble/scan/mermaid/PageDone.md | 21 +
reassemble/view/mermaid/lfcycle/EventSinkChanged.md | 7
29 files changed, 640 insertions(+), 0 deletions(-)
diff --git a/doc/curtis/prompt/scanimpl_analysis/05/scanimpl_flow_chart.md b/doc/curtis/prompt/scanimpl_analysis/05/scanimpl_flow_chart.md
new file mode 100644
index 0000000..4ae80b2
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/05/scanimpl_flow_chart.md
@@ -0,0 +1,24 @@
+
+
+### 0.8 影像相關方法 flow chart 繪制
+- **目標**: 針對目標路徑下的所有 pascal 對其重要方法進行 mermaid chart 繪制
+- **輸入**: reassemble/scan/*.pas, reassemble/img/*.pas
+- **處理邏輯**:
+ 1. 遍歷目標資料夾下的方法,若該方法描述超過一行為其繪制 mermaid flow chart
+- **輸出腳本**:`{{目標路徑}}/mermaid/{{方法名稱}}.md`
+
+
+### 0.9 View 相關方法 flow chart 繪制
+- **目標**: 針對目標路徑下的所有 pascal 對其重要方法進行 mermaid chart 繪制
+- **輸入**: reassemble/view/*.pas, reassemble/CB_IMGPSScanImp.lfcycle.pas
+- **處理邏輯**:
+ 1. 遍歷目標資料夾下的方法,若該方法描述超過一行為其繪制 mermaid flow chart
+- **輸出腳本**:`{{目標路徑}}/mermaid/{{方法名稱}}.md`
+
+### 0.10 bloc 相關方法 flow chart 繪制
+- **目標**: 針對目標路徑下的所有 pascal 對其重要方法進行 mermaid chart 繪制
+- **輸入**: reassemble/bloc/*.pas, reassemble/CB_IMGPSScanImp.omr.pas
+- **處理邏輯**:
+ 1. 遍歷目標資料夾下的方法,若該方法描述超過一行為其繪制 mermaid flow chart
+- **輸出腳本**:`{{目標路徑}}/mermaid/{{方法名稱}}.md`
+
diff --git a/reassemble/bloc/mermaid/BarCode2CaseID.md b/reassemble/bloc/mermaid/BarCode2CaseID.md
new file mode 100644
index 0000000..47a3b0c
--- /dev/null
+++ b/reassemble/bloc/mermaid/BarCode2CaseID.md
@@ -0,0 +1,13 @@
+```mermaid
+graph TD
+ Start([開始 BarCode2CaseID]) --> Init[Result = 空字串]
+ Init --> LoopStart{遍歷 MpsBarcodeinf.Count}
+ LoopStart -- i=1 to Count --> CheckLen{長度 == CaseIDLength?}
+
+ CheckLen -- 是 --> Found[Result = 條碼內容<br/>Break 迴圈]
+ CheckLen -- 否 --> LoopNext[下一個條碼]
+ LoopNext --> LoopStart
+
+ Found --> End([結束])
+ LoopStart -- 結束 --> End
+```
diff --git a/reassemble/bloc/mermaid/BarCode2FormID.md b/reassemble/bloc/mermaid/BarCode2FormID.md
new file mode 100644
index 0000000..e0f9e60
--- /dev/null
+++ b/reassemble/bloc/mermaid/BarCode2FormID.md
@@ -0,0 +1,19 @@
+```mermaid
+graph TD
+ Start([開始 BarCode2FormID]) --> Init[Result = 空字串]
+ Init --> LoopStart{遍歷 MpsBarcodeinf.Count}
+ LoopStart -- i=1 to Count --> CheckLen{長度 == FormIDLength?}
+
+ CheckLen -- 是 --> CheckAppear{FormIDAppear 驗證?}
+ CheckLen -- 否 --> LoopNext[下一個條碼]
+
+ CheckAppear -- 通過 --> CheckExist{FormIDExists 驗證?}
+ CheckAppear -- 不通過 --> ClearForm[FormID = 空] --> LoopNext
+
+ CheckExist -- 通過 --> Found[Result = FormID<br/>Break 迴圈]
+ CheckExist -- 不通過 --> LoopNext[下一個條碼]
+
+ LoopNext --> LoopStart
+ Found --> End([結束])
+ LoopStart -- 結束 --> End
+```
diff --git a/reassemble/bloc/mermaid/GetUseCase.md b/reassemble/bloc/mermaid/GetUseCase.md
new file mode 100644
index 0000000..be4e5c3
--- /dev/null
+++ b/reassemble/bloc/mermaid/GetUseCase.md
@@ -0,0 +1,12 @@
+```mermaid
+graph TD
+ Start([開始 GetUseCase]) --> InitIni[建立 TIniFile: Path + 'UseCase.ini']
+ InitIni --> ModeCheck{檢查 Mode}
+
+ ModeCheck -- 'F' (From) --> ReadFrom[讀取 FROM_CASEID]
+ ModeCheck -- 'T' (To) --> ReadTo[讀取 TO_CASEID]
+
+ ReadFrom --> Finally[釋放 TIniFile]
+ ReadTo --> Finally
+ Finally --> End([返回 Result])
+```
diff --git a/reassemble/bloc/mermaid/SetUseCase.md b/reassemble/bloc/mermaid/SetUseCase.md
new file mode 100644
index 0000000..e7ee9cd
--- /dev/null
+++ b/reassemble/bloc/mermaid/SetUseCase.md
@@ -0,0 +1,12 @@
+```mermaid
+graph TD
+ Start([開始 SetUseCase]) --> InitIni[建立 TIniFile: Path + 'UseCase.ini']
+ InitIni --> ModeCheck{檢查 Mode}
+
+ ModeCheck -- 'A' (Add) --> AddAction[寫入 DocDir 區段:<br/>FROM_CASEID = FormCaseID<br/>TO_CASEID = ToCaseID]
+ ModeCheck -- 'D' (Delete) --> DelAction[刪除 DocDir 區段]
+
+ AddAction --> Finally[釋放 TIniFile]
+ DelAction --> Finally
+ Finally --> End([結束])
+```
diff --git a/reassemble/img/mermaid/CheckNeedCrop.md b/reassemble/img/mermaid/CheckNeedCrop.md
new file mode 100644
index 0000000..fe8a6b7
--- /dev/null
+++ b/reassemble/img/mermaid/CheckNeedCrop.md
@@ -0,0 +1,22 @@
+```mermaid
+flowchart TD
+ Start([開始 CheckNeedCrop]) --> Init[Result = False, FormIDCount = 0]
+ Init --> CheckWidth{影像寬度 > 4 * XDPI?}
+
+ CheckWidth -- 是 --> LoopStart[遍歷條碼清單 MpsBarcodeinf]
+ CheckWidth -- 否 --> FinalCheck
+
+ LoopStart --> CheckBarcode{長度正確且表單代碼存在?}
+ CheckBarcode -- 是 --> IncCount[FormIDCount + 1]
+ CheckBarcode -- 否 --> NextItem
+ IncCount --> NextItem{是否還有下一個?}
+
+ NextItem -- 是 --> LoopStart
+ NextItem -- 否 --> FinalCheck
+
+ FinalCheck{FormIDCount 等於 2?}
+ FinalCheck -- 是 --> SetTrue[Result = True]
+ FinalCheck -- 否 --> End([結束])
+
+ SetTrue --> End
+```
diff --git a/reassemble/img/mermaid/GetSiteOMR.md b/reassemble/img/mermaid/GetSiteOMR.md
new file mode 100644
index 0000000..125b0a1
--- /dev/null
+++ b/reassemble/img/mermaid/GetSiteOMR.md
@@ -0,0 +1,39 @@
+```mermaid
+flowchart TD
+ Start([開始 GetSiteOMR]) --> Init[Result = 0]
+ Init --> CheckLoad{影像檔名不符且非空?}
+
+ CheckLoad -- 是 --> LoadImg[載入影像 ImageScrollBox1.LoadFromFile]
+ LoadImg --> ClearBW[初始化黑白緩衝區 ClearLine]
+ ClearBW --> Redraw[重繪影像 ISB_BW.Redraw]
+ Redraw --> ProcessMsg[處理系統訊息 Application.ProcessMessages]
+ ProcessMsg --> CheckFileExist
+
+ CheckLoad -- 否 --> CheckFileExist{ImageScrollBox1.FileName 非空?}
+
+ CheckFileExist -- 是 --> GetInfo[獲取 DPI 與影像寬高]
+ GetInfo --> ConvRect[轉換 Site 字串為 OMRRect 矩陣\nCM_Str2Rect]
+ ConvRect --> LogDisp[記錄定位點與矩陣資訊到 Display1]
+
+ LogDisp --> BoundaryL{Left < 0?}
+ BoundaryL -- 是 --> SetL[Left = 0]
+ BoundaryL -- 否 --> BoundaryT{Top < 0?}
+ SetL --> BoundaryT
+
+ BoundaryT -- 是 --> SetT[Top = 0]
+ BoundaryT -- 否 --> BoundaryR{Right > Width?}
+ SetT --> BoundaryR
+
+ BoundaryR -- 是 --> SetR[Right = Width]
+ BoundaryR -- 否 --> BoundaryB{Bottom > Height?}
+ SetR --> BoundaryB
+
+ BoundaryB -- 是 --> SetB[Bottom = Height]
+ BoundaryB -- 否 --> CallOMR
+ SetB --> CallOMR
+
+ CallOMR[呼叫 Get_OMR 執行辨識] --> SetResult[Result = 辨識結果]
+ SetResult --> End([結束])
+
+ CheckFileExist -- 否 --> End
+```
diff --git a/reassemble/img/mermaid/ImageReSize_FormID.md b/reassemble/img/mermaid/ImageReSize_FormID.md
new file mode 100644
index 0000000..d4bca0e
--- /dev/null
+++ b/reassemble/img/mermaid/ImageReSize_FormID.md
@@ -0,0 +1,36 @@
+```mermaid
+flowchart TD
+ Start([開始 ImageReSize_FormID]) --> GetFormID[獲取 FormID]
+ GetFormID --> CheckID{FormID 為空?}
+ CheckID -- 是 --> End([結束])
+ CheckID -- 否 --> QueryDB[查詢資料庫獲取表單高寬與定位類型]
+
+ QueryDB --> Found{找到資料?}
+ Found -- 否 --> End
+ Found -- 是 --> CheckType{定位類型為 ANCHOR/FRAME\n且高寬資訊完整?}
+
+ CheckType -- 否 --> End
+ CheckType -- 是 --> LoadImg[載入影像檔]
+
+ LoadImg --> CheckSub{補件模式且圖檔已存在?}
+ CheckSub -- 是 --> End
+ CheckSub -- 否 --> FindPt1[執行定位點尋找 FindPoint]
+
+ FindPt1 --> CalcSize[計算偏移與縮放比例 CheckSize]
+ CalcSize --> Resize[執行影像縮放 ImageResize]
+ Resize --> FindPt2[縮放後重新定位 FindPoint]
+
+ FindPt2 --> CheckSuccess{SizeStr 有效且非 ERROR?}
+
+ CheckSuccess -- 是 --> CheckMD5{檢查 MD5 是否重複}
+ CheckMD5 --> SaveImg[儲存縮放後影像]
+ SaveImg --> LogResize[記錄縮放資訊到 ReSize.dat]
+ LogResize --> ClearName
+
+ CheckSuccess -- 否 --> CheckError{SizeStr 為 ERROR?}
+ CheckError -- 是 --> LogError[記錄錯誤到 AnchorError.dat]
+ LogError --> ClearName
+ CheckError -- 否 --> ClearName
+
+ ClearName[清除 FileName 快取] --> End
+```
diff --git a/reassemble/img/mermaid/ImageReSize_tmp.md b/reassemble/img/mermaid/ImageReSize_tmp.md
new file mode 100644
index 0000000..e66af06
--- /dev/null
+++ b/reassemble/img/mermaid/ImageReSize_tmp.md
@@ -0,0 +1,20 @@
+```mermaid
+flowchart TD
+ Start([開始 ImageReSize_tmp]) --> QueryDB[查詢資料庫 FORM_INF_List]
+ QueryDB --> Found{找到表單資訊?}
+
+ Found -- 是 --> CheckType{定位為 ANCHOR/FRAME\n且高寬非空?}
+ Found -- 否 --> End([結束])
+
+ CheckType -- 是 --> LoadImg[載入暫存影像檔]
+ CheckType -- 否 --> End
+
+ LoadImg --> CalcSize[執行 CheckSize 檢查縮放]
+ CalcSize --> NeedSave{SizeStr 非空?}
+
+ NeedSave -- 是 --> SaveImg[儲存調整後的影像]
+ NeedSave -- 否 --> ClearName[清除 FileName 快取]
+
+ SaveImg --> ClearName[清除 FileName 快取]
+ ClearName --> End
+```
diff --git a/reassemble/mermaid/omr/CheckRule2OMRErrInfo.md b/reassemble/mermaid/omr/CheckRule2OMRErrInfo.md
new file mode 100644
index 0000000..d7f1036
--- /dev/null
+++ b/reassemble/mermaid/omr/CheckRule2OMRErrInfo.md
@@ -0,0 +1,24 @@
+```mermaid
+graph TD
+ Start([開始 CheckRule2OMRErrInfo]) --> LoopStart{遍歷 i = 1 to 11}
+ LoopStart -- I --> FindData[FindSQLData 查詢 CHECK_RULE_INF_List]
+
+ FindData -- 找到資料 --> SetDisplay{MESG_SHOW_TYPE?}
+ SetDisplay -- '1' --> DispTrue[OMRErrInfo.Display = True]
+ SetDisplay -- '2' --> DispFalse[OMRErrInfo.Display = False]
+
+ DispTrue --> SetIgnore{MESG_DISP_TYPE?}
+ DispFalse --> SetIgnore
+
+ SetIgnore -- '1' --> IgnTrue[OMRErrInfo.Ignore = True]
+ SetIgnore -- '2' --> IgnFalse[OMRErrInfo.Ignore = False]
+
+ IgnTrue --> SetOther[設定 Info = CHECK_MESG<br/>設定 Mode = SCAN_MODE]
+ IgnFalse --> SetOther
+
+ SetOther --> LoopNext[下一個 i]
+ FindData -- 沒找到 --> LoopNext
+
+ LoopNext --> LoopStart
+ LoopStart -- 結束 --> End([結束])
+```
diff --git a/reassemble/mermaid/omr/DistinctFormCode.md b/reassemble/mermaid/omr/DistinctFormCode.md
new file mode 100644
index 0000000..3181d4c
--- /dev/null
+++ b/reassemble/mermaid/omr/DistinctFormCode.md
@@ -0,0 +1,26 @@
+```mermaid
+graph TD
+ Start([開始 DistinctFormCode]) --> LoadFile[讀取 Context.dat 到 TStringList]
+ LoadFile --> LoopFile{遍歷檔案清單}
+
+ LoopFile -- i --> CheckExist{影像是否存在或已縮放?}
+ CheckExist -- 是 --> Skip[Continue 下一個]
+ CheckExist -- 否 --> GetForm[提取檔案的 FormCode]
+
+ GetForm --> LoopOMR{遍歷 OMRFileList}
+ LoopOMR -- n --> CompareForm{FormCode 是否重複?}
+ CompareForm -- 是 --> MarkRepeat[AddOk = False, Break]
+ CompareForm -- 否 --> NextOMR[下一個 OMR 項目]
+ NextOMR --> LoopOMR
+
+ MarkRepeat --> CheckAdd{AddOk?}
+ NextOMR -- 結束 --> CheckAdd
+
+ CheckAdd -- True --> AddList[加入 OMRFileList]
+ CheckAdd -- False --> NextFile[下一個檔案]
+
+ AddList --> NextFile
+ Skip --> NextFile
+ NextFile --> LoopFile
+ LoopFile -- 結束 --> End([結束])
+```
diff --git a/reassemble/mermaid/omr/OMRCheckCase.md b/reassemble/mermaid/omr/OMRCheckCase.md
new file mode 100644
index 0000000..c7fbe9c
--- /dev/null
+++ b/reassemble/mermaid/omr/OMRCheckCase.md
@@ -0,0 +1,31 @@
+```mermaid
+graph TD
+ Start([開始 OMRCheckCase]) --> Init[刪除舊日誌/初始化變數]
+ Init --> GetMainID[獲取 MainFormID]
+
+ GetMainID --> MainCheck{MainFormID 是否存在?}
+ MainCheck -- 否 --> Phase2[進入檔案清單檢查]
+ MainCheck -- 是 --> CheckDep[檢查主要文件頁數 / 相依文件 / 互斥文件]
+
+ CheckDep --> Phase2
+ Phase2 --> LoopContext[遍歷 Context.dat 檢查停用文件]
+
+ LoopContext --> MaxPage[檢查各表單是否超過最大頁數]
+ MaxPage --> LoopOMRFiles{遍歷 OMRFileList 進行欄位檢核}
+
+ LoopOMRFiles -- 每張影像 --> Resize[執行十字定位縮放 ImageReSize_FormID]
+ Resize --> LoadXML[載入對應 XML 規則]
+
+ LoadXML --> CheckField1[Type 1: 必填欄位檢核]
+ CheckField1 --> CheckField3[Type 3: 關聯欄位檢核]
+ CheckField3 --> CheckField8[Type 8: 互斥填寫檢核]
+ CheckField8 --> CheckField4[Type 4: 欄位有值附文件檢核]
+ CheckField4 --> CheckField5[Type 5: 欄位有值不附文件檢核]
+ CheckField5 --> CheckField6[Type 6: 欄位有值寫備註檢核]
+ CheckField6 --> SaveValue[Type 7: OMR 帶值處理]
+
+ SaveValue --> NextOMRFile[下一個影像]
+ NextOMRFile --> LoopOMRFiles
+
+ LoopOMRFiles -- 結束 --> Finish([返回 CaseOk 結果])
+```
diff --git a/reassemble/mermaid/omr/OMRErr2ini.md b/reassemble/mermaid/omr/OMRErr2ini.md
new file mode 100644
index 0000000..deaa7f3
--- /dev/null
+++ b/reassemble/mermaid/omr/OMRErr2ini.md
@@ -0,0 +1,10 @@
+```mermaid
+graph TD
+ Start([開始 OMRErr2ini]) --> CheckDisp{Display?}
+
+ CheckDisp -- True --> IniWrite[開啟 Checkerr.ini<br/>讀取目前 Count 並累加<br/>寫入 Reason, Site, FileName 等詳細資訊]
+ CheckDisp -- False --> DatWrite[開啟 CheckMemo.dat<br/>附加 Reason 錯誤訊息字串]
+
+ IniWrite --> End([結束])
+ DatWrite --> End
+```
diff --git a/reassemble/mermaid/omr/OMRErrini2List.md b/reassemble/mermaid/omr/OMRErrini2List.md
new file mode 100644
index 0000000..29c2e84
--- /dev/null
+++ b/reassemble/mermaid/omr/OMRErrini2List.md
@@ -0,0 +1,17 @@
+```mermaid
+graph TD
+ Start([開始 OMRErrini2List]) --> OpenIni[讀取 Checkerr.ini]
+ OpenIni --> LoopErr{遍歷錯誤序號 i = 1 to Count}
+
+ LoopErr -- i --> CheckDel{Del == False?}
+ CheckDel -- 是 --> AddLV[將 Reason 與索引加入 ListView]
+ CheckDel -- 否 --> NextErr[下一個]
+
+ AddLV --> NextErr
+ NextErr --> LoopErr
+
+ LoopErr -- 結束 --> CheckCount{ListView 是否有資料?}
+ CheckCount -- 有 --> DisableBt[停用立即上傳按鈕 ImmediateBt]
+ CheckCount -- 無 --> End([結束])
+ DisableBt --> End
+```
diff --git a/reassemble/mermaid/omr/OMRErrini2ListForLog.md b/reassemble/mermaid/omr/OMRErrini2ListForLog.md
new file mode 100644
index 0000000..7109cf6
--- /dev/null
+++ b/reassemble/mermaid/omr/OMRErrini2ListForLog.md
@@ -0,0 +1,21 @@
+```mermaid
+graph TD
+ Start([開始 OMRErrini2ListForLog]) --> LoadCases[載入 CaseList.dat]
+ LoadCases --> LoopCases{遍歷每個案件}
+
+ LoopCases -- CaseID --> OpenIni[讀取該案件的 Checkerr.ini]
+ OpenIni --> LoopErr{遍歷 Count}
+
+ LoopErr -- j --> CheckDel{Del == False?}
+ CheckDel -- 是 --> AddToST[將 Reason 加入字串清單]
+ CheckDel -- 否 --> NextErr[下一個錯誤]
+
+ AddToST --> NextErr
+ NextErr --> LoopErr
+
+ LoopErr -- 結束 --> NextCase[下一個案件]
+ NextCase --> LoopCases
+
+ LoopCases -- 結束 --> Result[返回 ST.Text]
+ Result --> End([結束])
+```
diff --git a/reassemble/scan/mermaid/GetDefScanIni.md b/reassemble/scan/mermaid/GetDefScanIni.md
new file mode 100644
index 0000000..645d639
--- /dev/null
+++ b/reassemble/scan/mermaid/GetDefScanIni.md
@@ -0,0 +1,23 @@
+```mermaid
+graph TD
+ Start([Start GetDefScanIni]) --> SetHardDefaults[設定程式內建預設值<br/>Def_DeviceDelete=True, DPI=300 等]
+ SetHardDefaults --> LoopList[遍歷 WORK_INF_List]
+
+ subgraph ParaMatching
+ LoopList --> MatchPara{比對 PARA_NO}
+ MatchPara -- SCAN_BLANKDEL --> UpdBlank[更新空白頁刪除設定]
+ MatchPara -- SCAN_REVERSE --> UpdRev[更新影像反相設定]
+ MatchPara -- SCAN_DPI --> UpdDpi[更新 DPI]
+ MatchPara -- SCAN_DUPLEX --> UpdDup[更新雙面掃瞄]
+ MatchPara -- SCAN_ROTATE --> UpdRot[更新旋轉角度]
+ MatchPara -- SCAN_IMGSET --> UpdImgSet[更新亮度對比設定]
+ MatchPara -- LOCAL_PATH --> UpdPath[更新 ImagePath]
+ MatchPara -- GUIDE/DIV_ID --> UpdFormID[更新導引/分案頁代碼列表]
+ MatchPara -- Others --> UpdMisc[更新壓縮比/上傳限制等]
+ end
+
+ UpdMisc --> LoopNext[下一個參數]
+ LoopNext --> LoopList
+ LoopList -- 結束 --> FinalSet[ScanDuplex := Def_ScanDuplex]
+ FinalSet --> EndGetDef([End])
+```
diff --git a/reassemble/scan/mermaid/OnAcquire.md b/reassemble/scan/mermaid/OnAcquire.md
new file mode 100644
index 0000000..0b40162
--- /dev/null
+++ b/reassemble/scan/mermaid/OnAcquire.md
@@ -0,0 +1,39 @@
+```mermaid
+graph TD
+ Start([Start OnAcquire]) --> GetInfo[取得 pScanInfo]
+ GetInfo --> MultiPage{MultiPage?}
+
+ subgraph ImagePreprocessing
+ MultiPage -- Yes --> AssignDib[Assign DIB to Graphic & Set DPI]
+ AssignDib --> CheckFormat{ImageFormat?}
+ CheckFormat -- BlackWhite --> BWProc[條碼辨識/旋轉/反向/傾斜矯正/清黑邊]
+ CheckFormat -- TrueColor --> ColorProc[條碼辨識/旋轉/設定 JPEG 壓縮]
+ CheckFormat -- Gray/Color256 --> GrayProc[轉灰階/設定 JPEG 壓縮]
+ CheckFormat -- Others --> OtherProc[設定 PackBits 壓縮]
+ end
+
+ subgraph CropAndSave
+ ImagePreprocessing --> CreateTempGr[建立 iGraphic_First, iGraphic_sec]
+ CreateTempGr --> CropCheck{需要裁切 A3?}
+ CropCheck -- Yes --> DoCrop[將影像裁切為左右兩份]
+ CropCheck -- No --> SetFirst[iGraphic := iGraphic_First]
+
+ DoCrop --> SetFirst
+ SetFirst --> WhileLoop{iGraphic 不為空?}
+
+ WhileLoop -- Yes --> BlankCheck{是否刪除空白頁?}
+ BlankCheck -- No/Valid --> PageProcess[UI 顯示影像<br/>PageEnd 決定路徑與檔名]
+ PageProcess --> SaveFile{儲存檔案}
+ SaveFile -- .tif --> AppendTif[Append To Stream]
+ SaveFile -- .jpg --> SaveJpg[Save To File]
+ AppendTif --> DoPageDone[PageDone]
+ SaveJpg --> DoPageDone
+
+ DoPageDone --> NextImg[切換至 iGraphic_Sec 或 設為空]
+ BlankCheck -- IsBlank --> NextImg
+ NextImg --> WhileLoop
+ end
+
+ WhileLoop -- No --> FinallyFree[釋放暫存 Graphic 資源]
+ FinallyFree --> EndOnAcquire([End])
+```
diff --git a/reassemble/scan/mermaid/PageDone.md b/reassemble/scan/mermaid/PageDone.md
new file mode 100644
index 0000000..2a78954
--- /dev/null
+++ b/reassemble/scan/mermaid/PageDone.md
@@ -0,0 +1,21 @@
+```mermaid
+graph TD
+ Start([Start PageDone]) --> IncCount[Scaninfo.ImageCount 遞增]
+ IncCount --> CaseMode{ScanMode?}
+
+ CaseMode -- smNew --> NewMode[根據 ScanImgShowMode 設定 ISB]
+ NewMode --> ShowType{顯示模式?}
+ ShowType -- 清楚/模糊 --> LoadNew[ISB.LoadFromFile<br/>PEFileName]
+ ShowType -- 不顯示 --> smReplace
+
+ CaseMode -- smReplace --> LoadRep[DisplayISB.LoadFromFile]
+ CaseMode -- smInsert --> LoadIns[ISB.LoadFromFile]
+ CaseMode -- smSample --> LoadSam[ISB.LoadFromFile]
+ CaseMode -- smRTS --> EndPageDone
+
+ LoadNew --> EndPageDone
+ LoadRep --> EndPageDone
+ LoadIns --> EndPageDone
+ LoadSam --> EndPageDone
+ EndPageDone([End])
+```
diff --git a/reassemble/scan/mermaid/PageEnd.md b/reassemble/scan/mermaid/PageEnd.md
new file mode 100644
index 0000000..359b438
--- /dev/null
+++ b/reassemble/scan/mermaid/PageEnd.md
@@ -0,0 +1,38 @@
+```mermaid
+graph TD
+ Start([Start PageEnd]) --> CaseMode{ScanMode?}
+
+ subgraph smNew_Logic
+ CaseMode -- smNew --> GetFormID[獲取 FormID / 導引頁 / 分案頁資訊]
+ GetFormID --> IsDiv{偵測到分案條碼?}
+ IsDiv -- Yes --> ResetCase[重置計數/清空 View/取得新 ScanCaseno]
+ IsDiv -- No --> CheckCaseNo{ScanCaseno 為空?}
+ CheckCaseNo -- Yes --> GetNoName[GetNoNameCase]
+ CheckCaseNo -- No --> InitPath[建立目錄 Str2Dir]
+
+ GetNoName --> InitPath
+ InitPath --> DocDir[決定 ScanDocDir<br/>處理分份數邏輯]
+ DocDir --> SetDocList[SetDocNoList 更新目錄索引]
+ SetDocList --> GenFileName[產生 ScanSaveFilename 序號_FormID]
+ GenFileName --> SaveCheck{不存檔條碼?}
+ SaveCheck -- No --> SetContext[SetContextList<br/>更新 TreeView UI<br/>設定 PEFileName]
+ end
+
+ CaseMode -- smReplace --> DelOld[刪除舊檔] --> SetPE[設定 PEFileName]
+
+ subgraph smInsert_Logic
+ CaseMode -- smInsert --> GetFormIDIns[獲取 FormID / DocNo]
+ GetFormIDIns --> DocDirIns[尋找最後的 DocDir]
+ DocDirIns --> GenFileNameIns[產生 ScanSaveFilename]
+ GenFileNameIns --> SetContextIns[SetContextList<br/>設定 PEFileName]
+ end
+
+ CaseMode -- smSample --> SamLogic[刪除舊檔/設定 PEFileName/顯示辨識條碼]
+
+ SetContext --> EndPageEnd
+ SetPE --> EndPageEnd
+ SetContextIns --> EndPageEnd
+ SamLogic --> EndPageEnd
+
+ EndPageEnd([End])
+```
diff --git a/reassemble/scan/mermaid/R_W_Scanini.md b/reassemble/scan/mermaid/R_W_Scanini.md
new file mode 100644
index 0000000..daa35ec
--- /dev/null
+++ b/reassemble/scan/mermaid/R_W_Scanini.md
@@ -0,0 +1,15 @@
+```mermaid
+graph TD
+ Start([Start R_W_Scanini]) --> CreateIni[建立 TIniFile: FBScan.ini]
+ CreateIni --> TryBlock[try]
+
+ subgraph ModeSwitch
+ TryBlock --> ModeCheck{Mode?}
+ ModeCheck -- 'R' (Read) --> ReadIni[從 Ini 讀取:<br/>DeviceDelete, Reverse, BoardClear, <br/>Rotate, Deskew, Brightness, Contrast 等]
+ ModeCheck -- 'W' (Write) --> WriteIni[將變數寫入 Ini:<br/>DeviceDelete, Reverse, BoardClear, <br/>Rotate, Deskew, Brightness, Contrast 等]
+ end
+
+ ModeSwitch --> FinallyBlock[finally]
+ FinallyBlock --> FreeIni[釋放 Ini 物件]
+ FreeIni --> EndRW([End])
+```
diff --git a/reassemble/scan/mermaid/StatrTwainScan.md b/reassemble/scan/mermaid/StatrTwainScan.md
new file mode 100644
index 0000000..9a2b72b
--- /dev/null
+++ b/reassemble/scan/mermaid/StatrTwainScan.md
@@ -0,0 +1,35 @@
+```mermaid
+graph TD
+ Start([Start StatrTwainScan]) --> CheckConfig{Scanner.IsConfigured?}
+ CheckConfig -- No --> MsgNoDriver[顯示 TWAIN 驅動尚未安裝訊息] --> ExitStatrTwainScan([Exit])
+ CheckConfig -- Yes --> InitScanInfo[初始化 ScanInfo 結構<br/>建立 TTiffGraphic]
+
+ InitScanInfo --> TryBlock1[try: 開始掃瞄設定]
+
+ subgraph Try_Main
+ TryBlock1 --> SetParams[設定 DPI, ScanColor, ShowUI]
+ SetParams --> TryOpen[try: 開啟掃瞄來源]
+
+ subgraph Try_OpenSource
+ TryOpen --> OpenSource[Scanner.OpenSource]
+ OpenSource --> SetDuplex[設定雙面/亮度/對比]
+ end
+
+ SetDuplex --> CatchOpen{發生錯誤?}
+ CatchOpen -- Yes --> ShowErr[顯示掃瞄器錯誤]
+ ShowErr --> CloseSrc1[Scanner.CloseSource] --> ExitStatrTwainScan
+
+ CatchOpen -- No --> TryAcquire[try: 執行獲取影像]
+
+ subgraph Try_Acquire
+ TryAcquire --> Acquire[Scanner.AcquireWithSourceOpen<br/>傳入 OnAcquire 回呼]
+ Acquire --> CatchAcq{發生 Exception?}
+ CatchAcq -- Yes --> CloseSrc2[Scanner.CloseSource]
+ end
+
+ TryAcquire -. finally .-> CloseSrc3[Scanner.CloseSource]
+ end
+
+ Try_Main -. finally .-> FinalCleanup[Scanner.CloseSource<br/>ScanInfo.Graphic.Free]
+ FinalCleanup --> EndStatrTwainScan([End])
+```
diff --git a/reassemble/scan/mermaid/initkscan.md b/reassemble/scan/mermaid/initkscan.md
new file mode 100644
index 0000000..f0641de
--- /dev/null
+++ b/reassemble/scan/mermaid/initkscan.md
@@ -0,0 +1,21 @@
+```mermaid
+graph TD
+ Start([Start initkscan]) --> DisableCB[ScanDuplexCB.Enabled := False]
+ DisableCB --> CheckConfig{Scanner.IsConfigured?}
+
+ CheckConfig -- Yes --> TryOpen[try]
+
+ subgraph Try_Detect
+ TryOpen --> OpenSrc[Scanner.OpenSource]
+ OpenSrc --> CheckDuplex{Scanner.DuplexCap > 0?}
+ CheckDuplex -- Yes --> EnableCB[ScanDuplexCB.Enabled := True]
+ CheckDuplex -- No --> CatchErr
+ EnableCB --> CatchErr{發生異常?}
+ CatchErr -- Yes --> DataLoadErr[DataLoading False, True] --> ExitInit
+ end
+
+ Try_Detect --> CloseSrc[Scanner.CloseSource]
+ CheckConfig -- No --> EndInit
+ CloseSrc --> EndInit
+ EndInit([End])
+```
diff --git a/reassemble/view/mermaid/lfcycle/DestroyEvent.md b/reassemble/view/mermaid/lfcycle/DestroyEvent.md
new file mode 100644
index 0000000..bc5bcf9
--- /dev/null
+++ b/reassemble/view/mermaid/lfcycle/DestroyEvent.md
@@ -0,0 +1,14 @@
+```mermaid
+graph TD
+ Start([開始 DestroyEvent]) --> FreeList[釋放大量 TStringList 物件<br/>(Doc_Inf_List, FORM_INF_List, CaseList, ContextList...)]
+ FreeList --> CheckMode{FMode 是否為<br/>'DSCAN' 或 'ESCAN'?}
+ CheckMode -- 是 --> CheckPath{ImagePath 非空?}
+ CheckMode -- 否 --> CheckEvents
+ CheckPath -- 是 --> DelTree[呼叫 _Deltree 刪除 ImagePath 目錄]
+ CheckPath -- 否 --> CheckEvents
+ DelTree --> CheckEvents
+ CheckEvents{FEvents 非空?}
+ CheckEvents -- 是 --> TriggerEvent[觸發 FEvents.OnDestroy]
+ CheckEvents -- 否 --> End([結束])
+ TriggerEvent --> End
+```
diff --git a/reassemble/view/mermaid/lfcycle/EventSinkChanged.md b/reassemble/view/mermaid/lfcycle/EventSinkChanged.md
new file mode 100644
index 0000000..c55417d
--- /dev/null
+++ b/reassemble/view/mermaid/lfcycle/EventSinkChanged.md
@@ -0,0 +1,7 @@
+```mermaid
+graph TD
+ Start([開始 EventSinkChanged]) --> Cast[將 EventSink 轉換為 ICB_IMGPSScanXEvents]
+ Cast --> SetFEvents[賦值給 FEvents 變數]
+ SetFEvents --> CallInherited[呼叫 inherited EventSinkChanged]
+ CallInherited --> End([結束])
+```
diff --git a/reassemble/view/mermaid/lfcycle/InitialLanguage.md b/reassemble/view/mermaid/lfcycle/InitialLanguage.md
new file mode 100644
index 0000000..8224894
--- /dev/null
+++ b/reassemble/view/mermaid/lfcycle/InitialLanguage.md
@@ -0,0 +1,22 @@
+```mermaid
+graph TD
+ Start([開始 InitialLanguage]) --> DetermineForm[判斷 Sender 類型並設定 NowForm]
+ DetermineForm --> SetGlobalPath[設定 IISUnit 語言檔案路徑與語系]
+ SetGlobalPath --> CreateIni[建立 TMeminifile 讀取 Language.Lng]
+ CreateIni --> TryBlock[try: 開始遍歷組件]
+
+ subgraph ComponentLoop
+ TryBlock --> LoopStart{遍歷 NowForm.Components}
+ LoopStart -- TButton --> SetBtnCap[設定 Button.Caption]
+ LoopStart -- TBitBtn --> SetBitHint[設定 BitBtn.Hint]
+ LoopStart -- TMenuItem --> SetMenuCap[設定 MenuItem.Caption]
+ LoopStart -- TCheckBox --> SetCBCap[設定 CheckBox.Caption]
+ LoopStart -- TLabel --> SetLblCap[設定 Label.Caption]
+ LoopStart -- TListView --> LoopLVCols[遍歷並設定 ListView 欄位標題]
+ LoopStart -- TRadioGroup --> LoopRGItems[遍歷並設定 RadioGroup 選項文字]
+ end
+
+ LoopStart -- 結束 --> FinallyBlock[finally]
+ FinallyBlock --> FreeIni[釋放 Ini 物件]
+ FreeIni --> End([結束])
+```
diff --git a/reassemble/view/mermaid/lfcycle/Timer1Timer.md b/reassemble/view/mermaid/lfcycle/Timer1Timer.md
new file mode 100644
index 0000000..fce4b45
--- /dev/null
+++ b/reassemble/view/mermaid/lfcycle/Timer1Timer.md
@@ -0,0 +1,38 @@
+```mermaid
+graph TD
+ Start([開始 Timer1Timer]) --> InitFlags[設定介面旗標與預設壓縮率]
+ InitFlags --> UIConfig[根據 FMode 切換面板可見性]
+ UIConfig --> DownloadBase[下載多國語言檔案與初始化]
+ DownloadBase --> CreateLists[建立大量資訊清單 StringLists]
+ CreateLists --> DataLoadingOn[DataLoading True: 開始下載資料]
+
+ subgraph DataFetch
+ DataLoadingOn --> ServerInfo[取得主機時間/範本資訊]
+ ServerInfo --> GetSettings[取得文件/表單/規則/參數等設定]
+ GetSettings --> SetIDMap[執行 SetFormID_DocNo 與 SetIn_WH_DocNo]
+ end
+
+ DataFetch --> PathConfig[設定本地路徑 CheckXml/Site/Sample/Scantemp]
+ PathConfig --> ScannerInit[初始化掃描器 initkscan]
+
+ subgraph SpecialMode
+ ScannerInit --> ModeCheck{特定模式 RSCAN/DSCAN/ESCAN/FSCAN?}
+ ModeCheck -- 是 --> InitCase[建立空案件與下載既有影像]
+ InitCase --> MergeImgs[執行 Download2Case 合併影像]
+ MergeImgs --> LegacyProc[處理舊案規則與表單修正]
+ end
+
+ ModeCheck -- 否 --> CheckRules
+ LegacyProc --> CheckRules
+
+ subgraph Finalize
+ CheckRules --> DownloadXML[下載 OMR 檢核 XML 與登打設定]
+ DownloadXML --> LoadINI[讀取掃描設定 FBScan.ini]
+ LoadINI --> LoadImg[LoadImgFile 載入影像清單]
+ LoadImg --> SelectNode[更新 TreeView 並選取節點]
+ end
+
+ SelectNode --> DataLoadingOff[DataLoading False: 完成初始化]
+ DataLoadingOff --> LogEnd[寫入初始化結束日誌]
+ LogEnd --> End([結束])
+```
diff --git a/reassemble/view/mermaid/lfcycle/Timer2Timer.md b/reassemble/view/mermaid/lfcycle/Timer2Timer.md
new file mode 100644
index 0000000..f9ea256
--- /dev/null
+++ b/reassemble/view/mermaid/lfcycle/Timer2Timer.md
@@ -0,0 +1,9 @@
+```mermaid
+graph TD
+ Start([開始 Timer2Timer]) --> CheckDots{Panel22.Caption 是否等於<br/>ShowText + '......'?}
+ CheckDots -- 是 --> Reset[Panel22.Caption := ShowText]
+ CheckDots -- 否 --> AddDot[Panel22.Caption := Panel22.Caption + '.']
+ Reset --> ProcessMsg[Application.ProcessMessages]
+ AddDot --> ProcessMsg
+ ProcessMsg --> End([結束])
+```
diff --git a/reassemble/view/mermaid/msger/DataLoading.md b/reassemble/view/mermaid/msger/DataLoading.md
new file mode 100644
index 0000000..20ec299
--- /dev/null
+++ b/reassemble/view/mermaid/msger/DataLoading.md
@@ -0,0 +1,23 @@
+```mermaid
+graph TD
+ Start([開始 DataLoading]) --> CheckLoading{Loading 為 True?}
+
+ subgraph Loading_ON
+ CheckLoading -- 是 --> SetCursorWait[設定 Screen.Cursor 為等待狀態]
+ SetCursorWait --> CheckTimer{UseTimer 為 True?}
+ CheckTimer -- 是 --> ShowPanel22[顯示 Panel22 並置中<br/>啟動 Timer2 點點動畫]
+ CheckTimer -- 否 --> ShowPanel8[顯示 Panel8 並置中]
+ ShowPanel22 --> DisableMain[停用 Panel1 與 Panel2]
+ ShowPanel8 --> DisableMain
+ DisableMain --> ProcessMsg[Application.ProcessMessages]
+ end
+
+ subgraph Loading_OFF
+ CheckLoading -- 否 --> HidePanels[隱藏 Panel22 與 Panel8<br/>停止 Timer2]
+ HidePanels --> EnableMain[啟用 Panel1 與 Panel2]
+ EnableMain --> SetCursorDefault[恢復 Screen.Cursor 為正常]
+ end
+
+ ProcessMsg --> End([結束])
+ SetCursorDefault --> End
+```
diff --git a/reassemble/view/mermaid/msger/StatusBar1DblClick.md b/reassemble/view/mermaid/msger/StatusBar1DblClick.md
new file mode 100644
index 0000000..20fd68d
--- /dev/null
+++ b/reassemble/view/mermaid/msger/StatusBar1DblClick.md
@@ -0,0 +1,9 @@
+```mermaid
+graph TD
+ Start([開始 StatusBar1DblClick]) --> ToggleBtns[切換 Button3, Button4 的可見性]
+ ToggleBtns --> CheckCtrl{Ctrl 鍵是否按下?}
+ CheckCtrl -- 是 --> ToggleAuth[切換 ExportBt, ImportBt 的可見性]
+ CheckCtrl -- 否 --> ToggleDebug[切換 Memo1, Display1 的可見性]
+ ToggleAuth --> End([結束])
+ ToggleDebug --> End
+```
--
Gitblit v1.8.0