curtis
20小時前 508bc7bdccb1de1f48c9d2f8062d195269f45f31
feat: mermaid chart
新增29個檔案
640 ■■■■■ 已變更過的檔案
doc/curtis/prompt/scanimpl_analysis/05/scanimpl_flow_chart.md 24 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/bloc/mermaid/BarCode2CaseID.md 13 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/bloc/mermaid/BarCode2FormID.md 19 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/bloc/mermaid/GetUseCase.md 12 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/bloc/mermaid/SetUseCase.md 12 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/img/mermaid/CheckNeedCrop.md 22 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/img/mermaid/GetSiteOMR.md 39 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/img/mermaid/ImageReSize_FormID.md 36 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/img/mermaid/ImageReSize_tmp.md 20 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/mermaid/omr/CheckRule2OMRErrInfo.md 24 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/mermaid/omr/DistinctFormCode.md 26 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/mermaid/omr/OMRCheckCase.md 31 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/mermaid/omr/OMRErr2ini.md 10 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/mermaid/omr/OMRErrini2List.md 17 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/mermaid/omr/OMRErrini2ListForLog.md 21 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/scan/mermaid/GetDefScanIni.md 23 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/scan/mermaid/OnAcquire.md 39 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/scan/mermaid/PageDone.md 21 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/scan/mermaid/PageEnd.md 38 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/scan/mermaid/R_W_Scanini.md 15 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/scan/mermaid/StatrTwainScan.md 35 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/scan/mermaid/initkscan.md 21 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/view/mermaid/lfcycle/DestroyEvent.md 14 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/view/mermaid/lfcycle/EventSinkChanged.md 7 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/view/mermaid/lfcycle/InitialLanguage.md 22 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/view/mermaid/lfcycle/Timer1Timer.md 38 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/view/mermaid/lfcycle/Timer2Timer.md 9 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/view/mermaid/msger/DataLoading.md 23 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
reassemble/view/mermaid/msger/StatusBar1DblClick.md 9 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
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`
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
```
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
```
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])
```
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([結束])
```
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
```
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
```
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
```
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
```
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([結束])
```
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([結束])
```
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 結果])
```
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
```
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
```
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([結束])
```
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])
```
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])
```
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])
```
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])
```
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])
```
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])
```
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])
```
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
```
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([結束])
```
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([結束])
```
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([結束])
```
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([結束])
```
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
```
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
```