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