From 10220027159dc90f19f7c62a7b84bb00c6453d4c Mon Sep 17 00:00:00 2001
From: curtis <curtis@i-mps.com>
Date: 星期一, 30 三月 2026 09:27:16 +0800
Subject: [PATCH] feat: spec 定義

---
 doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_PatchFom.md                    |   37 
 doc/curtis/screenShot/CB_DocList.png                                          |    0 
 doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ScannerController.json |  118 
 doc/curtis/prompt/scanimpl_analysis/step1_raw_methods.json                    | 2417 ++++++++
 doc/curtis/Scanner_Controller_Analysis.md                                     |   12 
 doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_template.md                    |   37 
 doc/curtis/prompt/scanimpl_analysis/step2_classified_methods.json             | 5318 +++++++++++++++++++
 doc/curtis/prompt/scanimpl_analysis/03/scanimpl_ann_annotate.md               |   70 
 doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.UIView.json            | 5530 +++++++++++++++++++
 doc/curtis/prompt/scanimpl_analysis/01/scanimpl_annalysis_step_ver.md         |  145 
 doc/curtis/prompt/scanimpl_analysis/02/scanimpl_ann_addon.md                  |   55 
 doc/curtis/Local_IO_路徑與檔案操作分析.md                                              |    4 
 doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_ErrList.md                     |   39 
 doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.BusinessLogic.json     |  363 +
 doc/curtis/screenShot/CB_PatchFom.png                                         |    0 
 doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ts                     |   27 
 doc/curtis/prompt/scanimpl_analysis/04/scanimpl_reAssemble.md                 |  139 
 doc/curtis/Transport_Manager_Analysis.md                                      |    2 
 doc/curtis/prompt/scanimpl_analysis/01/scanimpl_annalysis.md                  |  167 
 doc/curtis/prompt/dfm_to_web/readme.md                                        |    4 
 doc/curtis/UI_View_Analysis.md                                                |    2 
 doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_CB_IMGPSScanImp.md             |   37 
 doc/curtis/prompt/scanimpl_analysis/readme.md                                 |   33 
 doc/curtis/Business_Logic_Analysis.md                                         |    2 
 doc/curtis/Image_Processer_Analysis.md                                        |   55 
 doc/curtis/screenShot/CB_ErrList.png                                          |    0 
 doc/curtis/prompt/scanimpl_analysis/02/readme.md                              |    7 
 doc/curtis/OCX_溝通與_抽象層抽換.md                                                   |   14 
 doc/curtis/prompt/scanimpl_analysis/02/team_tasks_classification.json         |  882 +++
 doc/curtis/screenShot/CB_DocPrt.png                                           |    0 
 /dev/null                                                                     |  830 --
 doc/curtis/prompt/dfm_to_web/dfm_to_web_requirement.json                      |   16 
 doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.TransportManager.json  |   98 
 doc/curtis/screenShot/CB_IMGPSScanImp.png                                     |    0 
 doc/curtis/todos.md                                                           |    8 
 doc/curtis/ScanImp_源碼分析.md                                                    |    2 
 doc/curtis/Delphi_套件相依.md                                                     |    9 
 doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.remainings.txt         |   65 
 doc/curtis/screenShot/CB_OldCaseInfo.png                                      |    0 
 doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ImageProcessor.json    |   71 
 40 files changed, 15,732 insertions(+), 883 deletions(-)

diff --git a/doc/curtis/Business_Logic_Analysis.md b/doc/curtis/Business_Logic_Analysis.md
index aa486eb..c52cf7e 100644
--- a/doc/curtis/Business_Logic_Analysis.md
+++ b/doc/curtis/Business_Logic_Analysis.md
@@ -1,6 +1,6 @@
 # 業務邏輯與資料解析模組 (Business Logic & Parser) 深度分析
 
-在 `CB_IMGPSScanImp.pas` 中,「業務邏輯與資料解析模組」扮演了將底層掃描影像與上層銀行/保險業務需求結合的橋樑。它將前端網頁傳入的原始設定資料,轉換為系統可理解的「案件 (Case)」、「文件 (Document)」與「表單 (Form)」結構,並執行極度複雜的業務規則檢核 (OMR 檢核)。
+在 `CB_IMGPSScanImp.pas.bk` 中,「業務邏輯與資料解析模組」扮演了將底層掃描影像與上層銀行/保險業務需求結合的橋樑。它將前端網頁傳入的原始設定資料,轉換為系統可理解的「案件 (Case)」、「文件 (Document)」與「表單 (Form)」結構,並執行極度複雜的業務規則檢核 (OMR 檢核)。
 
 若要將此模組進一步細拆,其內部組成可分為以下四大子分類:
 
diff --git "a/doc/curtis/Delphi_\345\245\227\344\273\266\347\233\270\344\276\235.md" "b/doc/curtis/Delphi_\345\245\227\344\273\266\347\233\270\344\276\235.md"
index d343a80..8c59d7a 100644
--- "a/doc/curtis/Delphi_\345\245\227\344\273\266\347\233\270\344\276\235.md"
+++ "b/doc/curtis/Delphi_\345\245\227\344\273\266\347\233\270\344\276\235.md"
@@ -1,12 +1,13 @@
 # **相依套件分析報告**
 
-本報告針對 ActiveX 元件核心實作檔 CB_IMGPSScanImp.pas 進行功能解構,並分析其與第三方套件的綁定關係,以作為後續維護或現代化升級之參考。
+本報告針對 ActiveX 元件核心實作檔 CB_IMGPSScanImp.pas.bk 進行功能解構,並分析其與第三方套件的綁定關係,以作為後續維護或現代化升級之參考。
 
 ## **壹、 依功能拆分模組與第三方套件綁定分析**
 
-根據原始碼結構,CB_IMGPSScanImp.pas 是一個將介面、硬體、網路與業務邏輯高度耦合的「上帝物件 (God Object)」。若要進行重構或拆件,建議依據以下五個核心模組進行解耦:
+根據原始碼結構,CB_IMGPSScanImp.pas.bk 是一個將介面、硬體、網路與業務邏輯高度耦合的「上帝物件 (God Object)」。若要進行重構或拆件,建議依據以下五個核心模組進行解耦:
 
 ### **1. 硬體掃描控制模組 (Scanner Controller)**
+detail: [Scanner_Controller_Analysis.md](Scanner_Controller_Analysis.md)
 
 - **功能描述**:負責與實體掃描機溝通,處理 TWAIN 介面初始化、設定掃描參數(DPI、色彩、雙面)、觸發掃描指令,以及接收掃描完成的記憶體影像 (DibHandle)。
 - **子模組細分建議**:
@@ -19,6 +20,7 @@
   - 依賴 EnMisc 處理底層記憶體或雜項運算。
 
 ### **2. 影像處理與轉換模組 (Image Processor)**
+detail: [Image_Processer_Analysis.md](Image_Processer_Analysis.md)
 
 - **功能描述**:負責對擷取到的原始影像進行後製處理,包括:裁切(如 A3 裁 A4)、去斜 (Deskew)、旋轉、二值化 (轉黑白)、格式轉換 (轉 TIFF/JPEG),以及讀取影像上的條碼。
 - **子模組細分建議**:
@@ -32,6 +34,7 @@
   - 依賴 **MPS Barcode** (mpsBarco, BarcodesFinder) 進行影像條碼掃描與解析。
 
 ### **3. 安全傳輸與 API 通訊模組 (Transport Manager)**
+detail: [Transport_Manager_Analysis.md](Transport_Manager_Analysis.md)
 
 - **功能描述**:負責將掃描並壓縮後的檔案上傳至伺服器,或從伺服器下載檔案。同時處理與後端 Java Servlet 的參數交換(如校時、取得 FTP 資訊、更新案件狀態)。
 - **子模組細分建議**:
@@ -46,6 +49,7 @@
   - 依賴自訂/第三方加密庫 (Encryp) 處理字串加解密。
 
 ### **4. 業務邏輯與資料解析模組 (Business Logic & Parser)**
+detail: [Business_Logic_Analysis.md](Business_Logic_Analysis.md)
 
 - **功能描述**:專案核心的領域邏輯,包含接收網頁端傳入的參數字串進行解析、定義文件歸類邏輯(由條碼推導文件類型)、OMR (光學標記辨識) 檢核定義等。
 - **子模組細分建議**:
@@ -59,6 +63,7 @@
   - 依賴 **VCLZip** (VCLZip, VCLUnZip) 將多個影像檔打包成 ZIP 進行單一傳輸。
 
 ### **5. UI 與介面呈現模組 (UI View)**
+detail: [UI_View_Analysis.md](UI_View_Analysis.md)
 
 - **功能描述**:負責 ActiveX 控制項的視覺化介面,包含左側的樹狀文件清單 (TreeView)、右側的影像預覽區 (ScrollBox),以及按鈕與多國語言切換。
 - **子模組細分建議**:
diff --git a/doc/curtis/Image_Processer_Analysis.md b/doc/curtis/Image_Processer_Analysis.md
index 41e6b3a..d51d24b 100644
--- a/doc/curtis/Image_Processer_Analysis.md
+++ b/doc/curtis/Image_Processer_Analysis.md
@@ -1,6 +1,6 @@
 # 影像處理與轉換模組 (Image Processor) 深度分析
 
-在 `CB_IMGPSScanImp.pas` 中,「影像處理與轉換模組」負責在硬體掃描取得原始影像後,以及上傳/顯示之前,對影像進行一系列的強化、分析與格式轉換。這個模組是決定影像品質、檔案大小與後續 OMR 辨識準確率的關鍵。
+在 `CB_IMGPSScanImp.pas.bk` 中,「影像處理與轉換模組」負責在硬體掃描取得原始影像後,以及上傳/顯示之前,對影像進行一系列的強化、分析與格式轉換。這個模組是決定影像品質、檔案大小與後續 OMR 辨識準確率的關鍵。
 
 若要將此模組進一步細拆,其內部組成可分為以下四大子分類:
 
@@ -57,6 +57,53 @@
 
 ---
 
+
+## 影像相關關鍵字:
+```js
+[
+'TTiffGraphic',
+'TDibGraphic',
+'DeskewImg',
+'Rotate',
+'CropImg',
+'ImageReSize_FormID',
+'ImageReSize_tmp',
+'CheckNeedCrop',
+'ImageProcessor.transformer',
+'ConvertToBW',
+'ConvertToGray',
+'Image_Smooth',
+'NegativeImg',
+'CleanupBorder',
+'ImageProcessor.converter',
+'MpsGetBarcode',
+'Get_OMR',
+'ImageProcessor.barcodeRecognizer',
+'FindPoint',
+'CheckSize',
+'GetSiteOMR',
+'ImageProcessor.anchorAnalyzer',
+'TJpegGraphic',
+'DpiResize',
+// 以下可省
+'SaveQuality',
+'FJpgCompression',
+'ifTrueColor',
+'ifGray256',
+'ConvertToBW',
+'ConvertToGray',
+'Image_Smooth',
+'NegativeImg',
+'CleanupBorder',
+'ifBlackWhite',
+'tcGroup4',
+'tcPackBits',
+'tcJpeg',
+'ifColor25'
+]
+```
+
+
 ## 💡 未來重構與微服務化建議
 
 若要對此影像處理模組進行重構,建議方向如下:
@@ -67,3 +114,9 @@
     目前大量依賴畫面上隱藏的 `ISB_BW` (TImageScrollBox) 來進行二值化和條碼辨識。這違反了 MVC 原則且耗費額外的 GDI 資源。應改用純記憶體物件 (如獨立的 `TDibGraphic` 或 `TBitmap`) 在背景執行緒中進行這些運算,不要綁定可見的 UI 元件。
 3.  **引入更現代的影像引擎 (如 OpenCV)**:
     早期依賴的 Envision SDK 在尋找十字定位點 (FindPoint) 和去斜 (DeskewImg) 的演算法可能較為老舊。若未來轉型為微服務架構,可將這部分邏輯移植為 Python/C++ 並使用 OpenCV 來達成更精準的高速運算。
+
+
+
+
+
+
diff --git "a/doc/curtis/Local_IO_\346\212\275\345\203\217\346\226\271\346\263\225\345\210\227\350\241\250.md" "b/doc/curtis/Local_IO_\346\212\275\345\203\217\346\226\271\346\263\225\345\210\227\350\241\250.md"
deleted file mode 100644
index e69de29..0000000
--- "a/doc/curtis/Local_IO_\346\212\275\345\203\217\346\226\271\346\263\225\345\210\227\350\241\250.md"
+++ /dev/null
diff --git "a/doc/curtis/Local_IO_\350\267\257\345\276\221\350\210\207\346\252\224\346\241\210\346\223\215\344\275\234\345\210\206\346\236\220.md" "b/doc/curtis/Local_IO_\350\267\257\345\276\221\350\210\207\346\252\224\346\241\210\346\223\215\344\275\234\345\210\206\346\236\220.md"
index 51ca802..67e4e9a 100644
--- "a/doc/curtis/Local_IO_\350\267\257\345\276\221\350\210\207\346\252\224\346\241\210\346\223\215\344\275\234\345\210\206\346\236\220.md"
+++ "b/doc/curtis/Local_IO_\350\267\257\345\276\221\350\210\207\346\252\224\346\241\210\346\223\215\344\275\234\345\210\206\346\236\220.md"
@@ -1,6 +1,6 @@
 # **IO 路徑與檔案操作分析**
 
-本報告詳列了 CB_IMGPSScanImp.pas 檔案中定義的所有 IO 相關變數,以及執行目錄與檔案管理的關鍵方法,並定義了抽像化所需的介面原型。
+本報告詳列了 CB_IMGPSScanImp.pas.bk 檔案中定義的所有 IO 相關變數,以及執行目錄與檔案管理的關鍵方法,並定義了抽像化所需的介面原型。
 
 ## **壹、 關鍵路徑與檔案變數 (Variables)**
 
@@ -150,7 +150,7 @@
 
 ## **陸、 IO 方法具體實作邏輯細部說明 (Detailed Implementation Logic)**
 
-本節針對 CB_IMGPSScanImp.pas 內部如何透過 Windows API 實作這些 IO 操作進行細部解說。
+本節針對 CB_IMGPSScanImp.pas.bk 內部如何透過 Windows API 實作這些 IO 操作進行細部解說。
 
 ### **1. Str2Dir(Path: string) 的運作機制**
 
diff --git "a/doc/curtis/OCX_\346\272\235\351\200\232\350\210\207_\346\212\275\350\261\241\345\261\244\346\212\275\346\217\233.md" "b/doc/curtis/OCX_\346\272\235\351\200\232\350\210\207_\346\212\275\350\261\241\345\261\244\346\212\275\346\217\233.md"
index 65dba92..75abee5 100644
--- "a/doc/curtis/OCX_\346\272\235\351\200\232\350\210\207_\346\212\275\350\261\241\345\261\244\346\212\275\346\217\233.md"
+++ "b/doc/curtis/OCX_\346\272\235\351\200\232\350\210\207_\346\212\275\350\261\241\345\261\244\346\212\275\346\217\233.md"
@@ -59,10 +59,10 @@
 }
 
 /**
- * 掃描服務抽象介面 (IScanService)
+ * 掃描服務抽象介面 (IOCXService)
  * UI 層僅與此介面溝通,不直接操作底層實作
  */
-export interface IScanService {
+export interface IOCXService {
   initialize(config: ScanConfig): Promise<void>;
   startScan(): Promise<boolean>;
   uploadFiles(): Promise<boolean>;
@@ -75,7 +75,7 @@
  * 實作 A: ActiveX 適配器 (Legacy Adapter)
  * 用於目前環境:UI (TS) -> Delphi Browser -> ActiveX (OCX)
  */
-export class ActiveXScanAdapter implements IScanService {
+export class ActiveXScanAdapter implements IOCXService {
   private ocx: any;
 
   constructor() {
@@ -122,7 +122,7 @@
  * 實作 B: Backend Server 適配器 (Future Adapter)
  * 用於未來環境:UI (TS) -> REST API / WebSocket -> Rust/Go Backend
  */
-export class BackendServerAdapter implements IScanService {
+export class BackendServerAdapter implements IOCXService {
   private apiUrl = "http://localhost:8080/api/scanner";
 
   async initialize(config: ScanConfig): Promise<void> {
@@ -164,7 +164,7 @@
  * 根據環境自動切換實作
  */
 export class ScannerFactory {
-  static getService(): IScanService {
+  static getService(): IOCXService {
     if ((window as any).OCX_INSTANCE) {
       console.log("偵測到 ActiveX 環境,啟用 ActiveX 適配器");
       return new ActiveXScanAdapter();
@@ -184,14 +184,14 @@
 
 ActiveX 的方法通常是同步阻塞的,而後端 API 是非同步的。
 
-- **建議**:在抽象介面(IScanService)中,所有方法都回傳 Promise。
+- **建議**:在抽象介面(IOCXService)中,所有方法都回傳 Promise。
 - **原因**:這樣當你未來切換到後端伺服器(fetch API)時,UI 的調用邏輯(await service.startScan())不需要做任何修改。
 
 ### **3. 實作「心跳」或「狀態輪詢」**
 
 原本 GetSetInf1~7 主要是靠宿主程式主動去「問」OCX。
 
-- **抽象層建議**:在 IScanService 中實作一個 subscribeStatus(callback) 的觀察者模式。
+- **抽象層建議**:在 IOCXService 中實作一個 subscribeStatus(callback) 的觀察者模式。
 - **ActiveX 模式下**:在適配器內部啟動一個 setInterval 去輪詢 GetSetInf。
 - **未來後端模式下**:適配器改用 **WebSocket** 接收後端主動推播的掃描事件。
 - **UI 層感受**:UI 只需要處理 onStatusUpdate 事件,根本不用管底層是用輪詢還是 WebSocket。
diff --git "a/doc/curtis/ScanImp_\346\272\220\347\242\274\345\210\206\346\236\220.md" "b/doc/curtis/ScanImp_\346\272\220\347\242\274\345\210\206\346\236\220.md"
index 8781c3c..c28f86b 100644
--- "a/doc/curtis/ScanImp_\346\272\220\347\242\274\345\210\206\346\236\220.md"
+++ "b/doc/curtis/ScanImp_\346\272\220\347\242\274\345\210\206\346\236\220.md"
@@ -1,6 +1,6 @@
 # **核心源碼與物件實作解析**
 
-本文件針對 CB_IMGPSScanImp.pas 中的核心方法與隱藏物件進行原始碼級別的邏輯拆解與推導。
+本文件針對 CB_IMGPSScanImp.pas.bk 中的核心方法與隱藏物件進行原始碼級別的邏輯拆解與推導。
 
 ## **壹、 核心方法源碼說明**
 
diff --git a/doc/curtis/Scanner_Controller_Analysis.md b/doc/curtis/Scanner_Controller_Analysis.md
index 964c8d8..e72bac3 100644
--- a/doc/curtis/Scanner_Controller_Analysis.md
+++ b/doc/curtis/Scanner_Controller_Analysis.md
@@ -1,6 +1,6 @@
 # 硬體掃描控制模組 (Scanner Controller) 深度分析
 
-在 `CB_IMGPSScanImp.pas` 中,「硬體掃描控制模組」是系統與實體掃描設備溝通的唯一橋樑。它深度依賴 TWAIN 協定(透過第三方元件 `EnScan` 封裝),負責控制硬體行為並將紙本文件轉換為記憶體中的數位影像資料。
+在 `CB_IMGPSScanImp.pas.bk` 中,「硬體掃描控制模組」是系統與實體掃描設備溝通的唯一橋樑。它深度依賴 TWAIN 協定(透過第三方元件 `EnScan` 封裝),負責控制硬體行為並將紙本文件轉換為記憶體中的數位影像資料。
 
 若要將此模組進一步細拆,其內部組成可分為以下三大子分類:
 
@@ -60,3 +60,13 @@
     該服務可以透過 **WebSocket** 或 **Local REST API** 接收來自網頁端的掃描指令,控制 TWAIN 掃描機,並將接收到的影像轉為 Base64 或二進位流回傳給網頁前端。
 3.  **單一職責分離 (Separation of Concerns)**:
     應將 `OnAcquire` 中厚重的「條碼辨識」、「A3 裁切」與「黑邊處理」移出此模組。Scanner Controller 的唯一職責應該只有:**「將紙本轉為電腦中的 Bitmap」**。後續的處理應交給 `Image Processor` (影像處理模組) 透過管線 (Pipeline) 的方式接手處理。
+
+
+
+R_W_Scanini|GetDefScanIni
+
+## 相關關鍵字:
+OnAcquire|SelectScanner|scanner.SelectScanner|initkscan|CheckScannerConfig|PageEnd|PageDone|ScannerControl.twainWrapper|StatrTwainScan|Scanner.OpenSource|Scanner.AcquireWithSourceOpen|Scanner.CloseSource|Scanner
+
+
+
diff --git a/doc/curtis/Transport_Manager_Analysis.md b/doc/curtis/Transport_Manager_Analysis.md
index 330fca5..d49c825 100644
--- a/doc/curtis/Transport_Manager_Analysis.md
+++ b/doc/curtis/Transport_Manager_Analysis.md
@@ -1,6 +1,6 @@
 # 安全傳輸與 API 通訊模組 (Transport Manager) 深度分析
 
-在 `CB_IMGPSScanImp.pas` 中,「安全傳輸與 API 通訊模組」負責處理 ActiveX 客戶端與後端伺服器 (如 Java Servlet 平台) 之間的所有資料交換與檔案傳輸。由於涉及機敏的金融/保險文件,此模組高度依賴加密與安全通訊協定。
+在 `CB_IMGPSScanImp.pas.bk` 中,「安全傳輸與 API 通訊模組」負責處理 ActiveX 客戶端與後端伺服器 (如 Java Servlet 平台) 之間的所有資料交換與檔案傳輸。由於涉及機敏的金融/保險文件,此模組高度依賴加密與安全通訊協定。
 
 若要將此模組進一步細拆,其內部組成可分為以下四大子分類:
 
diff --git a/doc/curtis/UI_View_Analysis.md b/doc/curtis/UI_View_Analysis.md
index f6b4f93..29e5d17 100644
--- a/doc/curtis/UI_View_Analysis.md
+++ b/doc/curtis/UI_View_Analysis.md
@@ -1,6 +1,6 @@
 # UI 視圖與介面呈現模組 (UI View) 深度分析
 
-在 `CB_IMGPSScanImp.pas` 中,「UI 與介面呈現模組」主要負責與使用者的視覺互動,這是作為 ActiveX 控制項的核心表現形式。它管理了表單的佈局、多國語言切換、快捷鍵操作以及各種滑鼠拖拉 (Drag and Drop) 與捲動行為。
+在 `CB_IMGPSScanImp.pas.bk` 中,「UI 與介面呈現模組」主要負責與使用者的視覺互動,這是作為 ActiveX 控制項的核心表現形式。它管理了表單的佈局、多國語言切換、快捷鍵操作以及各種滑鼠拖拉 (Drag and Drop) 與捲動行為。
 
 以下是針對 UI View 模組的深度組成與分類分析:
 
diff --git a/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_CB_IMGPSScanImp.md b/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_CB_IMGPSScanImp.md
new file mode 100644
index 0000000..673335c
--- /dev/null
+++ b/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_CB_IMGPSScanImp.md
@@ -0,0 +1,37 @@
+### 2.1 DFM 轉換需求: .dfm Delphi 轉換為 vue 實作
+@/CB_IMGPSScanImp.dfm 為 Delphi 的 ui 介面定義, 請幫我轉換為相對應的 /uiOutput/ErrList/CB_IMGPSScanImp.vue
+@/CB_IMGPSScanImp.pas 為 Delphi 的 ui 介面定義實作, 也請幫我轉換為相應的 /uiOutput/ErrList/CB_IMGPSScanImp.ts
+@/doc/curtis/screenShot/CB_IMGPSScanImp.png 則是 @/CB_IMGPSScanImp.dfm 介面的截圖, 轉換後的 /uiOutput/ErrList/CB_IMGPSScanImp.vue 必須與 @/doc/curtis/screenShot/CB_IMGPSScanImp.png 一致
+
+#### 2.2 轉換原則
+##### 2.2.1 CB_IMGPSScanImp.vue 轉換原則
+- ui layout 及風格請完全參照 CB_IMGPSScanImp.png, 因為這是使用者要的設計, 大小定義請完全參照 CB_IMGPSScanImp.dfm
+- Delphi DFM 結構轉換為使用 Tailwind CSS, 請參考其 Left, Top, Width, Height 屬性來推斷相對位置
+- dfm 檔案內所指向的物件進行轉換時請生成相對應的 vue 元件, 如下 TPanel 在轉換成 vue 時請生成對應的 TPanel元件
+```dfm
+object ErrlistForm: TErrlistForm
+  Left = 0
+  Top = 0
+  ...
+  object Panel2: TPanel
+    Left = 0
+    Top = 0
+    Width = 841
+    Height = 636
+    Align = alClient
+    Caption = 'Panel2'
+```
+- CB_IMGPSScanImp.dfm 參照 CB_IMGPSScanImp.png 的截圖回推 vue 的實作方式,並 以 vuejs 實作 CB_IMGPSScanImp.vue,
+
+##### 2.2.2 CB_IMGPSScanImp.ts 轉換原則
+- 將 CB_IMGPSScanImp.pas 的實作轉換為 ts 實作, 並完全保留其介面及大小寫, 將其 transpile 為 CB_IMGPSScanImp.ts
+- 若 CB_IMGPSScanImp.pas 找不到相依方法的實作方式則於 ts 應完全保留該方法及界面,讓使用者另行實作
+- 2.2.1 於實作 CB_IMGPSScanImp.vue 時能引用 CB_IMGPSScanImp.ts 用相關方法
+
+#### 2.3 生成後輸出
+- 生成後的檔案請輸出至對應的 /uiOutput/ErrList/CB_IMGPSScanImp.vue 和 /uiOutput/ErrList/CB_IMGPSScanImp.ts 路徑
+
+#### 2.4 更新 preview 入口
+- 2.4.1 preview 入口功能定義: 
+  - 2.4.1.1 確保 @/uiOutput/index.html 中的 `availableComponents` 陣列包含此新轉換的元件
+  - 2.4.1.2 此新元件的設定應包含 id, name, vuePath, jsPath (指向 ts 檔案) 和 windowTitle
diff --git a/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_ErrList.md b/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_ErrList.md
new file mode 100644
index 0000000..4b48d09
--- /dev/null
+++ b/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_ErrList.md
@@ -0,0 +1,39 @@
+
+### 2.1 DFM 轉換需求: .dfm Delphi 轉換為 vue 實作
+@ErrList.dfm 為 Delphi 的 ui 介面定義, 請幫我轉換為相對應的 ErrList.vue
+@ErrList.pas 為 Delphi 的 ui 介面定義實, 也請幫我轉換為相應的 ErrList.ts
+@CB_ErrList.png 則是 @ErrList.dfm 介面的截圖, 轉換後的 ErrList.vue 必須與 @CB_ErrList.png 一致
+
+#### 2.2 轉換原則
+##### 2.2.1 ErrList.vue 轉換原則
+- ui layout 及風格請完全參照 ErrList.png, 因為這是使用者要的設計, 大小定義請完全參照 ErrList.dfm
+- Delphi DFM 結構轉換為使用 Tailwind CSS, 請參考其 Left, Top, Width, Height 屬性來推斷相對位置
+- dfm 檔案內所指向的物件進行轉換時請生成相對應的 vue 元件, 如下 TPanel 在轉換成 vue 時請生成對應的 TPanel元件
+```dfm
+object ErrlistForm: TErrlistForm
+  Left = 0
+  Top = 0
+  ...
+  object Panel2: TPanel
+    Left = 0
+    Top = 0
+    Width = 841
+    Height = 636
+    Align = alClient
+    Caption = 'Panel2'
+```
+- ErrList.dfm 參照 CB_ErrList.png 的截圖回推 vue 的實作方式,並 以 vuejs 實作 ErrList.vue,
+- 
+##### 2.2.2 ErrList.ts 轉換原則
+- 將 ErrList.pas 的實作轉換為 ts 實作, 並完全保留其介面及大小寫, 將其 transpile 為 ErrList.ts
+- 若 ErrList.pas 找不到相依方法的實作方式則於 ts 應完全保留該方法及界面,讓使用者另行實作
+- 2.2.1 於實作 ErrList.vue 時能引用 ErrList.ts 用相關方法
+
+#### 2.3 生成後輸出
+- 生成後的檔案請輸出至 uiOutput/ErrList
+
+#### 2.4 生成 preview 入口
+- 2.4.1 preview 入口功能定義: 
+  - 2.4.1.1 preview 入口上方為 list button 區塊, 該區塊用來放致所有於 2.3 轉換生成的 vue 連結
+  - 2.4.1.2 preview 入口下方為 preview viewer, 當點擊 2.4.1.1 的 vue 連結時, viewer 能載入相應的 vue 元件內容
+- 2.4.2 prview 入口請輪出至 uiOutput/index.html
diff --git a/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_PatchFom.md b/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_PatchFom.md
new file mode 100644
index 0000000..b5d5821
--- /dev/null
+++ b/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_PatchFom.md
@@ -0,0 +1,37 @@
+### 2.1 DFM 轉換需求: .dfm Delphi 轉換為 vue 實作
+@/PatchFom.dfm 為 Delphi 的 ui 介面定義, 請幫我轉換為相對應的 /uiOutput/PatchFom/PatchFom.vue
+@/PatchFom.pas 為 Delphi 的 ui 介面定義實作, 也請幫我轉換為相應的 /uiOutput/PatchFom/PatchFom.ts
+@/doc/curtis/screenShot/PatchFom.png 則是 @/PatchFom.dfm 介面的截圖, 轉換後的 /uiOutput/PatchFom/PatchFom.vue 必須與 @/doc/curtis/screenShot/PatchFom.png 一致
+
+#### 2.2 轉換原則
+##### 2.2.1 PatchFom.vue 轉換原則
+- ui layout 及風格請完全參照 PatchFom.png, 因為這是使用者要的設計, 大小定義請完全參照 PatchFom.dfm
+- Delphi DFM 結構轉換為使用 Tailwind CSS, 請參考其 Left, Top, Width, Height 屬性來推斷相對位置
+- dfm 檔案內所指向的物件進行轉換時請生成相對應的 vue 元件, 如下 TPanel 在轉換成 vue 時請生成對應的 TPanel元件
+```dfm
+object ErrlistForm: TErrlistForm
+  Left = 0
+  Top = 0
+  ...
+  object Panel2: TPanel
+    Left = 0
+    Top = 0
+    Width = 841
+    Height = 636
+    Align = alClient
+    Caption = 'Panel2'
+```
+- PatchFom.dfm 參照 PatchFom.png 的截圖回推 vue 的實作方式,並 以 vuejs 實作 PatchFom.vue,
+
+##### 2.2.2 PatchFom.ts 轉換原則
+- 將 PatchFom.pas 的實作轉換為 ts 實作, 並完全保留其介面及大小寫, 將其 transpile 為 PatchFom.ts
+- 若 PatchFom.pas 找不到相依方法的實作方式則於 ts 應完全保留該方法及界面,讓使用者另行實作
+- 2.2.1 於實作 PatchFom.vue 時能引用 PatchFom.ts 用相關方法
+
+#### 2.3 生成後輸出
+- 生成後的檔案請輸出至對應的 /uiOutput/PatchFom/PatchFom.vue 和 /uiOutput/PatchFom/PatchFom.ts 路徑
+
+#### 2.4 更新 preview 入口
+- 2.4.1 preview 入口功能定義: 
+  - 2.4.1.1 確保 @/uiOutput/index.html 中的 `availableComponents` 陣列包含此新轉換的元件
+  - 2.4.1.2 此新元件的設定應包含 id, name, vuePath, jsPath (指向 ts 檔案) 和 windowTitle
diff --git a/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_template.md b/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_template.md
new file mode 100644
index 0000000..840a769
--- /dev/null
+++ b/doc/curtis/prompt/dfm_to_web/dfm_to_web_prompt_template.md
@@ -0,0 +1,37 @@
+### 2.1 DFM 轉換需求: .dfm Delphi 轉換為 vue 實作
+@{{dfm}} 為 Delphi 的 ui 介面定義, 請幫我轉換為相對應的 {{vue}}
+@{{pas}} 為 Delphi 的 ui 介面定義實作, 也請幫我轉換為相應的 {{ts}}
+@{{png}} 則是 @{{dfm}} 介面的截圖, 轉換後的 {{vue}} 必須與 @{{png}} 一致
+
+#### 2.2 轉換原則
+##### 2.2.1 {{vue_filename}} 轉換原則
+- ui layout 及風格請完全參照 {{png_filename}}, 因為這是使用者要的設計, 大小定義請完全參照 {{dfm_filename}}
+- Delphi DFM 結構轉換為使用 Tailwind CSS, 請參考其 Left, Top, Width, Height 屬性來推斷相對位置
+- dfm 檔案內所指向的物件進行轉換時請生成相對應的 vue 元件, 如下 TPanel 在轉換成 vue 時請生成對應的 TPanel元件
+```dfm
+object ErrlistForm: TErrlistForm
+  Left = 0
+  Top = 0
+  ...
+  object Panel2: TPanel
+    Left = 0
+    Top = 0
+    Width = 841
+    Height = 636
+    Align = alClient
+    Caption = 'Panel2'
+```
+- {{dfm_filename}} 參照 {{png_filename}} 的截圖回推 vue 的實作方式,並 以 vuejs 實作 {{vue_filename}},
+
+##### 2.2.2 {{ts_filename}} 轉換原則
+- 將 {{pas_filename}} 的實作轉換為 ts 實作, 並完全保留其介面及大小寫, 將其 transpile 為 {{ts_filename}}
+- 若 {{pas_filename}} 找不到相依方法的實作方式則於 ts 應完全保留該方法及界面,讓使用者另行實作
+- 2.2.1 於實作 {{vue_filename}} 時能引用 {{ts_filename}} 用相關方法
+
+#### 2.3 生成後輸出
+- 生成後的檔案請輸出至對應的 {{vue}} 和 {{ts}} 路徑
+
+#### 2.4 更新 preview 入口
+- 2.4.1 preview 入口功能定義: 
+  - 2.4.1.1 確保 @/uiOutput/index.html 中的 `availableComponents` 陣列包含此新轉換的元件
+  - 2.4.1.2 此新元件的設定應包含 id, name, vuePath, jsPath (指向 ts 檔案) 和 windowTitle
diff --git a/doc/curtis/prompt/dfm_to_web/dfm_to_web_requirement.json b/doc/curtis/prompt/dfm_to_web/dfm_to_web_requirement.json
new file mode 100644
index 0000000..f4fb16b
--- /dev/null
+++ b/doc/curtis/prompt/dfm_to_web/dfm_to_web_requirement.json
@@ -0,0 +1,16 @@
+[
+  {
+    "dfm": "/PatchFom.dfm",
+    "pas": "/PatchFom.pas",
+    "png": "/doc/curtis/screenShot/PatchFom.png",
+    "vue": "/uiOutput/PatchFom/PatchFom.vue",
+    "ts": "/uiOutput/PatchFom/PatchFom.ts"
+  },
+  {
+    "dfm": "/CB_IMGPSScanImp.dfm",
+    "pas": "/CB_IMGPSScanImp.pas",
+    "png": "/doc/curtis/screenShot/CB_IMGPSScanImp.png",
+    "vue": "/uiOutput/CB_IMGPSScanImp/CB_IMGPSScanImp.vue",
+    "ts": "/uiOutput/CB_IMGPSScanImp/CB_IMGPSScanImp.ts"
+  }
+]
diff --git a/doc/curtis/prompt/dfm_to_web/readme.md b/doc/curtis/prompt/dfm_to_web/readme.md
new file mode 100644
index 0000000..a4ec05f
--- /dev/null
+++ b/doc/curtis/prompt/dfm_to_web/readme.md
@@ -0,0 +1,4 @@
+### Delphi dfm 轉 vue
+
+template: [dfm_to_web_prompt_template.md](dfm_to_web_prompt_template.md)
+template_render: [batch_dfm_to_web.js](../../../../scripts/batch_dfm_to_web.js)
diff --git a/doc/curtis/prompt/scanimpl_analysis/01/scanimpl_annalysis.md b/doc/curtis/prompt/scanimpl_analysis/01/scanimpl_annalysis.md
new file mode 100644
index 0000000..f873c54
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/01/scanimpl_annalysis.md
@@ -0,0 +1,167 @@
+
+---
+base_path: "doc/curtis/prompt/scanimpl_analysis"
+script_path: "script"
+---
+
+
+## B1.1 分析方法集合:
+請依 @Delphi_套件相依.md 裡 「依功能拆分模組與第三方套件綁定分析」要項
+對 @CB_IMGPSScanImp.pas 檔案進行分析,將合於該分類的方法名集合找出來
+生成對應的 json 檔, 該生成的 json 檔可用來代表 @CB_IMGPSScanImp.pas.bk
+拆分前的每個方法,其分類是什麼,其所在區段是什麼,最後該 json 檔將餵入
+腳本,透過腳本執行,進行檔案拆分及測試,而不是透過 AI 拆分
+
+以下是詳細規格需求:
+### B1.1.1.  **輸入檔案**:
+  *   程式需讀取同一目錄下的 `CB_IMGPSScanImp.pas.bk` 檔案。
+
+### B1.1.2.  **方法擷取**:
+  *   尋找檔案中所有以 `procedure TCB_IMGPSScanX.` 或 `function TCB_IMGPSScanX.` 開頭的行。
+  *   紀錄每個方法的:
+    *   `lIndex`:該方法在檔案中的起始行號(從 1 開始計算)。
+    *   `methodName`:方法的完整簽名字串 (例如:`procedure TCB_IMGPSScanX.StatrTwainScan;`, `procedure TCB_IMGPSScanX.OnAcquire( const DibHandle    : THandle;`)。
+
+### B1.1.3.  **計算 `rIndex`**:
+  *   每個方法的結束行 (`rIndex`) 可以假設是下一個方法開始的前一行 (`lIndex - 1`)。
+  *   如果是最後一個方法,它的 `rIndex` 應該是檔案的總行數。
+
+### B1.1.4.  **分類邏輯 (tags)**:
+    我需要你將找到的每個方法,分配到對應的 `tags`。
+    請根據以下關鍵字進行簡單的字串比對分類 (如果不在此列表內,則預設分類到 `"UIView"` / `"UIView.misc"`):
+
+  *   **ScannerControl (硬體掃描控制模組)**
+    *   `StatrTwainScan`, `OnAcquire`, `initkscan`, `CheckScannerConfig`, `PageEnd`, `PageDone`, `R_W_Scanini`, `GetDefScanIni` -> `ScannerControl.twainWrapper`
+
+  *   **ImageProcessor (影像處理與轉換模組)**
+    *   `DeskewImg`, `Rotate`, `CropImg`, `ImageReSize_FormID`, `ImageReSize_tmp`, `CheckNeedCrop` -> `ImageProcessor.transformer`
+    *   `ConvertToBW`, `ConvertToGray`, `Image_Smooth`, `NegativeImg`, `CleanupBorder` -> `ImageProcessor.converter`
+    *   `MpsGetBarcode`, `Get_OMR` -> `ImageProcessor.barcodeRecognizer`
+    *   `FindPoint`, `CheckSize`, `GetSiteOMR` -> `ImageProcessor.anchorAnalyzer`
+
+  *   **TransportManager (安全傳輸與 API 通訊模組)**
+    *   `ProcessServlet`, `ProcessServlet_Get`, `ProcessServlet_FormData` -> `TransportManager.requestWrapper`
+    *   `upFile`, `dnFile`, `dnFile_Get`, `GetftpInfo`, `SetFtpInfo`, `FtpCaseComplete` -> `TransportManager.fileTransfer`
+    *   `En_DecryptionStr_Base64`, `LoadFileGetMD5`, `HTTPSClientCertificateValidate` -> `TransportManager.utilities`
+    *   `ZipMainFile`, `ZipMaskFile`, `ExecuteUnZip` -> `TransportManager.payloadArchiver`
+
+  *   **BusinessLogic (業務邏輯與資料解析模組)**
+    *   `SetSQLData`, `GetSQLData`, `FindSQLData`, `GetSetInf1`, `GetSetInf2`, `GetSetInf3`, `GetSetInf4`, `GetSetInf5`, `GetSetInf6`, `GetSetInf7` -> `BusinessLogic.paramState`
+    *   `BarCode2FormID`, `BarCode2CaseID`, `FormCode2DocNo`, `DocNo2DocName`, `DocNoNeedDiv`, `CreateDocNo_Info`, `CreateCustDocNo_Info` -> `BusinessLogic.entityMapping`
+    *   `OMRCheckCase`, `OMRErr2ini`, `OMRErrini2List` -> `BusinessLogic.ormRuleEngine`
+    *   `SetUseCase`, `GetUseCase`, `OldCasetoNewCase`, `ErrFormtoCurrentForm`, `DeleteDocNoFileForESCAN` -> `BusinessLogic.caseManager`
+
+  *   **UIView (UI 視圖與介面呈現模組)**
+    *   包含 `TreeView` 的方法 (如 `TreeView1Click`, `DrawDocItem2` 等) -> `UIView.treeView`
+    *   包含 `ISB`, `ImageScrollBox`, `ScrollBox` 的方法 (如 `ISB1Click`, `CreatePreViewISB` 等) -> `UIView.scrollView`
+    *   `InitialLanguage`, `DownLanguage` -> `UIView.i18n`
+    *   `DisplayMode`, `GoViewMode` -> `UIView.misc`
+    *   `DataLoading`, `Timer2Timer`, `StatusBar1DblClick` -> `UIView.statusMessenger`
+
+### B1.1.5.  **方法分類 tags 說明**:
+
+#### ScannerController (掃描硬體控制模組)
+- ScannerController.twainWrapper (TWAIN 介面與硬體初始化)
+- ScannerController.acquisitionHandler (硬體取像非同步回呼與後處理)
+
+#### ImageProcessor
+- ImageProcessor.transformer (影像幾何與物理變換):如各種縮放 (ReSize)、裁切 (CheckNeedCrop)、旋轉 (Rotate)、去斜 (Deskew) 及所有 UI 比例變換等。
+- ImageProcessor.converter (影像色彩與品質轉換):包含黑白轉換 (ConvertToBW)、平滑化 (Smooth)、遮罩處理 (Mask)、浮水印列印 (PrintImg)。
+- ImageProcessor.anchorAnalyzer (特徵定位與 OMR 分析):包含了分析黑點密度的 GetSiteOMR。
+
+#### TransportManager (傳輸與網路管理模組),新增了:
+- TransportManager.apiClient (RESTful / Servlet 參數與組態拉取)
+- TransportManager.fileTransfer (大檔、影像、FTP 實體傳輸)
+- TransportManager.certificateManager (HTTPS 與 SSL 憑證驗證)
+- TransportManager.payloadArchiver (ZIP 壓縮、解壓縮與進匯出封裝)
+
+#### BusinessLogic
+- BusinessLogic.systemInternal': 系統參數與組態儲存庫 (Config & Parameter Repository),
+- BusinessLogic.configRepository: 系統參數與組態儲存庫 (Config & Parameter Repository),
+- BusinessLogic.ormRuleEngine': OMR 與業務規則檢核引擎 (OMR & Business Rule Engine),
+- BusinessLogic.entityMapping: 領域實體對映與結構管理器 (Entity Mapping & Structure Manager),
+- BusinessLogic.entityModel: 領域實體對映與結構管理器 (Entity Mapping & Structure Manager),
+- BusinessLogic.fileManager': 案件異動與舊案引用處理器 (Case Modification & Legacy Handler),
+- BusinessLogic.caseManager': 案件異動與舊案引用處理器 (Case Modification & Legacy Handler),
+- BusinessLogic.activeXWrapper': 處理 ActiveX 相關,
+
+#### UIView
+- UIView.treeView:樹狀結構呈現與操作 (如 TreeView 的節點刷新、拖曳、點擊)
+- UIView.listView:清單結構呈現 (如 PageLV, AttListBox)
+- UIView.imageScrollBox:影像預覽與捲動 (對應 EnImgScr / TImageScrollBox 相關的視覺控制與預覽)
+- UIView.toolBar:互動工具與面板按鈕 (如各類 BtnClick、FC 分類按鈕)
+- UIView.popupMenu:快顯選單控制 (各類 PMxxxClick 或是 PopupMenuPopup)
+- UIView.i18n:多國語言與翻譯載入
+- UIView.feedback:系統狀態與進度回饋 (包含 Timer、DataLoading、StatusBar)
+
+### B1.1.5.  **輸出格式**:
+  *   JSON 輸出的結構應該類似這樣:
+```json
+    [
+        {
+            "matcher": "procedure TCB_IMGPSScanX.OnAcquire( const DibHandle    : THandle;",
+            "tags": [
+                "ScannerController",
+                "ScannerController.acquisitionHandler"
+            ],
+            "deps": [],
+            "lIndex": "4444",
+            "rIndex": "4476",
+            "description": ""
+        }
+    ]
+```
+  * 盡量將相同 `tags` 的 items 群組在一個 block 內。
+  * deps 保持空陣列
+
+
+## B1.2 分類結果生成:
+### B1.2.1 生成分類結果 json - tags 說明: 
+透過 B1.1 取得的結果將各個方法名進行分類,分類時請合於 @Delphi_套件相依.md
+的分類方法,並依 "B1.1.5 方法分類 tags 說明" 判定其 tags 屬性
+
+**example:**
+```pascal
+// CB_IMGPSScanImp.pas, 假定該分類為 ImageProcessor.anchorAnalyzer
+function TCB_IMGPSScanX.GetSiteOMR(FileName,Site:String;bt: Integer): Integer;
+```
+
+```json
+{
+  "matcher": "function TCB_IMGPSScanX.GetSiteOMR(FileName,Site:String;bt: Integer): Integer;",
+  "tags": [
+    "ImageProcessor",
+    "ImageProcessor.anchorAnalyzer"
+  ],
+  "deps": [],
+  "lIndex": "5173",
+  "rIndex": "5226",
+  "description": ""
+}
+```
+
+### B1.2.2 生成分類結果 json - 輸出位置說明:
+- B1.2.2.1 - 若 tag 名其一綴包含 ScannerController:
+  > output: `{{base_path}}/scanimpl_annalysis.ScannerController.json`
+- B1.2.2.2 - 若 tag 名其一綴包含 BusinessLogic:
+  > output: `{{base_path}}/scanimpl_annalysis.BusinessLogic.json`
+- B1.2.2.3 - 若 tag 名其一綴包含 ImageProcessor:
+  > output: `{{base_path}}/scanimpl_annalysis.ImageProcessor.json`
+- B1.2.2.4 - 若 tag 名其一綴包含 TransportManager:
+  > output: `{{base_path}}/scanimpl_annalysis.TransportManager.json`
+- B1.2.2.5 - 若 tag 名其一綴包含 UIView:
+  > output: `{{base_path}}/scanimpl_annalysis.UIView.json`
+  
+
+## B1.3 生成分類結果 json 驗證腳本
+生成腳本,以驗證 "B1.2 分類結果生成" 是否正確,該腳本檔針對 @CB_IMGPSScanImp.pas.bk 
+與 '"B1.2 分類結果生成" 生成之 json'(以下簡程 [B1.2Jsons] ) 進行驗證
+
+### B1.3.1 驗證原則說明:
+- B1.3.1.1: [B1.2Jsons] 其方法名(matcher) 必須等於 @CB_IMGPSScanImp.pas 所對應的 lIndex
+- B1.3.1.2: [B1.2Jsons] 裡的 rIndex, lIndex 不可能為 -1, 因為該值必須正確映射 @CB_IMGPSScanImp.pas.bk 的行號
+- B1.3.1.3: 移除 @CB_IMGPSScanImp.pas 中於 [B1.2Jsons] 所標示之區段另存為文字檔,並於腳本結束時,顯其文字檔路徑,我想人工審核
+  > output: `{{base_path}}/scanimpl_annalysis.remainings.txt`
+
+### B1.3.2 驗證腳本路徑:
+> output: `{{script_path}}/scanimpl_annalysis_json.test.js`
diff --git a/doc/curtis/prompt/scanimpl_analysis/01/scanimpl_annalysis_step_ver.md b/doc/curtis/prompt/scanimpl_analysis/01/scanimpl_annalysis_step_ver.md
new file mode 100644
index 0000000..d2eb174
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/01/scanimpl_annalysis_step_ver.md
@@ -0,0 +1,145 @@
+
+
+### 0.1.1. 專案背景與目標
+本文件定義了將大型實體檔案 `CB_IMGPSScanImp.pas.bk` 進行解耦與重構的標準流程。
+核心策略在於「步驟間解耦(Step Decoupling)」,透過引入中介產出物,確保流程中斷時可從失敗步驟直接重試,無需重複耗時的掃描作業。
+
+### 0.1.2. 環境變數定義
+- {{base_path}} = "doc/curtis/prompt/scanimpl_analysis"
+- {{script_path}} = "script"
+- {{source_file}} = "CB_IMGPSScanImp.pas.bk"
+
+### 0.1.3. 四階段執行程序規格
+
+### 0.1.3.1 階段一:原始碼結構提取 (Physical Extraction)
+- **目標**:識別所有 `TCB_IMGPSScanX` 類別的方法實體邊界,建立物理行號索引。
+- **輸入**:{{source_file}}。
+- **處理邏輯**:
+    1. 執行逐行掃描。
+    2. 匹配正則表達式:`^(procedure|function)\s+TCB_IMGPSScanX\.`。
+    3. 紀錄 `lIndex`:該方法宣告所在的起始行號(從 1 開始計算)。
+    4. 紀錄 `matcher`:該行的完整原始碼字串。
+    5. 計算 `rIndex`:將「下一個方法」的 `lIndex - 1` 作為當前方法的結束行;若為最後一個方法,則 `rIndex` 為檔案總行數。
+- **中介輸出**:`{{base_path}}/step1_raw_methods.json`
+- **中介輸出腳本**: `{{script_path}}/scanimpl_annalysis_extract_methods.js`
+- **結構範例**:`[{"matcher": "...", "lIndex": 120, "rIndex": 150}]`
+
+### 0.1.3.2 階段二:特徵比對與標籤分類 (Semantic Tagging)
+- **目標**:讀取邊界索引,根據關鍵字字典規則賦予業務分類標籤 (Tags)。
+- **輸入**:`{{base_path}}/step1_raw_methods.json`。
+- **處理邏輯**:
+    1. 遍歷中介 JSON 中的所有項目。
+    2. 依據 `matcher` 內容進行關鍵字匹配(分類規則詳見第 4 節)。
+    3. 賦予對應的主標籤(如 `UIView`)與次標籤(如 `UIView.treeView`)。
+    4. 統一初始化 `deps: []` 與 `description: ""` 欄位。
+- **中介輸出**:`{{base_path}}/step2_classified_methods.json`
+- **中介輸出腳本**:`{{base_path}}/scanimpl_annalysis_classify.js`
+
+### 0.1.3.3 階段三:模組分流實體化 (Module Disaggregation)
+- **目標**:將分類完成的總集合,物理性地拆分為五個符合專案規範的正式模組 JSON。
+- **輸入**:`{{base_path}}/step2_classified_methods.json`。
+- **處理邏輯**:
+    1. 依據項目中的主標籤(ScannerController, BusinessLogic, ImageProcessor, TransportManager, UIView)進行分流。
+    2. 格式化 JSON:使用 UTF-8 編碼,縮排為 2 個空格。
+- **目標產出**:
+    - `{{base_path}}/scanimpl_annalysis.ScannerController.json`
+    - `{{base_path}}/scanimpl_annalysis.BusinessLogic.json`
+    - `{{base_path}}/scanimpl_annalysis.ImageProcessor.json`
+    - `{{base_path}}/scanimpl_annalysis.TransportManager.json`
+    - `{{base_path}}/scanimpl_annalysis.UIView.json`
+- **目標產出腳本**: `{{script_path}}/scanimpl_annalysis_disaggregate.js`
+
+### 0.1.3.4 階段四:邊界驗證與死角萃取 (Validation & Dead Zone Analysis)
+- **目標**:產出並執行驗證腳本,確保 JSON 數據與原始碼 100% 對齊。
+- **輸入**:上述 5 個模組 JSON 與 {{source_file}}。
+- **驗證腳本規格** (`{{script_path}}/scanimpl_annalysis_json.test.js`):
+    1. **字串對齊斷言**:斷言 JSON 裡的 `matcher` 必須精確等於原檔在 `lIndex` 行的內容。
+    2. **範圍合法性斷言**:斷言所有 `lIndex` 與 `rIndex` 均 > 0,嚴禁出現 -1。
+    3. **覆蓋率分析**:標記所有被捕捉的行區段,將未被標記的代碼區塊(如全域變數、Type 定義區)匯出至 `remainings.txt`。
+- **驗證產出**:
+    - `{{script_path}}/dist/scanimpl_annalysis.remainings.txt` (死角清單)
+
+### 0.1.4. 方法分類 Tags 映射規則
+請根據以下關鍵字進行簡單的字串比對分類 (如果不在此列表內,則預設分類到 `"UIView"` / `"UIView.misc"`), tags 應允許多組:
+*   **ScannerControl (硬體掃描控制模組)**
+  *   `StatrTwainScan`, `OnAcquire`, `initkscan`, `CheckScannerConfig`, `PageEnd`, `PageDone`, `R_W_Scanini`, `GetDefScanIni` -> `ScannerControl.twainWrapper`
+
+*   **ImageProcessor (影像處理與轉換模組)**
+  *   `DeskewImg`, `Rotate`, `CropImg`, `ImageReSize_FormID`, `ImageReSize_tmp`, `CheckNeedCrop` -> `ImageProcessor.transformer`
+  *   `ConvertToBW`, `ConvertToGray`, `Image_Smooth`, `NegativeImg`, `CleanupBorder` -> `ImageProcessor.converter`
+  *   `MpsGetBarcode`, `Get_OMR` -> `ImageProcessor.barcodeRecognizer`
+  *   `FindPoint`, `CheckSize`, `GetSiteOMR` -> `ImageProcessor.anchorAnalyzer`
+
+*   **TransportManager (安全傳輸與 API 通訊模組)**
+  *   `ProcessServlet`, `ProcessServlet_Get`, `ProcessServlet_FormData` -> `TransportManager.requestWrapper`
+  *   `upFile`, `dnFile`, `dnFile_Get`, `GetftpInfo`, `SetFtpInfo`, `FtpCaseComplete` -> `TransportManager.fileTransfer`
+  *   `En_DecryptionStr_Base64`, `LoadFileGetMD5`, `HTTPSClientCertificateValidate` -> `TransportManager.utilities`
+  *   `ZipMainFile`, `ZipMaskFile`, `ExecuteUnZip` -> `TransportManager.payloadArchiver`
+
+*   **BusinessLogic (業務邏輯與資料解析模組)**
+  *   `SetSQLData`, `GetSQLData`, `FindSQLData`, `GetSetInf1`, `GetSetInf2`, `GetSetInf3`, `GetSetInf4`, `GetSetInf5`, `GetSetInf6`, `GetSetInf7` -> `BusinessLogic.paramState`
+  *   `BarCode2FormID`, `BarCode2CaseID`, `FormCode2DocNo`, `DocNo2DocName`, `DocNoNeedDiv`, `CreateDocNo_Info`, `CreateCustDocNo_Info` -> `BusinessLogic.entityMapping`
+  *   `OMRCheckCase`, `OMRErr2ini`, `OMRErrini2List` -> `BusinessLogic.ormRuleEngine`
+  *   `SetUseCase`, `GetUseCase`, `OldCasetoNewCase`, `ErrFormtoCurrentForm`, `DeleteDocNoFileForESCAN` -> `BusinessLogic.caseManager`
+
+*   **UIView (UI 視圖與介面呈現模組)**
+  *   包含 `TreeView` 的方法 (如 `TreeView1Click`, `DrawDocItem2` 等) -> `UIView.treeView`
+  *   包含 `ISB`, `ImageScrollBox`, `ScrollBox` 的方法 (如 `ISB1Click`, `CreatePreViewISB` 等) -> `UIView.scrollView`
+  *   `InitialLanguage`, `DownLanguage` -> `UIView.i18n`
+  *   `DisplayMode`, `GoViewMode` -> `UIView.layouts`
+  *   `DataLoading`, `Timer2Timer`, `StatusBar1DblClick` -> `UIView.statusMessenger`
+
+
+**example:**
+```pascal
+// CB_IMGPSScanImp.pas, 假定該分類為 ImageProcessor.anchorAnalyzer
+function TCB_IMGPSScanX.GetSiteOMR(FileName,Site:String;bt: Integer): Integer;
+```
+
+```json
+{
+  "matcher": "function TCB_IMGPSScanX.GetSiteOMR(FileName,Site:String;bt: Integer): Integer;",
+  "tags": [
+    "ImageProcessor",
+    "ImageProcessor.anchorAnalyzer"
+  ],
+  "deps": [],
+  "lIndex": "5173",
+  "rIndex": "5226",
+  "description": ""
+}
+```
+
+#### 0.1.4.1 ScannerController (掃描硬體控制模組)
+- ScannerController.twainWrapper (TWAIN 介面與硬體初始化)
+- ScannerController.acquisitionHandler (硬體取像非同步回呼與後處理)
+
+#### 0.1.4.2 ImageProcessor
+- ImageProcessor.transformer (影像幾何與物理變換):如各種縮放 (ReSize)、裁切 (CheckNeedCrop)、旋轉 (Rotate)、去斜 (Deskew) 及所有 UI 比例變換等。
+- ImageProcessor.converter (影像色彩與品質轉換):包含黑白轉換 (ConvertToBW)、平滑化 (Smooth)、遮罩處理 (Mask)、浮水印列印 (PrintImg)。
+- ImageProcessor.anchorAnalyzer (特徵定位與 OMR 分析):包含了分析黑點密度的 GetSiteOMR。
+
+#### 0.1.4.3 TransportManager (傳輸與網路管理模組),新增了:
+- TransportManager.apiClient (RESTful / Servlet 參數與組態拉取)
+- TransportManager.fileTransfer (大檔、影像、FTP 實體傳輸)
+- TransportManager.certificateManager (HTTPS 與 SSL 憑證驗證)
+- TransportManager.payloadArchiver (ZIP 壓縮、解壓縮與進匯出封裝)
+
+#### 0.1.4.4 BusinessLogic
+- BusinessLogic.systemInternal': 系統參數與組態儲存庫 (Config & Parameter Repository),
+- BusinessLogic.configRepository: 系統參數與組態儲存庫 (Config & Parameter Repository),
+- BusinessLogic.ormRuleEngine': OMR 與業務規則檢核引擎 (OMR & Business Rule Engine),
+- BusinessLogic.entityMapping: 領域實體對映與結構管理器 (Entity Mapping & Structure Manager),
+- BusinessLogic.entityModel: 領域實體對映與結構管理器 (Entity Mapping & Structure Manager),
+- BusinessLogic.fileManager': 案件異動與舊案引用處理器 (Case Modification & Legacy Handler),
+- BusinessLogic.caseManager': 案件異動與舊案引用處理器 (Case Modification & Legacy Handler),
+- BusinessLogic.activeXWrapper': 處理 ActiveX 相關,
+
+#### 0.1.4.5 UIView
+- UIView.treeView:樹狀結構呈現與操作 (如 TreeView 的節點刷新、拖曳、點擊)
+- UIView.listView:清單結構呈現 (如 PageLV, AttListBox)
+- UIView.imageScrollBox:影像預覽與捲動 (對應 EnImgScr / TImageScrollBox 相關的視覺控制與預覽)
+- UIView.toolBar:互動工具與面板按鈕 (如各類 BtnClick、FC 分類按鈕)
+- UIView.popupMenu:快顯選單控制 (各類 PMxxxClick 或是 PopupMenuPopup)
+- UIView.i18n:多國語言與翻譯載入
+- UIView.feedback:系統狀態與進度回饋 (包含 Timer、DataLoading、StatusBar)
diff --git a/doc/curtis/prompt/scanimpl_analysis/02/readme.md b/doc/curtis/prompt/scanimpl_analysis/02/readme.md
new file mode 100644
index 0000000..9183395
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/02/readme.md
@@ -0,0 +1,7 @@
+
+
+- team_tasks_classification.json
+  用於合併 excel 分類
+
+
+excel[https://docs.google.com/spreadsheets/d/1500m32ysXtdHw16iCfuMZsQpDhZbtJksPkoK5aEg_Bg/edit?gid=370660718#gid=370660718]
diff --git a/doc/curtis/prompt/scanimpl_analysis/02/scanimpl_ann_addon.md b/doc/curtis/prompt/scanimpl_analysis/02/scanimpl_ann_addon.md
new file mode 100644
index 0000000..0ea3392
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/02/scanimpl_ann_addon.md
@@ -0,0 +1,55 @@
+
+---
+base_path: "doc/curtis/prompt/scanimpl_analysis"
+script_path: "script"
+assets_json: "team_tasks_classification.json"
+current_step: "02"
+output_script: "scanimpl_annalysis_addon_json.js"
+---
+
+
+[定義:
+- 以下 @{{json}} 指的是 @scanimpl_annalysis_step_ver.md 需求 "0.1.3.3 階段三:模組分流實體化 (Module Disaggregation)" 所輸出的五個檔案]()
+
+
+## 0.3 處理額外分類
+## 0.3.1 生成處理額外分類腳本
+透過額外分類檔 @team_tasks_classification.json 生成一腳本, 能夠為 @{{jsons}} 額外添加新的分類
+
+- 0.3.1.1 步驟1 變更資料
+  由 @team_tasks_classification.json 中的 lineno 找出於 @{{jsons}} 所對應的 lineno, 
+  為其添加新的 tag, 並於 0.3.1.2 進行寫入
+
+**範例A**
+
+檔案: team_tasks_classification.json
+用於為 需求0.2 生成的 json 額外新增新的 tag, 以下面為例,將為行號 4117 的 ActiveFormCreate 方法新增 tag "初始化與生命週期" 
+```json
+{
+  "tag": "初始化與生命週期",
+  "methodName": "`ActiveFormCreate`",
+  "lineno": "4117"
+}
+```
+
+檔案: scanimpl_annalysis.UIView.json
+行號 4117 的 ActiveFormCreate 方法位於 @scanimpl_annalysis.UIView.json 中,應為 @scanimpl_annalysis.UIView.json
+添加新的 tag "初始化與生命週期", 結果應如下
+```json
+{
+    "matcher": "procedure TCB_IMGPSScanX.ActiveFormCreate",
+    "tags": [
+      "UIView", "初始化與生命週期"
+    ],
+    "lIndex": "4117",
+    "rIndex": "4137"
+}
+```
+
+- 0.3.1.2 步驟2 寫入資料
+  寫入 0.3.1.1 的結果至相應的 json 檔
+
+**腳本檔案輸出位置:**
+> output: {{script_path}}/{{output_script}}
+
+
diff --git a/doc/curtis/prompt/scanimpl_analysis/02/team_tasks_classification.json b/doc/curtis/prompt/scanimpl_analysis/02/team_tasks_classification.json
new file mode 100644
index 0000000..34247ea
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/02/team_tasks_classification.json
@@ -0,0 +1,882 @@
+[
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`ActiveFormCreate`",
+    "lineno": "4117"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`Timer1Timer`",
+    "lineno": "14904"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`Timer2Timer`",
+    "lineno": "15338"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`DestroyEvent`",
+    "lineno": "1710"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`ActivateEvent`",
+    "lineno": "1685"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`DeactivateEvent`",
+    "lineno": "1705"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`CreateEvent`",
+    "lineno": "1695"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`PaintEvent`",
+    "lineno": "1805"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`ClickEvent`",
+    "lineno": "1690"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`DblClickEvent`",
+    "lineno": "1700"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`MouseEnterEvent`",
+    "lineno": "1795"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`MouseLeaveEvent`",
+    "lineno": "1800"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`KeyPressEvent`",
+    "lineno": "1756"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`EventSinkChanged`",
+    "lineno": "1254"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`DefinePropertyPages`",
+    "lineno": "1247"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`InitialLanguage`",
+    "lineno": "5095"
+  },
+  {
+    "tag": "初始化與生命週期",
+    "methodName": "`HotKeyDown`",
+    "lineno": "5090"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`GetServerDate`",
+    "lineno": "5600"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`GetSampleInf`",
+    "lineno": "5632"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`GetSetInf1`",
+    "lineno": "5665"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`GetSetInf2`",
+    "lineno": "5708"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`GetSetInf3`",
+    "lineno": "5747"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`GetSetInf4`",
+    "lineno": "5787"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`GetSetInf5`",
+    "lineno": "5828"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`GetSetInf6`",
+    "lineno": "5867"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`GetSetInf7`",
+    "lineno": "5907"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`GetOMRCheckSet`",
+    "lineno": "14507"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`GetKeyinSet`",
+    "lineno": "14566"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`CaseAsk`",
+    "lineno": "14625"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`CaseComplete`",
+    "lineno": "14675"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`DownLanguage`",
+    "lineno": "13059"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`DownLoadImage`",
+    "lineno": "6840+"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`Down_Img`",
+    "lineno": "6988+"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`TransCaseID`",
+    "lineno": "6458"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`TransOldCaseFile`",
+    "lineno": "10877"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`WriteLog`",
+    "lineno": "10938"
+  },
+  {
+    "tag": "API 呼叫相關",
+    "methodName": "`CheckAvailable`",
+    "lineno": "9835+"
+  },
+  {
+    "tag": "FTP 相關",
+    "methodName": "`GetFtpinfo`",
+    "lineno": "10964"
+  },
+  {
+    "tag": "FTP 相關",
+    "methodName": "`SetFtpInfo`",
+    "lineno": "11042"
+  },
+  {
+    "tag": "FTP 相關",
+    "methodName": "`FtpCaseComplete`",
+    "lineno": "11072"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FormCode2FormName`",
+    "lineno": "11845"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FormCode2FileName`",
+    "lineno": "11896"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FileName2FormCode`",
+    "lineno": "11919"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FileName2FormName`",
+    "lineno": "11936"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FileName2ScanPage`",
+    "lineno": "11941"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FileName2NoQuene_Filename`",
+    "lineno": "11953"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FileName2Index`",
+    "lineno": "11966"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FileName2NowDcoNo`",
+    "lineno": "11980"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FormCode2DocNo`",
+    "lineno": "11994"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FormCode2Version`",
+    "lineno": "12019"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FormCode2Page`",
+    "lineno": "12024"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`DocNo2DocName`",
+    "lineno": "12029"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`DocNo2FileName`",
+    "lineno": "12067"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FormCode2WorkNo`",
+    "lineno": "12082"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`DocNo2WorkNo`",
+    "lineno": "12091"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`DocNoNeedDiv`",
+    "lineno": "12100"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`CaseNode2Info`",
+    "lineno": "12113"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`DocNode2Info`",
+    "lineno": "12127"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`FormNode2Info`",
+    "lineno": "12145"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`Node2DocNo`",
+    "lineno": "6780+"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`Node3DocNo`",
+    "lineno": "6795+"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`Node3FormID`",
+    "lineno": "6808+"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`GetNode2Name`",
+    "lineno": "6821+"
+  },
+  {
+    "tag": "轉換區(名稱/格式轉換)",
+    "methodName": "`Path2DocDir`",
+    "lineno": "10640"
+  },
+  {
+    "tag": "掃描相關",
+    "methodName": "`StatrTwainScan`",
+    "lineno": "4390"
+  },
+  {
+    "tag": "掃描相關",
+    "methodName": "`OnAcquire`",
+    "lineno": "4444"
+  },
+  {
+    "tag": "掃描相關",
+    "methodName": "`PageDone`",
+    "lineno": "4684"
+  },
+  {
+    "tag": "掃描相關",
+    "methodName": "`PageEnd`",
+    "lineno": "4734"
+  },
+  {
+    "tag": "掃描相關",
+    "methodName": "`R_W_ScanIni`",
+    "lineno": "5254"
+  },
+  {
+    "tag": "掃描相關",
+    "methodName": "`GetDefScanIni`",
+    "lineno": "5296"
+  },
+  {
+    "tag": "影像處理",
+    "methodName": "`CaseReSize`",
+    "lineno": "6320"
+  },
+  {
+    "tag": "影像處理",
+    "methodName": "`ImageReSize_FormID`",
+    "lineno": "6343"
+  },
+  {
+    "tag": "影像處理",
+    "methodName": "`ImageReSize_tmp`",
+    "lineno": "6421"
+  },
+  {
+    "tag": "影像處理",
+    "methodName": "`ImageScrollBox1NewGraphic`",
+    "lineno": "6447"
+  },
+  {
+    "tag": "影像處理",
+    "methodName": "`CheckNeedCrop`",
+    "lineno": "9996"
+  },
+  {
+    "tag": "影像處理",
+    "methodName": "`Case2Mask`",
+    "lineno": "9932"
+  },
+  {
+    "tag": "OMR 檢核",
+    "methodName": "`OMRCheckCase`",
+    "lineno": "12255"
+  },
+  {
+    "tag": "OMR 檢核",
+    "methodName": "`OMRErr2ini`",
+    "lineno": "12951"
+  },
+  {
+    "tag": "OMR 檢核",
+    "methodName": "`OMRErrini2List`",
+    "lineno": "12991"
+  },
+  {
+    "tag": "OMR 檢核",
+    "methodName": "`OMRErrini2ListForLog`",
+    "lineno": "13021"
+  },
+  {
+    "tag": "OMR 檢核",
+    "methodName": "`CheckRule2OMRErrInfo`",
+    "lineno": "5983"
+  },
+  {
+    "tag": "OMR 檢核",
+    "methodName": "`GetSiteOMR`",
+    "lineno": "5173"
+  },
+  {
+    "tag": "OMR 檢核",
+    "methodName": "`DistinctFormCode`",
+    "lineno": "12209"
+  },
+  {
+    "tag": "案件管理(TreeView / 案件操作)",
+    "methodName": "`LoadImgFile`",
+    "lineno": "9500+"
+  },
+  {
+    "tag": "案件管理(TreeView / 案件操作)",
+    "methodName": "`LoadImgFile1`",
+    "lineno": "9685+"
+  },
+  {
+    "tag": "案件管理(TreeView / 案件操作)",
+    "methodName": "`LoadAttFile`",
+    "lineno": "9785+"
+  },
+  {
+    "tag": "案件管理(TreeView / 案件操作)",
+    "methodName": "`NewTreeNodeRefresh`",
+    "lineno": "6762"
+  },
+  {
+    "tag": "案件管理(TreeView / 案件操作)",
+    "methodName": "`MyTreeNode1Refresh`",
+    "lineno": "6772"
+  },
+  {
+    "tag": "案件管理(TreeView / 案件操作)",
+    "methodName": "`MyTreeNode2ReFresh`",
+    "lineno": "6779"
+  },
+  {
+    "tag": "案件管理(TreeView / 案件操作)",
+    "methodName": "`MyTreeNode3ReFresh`",
+    "lineno": "6786"
+  },
+  {
+    "tag": "案件管理(TreeView / 案件操作)",
+    "methodName": "`DocNoExistsinTree`",
+    "lineno": "12183"
+  },
+  {
+    "tag": "案件管理(TreeView / 案件操作)",
+    "methodName": "`DocnoNeedGroup`",
+    "lineno": "12199"
+  },
+  {
+    "tag": "案件管理(TreeView / 案件操作)",
+    "methodName": "`CaseDelete_Enable`",
+    "lineno": "11369"
+  },
+  {
+    "tag": "清單管理",
+    "methodName": "`SetFormID_DocNo`",
+    "lineno": "5947"
+  },
+  {
+    "tag": "清單管理",
+    "methodName": "`SetIn_WH_DocNo`",
+    "lineno": "5959"
+  },
+  {
+    "tag": "檔案操作",
+    "methodName": "`ReNameContext`",
+    "lineno": "6011"
+  },
+  {
+    "tag": "檔案操作",
+    "methodName": "`DeleteImageFile`",
+    "lineno": "6028"
+  },
+  {
+    "tag": "檔案操作",
+    "methodName": "`DeleteFormCodeFile`",
+    "lineno": "6060"
+  },
+  {
+    "tag": "檔案操作",
+    "methodName": "`DeleteDocNoFile`",
+    "lineno": "6115"
+  },
+  {
+    "tag": "檔案操作",
+    "methodName": "`DeleteDocNoFileForESCAN`",
+    "lineno": "6141"
+  },
+  {
+    "tag": "檔案操作",
+    "methodName": "`DeleteShowFile`",
+    "lineno": "6175"
+  },
+  {
+    "tag": "檔案操作",
+    "methodName": "`DeleteCustomDocDir`",
+    "lineno": "10197"
+  },
+  {
+    "tag": "檔案操作",
+    "methodName": "`ReSortFileName`",
+    "lineno": "14427"
+  },
+  {
+    "tag": "檔案操作",
+    "methodName": "`ReSortFileName_New`",
+    "lineno": "14455"
+  },
+  {
+    "tag": "檔案操作",
+    "methodName": "`ReSortFileName2Scanlist`",
+    "lineno": "14482"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`Case2upload`",
+    "lineno": "11547"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`Download2Case`",
+    "lineno": "11673"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`GetCaseFormID`",
+    "lineno": "13890"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`CreateFormID_FormName`",
+    "lineno": "13912"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`CreateDocNo_DocName`",
+    "lineno": "13932"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`CreateIn_WH`",
+    "lineno": "13954"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`CreateDocNo_Info`",
+    "lineno": "13985"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`CreateCustDocNo_Info`",
+    "lineno": "14069"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`CreateDocnoFrom_Info`",
+    "lineno": "14122"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`CreateCustDocNoFrom_Info`",
+    "lineno": "14187"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`CreateAttach_Info`",
+    "lineno": "14245"
+  },
+  {
+    "tag": "上傳前置資料產生",
+    "methodName": "`CreateCaseNeedData`",
+    "lineno": "10795"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`GetDocNo_Count`",
+    "lineno": "14292"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`GetDocNo_Page`",
+    "lineno": "14332"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`GetDataDocNoPage`",
+    "lineno": "6189"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`CheckCaseDocNoPage`",
+    "lineno": "6204"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`FindFormCodePages`",
+    "lineno": "6278"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`GetDataFormCodePages`",
+    "lineno": "6309"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`GetDocNoEdit`",
+    "lineno": "14252"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`FormIDExists`",
+    "lineno": "14359"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`Case_DocNoExists`",
+    "lineno": "14397"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`GetDocNoCount`",
+    "lineno": "11138"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`GetDocDirCopies`",
+    "lineno": "11168"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`SetDocDirCopies`",
+    "lineno": "11198"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`GetDocDirCopies_Rec`",
+    "lineno": "11226"
+  },
+  {
+    "tag": "文件份數/頁數/查詢",
+    "methodName": "`GetDocDir_Page`",
+    "lineno": "10623"
+  },
+  {
+    "tag": "自訂文件",
+    "methodName": "`GetNewCustomDocNo`",
+    "lineno": "10022"
+  },
+  {
+    "tag": "自訂文件",
+    "methodName": "`GetCustomDocName`",
+    "lineno": "10087"
+  },
+  {
+    "tag": "自訂文件",
+    "methodName": "`GetCustomFormID`",
+    "lineno": "10099"
+  },
+  {
+    "tag": "自訂文件",
+    "methodName": "`GetCustomDocDir`",
+    "lineno": "10111"
+  },
+  {
+    "tag": "自訂文件",
+    "methodName": "`FindCustomDocName`",
+    "lineno": "10138"
+  },
+  {
+    "tag": "自訂文件",
+    "methodName": "`GetCustomNameCount`",
+    "lineno": "11278"
+  },
+  {
+    "tag": "自訂文件",
+    "methodName": "`GetCustomDocNoCount`",
+    "lineno": "11302"
+  },
+  {
+    "tag": "自訂文件",
+    "methodName": "`Create_Cust_DocDir`",
+    "lineno": "10365"
+  },
+  {
+    "tag": "舊案/異動件處理",
+    "methodName": "`OldCasetoNewCase`",
+    "lineno": "10456"
+  },
+  {
+    "tag": "舊案/異動件處理",
+    "methodName": "`ErrFormtoCurrentForm`",
+    "lineno": "10525"
+  },
+  {
+    "tag": "舊案/異動件處理",
+    "methodName": "`SetRecordEditedDocDir`",
+    "lineno": "10575"
+  },
+  {
+    "tag": "入庫文件/可見性",
+    "methodName": "`GetDocNo_IS_WH`",
+    "lineno": "10665"
+  },
+  {
+    "tag": "入庫文件/可見性",
+    "methodName": "`DocNoIs_In_WH`",
+    "lineno": "10775"
+  },
+  {
+    "tag": "入庫文件/可見性",
+    "methodName": "`FormIDAppear`",
+    "lineno": "11095"
+  },
+  {
+    "tag": "入庫文件/可見性",
+    "methodName": "`DocNoAppear`",
+    "lineno": "11121"
+  },
+  {
+    "tag": "入庫文件/可見性",
+    "methodName": "`ISGuideFormID`",
+    "lineno": "11326"
+  },
+  {
+    "tag": "入庫文件/可見性",
+    "methodName": "`ISDivPageFormID`",
+    "lineno": "11341"
+  },
+  {
+    "tag": "入庫文件/可見性",
+    "methodName": "`FindDivFormCode`",
+    "lineno": "9850+"
+  },
+  {
+    "tag": "影像瀏覽/顯示",
+    "methodName": "`FindISB2View`",
+    "lineno": "5228"
+  },
+  {
+    "tag": "影像瀏覽/顯示",
+    "methodName": "`FindMpsView`",
+    "lineno": "13864"
+  },
+  {
+    "tag": "影像瀏覽/顯示",
+    "methodName": "`DesableImage`",
+    "lineno": "5499"
+  },
+  {
+    "tag": "影像瀏覽/顯示",
+    "methodName": "`EnableImage`",
+    "lineno": "5485"
+  },
+  {
+    "tag": "影像瀏覽/顯示",
+    "methodName": "`ViewMouseMode`",
+    "lineno": "5519"
+  },
+  {
+    "tag": "影像瀏覽/顯示",
+    "methodName": "`GoViewMode`",
+    "lineno": "5544"
+  },
+  {
+    "tag": "影像瀏覽/顯示",
+    "methodName": "`DisplayMode`",
+    "lineno": "5556"
+  },
+  {
+    "tag": "影像瀏覽/顯示",
+    "methodName": "`view_image_FormCode`",
+    "lineno": "13084"
+  },
+  {
+    "tag": "影像瀏覽/顯示",
+    "methodName": "`view_image_DocNo`",
+    "lineno": "13200"
+  },
+  {
+    "tag": "影像瀏覽/顯示",
+    "methodName": "`PriorPage`",
+    "lineno": "12161"
+  },
+  {
+    "tag": "影像瀏覽/顯示",
+    "methodName": "`NextPage`",
+    "lineno": "12172"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`CreatePreViewISB`",
+    "lineno": "13502"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`FreePreViewISB`",
+    "lineno": "13551"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`FitPreViewISB`",
+    "lineno": "13581"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`PaintShape`",
+    "lineno": "13618"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`FreeShapeobj`",
+    "lineno": "13674"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`ISBClick`",
+    "lineno": "13695"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`ISBMouseMove`",
+    "lineno": "13734"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`ISBImageMouseDown`",
+    "lineno": "13748"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`ISBImageMouseUp`",
+    "lineno": "13822"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`ISBEndDrag`",
+    "lineno": "13828"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`ISBDragDrop`",
+    "lineno": "13833"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`ISBDragOver`",
+    "lineno": "13843"
+  },
+  {
+    "tag": "縮圖預覽(PreViewISB)",
+    "methodName": "`ShapeName2PreViewISBName`",
+    "lineno": "13395"
+  },
+  {
+    "tag": "其他內部",
+    "methodName": "`GetCurrentVersionNo`",
+    "lineno": "1052"
+  },
+  {
+    "tag": "其他內部",
+    "methodName": "`WMMOUSEWHEEL`",
+    "lineno": "1086"
+  },
+  {
+    "tag": "其他內部",
+    "methodName": "`InitExistImgList`",
+    "lineno": "1338"
+  }
+]
diff --git a/doc/curtis/prompt/scanimpl_analysis/03/scanimpl_ann_annotate.md b/doc/curtis/prompt/scanimpl_analysis/03/scanimpl_ann_annotate.md
new file mode 100644
index 0000000..d0ef51e
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/03/scanimpl_ann_annotate.md
@@ -0,0 +1,70 @@
+
+
+---
+all_csv: "scripts/dist/deps.all.csv"
+script_path: "script"
+---
+
+定義:
+- 以下 @{{json}} 指的是 @scanimpl_annalysis_step_ver.md
+  需求 "0.1.3.3 階段三:模組分流實體化 (Module Disaggregation)"
+  所輸出的五個檔案。
+
+## 0.4 處理方法描述,方法引用,方法分類
+### 0.4.1 生成引用
+- **目標**: 生成腳本, 該腳本能將{{all_csv}}所記錄的"引用相依"寫入至 @{{json}} deps 屬性中
+- **輸入**:@{{json}}, {{all_csv}}
+- **處理邏輯**:
+    1. 遍歷 {{all_csv}} 取出 "方法名" 所對應的 "引用了什麼相依"
+    2. 匹配 `1. 的"方法名"` 與 @{{json}} 中 matcher 所對應的 "方法名" 並將 `1. 的引用相依` 寫入 @{{json}} deps 屬性中
+    3. 引用相依有多個,其格式為陣列
+- **輸出腳本**:`{{script_path}}/scanimpl_annalysis_json_deps.js`
+- **範例**:
+若以下為 @{{json}}:
+```json
+{
+    "matcher": "procedure TCB_IMGPSScanX.ImageScrollBox1NewGraphic(",
+    "tags": [
+      "ImageProcessor",
+      "影像處理"
+    ],
+    "lIndex": "6447",
+    "rIndex": "6455",
+    "description": "載入新圖形事件"
+}
+```
+若以下為 @deps.all.csv:
+```csv
+[ ],方法名,所在檔名,行號,引用了什麼相依,方法描述(請手動填寫),原始程式碼片段
+[V],TCB_IMGPSScanX.ImageScrollBox1NewGraphic,CB_IMGPSScanImp.pas.bk,6447,TDibGraphic,,procedure TCB_IMGPSScanX.ImageScrollBox1NewGraphic(const Graphic: TDibGraphic);
+[V],TCB_IMGPSScanX.ImageScrollBox1NewGraphic,CB_IMGPSScanImp.pas.bk,6453,ConvertToBW,,ConvertToBW(ISB_BW.Graphic);
+```
+
+則 @{{json}} 應寫入:
+```json
+{
+    "matcher": "procedure TCB_IMGPSScanX.ImageScrollBox1NewGraphic(",
+    "tags": [
+      "ImageProcessor",
+      "影像處理"
+    ],
+    "deps": [
+      "TDibGraphic", "ConvertToBW"
+    ],
+    "lIndex": "6447",
+    "rIndex": "6455",
+    "description": "載入新圖形事件"
+}
+```
+
+### 0.4.2 生成描述
+- **目標**:針對重要方法生成方法描述
+- **輸入**:@{{jsons}}, @CB_IMGPSScanImp.pas.bk
+- **處理邏輯**:
+    1. 請就 @{{json}} 中的方法進行描述,該方法的實作於 @CB_IMGPSScanImp.pas.bk,對應的 lIndex, rIndex 區段中
+    2. 重要方法(行數大於 14 行)做詳盡描述, 簡易方法做簡易描述, 請使用中文作為描述語言
+    3. 方法描述請寫入 @{{json}} 檔中的 description 欄位
+    4. description 若為多行請考慮斷行符號
+- **目標產出**: @{{json}}
+
+
diff --git a/doc/curtis/prompt/scanimpl_analysis/04/scanimpl_reAssemble.md b/doc/curtis/prompt/scanimpl_analysis/04/scanimpl_reAssemble.md
new file mode 100644
index 0000000..8962c2e
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/04/scanimpl_reAssemble.md
@@ -0,0 +1,139 @@
+
+---
+description: 用於 CB_IMPSScan 檔案拆分
+all_csv: "scripts/dist/deps.all.csv"
+script_path: "script"
+output_path: "reassemble"
+---
+
+
+定義:
+- 以下 @{{json}} 指的是 @scanimpl_annalysis_step_ver.md 
+  需求 "0.1.3.3 階段三:模組分流實體化 (Module Disaggregation)" 
+  所輸出的五個檔案。
+
+### 0.5 ScanImplScann 分類
+@{{json}} 代表 @CB_IMGPSScanImp.pas 檔案中拆分前的每個方法,其分類是什麼(tags),其方法名(matcher)
+對應的原始碼區段(lIndex, rIndex)在哪,及其引用相依(deps)為什麼,現欲使用 @{{json}} 對 @CB_IMGPSScanImp.pas
+進行分類
+
+#### 0.5.1 tags 與拆分檔案對應
+##### 0.5.1.1 tags:ScannerController 拆分檔案對應
+- ScannerController.acquisitionHandler: {{output_path}}/scan/acquisition.pas 
+- ScannerController.twainWrapper: {{output_path}}/scan/twain.pas
+
+##### 0.5.1.2 tags:TransportManager 拆分檔案對應
+- TransportManager.apiClient: {{output_path}}/transp/apiClient.pas
+- TransportManager.fileTransfer: {{output_path}}/transp/fileClient.pas
+- TransportManager.certificateManager: {{output_path}}/transp/certManager.pas
+- TransportManager.payloadArchiver: {{output_path}}/transp/payloadArchiver.pas
+
+##### 0.5.1.3 tags:ImageProcessor 拆分檔案對應
+- ImageProcessor.transformer: {{output_path}}/img/transformer.pas
+- ImageProcessor.converter: {{output_path}}/img/converter.pas
+- ImageProcessor.anchorAnalyzer: {{output_path}}/img/anchor.pas
+- ImageProcessor.payloadArchiver: {{output_path}}/img/imgArchiver.pas
+
+
+##### 0.5.1.4 tags:BusinessLogic 拆分檔案對應
+- BusinessLogic.systemInternal: {{output_path}}/bloc/sys.pas
+- BusinessLogic.configRepository: {{output_path}}/bloc/cfg.pas
+- BusinessLogic.ormRuleEngine: {{output_path}}/bloc/ormRuleEngine.pas
+- BusinessLogic.entityMapping: {{output_path}}/bloc/entityMapping.pas
+- BusinessLogic.fileManager: {{output_path}}/bloc/fileManager.pas
+- BusinessLogic.caseManager: {{output_path}}/bloc/caseManager.pas
+- BusinessLogic.entityModel: {{output_path}}/bloc/entityModel.pas
+- BusinessLogic.activeXWrapper: {{output_path}}/bloc/ocx.pas
+
+##### 0.5.1.5 tags:UIView 拆分檔案對應
+- UIView.statusMessenger: {{output_path}}/view/msger.pas,
+- UIView.events: {{output_path}}/view/events.pas,
+- UIView.i18n: {{output_path}}/view/i18n.pas,
+- UIView.inputHandler: {{output_path}}/view/input.pas,
+- UIView.configRepository: {{output_path}}/view/cfg.pas,
+- UIView.treeView: {{output_path}}/view/treeView.pas,
+- UIView.toolBar: {{output_path}}/view/toolBar.pas,
+- UIView.imageScrollBox: {{output_path}}/view/isb.pas,
+- UIView.popupMenu: {{output_path}}/view/popupMenu.pas,
+- UIView.listView: {{output_path}}/view/listView.pas,
+- UIView.scrollView: {{output_path}}/view/scrollView.pas,
+- UIView.misc: {{output_path}}/view/misc.pas
+
+
+### 0.6 ScanImplScann 分類腳本生成
+**目標**: 依據 @{{json}} 所提供的拆分資料及 需求 "0.5 ScanImplScann 分類" 規格寫一 javascript 腳本
+並針對 @CB_IMGPSScanImp.pas, 檔案進行拆分
+**輸入**:@{{json}}
+**目標產出腳本**:scripts/final_classify_scanImp_pas.js
+
+#### 0.6.1 拆分腳本原則
+##### 0.6.1.1 檔案拆分前先複制確保乾淨
+**目標**: 拆分應不影響原始檔案內容
+**處理邏輯**:
+- 拆分前將主檔案 @CB_IMGPSScanImp.pas.bk 複制一份並命名為 "CB_IMGPSScanImp.pas"
+拆分作業請在 CB_IMGPSScanImp.pas 檔案中進行, 拆分時請透過 delphi include
+語句將相應的檔案 include 至 CB_IMGPSScanImp.pas
+- 若 "0.6 ScanImplScann 分類腳本生成"所定義之拆分腳本已存在,應保留其結構再行修改,因此拆分
+  前請先行讀取 "0.6 ScanImplScann 分類腳本生成"所定義之拆分腳本,了解其結構
+
+##### 0.6.1.2 生成人工審核資料
+**目標**: 拆分後可人工審核
+**處理邏輯**:移除 @CB_IMGPSScanImp.pas 中於 @{{json}} 所標示之區段,並於腳本
+結束時顯示移除後的內容,我想人工審核
+**中介輸出**: `scripts/dist/scanimpl_annalysis.remainings.txt`
+
+#### 0.6.2 拆分腳請一併寫入相依及描述
+**目標**: 依 @{{jsons}} 寫入 "0.5.1 tags 與拆分檔案對應" 時,需一併寫入相依(deps),及描述(description),描述需保持其可閱讀性
+**處理邏輯**: 
+- 見 "0.6.2.1 方法描述 template"
+- description: column 字元長為 60 字元,超過情加斷行符
+- description: 若有標示 1., 2., 3., ... 等要點,請確保可閱讀性,也必須須一併斷行 
+
+##### 0.6.2.1 方法描述 template
+**腳本-docstring-template**
+```pascal
+{ ==============================================================================
+  方法名稱:StatrTwainScan
+  引用相依:{{deps}}
+  {{description}}
+============================================================================== }
+```
+
+**example**
+若 @{{jsons}} deps, description 分別為
+- deps: Scanner (TEnScan), TTiffGraphic
+-
+```pascal
+{ ==============================================================================
+  方法名稱:StatrTwainScan
+  引用相依:Scanner (TEnScan), TTiffGraphic
+  方法描述:觸發實體掃描器進行取像的核心起點。將系統參數 (如解析度 ScanDpi、色彩格式 
+          ScanColor、雙面掃描 ScanDuplex、亮度、對比等) 寫入 Scanner 物件,並宣告 
+          TTiffGraphic 容器。最後呼叫 AcquireWithSourceOpen 開始掃描,並綁定 
+          OnAcquire 作為非同步接收影像的回呼函式。
+============================================================================== }
+```
+
+
+### 0.7 測試柝分正確性
+撰寫 js 測試, 驗證拆分前後是否正確, 細項如下
+
+#### 0.7.1 拆分代碼字串比對
+透過 @{{json}} 中對應的 rIndex, lIndex 由原始檔案 @CB_IMGPSScanImp.pas 中取得對應的代碼,與下列
+拆分後的檔案與原始檔案進行字串比對
+
+- 0.6.2.1.1 比對 ScannerControl 相關檔案
+  相關檔案參照 0.5.1
+- 0.6.2.1.2 比對 ImageProcessor 相關檔案
+  相關檔案參照 0.5.1
+- 0.6.2.1.3 比對 TransportManager 相關檔案
+  相關檔案參照 0.5.1
+- 0.6.2.1.4 比對 BusinessLogic 相關檔案
+  相關檔案參照 0.5.1
+- 0.6.2.1.5 比對 UIView 相關檔案
+  相關檔案參照 0.5.1
+
+> output: scripts/final_classify_scanImp_pas.test.js
+
+
+
diff --git a/doc/curtis/prompt/scanimpl_analysis/readme.md b/doc/curtis/prompt/scanimpl_analysis/readme.md
new file mode 100644
index 0000000..2216a2a
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/readme.md
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+### 拆分說明:
+#### UIView
+- UIView.treeView:樹狀結構呈現與操作 (如 TreeView 的節點刷新、拖曳、點擊)
+- UIView.toolBar: 'CB_IMGPSScanImp.view.toolbar.pas'
+- UIView.listView:清單結構呈現 (如 PageLV, AttListBox)
+- UIView.imageScrollBox:影像預覽與捲動 (對應 EnImgScr / TImageScrollBox 相關的視覺控制與預覽)
+- UIView.toolBar:互動工具與面板按鈕 (如各類 BtnClick、FC 分類按鈕)
+- UIView.popupMenu:快顯選單控制 (各類 PMxxxClick 或是 PopupMenuPopup)
+- UIView.i18n:多國語言與翻譯載入
+- UIView.feedback:系統狀態與進度回饋 (包含 Timer、DataLoading、StatusBar)
+
+#### ScannerController (掃描硬體控制模組)
+- ScannerController.twainWrapper (TWAIN 介面與硬體初始化)
+- ScannerController.acquisitionHandler (硬體取像非同步回呼與後處理)
+
+#### TransportManager (傳輸與網路管理模組),新增了:
+- TransportManager.apiClient (RESTful / Servlet 參數與組態拉取)
+- TransportManager.fileTransfer (大檔、影像、FTP 實體傳輸)
+- TransportManager.certificateManager (HTTPS 與 SSL 憑證驗證)
+- TransportManager.payloadArchiver (ZIP 壓縮、解壓縮與進匯出封裝)
+
+#### ImageProcessor
+- ImageProcessor.transformer (影像幾何與物理變換):如各種縮放 (ReSize)、裁切 (CheckNeedCrop)、旋轉 (Rotate)、去斜 (Deskew) 及所有 UI 比例變換等。
+- ImageProcessor.converter (影像色彩與品質轉換):包含黑白轉換 (ConvertToBW)、平滑化 (Smooth)、遮罩處理 (Mask)、浮水印列印 (PrintImg)。
+- ImageProcessor.anchorAnalyzer (特徵定位與 OMR 分析):包含了分析黑點密度的 GetSiteOMR。
+
diff --git a/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.BusinessLogic.json b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.BusinessLogic.json
new file mode 100644
index 0000000..47f441d
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.BusinessLogic.json
@@ -0,0 +1,363 @@
+[
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf1 : Boolean; //取系統設定資訊Mode1 DOC_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "En_DecryptionStr_Base64",
+      "ProcessServlet_Get"
+    ],
+    "lIndex": "5665",
+    "rIndex": "5707",
+    "description": "向伺服器請求 DOC_INF 資料表資訊(模式 1)。方法會加密目前伺服器時間戳記並發送 HTTP GET 請求。若成功取得資料(狀態碼 '0'),則利用 SetSQLData 將結果解析並存入本地快取 Doc_Inf_List;若發生通訊錯誤或 Session 逾時(偵測到登入頁面標籤),則會記錄對應的 HttpErrStr 並返回 False。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf2 : Boolean; //取系統設定資訊Mode2  DM_FORM_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "En_DecryptionStr_Base64",
+      "ProcessServlet_Get"
+    ],
+    "lIndex": "5708",
+    "rIndex": "5746",
+    "description": "向伺服器請求 DM_FORM_INF 表單關聯資訊(模式 2)。流程包含加密請求參數與發送 GET 請求。此方法負責取得表單間的主從關係、相依性以及互斥規則,並將回傳的資料行解析後存入本地的 DM_FORM_INF_List。若通訊失敗或 Session 過期,會設定錯誤訊息並中斷流程。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf3 : Boolean; //取系統設定資訊mode3  FORM_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "En_DecryptionStr_Base64",
+      "ProcessServlet_Get"
+    ],
+    "lIndex": "5747",
+    "rIndex": "5786",
+    "description": "向伺服器請求 FORM_INF 表單詳細資料(模式 3)。方法會取得包含表單名稱、說明、分類、定位點類型(ANCHOR/FRAME)、最大頁數及預設高寬等中繼數據。取得的資料會被快取至 FORM_INF_List,作為影像處理(如自動縮放與 OMR 檢核)的重要依據。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf4 : Boolean; //取系統設定資訊mode4  CHECK_RULE_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "En_DecryptionStr_Base64",
+      "ProcessServlet_Get"
+    ],
+    "lIndex": "5787",
+    "rIndex": "5827",
+    "description": "向伺服器請求 CHECK_RULE_INF 檢核規則資訊(模式 4)。此方法取得包含檢核代號、描述及顯示類型在內的驗證規則,並將其儲存於 CHECK_RULE_INF_List。最後會呼叫 CheckRule2OMRErrInfo,將取得的規則同步更新至 OMR 錯誤資訊記錄中,以確保前端檢核邏輯與伺服器同步。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf5 : Boolean; //取系統設定資訊mode5  MEMO_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "En_DecryptionStr_Base64",
+      "ProcessServlet_Get"
+    ],
+    "lIndex": "5828",
+    "rIndex": "5866",
+    "description": "向伺服器請求 MEMO_INF 註記資訊(模式 5)。方法會取得預設的註記內容及其對應的類型名稱,並將其快取至 MEMO_INF_List。這些資料通常用於 UI 上的註記選擇選單,方便掃瞄人員在影像處理過程中快速標註預設的說明文字。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf6 : Boolean; //取系統設定資訊mode5  WORK_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "En_DecryptionStr_Base64",
+      "ProcessServlet_Get"
+    ],
+    "lIndex": "5867",
+    "rIndex": "5906",
+    "description": "向伺服器請求 WORK_INF 工作參數資訊(模式 6)。此方法取得當前工作項目的全域參數(如 PARA_NO 與 PARA_CONTENT),並儲存於 WORK_INF_List。這些參數控制了掃瞄器的預設行為(如 DPI、雙面掃瞄等),是系統初始化環境設定的關鍵步驟。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf7 : Boolean; //取系統設定資訊mode5  LASTEST_FORM_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "En_DecryptionStr_Base64",
+      "ProcessServlet_Get"
+    ],
+    "lIndex": "5907",
+    "rIndex": "5946",
+    "description": "向伺服器請求 LASTEST_FORM_INF 最新表單版本資訊(模式 7)。方法會獲取各文件編號對應的最新表單 ID 與版本號,並儲存於 LASTEST_FORM_INF_List。此資訊用於確保使用者掃瞄的是最新版表單,或是用於舊案件轉檔時的版本對照。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DeleteDocNoFileForESCAN(Path,DocNo:String):Boolean;  //刪除指定DocNo文件",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.caseManager",
+      "檔案操作"
+    ],
+    "deps": [
+      "DeleteDocNoFile",
+      "SaveToFile",
+      "LoadFromFile",
+      "_DelTree"
+    ],
+    "lIndex": "6141",
+    "rIndex": "6174",
+    "description": "在補件模式 (ESCAN) 下刪除屬於特定文件類型 (DocNo) 的影像。方法會從索引清單 (ContextList) 的末尾開始向前遍歷,識別符合目標文件編號或附件名稱的圖檔。若該檔案並非預先存在的(ISExistImg 返回 False),則執行實體刪除並從索引清單中移除。若整個文件目錄因此清空,則會進一步移除該目錄並從文件清單中刪除紀錄。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.BarCode2CaseID : String; //Barcode依規則轉成CaseID",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping"
+    ],
+    "deps": [],
+    "lIndex": "8155",
+    "rIndex": "8172",
+    "description": "從目前掃瞄到的條碼清單中提取案件編號 (CaseID)。方法會遍歷條碼暫存對象 (MpsBarcodeinf),並將第一個長度正好等於預設 CaseIDLength 的條碼值視為合法的案件編號返回。若遍歷結束仍未找到符合長度限制的條碼,則返回空字串。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.BarCode2FormID : String; //Barcode依規則轉成FormID",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping"
+    ],
+    "deps": [],
+    "lIndex": "8173",
+    "rIndex": "8195",
+    "description": "從目前掃瞄到的條碼清單中識別有效的表單代碼 (FormID)。方法會過濾長度符合 FormIDLength 的條碼,並呼叫 FormIDAppear 驗證其格式。若初步驗證通過,會進一步呼叫 FormIDExists 確認該代碼在系統中已註冊且可用。返回第一個完全符合條件的表單代碼,否則返回空。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetSQLData(ColumeStr:String;FromList,ToList:TStringlist); //把SQL值塞入",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "8651",
+    "rIndex": "8662",
+    "description": "將 SQL 查詢結果格式化後塞入目標字串清單。此方法會先清除目標清單 (ToList),第一行加入欄位定義字串 (ColumeStr),隨後將來源清單 (FromList) 中扣除標題後的資料列依序填入,用於更新系統本地的資料快取。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSQLData(TableList:TStringlist;Colname:String;colNo:Integer):String; //依欄位及索引取值",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "8663",
+    "rIndex": "8723",
+    "description": "從結構化字串清單中提取特定欄位的值。邏輯如下:1. 解析 TableList 的第一行(欄位定義)以確定目標欄位 (Colname) 的索引位置。2. 讀取指定行 (colNo) 的資料字串,該字串使用 '!@!' 作為欄位分隔符。3. 透過循環將資料拆分並存入臨時清單,最後返回對應欄位索引位置的數值內容。若找不到欄位或索引超出範圍,則返回空字串。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindSQLData(TableList:TStringlist;ColumeStr,KeyColumeStr,KeyStr:String;ColNo:Integer;Var ResultList:TStringlist):Boolean; //找指定的資料",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "8724",
+    "rIndex": "8802",
+    "description": "在資料快取清單中搜尋符合鍵值的紀錄。核心邏輯:1. 支援多個鍵值比對 (KeyColumeStr 與 KeyStr 可包含多個欄位)。2. 若 ColNo 為 0,則從頭搜尋清單;若非 0 則僅檢查該指定行。3. 搜尋時會調用 GetSQLData 提取欄位值並與目標鍵值比對。4. 一旦匹配成功,會將 ColumeStr 中指定的所有欄位名稱及其對應數值(格式為「欄位名,數值」)填入 ResultList 中並返回 True。若搜尋無結果則返回 False。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.OldCasetoNewCase(CaseID:String); //將舊案份數轉成新規則",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.caseManager",
+      "舊案/異動件處理"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "10456",
+    "rIndex": "10524",
+    "description": "將舊系統格式的案件文件份數轉換為新系統規則。方法會載入案件的文件目錄清單 (CaseDocNo.dat),並解析由全域變數傳入的舊案文件編號與名稱清單(以 Tab 字串傳遞)。流程中會針對每個目錄編號統計其在舊資料中的出現次數,並將統計後的份數結果更新至 CaseDocNo_Copies.dat 檔案中,以完成歷史資料的規格對接。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ErrFormtoCurrentForm(CaseID,EFormID,CFormID:String);//將舊案的錯誤FormID改正確的FormID",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.caseManager",
+      "舊案/異動件處理"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "FileExists",
+      "RenameFile",
+      "SaveToFile",
+      "MoveFile"
+    ],
+    "lIndex": "10525",
+    "rIndex": "10574",
+    "description": "修正案件中歸類錯誤的表單代碼及其關聯檔案。邏輯如下:1. 取得錯誤與正確表單對應的文件編號。2. 遍歷案件下的所有文件目錄,載入各目錄的影像索引檔 (Context.dat)。3. 識別檔名中包含 EFormID 的影像,執行實體重新命名並更新索引。4. 若該目錄編號與錯誤文件編號一致,則會執行 MoveFile 搬移整個目錄至新路徑,並同步更新總文件清單 (CaseDocNo.dat),確保影像與分類資訊的一致性。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetUseCase(Mode:Char;Path,DocDir,FormCaseID,ToCaseID:String);   //記錄引用其他案件 A:加入 D:刪掉",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.caseManager"
+    ],
+    "deps": [],
+    "lIndex": "11506",
+    "rIndex": "11526",
+    "description": "管理案件間的文件引用紀錄。此方法使用 Tinifile 操作案件目錄下的 UseCase.ini 檔案。當 Mode 為 'A' (Add) 時,會在指定的 DocDir 區段下紀錄來源案件 (FROM_CASEID) 與目標案件 (TO_CASEID) 的引用關係;當 Mode 為 'D' (Delete) 時,則會移除該目錄對應的引用資訊。這用於追蹤不同案件間影像資源的重複利用情況。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetUseCase(Mode:Char;Path,DocDir:String):String;  //F:取被引用 To:引用",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.caseManager"
+    ],
+    "deps": [],
+    "lIndex": "11527",
+    "rIndex": "11546",
+    "description": "取得指定目錄的文件引用資訊。方法讀取 UseCase.ini 設定檔,根據 Mode 參數返回對應的案件 ID:模式 'F' 返回被引用的來源案件 ID (FROM_CASEID),模式 'T' 返回執行引用的目標案件 ID (TO_CASEID)。若查無紀錄則返回空字串。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2DocNo(FormCode:String):String;   //FormCode轉Docno",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "11994",
+    "rIndex": "12018",
+    "description": "將表單代碼 (FormCode) 轉換為對應的文件編號 (DocNo)。方法遍歷預載的 FormID_List,若找到匹配的表單代碼,則返回 DocNo_List 中相同索引位置的數值。若表單代碼不在清單中(通常為使用者自訂的文件),則預設截取代碼的前 8 位字元作為文件編號返回。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2DocName(CaseID,DocNo:String):String; //Docno轉Doc名稱",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "12029",
+    "rIndex": "12066",
+    "description": "解析文件編號對應的描述性名稱。優先權邏輯為:1. 若編號符合附件名稱 (AttName),返回「未歸類」。2. 從系統定義快取 (Doc_Inf_List) 中搜尋對應的描述 (DOC_U_DESC)。3. 若系統定義查無結果,則呼叫 GetCustomDocName 從案件本地的自訂文件設定中尋找對應名稱。此方法確保 UI 上能顯示人類可讀的文件類別名稱。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoNeedDiv(DocNo:String):Boolean; //是否是需分份數的文件代號",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "12100",
+    "rIndex": "12112",
+    "description": "檢查指定的文件類型是否需要執行頁面拆分(分份數)。方法透過 FindSQLData 在 Doc_Inf_List 中查詢該編號的 'IS_DOC_DIV' 欄位,若旗標值為 'Y' 則返回 True,否則返回 False。此設定決定了掃瞄流程中是否需要根據條碼自動切分文件目錄。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.OMRCheckCase(CaseID:String):Boolean; //OMR檢核",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.ormRuleEngine",
+      "OMR 檢核"
+    ],
+    "deps": [
+      "ImageReSize_FormID",
+      "GetSiteOMR",
+      "FindPoint",
+      "LoadFromFile",
+      "FileExists",
+      "SaveToFile"
+    ],
+    "lIndex": "12255",
+    "rIndex": "12950",
+    "description": "執行案件的自動化 OMR 規則檢核,這是確保掃瞄案件合規性的核心邏輯。程序流程:1. 初始化檢核日誌。2. 識別主文件並驗證必要文件是否缺漏、相依與互斥文件是否衝突、以及表單是否已停用。3. 檢查各文件類型是否超過預設的最大頁數。4. 針對案件內每張影像,執行十字定位點縮放 (ImageReSize_FormID) 後,載入對應表單的 XML 規則檔。5. 執行欄位級檢核,包含必填項 (settype1)、跨文件欄位關聯 (settype3/settype8)、相依文件需求 (settype4) 及備註填寫要求 (settype6) 等。6. 將所有檢核失敗原因紀錄至 Checkerr.ini。最終返回案件是否通過所有檢核規則。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.OMRErr2ini(CaseID,Reason,FileName,Site,RelaFileName,RelaSite,Anchor,Anchor1:String;Del,Ingnore,Display:Boolean); //OMR檢核失敗寫入ini",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.ormRuleEngine",
+      "OMR 檢核"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "12951",
+    "rIndex": "12990",
+    "description": "紀錄 OMR 檢核失敗的詳細資訊。方法根據 Display 旗標決定紀錄方式:若為 True,則在案件目錄下的 Checkerr.ini 中建立新的錯誤序號區段,詳細紀錄失敗原因、檔案路徑、OMR 座標點、關聯檔案及定位點類型,用於後續 UI 呈現;若為 False,則僅將錯誤原因字串附加於 CheckMemo.dat 純文字日誌中,作為背景紀錄之用。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.OMRErrini2List(CaseID:String;ErrlistForm:TErrlistForm); //OMR檢核失敗從ini寫入ListView",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.ormRuleEngine",
+      "UIView",
+      "UIView.listView",
+      "OMR 檢核"
+    ],
+    "deps": [],
+    "lIndex": "12991",
+    "rIndex": "13020",
+    "description": "將檢核失敗紀錄從 INI 設定檔載入至 UI 介面。方法會讀取 Checkerr.ini,遍歷所有錯誤紀錄,並過濾掉已標記為刪除 (Del) 的項目。將符合條件的錯誤原因填入 ErrlistForm 中的 ListView 元件,供使用者查看與修正。若清單中仍存在錯誤,會同步停用介面上的上傳按鈕以防止不合規案件送出。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.OMRErrini2ListForLog(CaseID: String): String;",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.ormRuleEngine",
+      "OMR 檢核"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "13021",
+    "rIndex": "13058",
+    "description": "彙整系統中所有活動案件的 OMR 檢核錯誤訊息。方法讀取全域的 CaseList.dat,依次遍歷每個案件子目錄下的 Checkerr.ini,收集所有未被移除的錯誤原因,並將其合併為一個完整的文字區塊返回。此功能主要用於產生系統運行日誌,方便追蹤與審查多案件的檢核狀態。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateDocNo_Info(CaseID:String):String; //產生 DocNo[tab]份數[tab]總頁數[tab]是否異動[換行]DocNo[tab]份數[tab]總頁數[tab]是否異動",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping",
+      "上傳前置資料產生"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "13985",
+    "rIndex": "14068",
+    "description": "產生案件內標準文件(非自訂)的彙總資訊字串。方法讀取 CaseDocNo.dat,針對每個非 'ZZZZZ' 開頭的文件編號,計算其在案件中的總份數、累計總頁數,並檢查編輯狀態(異動旗標)。結果以「編號[Tab]份數[Tab]頁數[Tab]狀態」的格式逐行組成,作為案件上傳時與伺服器比對資料完整性的核心依據。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateCustDocNo_Info(CaseID:String):String; //產生自訂文件 DocName[tab]份數[tab]總頁數[tab]是否異動[#13#10]DocName[tab]份數[tab]總頁數[tab]是否異動",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping",
+      "上傳前置資料產生"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "14069",
+    "rIndex": "14121",
+    "description": "產生案件內自訂文件的彙總資訊字串。方法專門處理代碼開頭為 'ZZZZZ' 的文件目錄,透過 GetCustomDocName 取得使用者定義的文件名稱,並彙整其總份數、總頁數與編輯異動狀態。最終格式與標準文件一致,但首位欄位改為顯示自訂名稱,確保自訂類別的文件也能正確被伺服器識別與儲存。"
+  }
+]
diff --git a/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ImageProcessor.json b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ImageProcessor.json
new file mode 100644
index 0000000..7664ad8
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ImageProcessor.json
@@ -0,0 +1,71 @@
+[
+  {
+    "matcher": "function TCB_IMGPSScanX.GetSiteOMR(FileName,Site:String;bt: Integer): Integer;",
+    "tags": [
+      "ImageProcessor",
+      "ImageProcessor.anchorAnalyzer",
+      "OMR 檢核"
+    ],
+    "deps": [
+      "GetSiteOMR",
+      "FindPoint",
+      "Get_OMR",
+      "LoadFromFile"
+    ],
+    "lIndex": "5173",
+    "rIndex": "5227",
+    "description": "在指定影像文件的特定座標執行 OMR (光學標記辨識)。核心邏輯包含:1. 檢查並載入影像檔(若尚未載入),並呼叫 ClearLine 初始化黑白緩衝區。2. 讀取影像的 DPI 與寬高資訊。3. 使用 CM_Str2Rect 將 Site 字串轉為 TRect 矩陣,並參考定位點 (UpLPoint) 進行位移計算。4. 限制辨識區域座標不超出影像邊界。5. 呼叫 Get_OMR 對黑白圖形緩衝區執行辨識並返回結果值(通常為 1 或 0)。此方法是自動化資料檢核的重要工具。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ImageReSize_FormID(CaseID,FileName:String);  //依十字定位點做縮放",
+    "tags": [
+      "ImageProcessor",
+      "ImageProcessor.transformer",
+      "影像處理"
+    ],
+    "deps": [
+      "ImageReSize_FormID",
+      "FindPoint",
+      "CheckSize",
+      "LoadFromFile",
+      "SaveToFile",
+      "FileExists",
+      "LoadFileGetMD5"
+    ],
+    "lIndex": "6343",
+    "rIndex": "6420",
+    "description": "根據表單的十字定位點或邊框 (ANCHOR/FRAME) 對掃瞄影像進行縮放調整。流程如下:1. 從 FORM_INF_List 取得表單預設高寬與定位類型。2. 載入對應案件下的影像檔,若為補件模式則跳過原有圖檔。3. 呼叫 FindPoint 尋找影像中的十字線或邊框。4. 呼叫 CheckSize 計算偏移與縮放比例。5. 呼叫 ImageResize 執行實際調整。6. 成功縮放後,記錄檔案 MD5 並儲存更新後的影像,同時將操作記錄寫入 ReSize.dat;若定位點遺失或辨識錯誤,則記錄於 AnchorError.dat。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ImageReSize_tmp(FormID,FileName:String);  //依十字定位點做縮放(暫存檔)",
+    "tags": [
+      "ImageProcessor",
+      "ImageProcessor.transformer",
+      "影像處理"
+    ],
+    "deps": [
+      "ImageReSize_tmp",
+      "CheckSize",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "6421",
+    "rIndex": "6446",
+    "description": "針對暫存影像檔案執行十字定位點縮放處理。此方法是 ImageReSize_FormID 的簡化版本,主要針對暫存檔 (FileName) 與指定的 FormID。邏輯包含從資料庫清單查詢表單尺寸與定位模式,若符合 ANCHOR 或 FRAME 類型,則載入影像並呼叫 CheckSize 檢查是否需要調整。若偵測到影像存在偏移或比例差異(SizeStr 非空),則將調整後的影像直接覆蓋儲存回原始路徑。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckNeedCrop(Graphic:TDibGraphic):Boolean; //是否是A3要切影像",
+    "tags": [
+      "ImageProcessor",
+      "ImageProcessor.transformer",
+      "影像處理"
+    ],
+    "deps": [
+      "TDibGraphic",
+      "CheckNeedCrop"
+    ],
+    "lIndex": "9996",
+    "rIndex": "10021",
+    "description": "判斷掃瞄影像是否為 A3 尺寸並需要進行切割(Crop)。判定邏輯有二:首先,檢查影像寬度是否大於 4 倍的 DPI 閥值,藉此初步判斷為大尺寸掃瞄件;其次,遍歷目前的條碼清單 (MpsBarcodeinf),統計有效的表單代碼 (FormID) 數量。如果影像寬度達標且有效表單數量正好為 2,則返回 True。這代表此張大圖實際上是由兩份 A4 表單併排掃瞄而成,後續需依此旗標進行影像分割處理。"
+  }
+]
diff --git a/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ScannerController.json b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ScannerController.json
new file mode 100644
index 0000000..dcae3f1
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ScannerController.json
@@ -0,0 +1,118 @@
+[
+  {
+    "matcher": "procedure TCB_IMGPSScanX.StatrTwainScan;",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper",
+      "掃描相關"
+    ],
+    "deps": [
+      "TTiffGraphic",
+      "StatrTwainScan",
+      "Scanner",
+      "Scanner.OpenSource",
+      "Scanner.CloseSource",
+      "OnAcquire",
+      "Scanner.AcquireWithSourceOpen"
+    ],
+    "lIndex": "4390",
+    "rIndex": "4443",
+    "description": "啟動 TWAIN 掃瞄流程。此方法首先檢查掃瞄器驅動是否已安裝,接著初始化 ScanInfo 結構並設定掃瞄參數(如 DPI、影像格式、是否顯示 UI、雙面掃瞄模式、亮度與對比)。流程中會開啟掃瞄來源,呼叫 AcquireWithSourceOpen 執行實際掃瞄作業,並利用 try...finally 確保不論掃瞄成功與否,最終都會關閉掃瞄來源並釋放資源。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.OnAcquire( const DibHandle    : THandle;",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper",
+      "掃描相關"
+    ],
+    "deps": [
+      "TTiffGraphic",
+      "TJpegGraphic",
+      "OnAcquire"
+    ],
+    "lIndex": "4444",
+    "rIndex": "4683",
+    "description": "掃瞄影像獲取後的回呼處理函數。核心邏輯包含:1. 將獲取的 DIB 句柄轉為影像對象並設定 DPI。2. 依影像格式執行對應處理:黑白影像會進行條碼辨識、依條碼角度旋轉、影像反向、傾斜矯正及清黑邊;全彩或灰階影像則設定 JPEG 壓縮品質。3. 檢查是否需要進行 A3 切割為 A4 的處理。4. 透過 Deletepage 檢查並過濾空白頁(依據檔案大小)。5. 對於有效影像,更新 UI 顯示並呼叫 PageEnd 決定儲存路徑與檔名,最後依副檔名儲存為 TIFF 或 JPEG 並呼叫 PageDone 完成頁面流程。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageDone;",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper",
+      "掃描相關"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "PageDone"
+    ],
+    "lIndex": "4684",
+    "rIndex": "4733",
+    "description": "完成單頁影像處理後的 UI 更新邏輯。此方法會遞增掃瞄影像總計數,並根據目前的掃瞄模式(新建、取代、插入或取樣)將儲存好的影像檔載入到對應的 ImageScrollBox 元件中。在新建模式下,還會根據 ScanImgShowMode 設定決定影像顯示的品質(反鋸齒開啟與否)與縮放模式(zmFittopage),確保使用者能即時預覽掃瞄結果。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageEnd;",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper",
+      "掃描相關"
+    ],
+    "deps": [
+      "GetNoNameCase",
+      "DirectoryExists",
+      "_DelTree",
+      "Str2Dir",
+      "SaveToFile",
+      "PageEnd"
+    ],
+    "lIndex": "4734",
+    "rIndex": "4950",
+    "description": "管理掃瞄影像的儲存路徑與檔案命名規則。主要邏輯如下:1. 辨識條碼以取得 FormID,並判斷是否為導引頁或分案頁。2. 若偵測到分案頁,會重置計數並嘗試取得新的案件編號(CaseID)。3. 確定儲存目錄,包含處理「分份數」邏輯(依 DocNoNeedDiv 決定是否建立新子目錄)。4. 根據目前頁數與 FormID 產生標準化的檔名(如補零序號_FormID.tif)。5. 更新 ContextList(影像索引資訊)並在掃瞄新案件時更新 TreeView UI 結構。此方法確保每張影像都能正確歸類到對應的案件與文件目錄下。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.R_W_Scanini(Mode:Char); //'R'讀取;'W'寫入",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper",
+      "掃描相關"
+    ],
+    "deps": [
+      "Scanner"
+    ],
+    "lIndex": "5254",
+    "rIndex": "5295",
+    "description": "讀取或寫入掃瞄設定檔(FBScan.ini)。此方法使用 Tinifile 物件處理掃瞄相關參數的 I/O 作業。當 Mode 為 'R' 時,從設定檔讀取包含空白頁刪除設定、影像反向、清黑邊、旋轉角度、傾斜矯正、亮度對比以及 UI 顯示模式等參數;當 Mode 為 'W' 時,則將目前的系統變數值回寫至設定檔中,以利下次啟動時恢復使用者的個性化設定。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GetDefScanIni; //取得掃瞄的預設值",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper",
+      "掃描相關"
+    ],
+    "deps": [
+      "Rotate",
+      "FJpgCompression",
+      "Scanner"
+    ],
+    "lIndex": "5296",
+    "rIndex": "5472",
+    "description": "從資料庫參數清單(WORK_INF_List)初始化並設定掃瞄的系統預設值。流程首先設定一組程式內建的預設數值,隨後遍歷 WORK_INF_List 並比對 PARA_NO 關鍵字,動態更新包含:空白頁判斷大小、影像是否反相、清黑邊、掃瞄 DPI、雙面掃瞄開啟、影像旋轉角度、傾斜矯正、亮度對比、影像儲存路徑、導引頁與分案頁代碼列表、以及 JPEG 壓縮品質等關鍵參數。這使得掃瞄行為可以透過後台設定進行彈性調整。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.initkscan;",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper"
+    ],
+    "deps": [
+      "initkscan",
+      "Scanner",
+      "Scanner.OpenSource",
+      "Scanner.CloseSource"
+    ],
+    "lIndex": "9242",
+    "rIndex": "9262",
+    "description": "初始化並偵測掃瞄器硬體能力。此方法會先將雙面掃瞄勾選框(ScanDuplexCB)設為停用,接著嘗試開啟掃瞄來源(OpenSource),檢查掃瞄器是否支援雙面掃瞄功能(DuplexCap > 0)。如果硬體支援,則啟用 UI 上的勾選框供使用者選擇。最後確保關閉掃瞄來源,若過程中發生異常,會呼叫 DataLoading(False,True) 停止載入狀態提示。"
+  }
+]
diff --git a/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.TransportManager.json b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.TransportManager.json
new file mode 100644
index 0000000..dfa24ab
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.TransportManager.json
@@ -0,0 +1,98 @@
+[
+  {
+    "matcher": "procedure TCB_IMGPSScanX.HTTPSClientCertificateValidate(Sender: TObject;",
+    "tags": [
+      "TransportManager",
+      "TransportManager.utilities"
+    ],
+    "deps": [
+      "HTTPSClientCertificateValidate"
+    ],
+    "lIndex": "5473",
+    "rIndex": "5478",
+    "description": "HTTPS 用戶端憑證驗證回呼函數,預設直接將 Validate 設為 True,以接受所有伺服器憑證。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ZipMainFile(SoPath,DePath,ZipName:String);",
+    "tags": [
+      "TransportManager",
+      "TransportManager.payloadArchiver"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "8388",
+    "rIndex": "8460",
+    "description": "將案件的主要圖檔與所有中繼資料檔案打包壓縮為 ZIP。流程如下:1. 遍歷影像清單 (ContextList) 與附件清單 (AttContextList) 加入實體圖檔。2. 自動偵測並加入多種系統紀錄檔,包含索引檔 (Context.dat)、掃瞄清單 (scanlist.dat)、縮放紀錄 (ReSize.dat)、案件分類資訊 (CaseDocNo_Copies.dat) 及跨案引用設定 (UseCase.ini) 等。3. 檢查是否存在特殊壓縮檔 (FirstImg.zip) 並併入。4. 呼叫 ExeCuteZip 執行壓縮作業,確保上傳時案件資料的完整性。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ZipMaskFile(SoPath,MarkPath,DePath,ZipName:String); //壓縮遮罩影像檔",
+    "tags": [
+      "TransportManager",
+      "TransportManager.payloadArchiver"
+    ],
+    "deps": [
+      "FileExists"
+    ],
+    "lIndex": "8461",
+    "rIndex": "8494",
+    "description": "壓縮遮罩影像檔及其相關設定檔。此方法會從指定遮罩路徑 (MarkPath) 收集與影像索引 (ContextList) 對應的遮罩圖檔,同時併入基本的案件資訊檔(如 Context.dat, scanlist.dat, DocNo_Name.dat)以及系統預設的錯誤與授權圖檔(Err.jpg, auth.jpg)。最後將這些檔案統一壓縮至目標路徑,供後續遮罩影像的上傳作業使用。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.LoadFileGetMD5(const filename: string): string;",
+    "tags": [
+      "TransportManager",
+      "TransportManager.utilities"
+    ],
+    "deps": [
+      "LoadFileGetMD5",
+      "TIdHashMessageDigest5"
+    ],
+    "lIndex": "9551",
+    "rIndex": "9574",
+    "description": "計算指定檔案的 MD5 雜湊值。方法會以唯讀模式開啟檔案串流 (TFileStream),利用 TIdHashMessageDigest5 元件處理串流內容,並返回以十六進位字串表示的 MD5 值。此功能主要用於確認影像檔案在傳輸或處理前後的完整性與一致性,防止資料受損或被重複處理。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFtpinfo(CaseID,Action:String):Boolean;",
+    "tags": [
+      "TransportManager",
+      "TransportManager.fileTransfer",
+      "FTP 相關"
+    ],
+    "deps": [],
+    "lIndex": "10964",
+    "rIndex": "11041",
+    "description": "向伺服器請求案件上傳所需的 FTP 連線資訊。核心邏輯:1. 發送包含案件編號與動作代碼的 HTTP POST 請求至後台 Servlet。2. 解析伺服器回傳結果,若回傳 'nodata' 則維持 tsNone 模式;若回傳成功,則根據標籤判斷是否啟用 FTP 模式 (tsFtp)。3. 若為 FTP 模式,會進一步解析並呼叫 DecodeFtpInfo 對包含連線協定、IP、Port、帳號及密碼的加密字串進行解密,並存入系統全域變數中。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetFtpInfo;     //餵入FTP資訊",
+    "tags": [
+      "TransportManager",
+      "TransportManager.fileTransfer",
+      "FTP 相關"
+    ],
+    "deps": [
+      "SetFtpInfo",
+      "IIS_Ftp"
+    ],
+    "lIndex": "11042",
+    "rIndex": "11071",
+    "description": "將 FTP 連線參數與事件回呼設定至 FTP 傳輸元件 (IIS_Ftp)。此方法會將先前取得並解碼的連線資訊(如 FTP IP、帳號、密碼、路徑、連接埠)指派給 IIS_Ftp 物件,並根據協定類型設定是否開啟 SSL/TLS 以及被動模式 (Passive)。此外,也會關聯各項事件處理器(如 SSLError, CertificateValidate, TextDataLine 等),以監控傳輸過程中的通訊狀態。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FtpCaseComplete(SendData:String):Boolean;",
+    "tags": [
+      "TransportManager",
+      "TransportManager.fileTransfer",
+      "FTP 相關"
+    ],
+    "deps": [
+      "FtpCaseComplete",
+      "ProcessServlet_FormData"
+    ],
+    "lIndex": "11072",
+    "rIndex": "11094",
+    "description": "通知後台伺服器 FTP 案件上傳已完成。方法會將包含案件狀態的上傳數據發送至特定的 Servlet 介面。邏輯包含檢查 HTTP 通訊是否成功、解析伺服器回傳的結果代碼,並處理可能的登入過期(Session Timeout)情況。若執行失敗,會將錯誤原因記錄至 HttpErrStr,供後續 UI 顯示錯誤訊息。"
+  }
+]
diff --git a/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.UIView.json b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.UIView.json
new file mode 100644
index 0000000..74424ce
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.UIView.json
@@ -0,0 +1,5530 @@
+[
+  {
+    "matcher": "function TCB_IMGPSScanX.GetCurrentVersionNo: String; //獲取自身版本號所需要",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "其他內部"
+    ],
+    "deps": [],
+    "lIndex": "1052",
+    "rIndex": "1085",
+    "description": "獲取當前模組的版本號。透過 GetModuleFileName 獲取檔案路徑,再利用 GetFileVersionInfoSize 和 GetFileVersionInfo 讀取版本資訊。接著從 VarFileInfo\\Translation 取得語系資訊,最後從 StringFileInfo 中提取 FileVersion 並回傳為字串。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.WMMOUSEWHEEL(var message: TWMMouseWheel);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "其他內部"
+    ],
+    "deps": [],
+    "lIndex": "1086",
+    "rIndex": "1171",
+    "description": "處理滑鼠滾輪事件。根據滾輪捲動方向(WHEEL_DELTA)對 ScrollBox1 或當前顯示的影像捲軸盒(DisplayISB)進行垂直捲動(SB_Lineup 或 SB_LINEDOWN)。若同時按下特定鍵(message.Keys=50),則會調整影像的縮放百分比(ZoomPercent)。此外也會遍歷所有影像捲軸盒元件並對取得焦點的元件執行捲動操作。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.WNoteBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "1172",
+    "rIndex": "1246",
+    "description": "開啟備註編輯視窗。首先初始化多國語言並從 MEMO_INF_List 載入註記範本資訊。若存在 Scan_Memo.dat,則讀取既有的註記內容。顯示 TSortMemoForm 供使用者編輯,確認後將編輯結果存回 Scan_Memo.dat。最後視需要觸發 CaseHelpBtnClick 以更新狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "1247",
+    "rIndex": "1253",
+    "description": "Delphi ActiveForm 用於定義屬性頁面的存根方法,目前未實作具體內容。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.EventSinkChanged(const EventSink: IUnknown);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "1254",
+    "rIndex": "1259",
+    "description": "當事件接收器改變時觸發。將傳入的 EventSink 轉換為 ICB_IMGPSScanXEvents 並賦值給 FEvents,同時呼叫繼承的 EventSinkChanged 方法。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC0Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1260",
+    "rIndex": "1270",
+    "description": "工具列功能按鈕 0 的點擊處理。若重複點擊則關閉影像顯示(DesableImage),否則啟用索引為 0 的影像顯示(EnableImage)並更新 NowClick 狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1271",
+    "rIndex": "1281",
+    "description": "工具列功能按鈕 1 的點擊處理。若重複點擊則關閉影像顯示,否則啟用索引為 1 的影像顯示並更新 NowClick 狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC2Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1282",
+    "rIndex": "1292",
+    "description": "工具列功能按鈕 2 的點擊處理。若重複點擊則關閉影像顯示,否則啟用索引為 2 的影像顯示並更新 NowClick 狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC3Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1293",
+    "rIndex": "1303",
+    "description": "工具列功能按鈕 3 的點擊處理。若重複點擊則關閉影像顯示,否則啟用索引為 3 的影像顯示並更新 NowClick 狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC4Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1304",
+    "rIndex": "1314",
+    "description": "工具列功能按鈕 4 的點擊處理。若重複點擊則關閉影像顯示,否則啟用索引為 4 的影像顯示並更新 NowClick 狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC5Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1315",
+    "rIndex": "1325",
+    "description": "工具列功能按鈕 5 的點擊處理。若重複點擊則關閉影像顯示,否則啟用索引為 5 的影像顯示並更新 NowClick 狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC6Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1326",
+    "rIndex": "1337",
+    "description": "工具列功能按鈕 6 的點擊處理。目前的實作已註解掉原有的影像啟用邏輯,改為直接呼叫 PM605Click(nil),即觸發右鍵選單中的刪除影像功能。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.InitExistImgList(casepath: String);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "其他內部"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "LoadFileGetMD5"
+    ],
+    "lIndex": "1338",
+    "rIndex": "1362",
+    "description": "初始化已存在的影像清單。讀取案件路徑下 Download\\Context.dat 的檔案內容,計算每個檔案的 MD5 雜湊值並存入 ExistImgList,同時將處理過程記錄至日誌檔。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Initialize;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "TDibGraphic"
+    ],
+    "lIndex": "1363",
+    "rIndex": "1386",
+    "description": "初始化元件狀態。註冊各類視窗與滑鼠事件處理函式(如 OnActivate, OnClick, OnCreate 等),並設定多項預設參數,包含 MpsKey、瀏覽窗邊界、檔案副檔名、案件與表單編號長度、去直線容忍值及切圖條碼類型。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "1387",
+    "rIndex": "1406",
+    "description": "影像滾輪盒(ISB)的點擊處理。更新當前顯示的 ISB 對象,調整 Shape1 標記框的位置以框選當前 ISB。根據 ISB 名稱與捲軸位置計算並更新 PageLV 清單中的選取狀態(NowPage 與 ItemIndex)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1EndScroll(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "1407",
+    "rIndex": "1421",
+    "description": "當影像滾輪盒停止捲動時觸發。呼叫 SetScrollData 將當前的水平/垂直捲軸位置與縮放百分比存回緩存中,以維持影像顯示的一致性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1Enter(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "1422",
+    "rIndex": "1426",
+    "description": "當滑鼠進入影像滾輪盒區域時,強制將焦點設為 ISB1。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1ImageMouseDown(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "1427",
+    "rIndex": "1463",
+    "description": "影像滑鼠按下事件。設定當前 DisplayISB 並視情況取得焦點,更新 Shape1 的選取框位置。同步更新 PageLV 的選取頁面。若處於特定模式(NowClick = -1)且按下左鍵,則啟動影像的拖曳操作(BeginDrag)。此外也會處理旋轉模式下的影像載入。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1ImageMouseMove(Sender: TObject; Shift: TShiftState;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "1464",
+    "rIndex": "1489",
+    "description": "影像滑鼠移動事件。根據當前是否有載入影像檔案,動態切換滑鼠模式(MouseMode)。若無檔案則設為使用者模式(mmUser),否則根據 NowClick 狀態呼叫 ViewMouseMode 切換至對應的檢視模式。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1ImageMouseUp(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [
+      "TJpegGraphic",
+      "SaveQuality",
+      "SaveToFile"
+    ],
+    "lIndex": "1490",
+    "rIndex": "1524",
+    "description": "影像滑鼠放開事件。處理多種滑鼠模式:在 mmDelete 模式下觸發刪除功能;在旋轉模式(mmR90等)下儲存旋轉後的影像檔案,並同步更新預覽圖(SelectISB)與清空檢核記錄。最後針對縮放或拖曳模式更新捲軸位置數據。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Active: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1525",
+    "rIndex": "1529",
+    "description": "獲取元件的 Active 狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AlignDisabled: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1530",
+    "rIndex": "1534",
+    "description": "獲取元件的 AlignDisabled 狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AlignWithMargins: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1535",
+    "rIndex": "1539",
+    "description": "獲取元件的 AlignWithMargins 狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AutoScroll: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1540",
+    "rIndex": "1544",
+    "description": "獲取元件的 AutoScroll 狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AutoSize: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1545",
+    "rIndex": "1549",
+    "description": "獲取元件的 AutoSize 狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AxBorderStyle: TxActiveFormBorderStyle;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1550",
+    "rIndex": "1554",
+    "description": "獲取元件的 AxBorderStyle 邊框樣式。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Caption: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1555",
+    "rIndex": "1559",
+    "description": "獲取元件的標題文字。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Color: OLE_COLOR;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1560",
+    "rIndex": "1564",
+    "description": "獲取元件的背景顏色。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_DockSite: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1565",
+    "rIndex": "1569",
+    "description": "獲取元件的 DockSite 狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_DoubleBuffered: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1570",
+    "rIndex": "1574",
+    "description": "獲獲取元件的 DoubleBuffered 狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_DropTarget: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1575",
+    "rIndex": "1579",
+    "description": "獲取元件的 DropTarget 狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Enabled: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1580",
+    "rIndex": "1584",
+    "description": "獲取元件的啟用狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitHeight: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1585",
+    "rIndex": "1589",
+    "description": "獲取元件的明確高度。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitLeft: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1590",
+    "rIndex": "1594",
+    "description": "獲取元件的明確左座標。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitTop: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1595",
+    "rIndex": "1599",
+    "description": "獲取元件的明確頂座標。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitWidth: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1600",
+    "rIndex": "1604",
+    "description": "獲取元件的明確寬度。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Font: IFontDisp;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1605",
+    "rIndex": "1609",
+    "description": "獲取元件的字型。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_HelpFile: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1610",
+    "rIndex": "1614",
+    "description": "獲取元件的說明檔路徑。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_KeyPreview: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1615",
+    "rIndex": "1619",
+    "description": "獲取元件的鍵盤預覽狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_MouseInClient: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1620",
+    "rIndex": "1624",
+    "description": "獲取滑鼠是否在元件內部區域。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ParentCustomHint: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1625",
+    "rIndex": "1629",
+    "description": "獲取元件的 ParentCustomHint 狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ParentDoubleBuffered: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1630",
+    "rIndex": "1634",
+    "description": "獲取元件的 ParentDoubleBuffered 狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_PixelsPerInch: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1635",
+    "rIndex": "1639",
+    "description": "獲取元件的 PixelsPerInch 設定。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_PopupMode: TxPopupMode;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1640",
+    "rIndex": "1644",
+    "description": "獲取元件的彈出視窗模式。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_PrintScale: TxPrintScale;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1645",
+    "rIndex": "1649",
+    "description": "獲取元件的列印縮放比例。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Scaled: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1650",
+    "rIndex": "1654",
+    "description": "獲取元件的 Scaled 縮放狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ScreenSnap: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1655",
+    "rIndex": "1659",
+    "description": "獲取元件的 ScreenSnap 狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_SnapBuffer: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1660",
+    "rIndex": "1664",
+    "description": "獲取元件的 SnapBuffer 設定。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_UseDockManager: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1665",
+    "rIndex": "1669",
+    "description": "獲取元件是否使用 Dock 管理。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Visible: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1670",
+    "rIndex": "1674",
+    "description": "獲取元件的顯示狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_VisibleDockClientCount: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1675",
+    "rIndex": "1679",
+    "description": "獲取元件的可見 Dock 客戶端數量。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX._Set_Font(var Value: IFontDisp);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1680",
+    "rIndex": "1684",
+    "description": "設定元件的字型。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ActivateEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "1685",
+    "rIndex": "1689",
+    "description": "觸發 COM 介面的 OnActivate 事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ClickEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "1690",
+    "rIndex": "1694",
+    "description": "觸發 COM 介面的 OnClick 事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CreateEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "1695",
+    "rIndex": "1699",
+    "description": "觸發 COM 介面的 OnCreate 事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DblClickEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "1700",
+    "rIndex": "1704",
+    "description": "觸發 COM 介面的 OnDblClick 事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DeactivateEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "1705",
+    "rIndex": "1709",
+    "description": "觸發 COM 介面的 OnDeactivate 事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DestroyEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [
+      "_DelTree"
+    ],
+    "lIndex": "1710",
+    "rIndex": "1755",
+    "description": "銷毀元件時的清理工作。負責釋放大量的 TStringList 物件,包含各類資訊清單(表單、規則、註記、工作、影像路徑、條碼等)。針對特定模式(DSCAN/ESCAN),若 ImagePath 不為空則刪除該目錄及其子目錄。最後觸發 COM 介面的 OnDestroy 事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.KeyPressEvent(Sender: TObject; var Key: Char);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "1756",
+    "rIndex": "1764",
+    "description": "處理鍵盤按鈕事件,並將按鍵資訊傳遞至 COM 介面的 OnKeyPress 事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1765",
+    "rIndex": "1772",
+    "description": "切換至檢視模式 0(單頁顯示),呼叫 GoViewMode 更新佈局,並隱藏 Panel14 控制面版。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode2Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1773",
+    "rIndex": "1780",
+    "description": "切換至檢視模式 1(兩頁顯示),呼叫 GoViewMode 更新佈局,並顯示 Panel14 控制面版。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode3Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1781",
+    "rIndex": "1787",
+    "description": "切換至檢視模式 2(多頁網格顯示),呼叫 GoViewMode 更新佈局,並觸發捲軸變動以重新載入影像。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode4Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1788",
+    "rIndex": "1794",
+    "description": "切換至檢視模式 3(自定義檢視模式),呼叫 GoViewMode 更新佈局,並觸發捲軸變動以重新載入影像。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.MouseEnterEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "1795",
+    "rIndex": "1799",
+    "description": "當滑鼠進入元件時,觸發 COM 介面的 OnMouseEnter 事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.MouseLeaveEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "1800",
+    "rIndex": "1804",
+    "description": "當滑鼠離開元件時,觸發 COM 介面的 OnMouseLeave 事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PaintEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "1805",
+    "rIndex": "1809",
+    "description": "當元件需要重繪時,觸發 COM 介面的 OnPaint 事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AlignWithMargins(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1810",
+    "rIndex": "1814",
+    "description": "設定元件的 AlignWithMargins 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AutoScroll(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1815",
+    "rIndex": "1819",
+    "description": "設定元件的 AutoScroll 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AutoSize(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1820",
+    "rIndex": "1824",
+    "description": "設定元件的 AutoSize 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AxBorderStyle(Value: TxActiveFormBorderStyle);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1825",
+    "rIndex": "1829",
+    "description": "設定元件的 AxBorderStyle 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Caption(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1830",
+    "rIndex": "1834",
+    "description": "設定元件的標題文字。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Color(Value: OLE_COLOR);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1835",
+    "rIndex": "1839",
+    "description": "設定元件的背景顏色。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_DockSite(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1840",
+    "rIndex": "1844",
+    "description": "設定元件的 DockSite 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_DoubleBuffered(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1845",
+    "rIndex": "1849",
+    "description": "設定元件的 DoubleBuffered 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_DropTarget(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1850",
+    "rIndex": "1854",
+    "description": "設定元件的 DropTarget 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Enabled(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1855",
+    "rIndex": "1859",
+    "description": "設定元件的啟用狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Font(const Value: IFontDisp);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1860",
+    "rIndex": "1864",
+    "description": "設定元件的字型。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_HelpFile(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1865",
+    "rIndex": "1869",
+    "description": "設定元件的說明檔路徑。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_KeyPreview(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1870",
+    "rIndex": "1874",
+    "description": "設定元件的鍵盤預覽狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_ParentCustomHint(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1875",
+    "rIndex": "1879",
+    "description": "設定元件的 ParentCustomHint 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_ParentDoubleBuffered(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1880",
+    "rIndex": "1884",
+    "description": "設定元件的 ParentDoubleBuffered 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_PixelsPerInch(Value: Integer);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1885",
+    "rIndex": "1889",
+    "description": "設定元件的 PixelsPerInch 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_PopupMode(Value: TxPopupMode);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1890",
+    "rIndex": "1894",
+    "description": "設定元件的彈出視窗模式。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_PrintScale(Value: TxPrintScale);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1895",
+    "rIndex": "1899",
+    "description": "設定元件的列印縮放比例。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Scaled(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1900",
+    "rIndex": "1904",
+    "description": "設定元件的 Scaled 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_ScreenSnap(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1905",
+    "rIndex": "1909",
+    "description": "設定元件的 ScreenSnap 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_SnapBuffer(Value: Integer);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1910",
+    "rIndex": "1914",
+    "description": "設定元件的 SnapBuffer 屬性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_UseDockManager(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1915",
+    "rIndex": "1919",
+    "description": "設定元件是否使用 Dock 管理。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Visible(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1920",
+    "rIndex": "1924",
+    "description": "設定元件的顯示狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM401Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "GetNoNameCase",
+      "Str2Dir",
+      "RenameFile",
+      "SaveToFile",
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "1925",
+    "rIndex": "1978",
+    "description": "影像列表右鍵選單功能:從指定頁面分出新案。確認使用者選取的分案起點(不能為第一頁)後,取得新的流水案號並建立目錄。將原案件中該頁碼之後的所有影像檔案更名並搬移至新案目錄,同步更新原案與新案的 Context.dat 與 CaseIndex.dat。完成後重新載入影像列表並提示完成。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM402Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "1979",
+    "rIndex": "1988",
+    "description": "將影像列表(PageLV)中的所有項目設為選取狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM403Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "1989",
+    "rIndex": "1998",
+    "description": "將影像列表(PageLV)中的所有項目設為取消選取狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM404Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "1999",
+    "rIndex": "2067",
+    "description": "影像列表右鍵選單功能:文件歸類。開啟 TDocListForm 顯示可用的表單清單供使用者選擇。確認後根據當前 TreeView 的選取層級(案件級別、文件級別或特定表單),呼叫 PageReplaceFormID 將影像重新歸類至選定的表單類型。歸類完成後重新繪製樹狀結構並清空檢核記錄,最後回到原先選取的節點。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM601Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "DirectoryExists",
+      "CopyFile",
+      "SaveToFile",
+      "DeleteImageFile",
+      "RenameFile",
+      "ReSortFileName"
+    ],
+    "lIndex": "2068",
+    "rIndex": "2221",
+    "description": "縮圖瀏覽區右鍵選單功能:文件歸類。針對所有被選取(由 Shape 標記)的影像,開啟 TDocListForm 選擇目標表單。核心邏輯包含:判斷目標文件是否需要區分份數、自動產生新的文件目錄或沿用既有目錄、根據檔案序號產生新檔名、執行檔案複製並更新 ContextList。最後刪除原檔案、重新排序原目錄並重新繪製樹狀結構。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM602Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "Str2Dir",
+      "FileExists",
+      "LoadFromFile",
+      "CopyFile",
+      "SaveToFile",
+      "DeleteImageFile",
+      "ReSortFileName"
+    ],
+    "lIndex": "2222",
+    "rIndex": "2300",
+    "description": "縮圖瀏覽區右鍵選單功能:歸類至自定義文件。彈出對話框要求使用者輸入新文件名稱,檢核名稱是否重複後產生新的自定義文件編號。接著將所有選取的影像複製到新建立的文件目錄下,更新 ContextList並刪除原檔案。最後重新排序並刷新樹狀顯示。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM604Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "DeskewImg",
+      "SaveToFile",
+      "LoadFromFile"
+    ],
+    "lIndex": "2301",
+    "rIndex": "2323",
+    "description": "縮圖瀏覽區右鍵選單功能:自動去偏斜(Deskew)。遍歷所有選取的影像元件,對其 Graphic 執行 DeskewImg 操作,重新繪製並將結果存回原檔案。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM605Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "DeleteImageFile",
+      "ReSortFileName"
+    ],
+    "lIndex": "2324",
+    "rIndex": "2361",
+    "description": "縮圖瀏覽區右鍵選單功能:刪除影像。在使用者確認後,遍歷所有選取的影像元件,呼叫 DeleteImageFile 刪除實際檔案。刪除完成後,執行檔案重新排序(ReSortFileName),更新樹狀結構上的頁數統計文字,並刷新顯示。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.N1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2362",
+    "rIndex": "2372",
+    "description": "彈出對話框要求使用者輸入目標頁碼,呼叫 MoveImage 將當前顯示的影像移動到指定的位置。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.N51Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2373",
+    "rIndex": "2379",
+    "description": "切換至檢視模式 4,呼叫 GoViewMode 更新佈局,並觸發捲軸變動以重新載入影像。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.NewScanBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [
+      "StatrTwainScan"
+    ],
+    "lIndex": "2380",
+    "rIndex": "2427",
+    "description": "點擊「新案掃瞄」按鈕的處理。首先檢查初始化狀態。針對重掃(RSCAN)、異動(ESCAN)或重掃指定件(DSCAN),會自動選取新件節點並觸發追加掃瞄。若是全新掃瞄,則重設掃瞄模式與路徑,清空清單,最後呼叫 StatrTwainScan 啟動掃瞄程序,並在結束後重新載入影像檔案。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.NextPageBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "2428",
+    "rIndex": "2450",
+    "description": "處理「下一頁」按鈕點擊。若有選取影像,則呼叫 NextPage 跳轉至下一頁,並判斷選取影像的位置是否超出目前滾輪區域的高度,若是則自動調整 ScrollBox1 的垂直捲軸位置,以確保新頁面影像能正確顯示在視線範圍內。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.OptionBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [
+      "Scanner"
+    ],
+    "lIndex": "2451",
+    "rIndex": "2527",
+    "description": "處理「掃瞄參數設定」按鈕點擊。首先確認系統初始化是否完成,接著建立 TPatchDlg 對話框並載入多國語言。將目前的掃瞄設定(如自動刪除空白頁、DPI、單/雙面、反白、去邊、去偏斜、亮度、對比、旋轉角度及顯示模式等)同步至對話框。使用者完成設定後,將新參數存回系統變數,並呼叫 R_W_ScanIni 將設定寫入設定檔。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageLVClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.listView"
+    ],
+    "deps": [],
+    "lIndex": "2528",
+    "rIndex": "2535",
+    "description": "處理影像列表點擊。選取項目後同步更新 ScrollBar1 的位置。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageLVKeyUp(Sender: TObject; var Key: Word;",
+    "tags": [
+      "UIView",
+      "UIView.listView"
+    ],
+    "deps": [],
+    "lIndex": "2536",
+    "rIndex": "2542",
+    "description": "處理影像列表按鍵放開事件。若有選取項目,則同步更新 ScrollBar1 的位置。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageLVMouseDown(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.listView"
+    ],
+    "deps": [],
+    "lIndex": "2543",
+    "rIndex": "2554",
+    "description": "處理影像列表滑鼠按下事件。若是右鍵,則選取該項目並彈出右鍵選單。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Panel11DblClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2555",
+    "rIndex": "2561",
+    "description": "Panel11 的連按兩下事件,目前實作已註解掉。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Panel1DblClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2562",
+    "rIndex": "2567",
+    "description": "Panel1 的連按兩下事件,用於切換 Button1 與 Button2 的顯示狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Panel9Resize(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2568",
+    "rIndex": "2572",
+    "description": "當 Panel9 大小改變時,呼叫 GoViewMode 重新調整影像佈局。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM101Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "_DelTree",
+      "DirectoryExists",
+      "DeleteDocNoFile"
+    ],
+    "lIndex": "2573",
+    "rIndex": "2677",
+    "description": "處理樹狀結構(TreeView)的右鍵刪除選單。根據選取的節點類型(新掃瞄件、案件、文件或表單)執行不同範圍的刪除:包含刪除實體目錄、清空影像清單、更新案件索引及檢核記錄。針對異動模式(ESCAN),若刪除後無影像則會重建空案件以維持結構。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.DocNoIsExistImg(DocNopath:String):boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "2678",
+    "rIndex": "2701",
+    "description": "檢查指定的文件目錄路徑下是否存在影像檔案。首先讀取目錄中的 Context.dat 檔案,接著遍歷清單中的所有檔名並檢查實際檔案是否存在。若發現任何一個影像檔案存在則回傳 False(表示非空),否則回傳 True。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX._DelTreeForExistImg(ASourceDir:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "_DelTree"
+    ],
+    "lIndex": "2702",
+    "rIndex": "2709",
+    "description": "存根方法,目前未包含具體實作邏輯。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM102Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "DirectoryExists",
+      "RenameFile"
+    ],
+    "lIndex": "2710",
+    "rIndex": "2750",
+    "description": "處理「修改案件編號」右鍵選單。彈出輸入盒要求輸入新編號並驗證長度與是否重複。確認修改後,先清空當前影像顯示,接著執行磁碟目錄更名並更新案件清單文字。最後重新繪製該案件的文件樹狀結構並提示完成。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM103Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "2751",
+    "rIndex": "2788",
+    "description": "處理樹狀結構的「掃瞄/追加掃瞄」右鍵選單。根據選取的節點層級,決定是啟動全新的案件掃瞄程序(NewScanBtnClick)或是針對現有案件進行追加掃瞄(AddScanBtnclick),並在日誌中記錄操作行為。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PM104Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "TTiffGraphic",
+      "TJpegGraphic",
+      "FJpgCompression",
+      "DeskewImg",
+      "ConvertToBW",
+      "MpsGetBarcode",
+      "Rotate",
+      "CheckNeedCrop",
+      "CropImg",
+      "ifBlackWhite",
+      "tcGroup4",
+      "ifColor25",
+      "ConvertToGray",
+      "tcJpeg",
+      "ifTrueColor",
+      "ifGray256",
+      "SaveQuality",
+      "FindFirst",
+      "LoadFromFile",
+      "SaveToFile",
+      "DirectoryExists",
+      "_DelTree",
+      "GetNoNameCase",
+      "Str2Dir",
+      "FileExists"
+    ],
+    "lIndex": "2789",
+    "rIndex": "3186",
+    "description": "處理「匯入影像檔案」右鍵選單。開啟檔案對話框選取 TIF/JPG/PNG 檔,並檢查檔案大小是否超過限制。核心流程包含:計算總頁數、逐頁載入、執行自動去偏斜(Deskew)、條碼辨識以判斷 FormID、處理 A3 切圖(左右分割)、將影像轉換為對應格式(黑白轉 TIF G4,彩色/灰階轉 JPG)並寫入磁碟,最後更新索引、樹狀結構與頁數統計。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM106Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "CopyFile",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "3187",
+    "rIndex": "3280",
+    "description": "處理「複製文件」右鍵選單。開啟對話框供使用者選擇來源文件與目標案件。使用者確認後,遍歷目標案件並將符合條件的來源影像複製到目標目錄下,同步產生新的序號檔名、更新目標案件的 Context.dat 並清空其檢核記錄。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM107Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3281",
+    "rIndex": "3285",
+    "description": "觸發右鍵選單中的備註點擊事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM108Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3286",
+    "rIndex": "3381",
+    "description": "處理樹狀結構的「文件歸類」右鍵選單。開啟對話框顯示表單清單,使用者可選擇歸類至既有文件或新增自定義文件。若為自定義,則驗證名稱後取得新編號。隨後執行 FormIDReplace 搬移影像檔案、更新索引、清空檢核記錄並刷新樹狀結構顯示。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM109Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "SaveToFile"
+    ],
+    "lIndex": "3382",
+    "rIndex": "3411",
+    "description": "處理「案件 OMR 檢核」右鍵選單。清空當前顯示並開啟檢核進度,呼叫 OMRCheckCase 對案件執行光學劃記辨識檢核。若檢核成功則建立 OMRCheckOk.dat 標記檔,最後重新載入影像、刷新樹狀結構並提示檢核完成。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM110Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "Str2Dir"
+    ],
+    "lIndex": "3412",
+    "rIndex": "3441",
+    "description": "處理「新增其他文件」右鍵選單。彈出對話框要求輸入自定義名稱,驗證無誤後產生新的文件編號並在案件目錄下建立實體子目錄。隨後將新目錄加入清單並重新繪製樹狀結構,最後自動展開新建立的節點。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM111Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3442",
+    "rIndex": "3472",
+    "description": "處理「修改文件份數」右鍵選單。取得當前份數並供使用者修改(範圍 1-9999)。若份數有變動則執行驗證(如分份文件限制),確認後更新 SetDocDirCopies 設定並標記文件已編輯,最後刷新樹狀結構統計。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM301Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "ifBlackWhite"
+    ],
+    "lIndex": "3473",
+    "rIndex": "3480",
+    "description": "將掃瞄模式設定為黑白(ifBlackWhite)並指定副檔名為 .tif。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM302Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "ifGray256"
+    ],
+    "lIndex": "3481",
+    "rIndex": "3489",
+    "description": "將掃瞄模式設定為灰階(ifGray256)並指定副檔名為 .jpg。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM303Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "ifTrueColor"
+    ],
+    "lIndex": "3490",
+    "rIndex": "3498",
+    "description": "將掃瞄模式設定為全彩(ifTrueColor)並指定副檔名為 .jpg。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM501Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3499",
+    "rIndex": "3505",
+    "description": "將影像縮放模式設為「符合寬度」並開啟反鋸齒。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM502Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3506",
+    "rIndex": "3512",
+    "description": "將影像縮放模式設為「符合高度」並開啟反鋸齒。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM503Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3513",
+    "rIndex": "3519",
+    "description": "將影像縮放模式設為「符合頁面」並開啟反鋸齒。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM504Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3520",
+    "rIndex": "3526",
+    "description": "將影像縮放模式設為「原始大小」並開啟反鋸齒。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM505Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "StatrTwainScan"
+    ],
+    "lIndex": "3527",
+    "rIndex": "3547",
+    "description": "處理「掃瞄替換此頁」右鍵選單。檢查當前影像後,設定掃瞄模式為 smReplace 並指定儲存路徑與檔名為當前顯示之影像。啟動 StatrTwainScan 掃瞄以覆蓋原檔案,完成後清空該案件的檢核記錄。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM507Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "RenameFile"
+    ],
+    "lIndex": "3548",
+    "rIndex": "3615",
+    "description": "處理影像區域的「文件歸類」右鍵選單。彈出對話框供使用者選取目標表單,隨後根據選取的 FormID 產生新的序號檔名。執行 RenameFile 進行實際更名並同步更新 Context.dat。最後重新整理樹狀結構、清空檢核記錄並使焦點回到原文件節點。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM508Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "_DelTree",
+      "SaveToFile",
+      "ReSortFileName",
+      "LoadFromFile",
+      "FileExists"
+    ],
+    "lIndex": "3616",
+    "rIndex": "3656",
+    "description": "處理影像區域的「刪除影像」右鍵選單。若案件僅剩一張影像則詢問是否刪除整個案件目錄。否則,在確認後從影像清單中移除該項目、刪除實體檔案並呼叫 ReSortFileName 重新排序。最後刷新樹狀統計文字、清空檢核記錄並更新顯示。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM509Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3657",
+    "rIndex": "3661",
+    "description": "觸發「從此分案」功能,內部轉呼叫 PM401Click。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM510Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [
+      "DeskewImg",
+      "SaveToFile"
+    ],
+    "lIndex": "3662",
+    "rIndex": "3668",
+    "description": "對當前 Graphic 執行去偏斜處理後存回原檔案。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu1Popup(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3669",
+    "rIndex": "3826",
+    "description": "處理樹狀結構右鍵選單彈出時的動態項目控制。根據選取節點的層級(根、案件、文件、表單)與系統模式(如 FMode、FImgDelete 權限等)動態設定各項選單(刪除、修改、掃瞄加入、歸類、檢核等)的可見度與可用性。例如在文件層會受影像引用狀態限制刪除功能。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu4Popup(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3827",
+    "rIndex": "3844",
+    "description": "處理影像列表右鍵選單彈出邏輯。僅在樹狀結構選取文件或表單層級時顯示全選、取消全選及歸類功能,並特別判斷「分出新案」在非重掃模式下才可見。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu5Popup(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3845",
+    "rIndex": "3874",
+    "description": "處理影像顯示區域右鍵選單彈出邏輯。當有載入影像時啟用各類縮放選單項目,並根據樹狀選取層級與掃瞄模式決定是否顯示「分出新案」功能。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu6Popup(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3875",
+    "rIndex": "3924",
+    "description": "處理縮圖區右鍵選單彈出邏輯。動態設定歸類、自定義文件及刪除項目的可見度。若選取附件目錄則開啟特殊功能。同時根據權限設定與影像引用狀態(UseCase)限制歸類與刪除功能的可用性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PrePageBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "3925",
+    "rIndex": "3952",
+    "description": "處理「上一頁」按鈕點擊。跳轉至前一頁並判斷影像位置,若向上超出捲軸區域則自動滾動垂直捲軸,將影像帶入可見區域。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SampleScanBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile",
+      "StatrTwainScan",
+      "upFile"
+    ],
+    "lIndex": "3953",
+    "rIndex": "4068",
+    "description": "處理「範本掃瞄」按鈕點擊。切換為範本模式並引導使用者輸入 FormID,掃瞄後產生 TIF 與 JPG 影像。隨後透過 HTTPS 將範本上傳至伺服器,上傳過程中會嚴格檢查網路狀態、Session 有效性與伺服器回傳結果。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScrollBar1Change(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4069",
+    "rIndex": "4086",
+    "description": "捲軸變動處理,目前實作已透過 Exit 暫時停用。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScrollBox1MouseEnter(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "4087",
+    "rIndex": "4091",
+    "description": "當滑鼠進入捲軸區域時,自動將焦點設定至 ScrollBox1。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SelectScanBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [
+      "SelectScanner",
+      "scanner.SelectScanner",
+      "Scanner"
+    ],
+    "lIndex": "4092",
+    "rIndex": "4100",
+    "description": "開啟系統掃瞄器選擇視窗。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.StatusBar1DblClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.statusMessenger"
+    ],
+    "deps": [],
+    "lIndex": "4101",
+    "rIndex": "4116",
+    "description": "處理狀態列連按兩下事件。用於切換測試功能按鈕及除錯訊息視窗(Memo1/Display1)的顯示,支援搭配 Control 鍵切換授權匯出/匯入功能。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ActiveFormCreate(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "4117",
+    "rIndex": "4138",
+    "description": "ActiveForm 建立時的初始化處理。發送啟動訊息、設定預設檢視模式並初始化影像顯示區域。遍歷所有影像捲軸盒(ISB),設定預設滑鼠模式為 mmUser 並將縮放模式設為全頁顯示,最後延遲啟動 Timer。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ActiveFormKeyUp(Sender: TObject; var Key: Word;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4139",
+    "rIndex": "4164",
+    "description": "處理 ActiveForm 按鍵放開事件。當文字輸入框取得焦點且有選取影像時,攔截上下方向鍵並將其轉化為 PriorPage 或 NextPage 翻頁操作,並同步滾動捲軸。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AddAttFileLBClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "CopyFile"
+    ],
+    "lIndex": "4165",
+    "rIndex": "4194",
+    "description": "處理「加入附加電子檔」按鈕點擊。開啟檔案對話框選取多個 PDF 檔案,支援覆蓋檢查。執行 CopyFile 將檔案複製到案件目錄下,並呼叫 SetAttContextList 更新附加檔案清單後載入顯示。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AddCredit1RGClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4195",
+    "rIndex": "4207",
+    "description": "處理信用註記點擊,更新 Case_loandoc 狀態並寫入索引檔。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AddScanBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [
+      "StatrTwainScan"
+    ],
+    "lIndex": "4208",
+    "rIndex": "4249",
+    "description": "處理「追加掃瞄」按鈕點擊。檢查狀態後設定掃瞄模式為 smInsert(插入模式),初始化掃瞄參數並啟動 StatrTwainScan。完成後重新繪製樹狀結構、更新筆數統計並清空檢核記錄,最後自動選取新文件節點。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AttListBoxClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.listView"
+    ],
+    "deps": [],
+    "lIndex": "4250",
+    "rIndex": "4256",
+    "description": "處理附加檔案列表點擊,若有選取則啟用刪除按鈕。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AttListBoxDblClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.listView"
+    ],
+    "deps": [
+      "FileExists"
+    ],
+    "lIndex": "4257",
+    "rIndex": "4269",
+    "description": "處理附加檔案列表連按兩下,呼叫 ShellExecute 開啟檔案。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.BtnMouseEnter(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4270",
+    "rIndex": "4274",
+    "description": "當滑鼠進入按鈕區域時,顯示該按鈕的 Hint 文字提示。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button3Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "initkscan"
+    ],
+    "lIndex": "4275",
+    "rIndex": "4334",
+    "description": "工程師測試用按鈕。用於顯示當前系統環境變數與參數狀態,包含伺服器 URL、案件資訊、權限、DPI 設定及各類長度限制,最後重新載入影像檔案。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button4Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4335",
+    "rIndex": "4369",
+    "description": "工程師測試用按鈕。用於傾印內部多個 TStringList 與 Record 資料,包含 OMR 錯誤資訊、表單與檢核規則清單、範本與已存在影像清單等,用於除錯。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button5Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "SetFtpInfo",
+      "IIS_Ftp"
+    ],
+    "lIndex": "4370",
+    "rIndex": "4378",
+    "description": "測試 FTP 上傳功能。連線 FTP 後嘗試將特定的 PDF 檔案上傳至伺服器路徑。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button6Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "SetFtpInfo",
+      "IIS_Ftp",
+      "Rotate",
+      "FJpgCompression",
+      "Scanner"
+    ],
+    "lIndex": "4379",
+    "rIndex": "4389",
+    "description": "測試 FTP 下載功能。連線 FTP 後嘗試從伺服器下載 ZIP 案件檔至本地。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ExportBtClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "SaveToFile",
+      "FileExists",
+      "En_DecryptionStr_Base64",
+      "dnFile",
+      "dnFile_Get"
+    ],
+    "lIndex": "4951",
+    "rIndex": "5013",
+    "description": "處理「匯出授權檔」按鈕點擊。透過 HTTPS 下載掃瞄與檢視用的 .lic 授權檔案。將授權檔連同加密的 mps.dat 檔案打包成帶有密碼保護的 mps.zip 壓縮包,完成後清理暫存檔並提示路徑。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ImportBtClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "Str2Dir",
+      "FileExists",
+      "LoadFromFile",
+      "RenameFile",
+      "_DelTree",
+      "En_DecryptionStr_Base64",
+      "upFile"
+    ],
+    "lIndex": "5014",
+    "rIndex": "5089",
+    "description": "處理「匯入授權檔」按鈕點擊。選取 mps.zip 授權包後進行解壓與過期驗證。驗證通過後對授權檔執行重新命名,並透過 upFile 函式逐一上傳至伺服器範本目錄,過程中會嚴格檢查 Session 與回傳狀態。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.HotKeyDown (var Msg : TMessage);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "5090",
+    "rIndex": "5094",
+    "description": "熱鍵按下處理程序,目前為空實作。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.InitialLanguage(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.i18n",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "5095",
+    "rIndex": "5172",
+    "description": "元件多國語言初始化核心函式。讀取 Language.Lng 設定檔,根據指定的語系遞迴設定畫面上所有控制項(按鈕、選單、標籤、清單、群組框等)的 Caption 或 Hint 文字,實現介面語系動態切換。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindISB2View(Vmode:Integer):TImageScrollBox; //找空的ISB來顯示",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [],
+    "lIndex": "5228",
+    "rIndex": "5253",
+    "description": "根據檢視模式,在畫面中尋找下一個可顯示影像的 TImageScrollBox。遍歷 ISB1-ISB8,檢查 FileName 是否為空;若已滿則會清空特定位置影像並重新開始,確保影像載入有對應視窗。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.HTTPSClientRedirection(Sender: TObject;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5479",
+    "rIndex": "5484",
+    "description": "處理 HTTPS 客戶端的重導向事件,目前為空實作。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.EnableImage(v:integer;Sender : TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [],
+    "lIndex": "5485",
+    "rIndex": "5498",
+    "description": "啟用滑鼠工具列功能,更新按鈕圖示並切換滑鼠模式。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DesableImage;",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [],
+    "lIndex": "5499",
+    "rIndex": "5518",
+    "description": "停用所有工具列功能。重置點選狀態,將所有功能按鈕(FC0-FC6)圖示切換為灰階,並將所有影像捲軸盒的滑鼠模式切換回一般使用者模式。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ViewMouseMode(v:Integer);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [],
+    "lIndex": "5519",
+    "rIndex": "5543",
+    "description": "設定全域的滑鼠作業模式。根據參數對應至放大鏡、縮放、拖曳、旋轉或刪除等模式,並同步更新所有影像捲軸盒(ISB1-ISB8)的屬性,確保行為一致。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GoViewMode;",
+    "tags": [
+      "UIView",
+      "UIView.layouts",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [],
+    "lIndex": "5544",
+    "rIndex": "5555",
+    "description": "依檢視模式索引 VMode,呼叫 DisplayMode 來調整佈局。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DisplayMode(index,H_Count,W_Count:Integer;BasePanel:TPanel);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [],
+    "lIndex": "5556",
+    "rIndex": "5599",
+    "description": "調整影像視窗的網格佈局(1x1, 2x2 等)。隱藏所有影像面板後,根據行數與列數計算面板寬高與位置,重新排列並顯示。同時調整標記框 Shape1 的大小,最後更新模式圖示並初始化首個視窗。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetServerDate : Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "ProcessServlet_Get"
+    ],
+    "lIndex": "5600",
+    "rIndex": "5631",
+    "description": "從伺服器獲取伺服器時間。透過 HTTPS 請求取得時間字串,解析日期與時間,並計算 Server 與本機的時間差(Balance)供後續校時使用。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSampleInf : Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "ProcessServlet_Get"
+    ],
+    "lIndex": "5632",
+    "rIndex": "5664",
+    "description": "從伺服器獲取已註冊的範本表單 ID 清單,並存入 SampleFormIDList。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetFormID_DocNo; //將FormID及Docno抽出來另存入list裡    20130403增加",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "清單管理"
+    ],
+    "deps": [],
+    "lIndex": "5947",
+    "rIndex": "5958",
+    "description": "提取 FORM_INF_List 中的 FormID 與 DocNo 欄位至獨立清單。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetIn_WH_DocNo; //將要入庫的DocNo抽出來另存入list裡",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "清單管理"
+    ],
+    "deps": [],
+    "lIndex": "5959",
+    "rIndex": "5972",
+    "description": "提取所有入庫屬性(IS_IN_WH)為 'Y' 的文件編號至清單。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.CheckRequiredColumnValues(workno, caseno:String): Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5973",
+    "rIndex": "5982",
+    "description": "檢查特定業務邏輯下的必填欄位。針對特定的 workno 與案號格式(caseno[9])判斷是否符合要求。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CheckRule2OMRErrInfo;   //檢核規則填入OMRErrINFo Record",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "OMR 檢核"
+    ],
+    "deps": [],
+    "lIndex": "5983",
+    "rIndex": "6010",
+    "description": "將檢核規則清單(CHECK_RULE_INF_List)中的資料轉換為內部的 OMRErrInfo Record 陣列,設定各項規則的顯示類型(Display)、是否可忽略(Ignore)及提示訊息與掃瞄模式。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReNameContext(Path,OldName,NewName:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "檔案操作"
+    ],
+    "deps": [
+      "SaveToFile"
+    ],
+    "lIndex": "6011",
+    "rIndex": "6027",
+    "description": "在指定路徑下執行影像清單的更名同步。遍歷 ContextList,比對舊檔名後更新為新檔名,同步更新 Context.dat 及對應的文件編號清單(Context_DocNo.dat)。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteImageFile(Path,FileName,CaseID:String); // 刪除檔案  (無法得到DocDir用)",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "檔案操作"
+    ],
+    "deps": [
+      "DeleteImageFile",
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "6028",
+    "rIndex": "6059",
+    "description": "刪除指定的影像檔案。執行實體刪除後,自動計算文件目錄,並呼叫 SetContextList 從 Context 清單中移除對應的影像記錄。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteFormCodeFile(CaseID,DocDir,FormID:String);  //刪除指定FormID文件",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "檔案操作"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "DeleteImageFile",
+      "ReSortFileName",
+      "SaveToFile"
+    ],
+    "lIndex": "6060",
+    "rIndex": "6114",
+    "description": "刪除案件中指定 FormID 的所有文件。讀取 Context.dat 並遍歷,若 FormID 匹配則執行刪除(在 ESCAN 模式下會檢查是否非當次掃瞄以保護舊圖)。刪除後執行檔案序號重新排序。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DeleteDocNoFile(Path,DocNo:String):Boolean;  //刪除指定DocNo文件",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "檔案操作"
+    ],
+    "deps": [
+      "DeleteDocNoFile",
+      "SaveToFile",
+      "ReSortFileName",
+      "LoadFromFile",
+      "FileExists"
+    ],
+    "lIndex": "6115",
+    "rIndex": "6140",
+    "description": "刪除指定的文件編號(DocNo)影像。遍歷 ContextList,比對文件編號後執行實體刪除與清單移除(含 Context 與 Context_DocNo)。處理完成後執行檔案重新排序並重新載入清單。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteShowFile(Path:String); //刪除顯示中的影像",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "檔案操作"
+    ],
+    "deps": [
+      "DeleteShowFile"
+    ],
+    "lIndex": "6175",
+    "rIndex": "6188",
+    "description": "刪除當前顯示清單(NowShowFileList)中的影像檔案並更新索引。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDataDocNoPage(MainDocNo,MainVersion:String):Integer;  //取記錄的文件_版本頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [],
+    "lIndex": "6189",
+    "rIndex": "6203",
+    "description": "從 DOC_INF_List 資料中查詢特定文件與版本的預設頁數設定。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckCaseDocNoPage(CaseID,DocNo,Version:String;Pages:Integer):Integer; //取案件裡的文件_版本頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "6204",
+    "rIndex": "6277",
+    "description": "計算案件中特定文件與版本的實際頁數。透過讀取 upload 目錄下的 Context.dat 與 DocDir.dat,精確比對 FormID、DocNo、版本與頁碼索引,並排除入庫狀態影像,回傳符合條件的影像總數。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindFormCodePages(CaseID,FormCode:String):Integer;  //計算案件裡FormID的頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "6278",
+    "rIndex": "6308",
+    "description": "計算案件中特定 FormID 的實際影像總數,可用於檢核。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDataFormCodePages(FormCode:String):Integer;   //取記錄的FormcID的頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [],
+    "lIndex": "6309",
+    "rIndex": "6319",
+    "description": "查詢特定表單 ID 的最大頁數限制,若未設定則回傳 9999。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CaseReSize(CaseID:String); //案件的影像縮放",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "影像處理"
+    ],
+    "deps": [
+      "ImageReSize_FormID",
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "6320",
+    "rIndex": "6342",
+    "description": "對案件執行影像縮放處理。清空舊有的檢核與定位錯誤記錄,隨後遍歷影像清單,對每個檔案執行 ImageReSize_FormID 處理。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ImageScrollBox1NewGraphic(const Graphic: TDibGraphic);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "影像處理"
+    ],
+    "deps": [
+      "TDibGraphic",
+      "ConvertToBW"
+    ],
+    "lIndex": "6447",
+    "rIndex": "6456",
+    "description": "當載入新影像時觸發。將當前 Graphic 內容同步至黑白影像處理元件(ISB_BW),若原始影像非黑白格式則執行 ConvertToBW 轉換。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.TransCaseID(Path,CaseID:String;MainCase:Boolean):Boolean; //傳送案件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "CopyFile",
+      "FindFirst",
+      "_DelTree",
+      "upFile",
+      "SetFtpInfo",
+      "IIS_Ftp",
+      "FtpCaseComplete"
+    ],
+    "lIndex": "6457",
+    "rIndex": "6734",
+    "description": "傳送案件核心程序。包含排序影像、產生描述檔(FormID/DocNo對照、OMR資訊、附件狀態等)、建立 ZIP 壓縮包(含主圖與遮罩)並檢查大小。最後根據 HTTP 或 FTP 模式上傳至伺服器。上傳完成後針對異動模式處理舊件引入,並在最後清理本地暫存目錄。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.NewTreeNodeRefresh;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6735",
+    "rIndex": "6745",
+    "description": "更新樹狀結構根節點文字,顯示總案件筆數與總頁數。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MyTreeNode1Refresh;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6746",
+    "rIndex": "6753",
+    "description": "更新樹狀結構案件層級節點文字,顯示該層下的項目數量。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MyTreeNode2ReFresh(CaseID:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6754",
+    "rIndex": "6763",
+    "description": "重新整理並繪製指定案件的文件層級樹狀結構。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MyTreeNode3ReFresh(CaseID:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6764",
+    "rIndex": "6771",
+    "description": "重新整理並繪製指定案件的表單層級樹狀結構。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Node2DocNo(Node2:TTreeNode):String;  //MyTreeNode2取DocNo出來",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "案件管理(TreeView / 案件操作)"
+    ],
+    "deps": [],
+    "lIndex": "6772",
+    "rIndex": "6785",
+    "description": "從樹狀結構節點 2(文件層)的文字中解析並提取文件編號(DocNo)。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Node3DocNo(Node3:TTreeNode):String;  //MyTreeNode3取DocNo出來",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "案件管理(TreeView / 案件操作)"
+    ],
+    "deps": [],
+    "lIndex": "6786",
+    "rIndex": "6799",
+    "description": "從樹狀結構節點 3(表單層)的父節點文字中提取文件編號(DocNo)。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Node3FormID(Node3:TTreeNode):String;  //MyTreeNode3取FormCode出來",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6800",
+    "rIndex": "6814",
+    "description": "從樹狀結構節點 3(表單層)的文字中解析並提取表單 ID(FormID)。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetNode2Name(Node2:TTreeNode):String;  //取MyTreeNode2的識別字出來(記之前點選用)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "Str2Dir",
+      "SaveToFile",
+      "LoadFromFile",
+      "DeleteDocNoFile",
+      "CopyFile",
+      "DirectoryExists",
+      "En_DecryptionStr_Base64",
+      "dnFile"
+    ],
+    "lIndex": "6815",
+    "rIndex": "6933",
+    "description": "提取文件層級節點的識別名稱字串,用於記錄與恢復節點選取狀態。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DownLoadImage(Path,CaseID:String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "SetFtpInfo",
+      "IIS_Ftp"
+    ],
+    "lIndex": "6934",
+    "rIndex": "6979",
+    "description": "處理影像下載流程。根據案件上傳/下載方式(HTTP 或 FTP),從伺服器下載對應的 ZIP 檔案並解壓縮至本地案件目錄,供後續異動或補件使用。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Down_Img(Path,CaseID:String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "Str2Dir",
+      "En_DecryptionStr_Base64",
+      "dnFile_Get",
+      "dnFile"
+    ],
+    "lIndex": "6980",
+    "rIndex": "7032",
+    "description": "透過 HTTPS 從伺服器下載案件影像。下載 ZIP 檔案(含 img.zip 與 att.zip)後執行本地解壓縮,將主影像與附件部署至指定目錄。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetNoNameCase(Path:String):String; //取未配號XXXX",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "GetNoNameCase",
+      "DirectoryExists"
+    ],
+    "lIndex": "7033",
+    "rIndex": "7046",
+    "description": "在指定的本地路徑中尋找尚未被佔用的「未配號XXXX」目錄名稱。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CaseResort(Path:String); //案件的檔案重新排序(次文件依Docno排)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "FileExists",
+      "RenameFile",
+      "SaveToFile",
+      "ReSortFileName"
+    ],
+    "lIndex": "7047",
+    "rIndex": "7184",
+    "description": "對案件檔案進行實體重新排序。依據文件清單(Doc_Inf_List)的順序,對主文件與次文件進行更名與重新編號,確保檔名序號符合業務邏輯。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CaseResort2Scanlist(Path:String); //案件的檔案重新排序給scanlist(次文件依FormID排)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "RenameFile",
+      "SaveToFile",
+      "ReSortFileName"
+    ],
+    "lIndex": "7185",
+    "rIndex": "7306",
+    "description": "產生依表單代號排序的影像清單(scanlist.dat),用於上傳。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DistinctDocinCase(Path:String); //列出案件裡的Docno_版本",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "LoadFileGetMD5"
+    ],
+    "lIndex": "7307",
+    "rIndex": "7351",
+    "description": "列出案件目錄下所有具備文件編號與版本的唯一組合。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DistinctDocNoinCase(Path:String); //列出案件裡的Docno",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "7352",
+    "rIndex": "7387",
+    "description": "列出案件目錄下所有實際存在的文件編號(DocNo)。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ClearErrini(CaseID:String;CaseNode:TTreeNode); //清掉檢核檔案",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists"
+    ],
+    "lIndex": "7388",
+    "rIndex": "7406",
+    "description": "清除指定案件的所有檢核輔助檔案(如 Checkerr.ini, OMRCheckOk 等),並將樹狀節點恢復為預設的影像索引狀態。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetCaseList(Mode:Char;Index:Integer;text:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "7407",
+    "rIndex": "7445",
+    "description": "維護本地案件清單資料。支援對 CaseList.dat 執行加入、插入、刪除或修改案號操作,確保本地磁碟目錄與資料清單狀態同步。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetDocNoList(Mode:Char;Index:Integer;CaseNo,DocDir,Copies:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "7446",
+    "rIndex": "7516",
+    "description": "維護案件的文件目錄清單(CaseDocNo.dat)與份數清單(CaseDocNo_Copies.dat)。根據 Mode 參數執行「加入 (A)」、「插入 (I)」、「修改 (E)」或「刪除 (D)」操作。刪除時支援透過索引或目錄名稱進行,並會同步更新異動記錄(SetRecordEditedDocDir)。最後將更新後的清單存回檔案。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetContextList(Mode:Char;Index:Integer;CaseNo,DocDir,FileName:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "7517",
+    "rIndex": "7565",
+    "description": "維護特定文件目錄下的影像檔案清單(Context.dat)。支援「加入」、「插入」、「修改」與「刪除」模式。操作前會先從磁碟載入既有的清單,執行變動後再存回,並記錄該文件目錄已被異動。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetAttContextList(Mode:Char;Index:Integer;CaseNo,FileName:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "7566",
+    "rIndex": "7608",
+    "description": "維護案件的附件檔案清單(AttContext.dat)。邏輯與 SetContextList 相似,針對附件目錄進行檔案名稱的「加入」、「插入」、「修改」與「刪除」管理,並將結果持久化至磁碟。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.checkCaseOMRDone:Boolean;  //檢查案件是否完成OMR檢核",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7609",
+    "rIndex": "7623",
+    "description": "檢查當前案件是否已完成 OMR 檢核。遍歷 NewTreeNode 中的所有項目,判斷其 ImageIndex 是否皆為 7(代表已檢核通過的圖示索引),若有任何一項未達成則回傳 False。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.checkFormCodeIsCustom(path, formcode: string): boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7624",
+    "rIndex": "7644",
+    "description": "檢查指定的表單代碼(FormCode)是否為自定義文件。透過讀取 CustomDocNo.ini 設定檔中的 FormID 資訊,比對傳入的代碼是否與設定值一致。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckCaseID_OK:Boolean;  //檢查是否有未配號的案件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7645",
+    "rIndex": "7659",
+    "description": "檢查樹狀結構中是否存在「未配號」的案件。遍歷所有節點,若節點文字包含「未配號」字樣則回傳 False。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckCaseAttach_OK:Boolean;  //檢查是否有未歸類的案件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7660",
+    "rIndex": "7677",
+    "description": "檢查樹狀結構中是否存在「未歸類」的文件。遞迴遍歷案件下的所有子節點,若有任何節點文字包含「未歸類」則回傳 False。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateEmptyCase(Path,CaseID:String);  //產生空白案號(重掃件用)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "SaveToFile"
+    ],
+    "lIndex": "7678",
+    "rIndex": "7691",
+    "description": "產生一個空白的案件結構,主要用於重掃件。建立必要的目錄,並產生初始的 Context.dat 與更新 CaseList.dat。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.InitScrollRec;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7692",
+    "rIndex": "7701",
+    "description": "初始化影像捲軸記錄,將 1 到 8 號影像視窗的水平與垂直捲軸位置重設為 0。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GetScrollData(ISB:TImageScrollBox;Var HS,VS:Integer;Var iRate:Single);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "7702",
+    "rIndex": "7711",
+    "description": "根據傳入的影像捲軸盒(ISB)名稱,從 ScrollRec 陣列中提取其儲存的水平、垂直捲軸位置及縮放比例。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetScrollData(ISB:TImageScrollBox;HS,VS:Integer;iRate:Single);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "7712",
+    "rIndex": "7721",
+    "description": "將指定的水平、垂直捲軸位置與縮放比例存入對應影像視窗索引的 ScrollRec 記錄中。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FormIDReplace(CaseID,DocDir,OldFormID,NewFormID:String); //指定FormID更換成新的FormID",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "DirectoryExists",
+      "CopyFile",
+      "RenameFile",
+      "SaveToFile"
+    ],
+    "lIndex": "7722",
+    "rIndex": "7840",
+    "description": "將指定文件中的舊表單代碼替換為新代碼。首先決定目標目錄(考慮是否分份數、補件狀況),若目標目錄不存在則建立。接著將符合舊代碼的檔案複製到新目錄下並重新命名(產生新序號),同時更新新目錄的 Context.dat 與清單。最後刪除原目錄中的舊代碼檔案。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ShowFileReplace(Path,NewFormID:String);//顯示的影像換成新的FormID",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "RenameFile"
+    ],
+    "lIndex": "7841",
+    "rIndex": "7856",
+    "description": "將當前顯示清單(NowShowFileList)中的檔案更名為新的表單代碼。遍歷檔案,保留原序號但替換 FormID 部分,執行實體更名並同步更新全域的 ContextList 記錄。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PageReplaceFormID(Path,NowFormID,NewFormID:String); //選取頁更換FormID",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "RenameFile",
+      "SaveToFile"
+    ],
+    "lIndex": "7857",
+    "rIndex": "7906",
+    "description": "針對影像列表(PageLV)中選取的頁面進行表單代碼更換。先過濾出符合條件的檔案,再對選取項執行實體檔案更名(更新 FormID 部分),最後同步更新 Context.dat 檔案內容。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ModeNeedCheck(OMRMode,ScanMode:String):Boolean; //掃瞄模式是否要做檢核",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7907",
+    "rIndex": "7913",
+    "description": "判斷目前的掃瞄模式是否需要執行 OMR 檢核。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCasePage(Path,CaseID:String):Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "7914",
+    "rIndex": "7984",
+    "description": "計算案件的總影像頁數。遍歷案件下所有的文件目錄(CaseDocNo.dat),讀取每個目錄的 Context.dat 並累加檔案數量。過程中會考慮入庫/非入庫文件的權限與顯示過濾條件,最後也包含附件目錄的計數。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFormIDPage(FileList:TStringlist;FormID:String):Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7985",
+    "rIndex": "7999",
+    "description": "在指定的檔案清單中,計算符合特定表單代碼(FormID)的影像頁數。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetFile2Case(CaseID,FileName:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "8000",
+    "rIndex": "8013",
+    "description": "將指定的檔案名稱加入到案件的主 Context.dat 清單中。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.WriteResize(ImgName,TxtName:String); //產生Resize.dat",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "FileExists",
+      "SaveToFile"
+    ],
+    "lIndex": "8014",
+    "rIndex": "8056",
+    "description": "產生影像縮放記錄檔(Resize.dat)。載入影像後比對原始標記(Tag)中的長寬資訊與實際 Graphic 的長寬,若有變動則將差異記錄至文字檔中。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCase_PageCount(var CaseCount,PageCount:Integer):Boolean; //取出案件的數量及頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "8057",
+    "rIndex": "8134",
+    "description": "獲取所有案件的總數量與總頁數。讀取 CaseList.dat 取得案件清單,逐一計算各案件目錄與附件目錄下的影像檔案數。針對非入庫且當次掃瞄的特殊情況,會額外檢查 EditedDocDir.dat 以精確計算實際變動的頁數。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindNoSaveBarCode : Boolean; //找是否有不要儲存影像的條碼",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8135",
+    "rIndex": "8154",
+    "description": "檢查目前的條碼資訊中是否包含被標記為「不儲存影像」的條碼。遍歷所有辨識到的條碼,並與排除清單(NoSaveBarCodeList)進行比對,若匹配則回傳 True。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.WriteCaseIndex(Path:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "SaveToFile"
+    ],
+    "lIndex": "8196",
+    "rIndex": "8213",
+    "description": "將案件的信用註記狀態(Case_loandoc)寫入到指定路徑下的 CaseIndex.dat 檔案中。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReadCaseIndex(Path:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "8214",
+    "rIndex": "8242",
+    "description": "從磁碟讀取案件索引檔(CaseIndex.dat)。載入信用註記狀態,並據此更新畫面上 AddCredit1RG 選項組的選取狀態(Y 設為第一項,N 設為第二項)。若檔案不存在但有預設值,則自動建立檔案。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ReduceLogFile; //20171011 必免log檔掌太大",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "8243",
+    "rIndex": "8263",
+    "description": "防止日誌檔案過大。檢查 IMGPSCheck.log,若行數超過 100,000 行,則自動刪除最前面的 10,000 行記錄並重新存檔。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ClearCaseIndex;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8264",
+    "rIndex": "8269",
+    "description": "重設案件索引相關的 UI 狀態,將信用註記選項設為不可用且取消選取。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GetSelectImageFile;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8270",
+    "rIndex": "8290",
+    "description": "取得當前所有被選取的影像檔案路徑。遍歷畫面上的 TShape 元件(選取框),透過名稱關聯找到對應的影像捲軸盒(ISB),並將其載入的檔名加入到 NowSelectFileList 清單中。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNoDir(Path,DocNo:String):String; //取出目前DocNo的份數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "DirectoryExists"
+    ],
+    "lIndex": "8291",
+    "rIndex": "8312",
+    "description": "根據文件編號產生下一個可用的目錄名稱(用於區分份數)。若文件編號不為空,會遞增序號並檢查磁碟目錄是否存在,直到找到未使用的名稱(格式如 DocNo_1);若編號為空則回傳附件目錄名稱。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckFormIDExists(DocNoNode:TTreeNode;FormID:String):Boolean; //檢查FormID是否存在文件裡",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8313",
+    "rIndex": "8327",
+    "description": "檢查特定的表單代碼(FormID)是否已經存在於樹狀結構中指定文件的子節點中。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2DocNoDir(Path,DocNo:String):String;    //DocNo轉成DocNo(份數)目錄",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "DirectoryExists"
+    ],
+    "lIndex": "8328",
+    "rIndex": "8349",
+    "description": "類似 GetDocNoDir,但產生的目錄名稱格式為 DocNo(1)。透過循環檢查目錄是否存在,自動產生下一個可用的份數目錄名稱。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoDir2DocNo(DocNoDir:String):String; //DocNo(份數)目錄轉成DocNo",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8350",
+    "rIndex": "8365",
+    "description": "將包含份數括號的目錄名稱(如 A001(2))還原為原始的文件編號(如 A001)。排除附件目錄後,尋找左括號的位置並擷取前面的字串。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoDir2Index(Path,DocNoDir:String):Integer; //DocNo(份數)目錄轉成index",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "8366",
+    "rIndex": "8387",
+    "description": "將文件目錄名稱轉換為其在 CaseDocNo.dat 清單中的索引位置。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ParserPoint(S:String); //解析十字點的字串",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8495",
+    "rIndex": "8525",
+    "description": "解析代表影像十字點座標的字串。將包含四個端點(左上、左下、右上、右下)座標及長寬資訊的字串拆解,並轉換為 TPoint 結構存入全域變數中,若字串格式不符則全部重設為 (0,0)。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckScanDenialTime:Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8526",
+    "rIndex": "8539",
+    "description": "檢查目前時間是否已超過系統設定的「禁止掃瞄時間」。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormID2Anchor(FormID:String):String;  //用FormID取出十字模式",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8540",
+    "rIndex": "8551",
+    "description": "根據表單代碼(FormID)從 FORM_INF_List 中查詢對應的定位模式(ANCHOR 模式),並回傳轉換後的模式字串(NONE/ANCHOR/FRAME)。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Index2Anchor(Anchor:String):String;   //十字模式 0->NONE;1->ANCHOR;2->FRAME",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8552",
+    "rIndex": "8561",
+    "description": "將數值型的定位模式索引(0, 1, 2)轉換為易讀的模式名稱字串。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScanDuplexCBClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8562",
+    "rIndex": "8567",
+    "description": "處理雙面掃瞄勾選框點擊事件,同步更新全域的 ScanDuplex 變數。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScanGrayCBClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "ifGray256",
+      "ifBlackWhite",
+      "ifTrueColor"
+    ],
+    "lIndex": "8568",
+    "rIndex": "8596",
+    "description": "根據掃瞄勾選框狀態,設定掃瞄色彩模式(灰階、全彩或黑白)。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFormatID(CaseID: string):String;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "8597",
+    "rIndex": "8620",
+    "description": "從案件索引檔(CaseIndex.dat)中獲取案件的 FormatID(主鍵值)。目前實作為存根,包含讀取邏輯但未回傳特定欄位。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.MemoInfoTransfer(Mode,Str:String;ID_S,Name_S:TStringlist):String;  //註記代碼註記類別轉換  Mode 'ID':代碼轉名稱;'NAME':名稱轉代碼",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8621",
+    "rIndex": "8650",
+    "description": "註記代碼與類別名稱的轉換函數。支援「代碼轉名稱」或「名稱轉代碼」兩種模式,若無匹配代碼則預設為「自行輸入」。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFindResult(Col:String):String;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8803",
+    "rIndex": "8820",
+    "description": "從資料查詢結果(FindResult)中,根據指定的欄位名稱(Col)提取對應的值。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DataLoading(Loading:Boolean;UseTimer:Boolean);  //資料載入中要停止點選的動作",
+    "tags": [
+      "UIView",
+      "UIView.statusMessenger"
+    ],
+    "deps": [],
+    "lIndex": "8821",
+    "rIndex": "8855",
+    "description": "控制資料載入時的 UI 狀態。啟用載入時會切換滑鼠游標為等待狀態、顯示提示面板(Panel22 或 Panel8),並禁用主要的操作面板(Panel1/Panel2);關閉時則恢復正常狀態。支援使用計時器(Timer2)來顯示動態提示。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CaseHelpBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "8856",
+    "rIndex": "8926",
+    "description": "處理檢核失敗(補件/更正)按鈕點擊。開啟 TErrlistForm 顯示 OMR 檢核錯誤清單供使用者操作。若使用者完成更正並按確定,則會根據目前模式(ISCAN/NSCAN 等)將更新後的影像資料上傳至伺服器,並在完成後重新載入影像、提示使用者。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CheckCaseBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [
+      "SaveToFile"
+    ],
+    "lIndex": "8927",
+    "rIndex": "8965",
+    "description": "執行所有案件的批次檢核。遍歷 NewTreeNode 下的所有案件,對尚未檢核通過(ImageIndex 不為 7 或 5)的案件呼叫 OMRCheckCase 進行檢核。若檢核成功則建立 OMRCheckOk.dat 標記檔。最後刷新影像與樹狀顯示。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ClearView(stkv:Integer);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8966",
+    "rIndex": "8981",
+    "description": "清空指定的影像顯示區域。將索引從 stkv 到 8 的 TImageScrollBox 檔名重設為空,並清空對應的標籤文字,最後釋放預覽資源並將焦點設回 ISB1。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DrawDocItem2(CaseNode : TTreenode;Caseno:String):Boolean;  //畫出文件名稱的Tree",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "DirectoryExists"
+    ],
+    "lIndex": "8982",
+    "rIndex": "9241",
+    "description": "在樹狀結構中繪製指定案件的文件與表單節點。讀取 CaseDocNo.dat 取得文件清單,逐一建立文件節點並根據引用狀態設定圖示。接著在文件節點下建立表單節點,區分制式表單與自定義表單。包含入庫過濾與附件處理,是樹狀 UI 呈現的核心。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.initParameter;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "ifBlackWhite",
+      "ifGray256",
+      "ifTrueColor"
+    ],
+    "lIndex": "9263",
+    "rIndex": "9304",
+    "description": "初始化掃瞄相關參數。設定檔案大小限制(預設 5MB)、DPI(預設 300)以及掃瞄顏色模式(黑白、灰階、全彩),並同步更新 UI 狀態(如 ScanGrayCB)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PrtLbClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "9305",
+    "rIndex": "9375",
+    "description": "處理「列印」按鈕點擊。首先產生上傳用的暫存影像結構,接著開啟 TPrintForm 供使用者勾選欲列印的文件。確認後呼叫 PrintImg 進行實體列印,並記錄操作日誌。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.UseOldCaseLbClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "DirectoryExists",
+      "CopyFile",
+      "SaveToFile"
+    ],
+    "lIndex": "9376",
+    "rIndex": "9529",
+    "description": "處理「使用舊件」功能。開啟 TOldCaseInfoForm 讓使用者選擇舊有案件的文件。選定後,將舊件影像複製到新案件目錄下,自動產生新序號檔名,建立關聯記錄(UseCase.dat),並同步更新新案件的文件清單與樹狀統計。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LastInitFormidListCreate(path: string);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "9530",
+    "rIndex": "9550",
+    "description": "從 FormCode_Name.dat 檔案中提取表單代碼(底線前的部分),並將其加入到 LastInitFormidList 清單中。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LoadImgFile;  //載入新件及替換件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "9575",
+    "rIndex": "9660",
+    "description": "載入當前所有的影像案件至樹狀結構。清空舊有節點後,讀取 CaseList.dat,為每個案件建立父節點,並呼叫 DrawDocItem2 繪製子文件與表單。同時會根據 OMR 檢核狀態設定對應的案件圖示。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LoadImgFile1;  //載入新件及替換件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "9661",
+    "rIndex": "9770",
+    "description": "載入影像檔案的另一種實作版本。包含更細緻的 Context_DocNo.dat 管理,若檔案不存在會自動掃描 ContextList 並根據 FormCode 產生對應的文件編號記錄。主要用於特定的資料結構載入。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LoadAttFile(CaseID:String); //載入附加檔案",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "9771",
+    "rIndex": "9791",
+    "description": "載入指定案件的附件檔案。讀取 AttContext.dat,將附件檔名解碼後加入到 AttListBox 列表中。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.logTimeString: String;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9792",
+    "rIndex": "9796",
+    "description": "產生帶有當前日期時間與案件編號的日誌前綴字串。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindDivFormCode(FormCode:String):Boolean; //找有沒有分案的條碼",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9797",
+    "rIndex": "9824",
+    "description": "檢查特定的表單代碼是否具有「分案」屬性。從 FORM_INF_List 中查詢該表單的 DIVISION 欄位,判斷是否包含目前的作業模式(如 NSCAN/ISCAN)。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckAvailable:Boolean; //檢查是否可使用元件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "dnFile_Get",
+      "dnFile",
+      "upFile"
+    ],
+    "lIndex": "9825",
+    "rIndex": "9922",
+    "description": "檢查元件的使用授權。透過 HTTPS 下載掃瞄授權檔,並驗證 MacID、註冊數量與使用期限。若尚未註冊且仍有額度,則自動進行註冊並上傳新的授權檔至伺服器。最後在狀態列顯示註冊資訊。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SmoothCBClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "Image_Smooth"
+    ],
+    "lIndex": "9923",
+    "rIndex": "9931",
+    "description": "處理「影像平滑化」勾選框。若勾選,則對 ISB1 的影像執行平滑化處理並重新繪製。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Case2Mask(SoPath,DePath:String):Boolean;//產生遮罩影像  20170639 發現沒用到",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "影像處理"
+    ],
+    "deps": [
+      "FindPoint",
+      "DirectoryExists",
+      "_DelTree",
+      "Str2Dir",
+      "LoadFromFile",
+      "FileExists"
+    ],
+    "lIndex": "9932",
+    "rIndex": "9995",
+    "description": "產生案件的遮罩影像(用於遮蔽敏感個資)。讀取 Context.dat,針對每張影像尋找定位點,並依據對應表單的 XML 定義執行區域遮罩,最後存入指定目錄。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetNewCustomDocNo(Path,DocName:String):String; //取出未使用的自訂文件代號",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "自訂文件"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "10022",
+    "rIndex": "10086",
+    "description": "產生一個全新的自定義文件編號。讀取 CustomDocNo.ini 中的計數器,根據入庫/非入庫性質產生 ZZZZZ 或 YYYYY 開頭的編號,並預設其內部的第一個表單代碼,最後將新設定寫回 INI 檔。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomDocName(Path,DocNo:String):String; //取出自定文件名稱",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "自訂文件"
+    ],
+    "deps": [],
+    "lIndex": "10087",
+    "rIndex": "10098",
+    "description": "從 CustomDocNo.ini 中讀取指定自定義文件編號對應的顯示名稱。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomFormID(Path,DocNo:String):String; //取出自定文件FormID",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "自訂文件"
+    ],
+    "deps": [],
+    "lIndex": "10099",
+    "rIndex": "10110",
+    "description": "從 CustomDocNo.ini 中讀取指定自定義文件編號對應的表單代碼(FormID)。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomDocDir(Path,DocName:String):String; //取出自定文件DocDir",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "自訂文件"
+    ],
+    "deps": [],
+    "lIndex": "10111",
+    "rIndex": "10137",
+    "description": "根據自定義文件名稱尋找對應的目錄代號(如 ZZZZZ001)。遍歷 CustomDocNo.ini 中的所有區段,讀取 Name 欄位進行比對,成功則回傳該編號。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindCustomDocName(Path,DocName:String):Boolean; //尋找自定文件名稱是否存在",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "自訂文件"
+    ],
+    "deps": [],
+    "lIndex": "10138",
+    "rIndex": "10161",
+    "description": "檢查指定的自定義文件名稱是否已存在於 CustomDocNo.ini 設定檔中。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DelAttFileLBClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10162",
+    "rIndex": "10196",
+    "description": "處理「刪除附件電子檔」點擊。確認使用者選取的檔案後,從磁碟刪除實體檔案並呼叫 SetAttContextList 移除清單記錄。完成後重新載入附件清單並提示。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteCustomDocDir(Path,DocNo:String); //刪除自定文件DocNo",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "檔案操作"
+    ],
+    "deps": [],
+    "lIndex": "10197",
+    "rIndex": "10208",
+    "description": "從 CustomDocNo.ini 中刪除指定的自定義文件區段。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckFormID_Prt(FormID:String):Boolean; //傳入的FormID是否預設列印",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10209",
+    "rIndex": "10218",
+    "description": "查詢指定表單(FormID)是否被設定為預設列印。透過 FORM_INF_List 檢核 IS_PRINT 欄位是否為 'Y'。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PrintImg(FileName, LoginID, Datetime,",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "TDibGraphic"
+    ],
+    "lIndex": "10219",
+    "rIndex": "10297",
+    "description": "執行影像列印的核心程序。開啟列印對話框供選擇印表機,隨後遍歷檔案清單,逐一載入影像、套用浮水印後發送至印表機。支援多頁列印於同一個任務或分頁處理。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindLastestDocDir(CaseID,DocNo:String):String; //找出最新的DocDir",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "10298",
+    "rIndex": "10322",
+    "description": "針對指定的文件編號,從 CaseDocNo.dat 中反向尋找最新的份數目錄名稱(例如 A001(2))。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindLastestDocDirForPage(CaseID,DocNo,formid:String):String; //找出最新的DocDir  20180207  排除隱藏的資料夾",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "10323",
+    "rIndex": "10364",
+    "description": "類似 FindLastestDocDir,但額外呼叫 DocNoIsExistImg 確保該目錄下確實存在影像檔案,若為空目錄則不視為有效結果。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.Create_Cust_DocDir(CaseID:String); //產生外面傳入的文件代號及自定文件",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "自訂文件"
+    ],
+    "deps": [
+      "DirectoryExists"
+    ],
+    "lIndex": "10365",
+    "rIndex": "10455",
+    "description": "根據外部傳入的清單(FC_DocNoList 或 FC_DocNameList)預先產生案件所需的文件目錄。會自動處理分份文件的命名、檢查是否已存在,並在 CustomDocNo.ini 中註冊新名稱。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetRecordEditedDocDir(Mode:Char;CaseID,DocDir:String);  //記錄被異動的文件目錄  'A:加入D:刪掉'",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "舊案/異動件處理"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "10575",
+    "rIndex": "10622",
+    "description": "記錄案件中曾被異動(新增或刪除)的文件目錄。將目錄名稱存入 EditedDocDir.dat,以便後續判斷哪些內容需要同步上傳或重新計算。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocDir_Page(CaseID,DocDir:String):Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "10623",
+    "rIndex": "10639",
+    "description": "取得特定文件目錄下的影像總頁數。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Path2DocDir(Path,CaseID:String):String;",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "10640",
+    "rIndex": "10664",
+    "description": "將實體路徑轉換為案件內的文件目錄名稱。透過比對路徑字串與 CaseDocNo.dat 中的清單來識別對應的目錄。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNo_IS_WH(DocNo:String):Boolean; //DocNo是否為入庫文件",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "入庫文件/可見性"
+    ],
+    "deps": [],
+    "lIndex": "10665",
+    "rIndex": "10679",
+    "description": "判斷指定文件編號是否屬於「入庫文件」類別。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SortDocDir_FormID(CaseID,DocDir:String); //將DocDir裡的文件編號排序",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "RenameFile",
+      "SaveToFile"
+    ],
+    "lIndex": "10680",
+    "rIndex": "10752",
+    "description": "對文件目錄內的影像檔案依表單代碼(FormID)進行重新排序。先提取所有檔案的 FormID 並排序,依序產生新檔名進行更名,最後更新 Context.dat 檔案順序。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GotoAttach(OldLevel:Integer);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10753",
+    "rIndex": "10774",
+    "description": "將樹狀結構的焦點跳轉至案件的附件節點。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoIs_In_WH(DocNo:String):Boolean; //DocNo是否為入庫文件",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "入庫文件/可見性"
+    ],
+    "deps": [],
+    "lIndex": "10775",
+    "rIndex": "10794",
+    "description": "判斷指定文件編號(包含自定義 ZZZZZ 系列)是否為入庫文件。"
+  },
+  {
+    "matcher": "Procedure  TCB_IMGPSScanX.CreateCaseNeedData(Path:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "上傳前置資料產生"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "10795",
+    "rIndex": "10840",
+    "description": "掃描案件目錄下的 Context.dat 影像清單,自動推導並產生該案件所需的 DocDir.dat、CaseDocNo.dat 及份數清單,用於修復或重建案件結構。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetDocDirtoSelected(CaseNode:TTreeNode;DocDir:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10841",
+    "rIndex": "10853",
+    "description": "在樹狀結構中自動選取符合指定目錄名稱的節點。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckSelectImg_UseCase(Path,CaseID:String):Boolean; //檢查選擇的影像是否有包含被引用的影像",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10854",
+    "rIndex": "10876",
+    "description": "檢查當前選取的影像所在的文件目錄是否已被其他程序引用(UseKey 標記為 'T')。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.TransOldCaseFile(Path:String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "FileExists",
+      "upFile"
+    ],
+    "lIndex": "10877",
+    "rIndex": "10937",
+    "description": "處理舊件引用的檔案傳送。遍歷舊件清單,若發現有引用記錄,則透過 HTTPS 將引用資訊上傳至伺服器,並處理伺服器回傳狀態。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Writelog(CaseID : String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "API 呼叫相關"
+    ],
+    "deps": [],
+    "lIndex": "10938",
+    "rIndex": "10963",
+    "description": "透過 ProcessServlet 向伺服器發送列印日誌記錄。傳送案件編號與 FData 等參數,並檢查伺服器回傳是否成功或 Session 是否失效。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormIDAppear(FormID:String):Boolean; //FormID是否可出現",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "入庫文件/可見性"
+    ],
+    "deps": [],
+    "lIndex": "11095",
+    "rIndex": "11120",
+    "description": "判斷特定的表單代碼(FormID)是否符合目前入庫/非入庫作業模式的顯示規則。主要過濾掉不屬於當前作業範疇的文件。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoAppear(DocNo:String):Boolean;   //DocNo是否可出現",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "入庫文件/可見性"
+    ],
+    "deps": [],
+    "lIndex": "11121",
+    "rIndex": "11137",
+    "description": "判斷文件編號(DocNo)是否應在介面上顯示。包含針對附件與入庫屬性的互斥過濾。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNoCount(CaseID,DocNo:String):Integer; //取DocNo數量",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "11138",
+    "rIndex": "11167",
+    "description": "統計指定案件中某文件編號(DocNo)的總份數。讀取 CaseDocNo.dat 與 CaseDocNo_Copies.dat 並累加匹配項目的份數值。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocDirCopies(CaseID,DocDir:String):Integer; //取DocDir數量",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "11168",
+    "rIndex": "11197",
+    "description": "取得特定文件目錄(DocDir)目前的份數設定。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetDocDirCopies(CaseID,DocDir:String;NewCopies:Integer); //修改DocDir份數",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "11198",
+    "rIndex": "11225",
+    "description": "修改並儲存特定文件目錄的份數設定至 CaseDocNo_Copies.dat。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocDirCopies_Rec(Path,CaseID,DocDir:String):Integer; //取記錄裡的DocDir份數",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [],
+    "lIndex": "11226",
+    "rIndex": "11277",
+    "description": "從 FOldCaseInfo 記錄字串中解析並取得特定文件目錄在舊案中的份數。支援自定義文件名稱與一般文件編號的匹配。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomNameCount(CustomName:String):Integer;   //取外傳的名稱數量",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "自訂文件"
+    ],
+    "deps": [],
+    "lIndex": "11278",
+    "rIndex": "11301",
+    "description": "統計外部傳入清單中,特定自定義文件名稱出現的次數。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomDocNoCount(Docno:String):Integer;   //取外傳的DocNo數量",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "自訂文件"
+    ],
+    "deps": [],
+    "lIndex": "11302",
+    "rIndex": "11325",
+    "description": "統計外部傳入清單中,特定文件編號(DocNo)出現的次數。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ISGuideFormID(FormID:String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "入庫文件/可見性"
+    ],
+    "deps": [],
+    "lIndex": "11326",
+    "rIndex": "11340",
+    "description": "檢查指定的表單代碼是否屬於「引導頁(Guide Page)」清單。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ISDivPageFormID(FormID:String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "入庫文件/可見性"
+    ],
+    "deps": [],
+    "lIndex": "11341",
+    "rIndex": "11356",
+    "description": "檢查指定的表單代碼是否屬於「分案頁(Division Page)」清單。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.ISExistImg(const filename: string): boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFileGetMD5"
+    ],
+    "lIndex": "11357",
+    "rIndex": "11368",
+    "description": "透過 MD5 雜湊值比對,檢查指定的影像檔案是否已存在於 ExistImgList 清單中。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseDelete_Enable(CaseID:String):Boolean;  //案件可否被刪除",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "案件管理(TreeView / 案件操作)"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "11369",
+    "rIndex": "11389",
+    "description": "判斷案件是否允許刪除。若案件下有任何文件目錄已被其他程序引用,則禁止刪除。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MoveImage(Path:String;mp:Integer); //移動頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "RenameFile",
+      "SaveToFile",
+      "ReSortFileName"
+    ],
+    "lIndex": "11390",
+    "rIndex": "11447",
+    "description": "執行影像頁面的位置移動。先對目錄下所有檔案進行臨時更名(加上 @ 標記),根據選取狀態重新排列清單順序,最後更新 Context.dat 並重新排序實體檔案。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MoveImage_Drag(Path:String;fp,tp:Integer); //拖拉移動頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "RenameFile",
+      "SaveToFile",
+      "ReSortFileName"
+    ],
+    "lIndex": "11448",
+    "rIndex": "11505",
+    "description": "處理影像拖拉移動。邏輯與 MoveImage 相似,但針對單一來源索引移動至目標索引的情境進行排列。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.Case2upload(CaseID:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "上傳前置資料產生"
+    ],
+    "deps": [
+      "DirectoryExists",
+      "_DelTree",
+      "Str2Dir",
+      "CopyFile",
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "11547",
+    "rIndex": "11672",
+    "description": "準備案件上傳用的資料夾結構。將分散在各文件子目錄下的影像檔案複製到單一的 Upload 目錄下並重新編號檔名,同時產生彙整後的索引檔與附件。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.Download2Case(SoDir,DeDir:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "上傳前置資料產生"
+    ],
+    "deps": [
+      "FileExists",
+      "CopyFile",
+      "LoadFromFile",
+      "DirectoryExists",
+      "SaveToFile"
+    ],
+    "lIndex": "11673",
+    "rIndex": "11844",
+    "description": "將下載或匯入的案件結構還原回本系統的多層級目錄結構。包含建立文件子目錄、檔案複製並重新編號、以及重建各類索引與份數設定檔。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2FormName(CaseID,FormCode:String):String; //用FormCode轉成文件名稱",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "11845",
+    "rIndex": "11895",
+    "description": "將表單代碼轉換為易讀的文件名稱。優先查詢系統定義表,若無則至自定義文件清單中搜尋。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2FileName(FormCode:String;List:TStrings):String; //用FormCode找出檔名(第一頁)",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "11896",
+    "rIndex": "11918",
+    "description": "在指定的檔案清單中,根據表單代碼尋找其對應的第一個影像檔名。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2FormCode(FileName:String):String; //從檔名取出FormCode",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "11919",
+    "rIndex": "11935",
+    "description": "從影像檔名中提取表單代碼(底線與點號之間的部分)。若檔名格式不符則視為附件並回傳空字串。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2FormName(CaseID,FileName:String):String; //從檔名取出文件名稱",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "11936",
+    "rIndex": "11940",
+    "description": "根據案件編號與檔案名稱,先取得表單代碼,再轉換為對應的表單名稱。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2ScanPage(FileName:String):Integer; //從檔名轉出掃瞄頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "11941",
+    "rIndex": "11952",
+    "description": "從檔案名稱中提取掃描頁碼。透過尋找底線或點號的位置,截取檔名前段並轉換為整數。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2NoQuene_Filename(FileName:String):String; //取出沒有序號的檔名",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "11953",
+    "rIndex": "11965",
+    "description": "從檔案名稱中移除序號部分,僅保留從底線或點號開始的剩餘檔名結構。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2Index(FileName:String):Integer; //從檔名取出在ContextList的序號",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "11966",
+    "rIndex": "11979",
+    "description": "在 ContextList 清單中搜尋指定的檔案名稱,並回傳其所在的索引位置。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2NowDcoNo(FileName:String;CtList,DNList:TStrings):String; //從檔名取出歸屬的文件代號",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "11980",
+    "rIndex": "11993",
+    "description": "從檔案名稱對應的 CTList 中尋找索引,並從 DNList 取得其歸屬的文件代號。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2Version(FormCode:String):String; //FormCode轉版本",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "12019",
+    "rIndex": "12023",
+    "description": "從表單代碼(FormCode)的特定位置(第 11 位開始取 5 位)提取版本資訊。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2Page(FormCode:String):String; //FormCode轉頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "12024",
+    "rIndex": "12028",
+    "description": "從表單代碼(FormCode)的特定位置(第 9 位開始取 2 位)提取頁數資訊。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2FileName(DocNo:String;List:TStrings):String; //用DocNo找出檔名(第一頁)",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "12067",
+    "rIndex": "12081",
+    "description": "根據文件代號,在指定的檔案清單中搜尋並回傳該文件第一頁的檔案名稱。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2WorkNo(FormCode:String):String; //用FormCode取出作業別",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "12082",
+    "rIndex": "12090",
+    "description": "透過 FORM_INF_List 查詢表單代碼對應的作業別(WORK_NO)。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2WorkNo(DocNo:String):String; //用DocNo取出作業別",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "12091",
+    "rIndex": "12099",
+    "description": "透過 Doc_Inf_List 查詢文件代號對應的作業別(WORK_NO)。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseNode2Info(Node:TTreeNode;Mode:Char):String;   //案件Node取案件編號  Mode: I:Caseno;P:Page",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "12113",
+    "rIndex": "12126",
+    "description": "從樹狀結構的案件節點文字中,根據指定的模式提取案件編號或案件頁數。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNode2Info(Node:TTreeNode;Mode:Char):String;   //文件Node取文件代號 Mode: I:Docno;N:Docname;P:Page;G:Group",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "12127",
+    "rIndex": "12144",
+    "description": "從樹狀結構的文件節點文字中提取詳細資訊。節點文字格式預期為「文件名稱@組數{文件代號}-XX頁」。此函式會根據傳入的模式(Mode),利用分隔符號(@, {, }, -)定位並截取回傳文件代號(I)、文件名稱(N)、文件頁碼(P)或文件組別(G)。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormNode2Info(Node:TTreeNode;Mode:Char):String;   //表單Node取表單代號  Mode: I:FormID;N:FormName;P:Page",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "轉換區(名稱/格式轉換)"
+    ],
+    "deps": [],
+    "lIndex": "12145",
+    "rIndex": "12160",
+    "description": "從樹狀結構的表單節點文字中提取資訊。節點文字格式預期為「表單代號{表單名稱}-XX頁」。根據模式(Mode)參數,解析並回傳表單代號(I)、表單名稱(N)或頁碼(P)。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PriorPage(Page:Integer); //上一頁",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [],
+    "lIndex": "12161",
+    "rIndex": "12171",
+    "description": "跳轉至上一頁影像。根據當前頁碼尋找前一個影像捲軸盒組件(ISB),若存在則觸發其點擊事件。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.NextPage(Page:Integer); //下一頁",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [],
+    "lIndex": "12172",
+    "rIndex": "12182",
+    "description": "跳轉至下一頁影像。根據當前頁碼尋找下一個影像捲軸盒組件(ISB),若存在則觸發其點擊事件。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoExistsinTree(CaseNode:TTreeNode;DocNo:String):Boolean; //是否己存在樹裡",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "案件管理(TreeView / 案件操作)"
+    ],
+    "deps": [],
+    "lIndex": "12183",
+    "rIndex": "12198",
+    "description": "檢查指定的案件節點下,是否已經存在具備該文件代號(DocNo)的子節點。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocnoNeedGroup(DocNo:String):Boolean; //傳入的DocNo是否需分組",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "案件管理(TreeView / 案件操作)"
+    ],
+    "deps": [],
+    "lIndex": "12199",
+    "rIndex": "12208",
+    "description": "查詢 Doc_Inf_List 判斷傳入的文件代號是否需要進行文件分組(IS_DOC_DIV = \"Y\")。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DistinctFormCode(CaseID:String); //從案件裡的FormCode取出第一頁",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "OMR 檢核"
+    ],
+    "deps": [
+      "LoadFromFile",
+      "LoadFileGetMD5"
+    ],
+    "lIndex": "12209",
+    "rIndex": "12254",
+    "description": "從案件的 Context.dat 檔案中提取不重複的表單代碼(FormCode)並存入 OMRFileList。程序會遍歷上傳目錄下的所有檔案,檢查檔案是否存在且未被處理過。接著比對 OMRFileList 中已有的表單代碼,若為新出現的表單代碼且檔案有效,則將其加入清單中,用於後續 OMR 處理。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.OMRErrini2List(CaseID:String;ErrlistForm:TErrlistForm); //OMR檢核失敗從ini寫入ListView",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.ormRuleEngine",
+      "UIView",
+      "UIView.listView",
+      "OMR 檢核"
+    ],
+    "deps": [],
+    "lIndex": "12991",
+    "rIndex": "13020",
+    "description": "將 OMR 檢核失敗的記錄從 Checkerr.ini 讀取並顯示在 ListView 中。程序會開啟指定案件目錄下的設定檔,讀取錯誤總數後逐一檢查每筆記錄是否已被移除(Del 標記)。若記錄有效,則將錯誤原因及索引值新增至傳入的 ErrlistForm 中的 ErrListLV 列表。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DownLanguage:Boolean;  //下載多國語言檔",
+    "tags": [
+      "UIView",
+      "UIView.i18n",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "dnFile",
+      "dnFile_Get"
+    ],
+    "lIndex": "13059",
+    "rIndex": "13083",
+    "description": "從伺服器下載多國語言設定檔 Language.Lng。使用 HTTPS 客戶端執行 GET 請求,下載至本地語系路徑。下載後會檢查回傳內容,驗證是否發生錯誤、伺服器回傳錯誤訊息,或是因為閒置過久導致 Session 過期被導向登入頁面,並設定對應的錯誤字串。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.view_image_FormCode(Path,FormCode:String;stpage,stview:integer); //用FormCode來找影像",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "13084",
+    "rIndex": "13199",
+    "description": "根據表單代碼(FormCode)顯示對應的影像。支援顯示全部影像(ShowAll)或指定表單的影像。若是顯示全部,會重置視窗並建立縮圖;若指定特定表單,則遍歷 ContextList 尋找匹配的檔案,載入至影像捲軸盒(ISB),並設定縮放模式(zmFittoPage 或指定百分比)與捲軸位置,最後更新頁碼標籤資訊。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.view_image_DocNo(Path,DocNo,FormID:String;Pages:integer); //用DocNo來找影像",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [
+      "DpiResize",
+      "FileExists",
+      "LoadFromFile",
+      "DirectoryExists"
+    ],
+    "lIndex": "13200",
+    "rIndex": "13394",
+    "description": "根據文件代號(DocNo)或表單代號(FormID)顯示影像。函式包含三種模式:顯示案件內所有影像(ShowAll)、顯示指定文件夾(如 Attach)下的影像,以及顯示指定文件代號下特定表單的影像。處理過程中會檢查在席狀態(In_WH)、執行影像 DPI 調整、建立縮圖預覽視窗,並逐一載入檔案至對應的 ISB 元件中,最後自動點擊首張影像以進行預覽。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ShapeName2PreViewISBName(SP:TShape):String; //轉出指定PreViewISBName",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [],
+    "lIndex": "13395",
+    "rIndex": "13399",
+    "description": "將 TShape 元件的名稱轉換為對應的預覽影像捲軸盒(PreViewISB)名稱。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton14Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [
+      "Rotate",
+      "TJpegGraphic",
+      "SaveQuality",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "13400",
+    "rIndex": "13422",
+    "description": "處理工具列按鈕點擊,執行影像逆時針旋轉 90 度(即旋轉 270 度)。程序會重新載入影像、執行旋轉、根據影像格式(JPG 則設定品質為 30)儲存回原檔案,最後更新主顯示區與縮圖區,並重新調整縮圖佈局。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton15Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [
+      "Rotate",
+      "TJpegGraphic",
+      "SaveQuality",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "13423",
+    "rIndex": "13443",
+    "description": "處理工具列按鈕點擊,執行影像旋轉 180 度。程序重新載入檔案後執行旋轉操作,並依據格式存檔。完成後同步更新主畫面與預覽圖,確保顯示一致性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton16Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [
+      "Rotate",
+      "TJpegGraphic",
+      "SaveQuality",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "13444",
+    "rIndex": "13464",
+    "description": "處理工具列按鈕點擊,執行影像順時針旋轉 90 度。載入影像後執行旋轉並儲存,針對非黑白影像會設定 JPG 壓縮品質。最後重新繪製相關顯示元件並觸發點擊事件。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton17Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13465",
+    "rIndex": "13469",
+    "description": "將主影像顯示區的縮放模式設定為「符合高度」(zmFitHeight)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton18Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13470",
+    "rIndex": "13474",
+    "description": "將主影像顯示區的縮放模式設定為「符合寬度」(zmFitWidth)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton19Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13475",
+    "rIndex": "13479",
+    "description": "將主影像顯示區的縮放模式設定為「原始大小」(zmOriginalSize)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton20Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13480",
+    "rIndex": "13484",
+    "description": "將主影像顯示區的縮放模式設定為「符合頁面」(zmFittoPage)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton21Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13485",
+    "rIndex": "13490",
+    "description": "將主影像顯示區的縮放模式設定為自定義百分比,並將比例設為 50%。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton22Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13491",
+    "rIndex": "13496",
+    "description": "將主影像顯示區的縮放模式設定為自定義百分比,並將比例設為 25%。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton3Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13497",
+    "rIndex": "13501",
+    "description": "將主影像顯示區的縮放模式設定為「全頁顯示」(zmFullPage)。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreatePreViewISB(Count:Integer);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [],
+    "lIndex": "13502",
+    "rIndex": "13550",
+    "description": "動態建立指定數量的縮圖預覽組件。首先清空既有的預覽組件,接著在 ScrollBox1 中為每個縮圖建立一個 TPanel 作為容器,並在其內嵌入一個 TImageScrollBox。設定組件的對齊方式、預設縮放模式及多項事件處理函式(如 Click, MouseMove, DragDrop 等),並掛載右鍵選單。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FreePreViewISB;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [],
+    "lIndex": "13551",
+    "rIndex": "13580",
+    "description": "釋放所有與縮圖預覽相關的動態組件。遍歷所有組件,尋找名稱中包含特定前綴(如 ISBName, M_Pl, SP)的 TImageScrollBox、TPanel 與 TShape 並執行 Free 動作。最後呼叫 ProcessMessages 確保 UI 資源正確釋放。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FitPreViewISB;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [],
+    "lIndex": "13581",
+    "rIndex": "13617",
+    "description": "自動調整所有預覽縮圖面板的高度與位置。遍歷所有已建立的預覽組件(ISB),根據每個影像實際顯示的高度(DisplayedGraphic.Height)動態設定其父面板的高度,並依序由上而下排列,確保縮圖之間緊密銜接。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PaintShape(FromImg,ToImg:TImageScrollBox); //畫有被選取的影像",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [],
+    "lIndex": "13618",
+    "rIndex": "13673",
+    "description": "在預覽縮圖周圍繪製藍色選取框(TShape)。若僅傳入單一影像(ToImg 為 nil),則只在該影像位置建立選取框;若傳入起點與終點影像,則會在範圍內的所有影像組件上建立選取框。框線寬度設為 3 且顏色為藍色,用於視覺化標記選取狀態。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FreeShapeobj(SelectISB : TImageScrollBox);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [],
+    "lIndex": "13674",
+    "rIndex": "13694",
+    "description": "刪除縮圖上的選取標記(TShape)。若傳入的 SelectISB 為 nil,則會刪除所有名稱前綴為 \"SP\" 的選取框組件;若指定了特定的影像組件,則僅刪除與該影像對應的選取框。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ISBClick(Sender : TObject);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [
+      "Image_Smooth",
+      "LoadFromFile"
+    ],
+    "lIndex": "13695",
+    "rIndex": "13733",
+    "description": "處理縮圖點擊事件,支援組合鍵選取。若按下 Shift 鍵則執行連選(PaintShape 範圍選取);若按下 Control 鍵則切換單選狀態;一般點擊則清除舊選取並重新標記。點擊後會從選取的縮圖載入原圖至主顯示區(ISB1),並視需要執行影像平滑化處理。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ISBMouseMove(Sender: TObject; Shift: TShiftState;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [],
+    "lIndex": "13734",
+    "rIndex": "13747",
+    "description": "處理縮圖區的滑鼠移動事件。當處於拖曳狀態且滑鼠移動至已選取的影像(有 SP 標記)時,觸發組件的 BeginDrag 開始執行拖放操作。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBImageMouseDown(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "13748",
+    "rIndex": "13821",
+    "description": "處理縮圖預覽影像的滑鼠按下事件。當按下左鍵時,將 Draging 標記設為 True 以利後續拖曳判斷。若未處於拖曳中,則根據是否按下 Shift 或 Control 鍵,執行範圍選取、加選或單選操作。選取後會更新 SelectPage,並在主顯示區(ISB1)同步載入對應的影像檔案。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBImageMouseUp(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [],
+    "lIndex": "13822",
+    "rIndex": "13827",
+    "description": "處理縮圖預覽影像的滑鼠放開事件,將拖曳標記 Draging 重置為 False。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBEndDrag(Sender, Target: TObject; X, Y: Integer);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [],
+    "lIndex": "13828",
+    "rIndex": "13832",
+    "description": "當影像拖放操作結束時,觸發 TreeView1Click 事件以更新樹狀結構與顯示介面。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBDragDrop(Sender, Source: TObject; X, Y: Integer);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [],
+    "lIndex": "13833",
+    "rIndex": "13842",
+    "description": "執行縮圖拖放後的影像移動操作。根據來源與目標影像的原始掃描頁碼,呼叫 MoveImage_Drag 調整檔案在目錄中的順序。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBDragOver(Sender, Source: TObject; X, Y: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "縮圖預覽(PreViewISB)"
+    ],
+    "deps": [],
+    "lIndex": "13843",
+    "rIndex": "13863",
+    "description": "判斷拖放操作是否可接受。僅在來源為影像組件、檔案路徑不同且樹狀結構選取在文件層級(Level 2)時,才允許執行拖放。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindMpsView(Vmode: Integer):TImageScrollBox;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [],
+    "lIndex": "13864",
+    "rIndex": "13889",
+    "description": "根據當前的檢視模式(Vmode),在 8 個影像視窗中尋找適合載入下一個影像的視窗組件。函式會根據 1x1 到 4x2 的佈局決定搜尋上限,優先回傳檔名為空的視窗;若視窗已滿,則清空指定位置的顯示並回傳主視窗 ISB1。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCaseFormID(Path:String):String;  //取案件的主FormID",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "上傳前置資料產生"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "13890",
+    "rIndex": "13911",
+    "description": "從案件目錄的 Context.dat 檔案中搜尋並回傳該案件的主表單代碼(FormID)。程序會遍歷影像清單,提取各檔案的表單代碼,並排除特定的分案頁代碼,直到找到符合條件的主表單代碼為止。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateFormID_FormName(Path,CaseID:String);  //產生FormID_FormName.dat",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "上傳前置資料產生"
+    ],
+    "deps": [
+      "SaveToFile"
+    ],
+    "lIndex": "13912",
+    "rIndex": "13931",
+    "description": "遍歷 ContextList,提取每個檔案的表單代號與名稱並格式化為「代號_名稱」,最後存成 FormCode_Name.dat 供上傳使用。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateDocNo_DocName(Path,CaseID:String);  //產生DocNo_DocName.dat",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "上傳前置資料產生"
+    ],
+    "deps": [
+      "SaveToFile"
+    ],
+    "lIndex": "13932",
+    "rIndex": "13953",
+    "description": "產生包含文件代號與名稱的對應檔 DocNo_Name.dat。首先執行案件內文件去重,接著遍歷 CaseDocNoList 取得對應名稱,針對不需分組的文件會在名稱前加上星號標記,最後將結果以 UTF-8 編碼儲存。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateIn_WH(CaseID:String);  //產生In_WH.dat",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "上傳前置資料產生"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile"
+    ],
+    "lIndex": "13954",
+    "rIndex": "13984",
+    "description": "產生在席文件清單檔 In_Wh.dat。讀取案件的文件目錄清單後,比對全域的在席文件清單(IN_WH_DocNoList),若文件代號匹配或屬於特定系統目錄(ZZZZZ),則將其加入清單並儲存,用於標記需留存實體的文件。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateDocnoFrom_Info(CaseID:String):String; //產生被引進的保管袋文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "上傳前置資料產生"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "14122",
+    "rIndex": "14186",
+    "description": "產生被引進的保管袋文件詳細資訊字串。程序遍歷案件的文件目錄,排除自定義文件後,取得各文件的份數、總頁數、異動狀態及來源案件編號(UseCase)。若同一文件來自多個目錄,則會累加數據,最後產出以 Tab 分隔的文件資訊清單。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateCustDocNoFrom_Info(CaseID:String):String; //產生被引進的自定文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "上傳前置資料產生"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "14187",
+    "rIndex": "14244",
+    "description": "產出自定義文件的引進資訊字串。專門處理前綴為 \"ZZZZZ\" 的目錄,提取自定義文件名稱、份數及來源案件。與保管袋文件類似,會執行重複合併並統計總頁數,最後產出格式化的資訊字串。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateAttach_Info(CaseID:String):String; //產生是否有Attach Y:有 N:沒有",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "上傳前置資料產生"
+    ],
+    "deps": [],
+    "lIndex": "14245",
+    "rIndex": "14251",
+    "description": "判斷案件是否存在附加電子檔。透過檢查附加檔案目錄的總頁數是否大於 0,回傳 \"Y\" 或 \"N\"。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNoEdit(CaseID,DocNo,DocName:String):String; //取出DocNo是否被異動 (Y/N)",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "14252",
+    "rIndex": "14291",
+    "description": "檢查指定文件是否被異動。程序會載入已編輯目錄清單,並與原始的文件代號/名稱清單(FC_DocNoList)進行比對。若文件代號或名稱不在原始清單中,或存在於已編輯清單內,則判定該文件已被異動並回傳 \"Y\"。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNo_Count(Path,DocNo:String):Integer;  //取出文件份數",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "14292",
+    "rIndex": "14331",
+    "description": "計算指定文件代號在案件中的份數。若文件不需分組則直接回傳 1。否則,遍歷影像清單(Context.dat),根據檔案名稱解析出的頁碼是否為第一頁(\"01\")來累計該文件的份數。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNo_Page(Path,DocNo:String):Integer;  //取出文件總頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "14332",
+    "rIndex": "14358",
+    "description": "計算指定文件代號在案件中擁有的總影像頁數。遍歷影像對應的文件清單(Context_DocNo.dat),統計與傳入代號相符的項目數量。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormIDExists(FormCode:String;CheckDate:Boolean;index:Integer):Boolean;  //檢查FormID是否存在",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [],
+    "lIndex": "14359",
+    "rIndex": "14396",
+    "description": "檢查指定的表單代碼(FormID)是否存在於系統資料庫中。支援日期檢核模式:若啟用,則會進一步查詢該表單所屬文件的起迄效期(START_DATE, STOP_DATE),並與伺服器當前日期比對,確保表單仍在有效期限內。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Case_DocNoExists(CaseID,Docno:String):Boolean; //Docno是否存在案件裡",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "文件份數/頁數/查詢"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "14397",
+    "rIndex": "14421",
+    "description": "檢查指定的文件代號是否存在於特定案件的 Context.dat 影像清單中。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CB1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14422",
+    "rIndex": "14426",
+    "description": "處理核取方塊點擊,設定是否要在掃描時顯示 TWAIN 使用者介面(TwainShowUI)。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReSortFileName(Path:String); //檔名重新排序",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "檔案操作"
+    ],
+    "deps": [
+      "ReSortFileName",
+      "FileExists",
+      "LoadFromFile",
+      "RenameFile",
+      "SaveToFile"
+    ],
+    "lIndex": "14427",
+    "rIndex": "14454",
+    "description": "執行影像檔案名稱的重新排序與更名。讀取目錄下的 Context.dat,根據目前的排列順序為每個檔案產生新的三位數序號前綴,並呼叫 ReNameFile 執行磁碟更名,最後同步更新清單內容並儲存。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReSortFileName_New(Path:String); //檔名重新排序",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "檔案操作"
+    ],
+    "deps": [
+      "ReSortFileName",
+      "FileExists",
+      "LoadFromFile",
+      "RenameFile",
+      "SaveToFile"
+    ],
+    "lIndex": "14455",
+    "rIndex": "14481",
+    "description": "與 ReSortFileName 類似,執行影像檔案名稱的重新排序,但採用從清單末尾向前遍歷的方式執行更名與儲存。"
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReSortFileName2Scanlist(Path:String); //檔名重新排序給Scanlist.dat",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "檔案操作"
+    ],
+    "deps": [
+      "ReSortFileName",
+      "FileExists",
+      "LoadFromFile",
+      "RenameFile",
+      "SaveToFile"
+    ],
+    "lIndex": "14482",
+    "rIndex": "14506",
+    "description": "針對 scanlist.dat 檔案內的影像路徑進行序號重排。讀取清單後,依序為檔案名稱加上新的序號前綴並存回。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetOMRCheckSet : Boolean; //下載OMR檢核XML檔",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile",
+      "dnFile_Get",
+      "dnFile"
+    ],
+    "lIndex": "14507",
+    "rIndex": "14565",
+    "description": "從伺服器下載並更新 OMR 檢核設定檔(OMRSet.zip)。程序會檢查本地 LastDateTime.dat 取得最後更新時間,並發送請求。若伺服器有新資料,則下載後解壓縮並更新本地時間戳記;若無更新則維持現狀,並包含完整的錯誤處理邏輯。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetKeyinSet : Boolean; //取登打設定",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "SaveToFile",
+      "dnFile_Get",
+      "dnFile"
+    ],
+    "lIndex": "14566",
+    "rIndex": "14624",
+    "description": "從伺服器下載並更新登打設定檔(KeyinSet.zip)。運作機制與 GetOMRCheckSet 相同,透過比對時間戳記決定是否執行下載與解壓縮,確保本地的登打定位資訊與伺服器同步。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseAsk(CaseID: string):Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "ProcessServlet_Get"
+    ],
+    "lIndex": "14625",
+    "rIndex": "14674",
+    "description": "在上傳案件前,向伺服器詢問該案件是否可進行傳送。針對 NSCAN 或 DSCAN 模式,會封裝案件編號與加密驗證資訊發送至 IMGPSC05/isnew 服務。根據伺服器回傳結果(0 表示可上傳,1 表示重複),決定後續的上傳流程。"
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseComplete(Path,CaseID:String;MainCase:Boolean):Boolean;  //通知傳送完成",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "API 呼叫相關"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile",
+      "En_DecryptionStr_Base64"
+    ],
+    "lIndex": "14675",
+    "rIndex": "14903",
+    "description": "通知伺服器案件傳送完成。函式會收集案件的各項元數據,包含總頁數、主表單 ID、經辦資訊、被保人資料等,並根據不同的業務模式(如 NSCAN, ESCAN)格式化發送數據。若包含 OMR 檢核失敗資訊或備註,也會一併封裝傳送,最後根據伺服器回傳值判定作業是否成功。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Timer1Timer(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.statusMessenger",
+      "初始化與生命週期"
+    ],
+    "deps": [
+      "FJpgCompression",
+      "GetLocalAppDir",
+      "Str2Dir",
+      "_DelTree",
+      "FileExists",
+      "initkscan"
+    ],
+    "lIndex": "14904",
+    "rIndex": "15337",
+    "description": "OCX 元件初始化的核心程序。負責從伺服器下載各類基礎資訊(業務、表單、文件、檢核規則、常用片語、系統參數等),並設定本地暫存路徑(ScanTemp)。針對異動或重掃模式,會自動建立空案件並下載既有影像。最後執行各類屬性與語系設定,確保掃描環境就緒。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Timer2Timer(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.statusMessenger",
+      "初始化與生命週期"
+    ],
+    "deps": [],
+    "lIndex": "15338",
+    "rIndex": "15346",
+    "description": "處理進度條或提示文字的動態點點動畫。每觸發一次就會在 ShowText 後方增加一個點,模擬載入中的視覺效果。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TransBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [
+      "LoadFromFile"
+    ],
+    "lIndex": "15347",
+    "rIndex": "15538",
+    "description": "處理工具列「上傳」按鈕的點擊事件。執行完整的前置檢查(包含案件配號、歸類、收件時間限制等),接著遍歷所有案件執行 OMR 檢核與 ReSize,最後呼叫 TransCaseID 將案件封裝傳送至伺服器。上傳結束後會顯示成功/失敗的統計報告。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [
+      "FileExists",
+      "LoadFromFile"
+    ],
+    "lIndex": "15539",
+    "rIndex": "15766",
+    "description": "處理樹狀結構(TreeView)的點擊事件,是切換顯示內容的核心入口。根據點擊的層級(案件、文件、表單),重置全域變數並設定對應的 DisplayPath、NowDocNo 與 NowFormCode。接著載入並顯示該層級對應的影像與附件清單,同時動態調整按鈕與選單的可用性。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [
+      "RenameFile",
+      "CopyFile",
+      "DeleteImageFile",
+      "LoadFromFile",
+      "SaveToFile",
+      "_DelTree",
+      "ReSortFileName"
+    ],
+    "lIndex": "15767",
+    "rIndex": "15943",
+    "description": "處理樹狀結構的拖放操作,實現影像的快速歸類或跨案件移動。當使用者將影像縮圖拖至樹狀節點時,程序會判斷目標層級,執行實際的檔案搬移(Copy/Delete)與更名,同步更新 Context.dat 索引檔案,並重新整理樹狀顯示與筆數統計。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "15944",
+    "rIndex": "15978",
+    "description": "判斷樹狀結構拖放操作的有效性。程序會檢核來源影像的表單代碼與目標節點的屬性,限制只能將影像拖入特定的表單層級(Level 3),且排除已存在的相同表單、附件目錄或未註冊的文件類型。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1KeyUp(Sender: TObject; var Key: Word;",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "15979",
+    "rIndex": "15992",
+    "description": "處理樹狀結構的按鍵放開事件。若有選取子節點,則觸發 TreeView1Click 重新載入影像顯示,否則清空視窗。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseDown(Sender: TObject;",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "15993",
+    "rIndex": "16003",
+    "description": "處理樹狀結構滑鼠按下事件。若是右鍵按下,則自動選取該位置的節點以便後續彈出對應的開單選單。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseEnter(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "16004",
+    "rIndex": "16008",
+    "description": "當滑鼠進入樹狀結構區域時,自動將焦點(Focus)設定至 TreeView1。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseMove(Sender: TObject; Shift: TShiftState;",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "16009",
+    "rIndex": "16016",
+    "description": "處理樹狀結構滑鼠移動事件,目前實作已註解相關代碼。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "16017",
+    "rIndex": "16032",
+    "description": "處理樹狀結構滑鼠放開事件。若為右鍵點擊且有選取節點,則觸發 TreeView1Click 並彈出與節點層級對應的右鍵選單。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ViewModeBtnMouseEnter(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16033",
+    "rIndex": "16037",
+    "description": "當滑鼠進入檢視模式按鈕時,顯示該按鈕的 Hint 文字作為工具提示(Tooltip)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_caseid(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16038",
+    "rIndex": "16042",
+    "description": "設定內部變數 FCaseID 的值。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_data(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16043",
+    "rIndex": "16047",
+    "description": "設定內部變數 FData 的值。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_mode(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16048",
+    "rIndex": "16052",
+    "description": "設定作業模式(FMode),並將傳入的字串轉換為大寫。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_rewrite(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16053",
+    "rIndex": "16057",
+    "description": "設定是否強制覆蓋檔案的標記(FReWrite)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_url(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16058",
+    "rIndex": "16062",
+    "description": "設定後端伺服器的基礎 URL 路徑。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_userid(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16063",
+    "rIndex": "16067",
+    "description": "設定當前登入的使用者代號。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_username(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16068",
+    "rIndex": "16072",
+    "description": "設定當前登入的使用者名稱。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_verify(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16073",
+    "rIndex": "16077",
+    "description": "設定 API 呼叫所需的驗證字串。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_language(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "FileExists"
+    ],
+    "lIndex": "16078",
+    "rIndex": "16090",
+    "description": "設定語系代碼並執行初始化。會自動修正語系格式(如 zh-tw 轉 zh_tw),若語言檔存在則觸發介面語系切換。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_modename(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16091",
+    "rIndex": "16095",
+    "description": "設定作業模式的顯示名稱。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_userunit(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16096",
+    "rIndex": "16100",
+    "description": "設定使用者所屬的單位代碼。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_work_no(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16101",
+    "rIndex": "16105",
+    "description": "設定當前的業務別(WORK_NO)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_loandoc_enable(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16106",
+    "rIndex": "16117",
+    "description": "設定信用註記功能是否啟用。根據參數(Y/I)動態切換 AddCredit1RG 元件的可用性與可見度。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_loandoc_value(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16118",
+    "rIndex": "16122",
+    "description": "設定信用註記的具體數值。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_useproxy(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16123",
+    "rIndex": "16130",
+    "description": "設定系統是否使用 Proxy 代理伺服器進行網路連線。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_c_docnamelist(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16131",
+    "rIndex": "16135",
+    "description": "設定預設的文件名稱清單。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_c_docnolist(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16136",
+    "rIndex": "16140",
+    "description": "設定預設的文件代號清單。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_fixfilelist(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16141",
+    "rIndex": "16145",
+    "description": "設定固定的檔案清單字串。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_is_in_wh(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16146",
+    "rIndex": "16150",
+    "description": "設定是否為在席(In-Warehouse)作業模式。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_oldcaseinfo(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16151",
+    "rIndex": "16155",
+    "description": "設定舊案件的相關資訊字串。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_c_docnamelist: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16156",
+    "rIndex": "16160",
+    "description": "獲取預設文件名稱清單的存根函式,目前未實作回傳內容。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_c_docnolist: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16161",
+    "rIndex": "16165",
+    "description": "獲取預設文件代號清單的存根函式,目前未實作回傳內容。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_caseid: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16166",
+    "rIndex": "16170",
+    "description": "獲取內部案件編號(FCaseID)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_data: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16171",
+    "rIndex": "16175",
+    "description": "獲取內部資料字串(FData)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_fixfilelist: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16176",
+    "rIndex": "16180",
+    "description": "獲取固定的檔案清單字串(FFixFileList)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_is_in_wh: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16181",
+    "rIndex": "16185",
+    "description": "獲取是否為在席作業模式的標記(FIs_In_WH)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_language: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16186",
+    "rIndex": "16190",
+    "description": "獲取當前設定的語系代碼(FLanguage)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_loandoc_enable: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16191",
+    "rIndex": "16195",
+    "description": "獲取信用註記功能是否啟用的狀態。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_loandoc_value: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16196",
+    "rIndex": "16200",
+    "description": "獲取當前設定的信用註記數值。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_mode: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16201",
+    "rIndex": "16205",
+    "description": "獲取當前作業模式(FMode)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_modename: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16206",
+    "rIndex": "16210",
+    "description": "獲取作業模式的顯示名稱(FModeName)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_oldcaseinfo: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16211",
+    "rIndex": "16215",
+    "description": "獲取舊案件的相關資訊字串(FOldCaseInfo)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_rewrite: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16216",
+    "rIndex": "16220",
+    "description": "獲取是否強制覆蓋檔案的標記(FReWrite)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_url: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16221",
+    "rIndex": "16225",
+    "description": "獲取後端伺服器的基礎 URL(FUrl)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_useproxy: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16226",
+    "rIndex": "16230",
+    "description": "獲取是否使用 Proxy 代理伺服器的設定。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_userid: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16231",
+    "rIndex": "16235",
+    "description": "獲取當前登入的使用者代號(FUserID)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_username: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16236",
+    "rIndex": "16240",
+    "description": "獲取當前登入的使用者名稱(FUserName)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_userunit: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16241",
+    "rIndex": "16245",
+    "description": "獲取使用者所屬的單位代碼(FUserUnit)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_verify: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16246",
+    "rIndex": "16250",
+    "description": "獲取 API 驗證字串(FVerify)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_work_no: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16251",
+    "rIndex": "16255",
+    "description": "獲取當前的業務別代碼(FWork_No)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_printyn: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16256",
+    "rIndex": "16260",
+    "description": "獲取是否預設列印的標記(FPrintyn)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_printyn(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16261",
+    "rIndex": "16265",
+    "description": "設定是否預設列印的標記,並將傳入值轉換為大寫。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_is_oldcase: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16266",
+    "rIndex": "16270",
+    "description": "獲取是否為舊件處理模式的標記(FIs_OldCase)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_is_oldcase(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16271",
+    "rIndex": "16275",
+    "description": "設定是否為舊件處理模式,並將傳入值轉換為大寫。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_custdocyn: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16276",
+    "rIndex": "16280",
+    "description": "獲取是否支援自定義文件的標記(FCustDocYN)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_custdocyn(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16281",
+    "rIndex": "16285",
+    "description": "設定是否支援自定義文件,並將傳入值轉換為大寫。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_casenolength: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16286",
+    "rIndex": "16290",
+    "description": "獲取案件編號的長度限制。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_filesizelimit: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16291",
+    "rIndex": "16295",
+    "description": "獲取單一影像檔案的大小限制(KB)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_imgdpi: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16296",
+    "rIndex": "16300",
+    "description": "獲取掃描影像的 DPI 設定值。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_scancolor: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16301",
+    "rIndex": "16305",
+    "description": "獲取掃描顏色模式的索引值。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_casenolength(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16306",
+    "rIndex": "16320",
+    "description": "設定案件編號的長度限制。若傳入值為空字串則設為 0;否則將字串轉換為整數後賦值給 FCaseNoLength 與全域變數 CaseIDLength。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_filesizelimit(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16321",
+    "rIndex": "16335",
+    "description": "設定影像檔案的大小限制(KB)。若傳入值為空,則預設為 5120 KB (5MB);否則將字串轉換為整數後賦值給 FFileSizeLimit。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_imgdpi(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16336",
+    "rIndex": "16351",
+    "description": "設定掃描 DPI。若傳入值為空,則預設為 300 DPI;否則將字串轉整數後賦值給 FImgDPI,並同步更新全域變數 ScanDpi 與 Def_ScanDpi。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_scancolor(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [
+      "ifBlackWhite",
+      "ifGray256",
+      "ifTrueColor"
+    ],
+    "lIndex": "16352",
+    "rIndex": "16376",
+    "description": "設定掃描色彩模式。將傳入的數值字串轉為整數。0 代表黑白(ifBlackWhite),1 代表灰階(ifGray256),2 代表全彩(ifTrueColor)。此函式會同步更新 FScanColor 與全域變數 ScanColor,確保掃描器使用正確的色彩模式。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_imgdelete: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16377",
+    "rIndex": "16381",
+    "description": "獲取影像刪除權限的標記(FImgDelete)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_imgdelete(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16382",
+    "rIndex": "16386",
+    "description": "設定影像刪除權限。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_check_main_form: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16387",
+    "rIndex": "16391",
+    "description": "獲取是否檢查主表單的標記(FCheck_main_form)。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_isExternal: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16392",
+    "rIndex": "16396",
+    "description": "獲取是否為外部呼叫模式的標記(FIsExternal)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_check_main_form(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16397",
+    "rIndex": "16401",
+    "description": "設定是否檢查主表單。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_isExternal(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16402",
+    "rIndex": "16406",
+    "description": "設定是否為外部呼叫模式。"
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_WH_CATEGORY: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16407",
+    "rIndex": "16411",
+    "description": "獲取倉庫類別資訊(FWH_category)。"
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_WH_CATEGORY(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16412",
+    "rIndex": "16455",
+    "description": "設定倉庫類別(WH_CATEGORY)。此範圍除包含 setter 實作外,亦涵蓋了組件的 initialization 初始區段,負責註冊 ActiveForm 工廠並設定多組授權金鑰(LicenseKey),確保 OCX 運作環境與權限正確初始化。"
+  }
+]
diff --git a/separate/scanImp/CB_IMGPSScanImp_Main.pas b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.remainings.txt
similarity index 95%
rename from separate/scanImp/CB_IMGPSScanImp_Main.pas
rename to doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.remainings.txt
index febdbe3..3c82b23 100644
--- a/separate/scanImp/CB_IMGPSScanImp_Main.pas
+++ b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.remainings.txt
@@ -1,4 +1,5 @@
-unit CB_IMGPSScanImp;
+[Lines 1 - 1051]
+unit CB_IMGPSScanImp;
 //TEST
 {$WARN SYMBOL_PLATFORM OFF}
 
@@ -1049,41 +1050,33 @@
 
 { TCB_IMGPSScanX }
 
-{$I CB_IMGPSScanImp_UI.pas}{$I CB_IMGPSScanImp_Scan.pas}{$I CB_IMGPSScanImp_Data.pas}{$I CB_IMGPSScanImp_Utils.pas}initialization
-  TActiveFormFactory.Create(
-    ComServer,
-    TActiveFormControl,
-    TCB_IMGPSScanX,
-    Class_CB_IMGPSScanX,
-    1,
-    '',
-    OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
-    tmApartment);
+----------------------------------------
 
-  {SetLicenseKey('5B4451E676A1D2976FBB0F3BB18341336AF114C80B5ABAE7F6926B1CAF671F44' +
-  'BD2F098CCEDA922F6389BFAE398DA6AEE67F97EEA0C17234C20D75C12173DBDA' +
-  '594924D56DD8E342F454389C836AD880BB4352CA3BE62C4933B1BA3828E7462C' +
-  '60514F2ECDAD322E6128D841F12D24DA00B623106D3F08EBCAA917D8A97CAA34' +
-  '3D65F2DA567316457395BF9123EE53DF235D181F191A5712DBB27735284AA92D' +
-  '5DFA0C8308308505F384707E900C6063F53F1BFF4C6972607955D1AE517B19D0' +
-  '82CDD16301885403AD229D57BAEF98C056F31430861E5F68F339D658D72E1F92' +
-  '63899412EC2D07891FE3AFD35F3E4A4390B2F0A8A1BF1B7D6160E5F1CC009B17'); }
-  SetLicenseKey('4B2CF65E8C2A86CE8A0DD0F6A7DB03BC0B0126168B48AE4C27EBD78CAE75CF0F' +
-   'A612190861E0D99F6FAE3ED97AC1941B5E97843CFFCF705A3787989072D4EB2C' +
-   'AE6CAB3F5B69B86616ACC8A37AD6A2AB21C7BDD5C9AE1EDF9E4193D353805C9A' +
-   '403631CE8A3D0803FEBB1BE4C209CE7A63B1298EF080EB34B8628CED567D2B68' +
-   'E777FAC58E2E32B7411FC217A04336231D1E861A93474759DAA6EDF53F6EB632' +
-   'A3055229A52F3053FB844754741409022DDE3DFB19473510F2BE63328E74BE20' +
-   'A6A29AA24878F91ADA9DF8CE1F320AF4DAF58EBF95D9BE761D70EEA274E19475' +
-   '1C15948B184264C5C49E60493F3BCD2FFAE2CA8B021D00B96F45550C5F050D8A');
+[Lines 9996 - 10021]
+Function TCB_IMGPSScanX.CheckNeedCrop(Graphic:TDibGraphic):Boolean; //是否是A3要切影像
+Var
+  i,FormIDCount : Integer;
+begin
+  Result := False;
+  FormIDCount := 0;
+  if (Graphic.Width > (4 * Graphic.XDotsPerInch)) {or (Graphic.Height > (15 * Graphic.YDotsPerInch))} then
+  //if (Graphic.Width > (6 * Graphic.XDotsPerInch)) then
+  begin
+    for I := 1 to MpsBarcodeinf.Count do
+    begin
+      if (Length(MpsBarcodeinf.Text[i])=FormIDLength) and FormIDExists(MpsBarcodeinf.Text[i],False,0) then
+      begin
+        inc(FormIDCount);
+      end;
+    end;
 
+  end;
 
-  SetLicenseKey('A6A94A8D91B08A9D58F300C0573EA9EF1B9DB0BF69B90E13B958DB4CB6B44F5A' +
-  '4EE9CB22C9A68C2D07ED52ED4D13C755D890E4074996755361E6CDE2A6F1B563' +
-  '5DDC8999AC4D71FB092EA9F1F87BFA25694FBF0D6D250087D2B39629713FCCB0' +
-  'D0A83135BC14FC63A4E8331CFF9E24C45C2D9CFD837EB70BAFDB79A75B7B97D5' +
-  'E9EB271685118C29D90A7C85E7793908989E295DA50021C795A448366026E975' +
-  'F49EA75B721B80427B99E5CF24A225FB498C07946ED7B806B483654C00D85C66' +
-  'E34215CA3EDEF1D4C3F5896090E97E1E2C9752BA2D5B49EE58CF19A0D374077F' +
-  '6D13B90B6FED22D9EBC3AD6CDC76E595E08725BF2E12B8EF30A524A2E00504DF');
-end.
+//ShowMessage('FormIDCount='+IntToStr(FormIDCount)+#10#13+'MpsBarcodeinf.count='+IntToStr(MpsBarcodeinf.count));
+  if FormIDCount = 2 then
+  begin
+    Result := True;
+  end;
+end;
+
+----------------------------------------
diff --git a/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ts b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ts
new file mode 100644
index 0000000..073308e
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ts
@@ -0,0 +1,27 @@
+
+/** lIndex matcher, 於 {import('src/CB_IMGPSScanImp.pas.bk)} 找出方法分類中的 lIndex */
+type MethodLinenoMather = string
+
+/** 方法分類, 可以有多個分類, 用於找出不同分類的集合, 分類方式見需求 B1.1.5 @see {@link scanimpl_annalysis.md}*/
+type Tags = string[]
+/** 方實作中引用的其他依賴 */
+type Deps = string[]
+type MethodName = string
+
+/** 定義 Pascal 方法區段 */
+type PascalMethodDef = {
+  matcher: MethodLinenoMather,
+  name: MethodName,
+  /** 方法分類 */
+  tags: Tags
+  /** 引用相依 */
+  deps: Deps
+  /** 定義 Pascal 方法區段 l, 代表該方法所在行號 lbound, 該值不可能為-1 */
+  lIndex: number
+  /** 定義 Pascal 方法區段 r, 代表該方法所在行號 rbound, 該值不可能為-1  */
+  rIndex: number
+  /** 生成方法描述, 可有可無 */
+  description: string
+}
+
+
diff --git a/doc/curtis/prompt/scanimpl_analysis/step1_raw_methods.json b/doc/curtis/prompt/scanimpl_analysis/step1_raw_methods.json
new file mode 100644
index 0000000..069933b
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/step1_raw_methods.json
@@ -0,0 +1,2417 @@
+[
+  {
+    "matcher": "function TCB_IMGPSScanX.GetCurrentVersionNo: String; //獲取自身版本號所需要",
+    "lIndex": 1052,
+    "rIndex": 1085
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.WMMOUSEWHEEL(var message: TWMMouseWheel);",
+    "lIndex": 1086,
+    "rIndex": 1171
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.WNoteBtnClick(Sender: TObject);",
+    "lIndex": 1172,
+    "rIndex": 1246
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage);",
+    "lIndex": 1247,
+    "rIndex": 1253
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.EventSinkChanged(const EventSink: IUnknown);",
+    "lIndex": 1254,
+    "rIndex": 1259
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC0Click(Sender: TObject);",
+    "lIndex": 1260,
+    "rIndex": 1270
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC1Click(Sender: TObject);",
+    "lIndex": 1271,
+    "rIndex": 1281
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC2Click(Sender: TObject);",
+    "lIndex": 1282,
+    "rIndex": 1292
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC3Click(Sender: TObject);",
+    "lIndex": 1293,
+    "rIndex": 1303
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC4Click(Sender: TObject);",
+    "lIndex": 1304,
+    "rIndex": 1314
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC5Click(Sender: TObject);",
+    "lIndex": 1315,
+    "rIndex": 1325
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC6Click(Sender: TObject);",
+    "lIndex": 1326,
+    "rIndex": 1337
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.InitExistImgList(casepath: String);",
+    "lIndex": 1338,
+    "rIndex": 1362
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Initialize;",
+    "lIndex": 1363,
+    "rIndex": 1386
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1Click(Sender: TObject);",
+    "lIndex": 1387,
+    "rIndex": 1406
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1EndScroll(Sender: TObject);",
+    "lIndex": 1407,
+    "rIndex": 1421
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1Enter(Sender: TObject);",
+    "lIndex": 1422,
+    "rIndex": 1426
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1ImageMouseDown(Sender: TObject; Button: TMouseButton;",
+    "lIndex": 1427,
+    "rIndex": 1463
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1ImageMouseMove(Sender: TObject; Shift: TShiftState;",
+    "lIndex": 1464,
+    "rIndex": 1489
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1ImageMouseUp(Sender: TObject; Button: TMouseButton;",
+    "lIndex": 1490,
+    "rIndex": 1524
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Active: WordBool;",
+    "lIndex": 1525,
+    "rIndex": 1529
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AlignDisabled: WordBool;",
+    "lIndex": 1530,
+    "rIndex": 1534
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AlignWithMargins: WordBool;",
+    "lIndex": 1535,
+    "rIndex": 1539
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AutoScroll: WordBool;",
+    "lIndex": 1540,
+    "rIndex": 1544
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AutoSize: WordBool;",
+    "lIndex": 1545,
+    "rIndex": 1549
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AxBorderStyle: TxActiveFormBorderStyle;",
+    "lIndex": 1550,
+    "rIndex": 1554
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Caption: WideString;",
+    "lIndex": 1555,
+    "rIndex": 1559
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Color: OLE_COLOR;",
+    "lIndex": 1560,
+    "rIndex": 1564
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_DockSite: WordBool;",
+    "lIndex": 1565,
+    "rIndex": 1569
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_DoubleBuffered: WordBool;",
+    "lIndex": 1570,
+    "rIndex": 1574
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_DropTarget: WordBool;",
+    "lIndex": 1575,
+    "rIndex": 1579
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Enabled: WordBool;",
+    "lIndex": 1580,
+    "rIndex": 1584
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitHeight: Integer;",
+    "lIndex": 1585,
+    "rIndex": 1589
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitLeft: Integer;",
+    "lIndex": 1590,
+    "rIndex": 1594
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitTop: Integer;",
+    "lIndex": 1595,
+    "rIndex": 1599
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitWidth: Integer;",
+    "lIndex": 1600,
+    "rIndex": 1604
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Font: IFontDisp;",
+    "lIndex": 1605,
+    "rIndex": 1609
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_HelpFile: WideString;",
+    "lIndex": 1610,
+    "rIndex": 1614
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_KeyPreview: WordBool;",
+    "lIndex": 1615,
+    "rIndex": 1619
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_MouseInClient: WordBool;",
+    "lIndex": 1620,
+    "rIndex": 1624
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ParentCustomHint: WordBool;",
+    "lIndex": 1625,
+    "rIndex": 1629
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ParentDoubleBuffered: WordBool;",
+    "lIndex": 1630,
+    "rIndex": 1634
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_PixelsPerInch: Integer;",
+    "lIndex": 1635,
+    "rIndex": 1639
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_PopupMode: TxPopupMode;",
+    "lIndex": 1640,
+    "rIndex": 1644
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_PrintScale: TxPrintScale;",
+    "lIndex": 1645,
+    "rIndex": 1649
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Scaled: WordBool;",
+    "lIndex": 1650,
+    "rIndex": 1654
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ScreenSnap: WordBool;",
+    "lIndex": 1655,
+    "rIndex": 1659
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_SnapBuffer: Integer;",
+    "lIndex": 1660,
+    "rIndex": 1664
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_UseDockManager: WordBool;",
+    "lIndex": 1665,
+    "rIndex": 1669
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Visible: WordBool;",
+    "lIndex": 1670,
+    "rIndex": 1674
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_VisibleDockClientCount: Integer;",
+    "lIndex": 1675,
+    "rIndex": 1679
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX._Set_Font(var Value: IFontDisp);",
+    "lIndex": 1680,
+    "rIndex": 1684
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ActivateEvent(Sender: TObject);",
+    "lIndex": 1685,
+    "rIndex": 1689
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ClickEvent(Sender: TObject);",
+    "lIndex": 1690,
+    "rIndex": 1694
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CreateEvent(Sender: TObject);",
+    "lIndex": 1695,
+    "rIndex": 1699
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DblClickEvent(Sender: TObject);",
+    "lIndex": 1700,
+    "rIndex": 1704
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DeactivateEvent(Sender: TObject);",
+    "lIndex": 1705,
+    "rIndex": 1709
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DestroyEvent(Sender: TObject);",
+    "lIndex": 1710,
+    "rIndex": 1755
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.KeyPressEvent(Sender: TObject; var Key: Char);",
+    "lIndex": 1756,
+    "rIndex": 1764
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode1Click(Sender: TObject);",
+    "lIndex": 1765,
+    "rIndex": 1772
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode2Click(Sender: TObject);",
+    "lIndex": 1773,
+    "rIndex": 1780
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode3Click(Sender: TObject);",
+    "lIndex": 1781,
+    "rIndex": 1787
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode4Click(Sender: TObject);",
+    "lIndex": 1788,
+    "rIndex": 1794
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.MouseEnterEvent(Sender: TObject);",
+    "lIndex": 1795,
+    "rIndex": 1799
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.MouseLeaveEvent(Sender: TObject);",
+    "lIndex": 1800,
+    "rIndex": 1804
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PaintEvent(Sender: TObject);",
+    "lIndex": 1805,
+    "rIndex": 1809
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AlignWithMargins(Value: WordBool);",
+    "lIndex": 1810,
+    "rIndex": 1814
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AutoScroll(Value: WordBool);",
+    "lIndex": 1815,
+    "rIndex": 1819
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AutoSize(Value: WordBool);",
+    "lIndex": 1820,
+    "rIndex": 1824
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AxBorderStyle(Value: TxActiveFormBorderStyle);",
+    "lIndex": 1825,
+    "rIndex": 1829
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Caption(const Value: WideString);",
+    "lIndex": 1830,
+    "rIndex": 1834
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Color(Value: OLE_COLOR);",
+    "lIndex": 1835,
+    "rIndex": 1839
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_DockSite(Value: WordBool);",
+    "lIndex": 1840,
+    "rIndex": 1844
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_DoubleBuffered(Value: WordBool);",
+    "lIndex": 1845,
+    "rIndex": 1849
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_DropTarget(Value: WordBool);",
+    "lIndex": 1850,
+    "rIndex": 1854
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Enabled(Value: WordBool);",
+    "lIndex": 1855,
+    "rIndex": 1859
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Font(const Value: IFontDisp);",
+    "lIndex": 1860,
+    "rIndex": 1864
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_HelpFile(const Value: WideString);",
+    "lIndex": 1865,
+    "rIndex": 1869
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_KeyPreview(Value: WordBool);",
+    "lIndex": 1870,
+    "rIndex": 1874
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_ParentCustomHint(Value: WordBool);",
+    "lIndex": 1875,
+    "rIndex": 1879
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_ParentDoubleBuffered(Value: WordBool);",
+    "lIndex": 1880,
+    "rIndex": 1884
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_PixelsPerInch(Value: Integer);",
+    "lIndex": 1885,
+    "rIndex": 1889
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_PopupMode(Value: TxPopupMode);",
+    "lIndex": 1890,
+    "rIndex": 1894
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_PrintScale(Value: TxPrintScale);",
+    "lIndex": 1895,
+    "rIndex": 1899
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Scaled(Value: WordBool);",
+    "lIndex": 1900,
+    "rIndex": 1904
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_ScreenSnap(Value: WordBool);",
+    "lIndex": 1905,
+    "rIndex": 1909
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_SnapBuffer(Value: Integer);",
+    "lIndex": 1910,
+    "rIndex": 1914
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_UseDockManager(Value: WordBool);",
+    "lIndex": 1915,
+    "rIndex": 1919
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Visible(Value: WordBool);",
+    "lIndex": 1920,
+    "rIndex": 1924
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM401Click(Sender: TObject);",
+    "lIndex": 1925,
+    "rIndex": 1978
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM402Click(Sender: TObject);",
+    "lIndex": 1979,
+    "rIndex": 1988
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM403Click(Sender: TObject);",
+    "lIndex": 1989,
+    "rIndex": 1998
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM404Click(Sender: TObject);",
+    "lIndex": 1999,
+    "rIndex": 2067
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM601Click(Sender: TObject);",
+    "lIndex": 2068,
+    "rIndex": 2221
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM602Click(Sender: TObject);",
+    "lIndex": 2222,
+    "rIndex": 2300
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM604Click(Sender: TObject);",
+    "lIndex": 2301,
+    "rIndex": 2323
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM605Click(Sender: TObject);",
+    "lIndex": 2324,
+    "rIndex": 2361
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.N1Click(Sender: TObject);",
+    "lIndex": 2362,
+    "rIndex": 2372
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.N51Click(Sender: TObject);",
+    "lIndex": 2373,
+    "rIndex": 2379
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.NewScanBtnClick(Sender: TObject);",
+    "lIndex": 2380,
+    "rIndex": 2427
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.NextPageBtnClick(Sender: TObject);",
+    "lIndex": 2428,
+    "rIndex": 2450
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.OptionBtnClick(Sender: TObject);",
+    "lIndex": 2451,
+    "rIndex": 2527
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageLVClick(Sender: TObject);",
+    "lIndex": 2528,
+    "rIndex": 2535
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageLVKeyUp(Sender: TObject; var Key: Word;",
+    "lIndex": 2536,
+    "rIndex": 2542
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageLVMouseDown(Sender: TObject; Button: TMouseButton;",
+    "lIndex": 2543,
+    "rIndex": 2554
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Panel11DblClick(Sender: TObject);",
+    "lIndex": 2555,
+    "rIndex": 2561
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Panel1DblClick(Sender: TObject);",
+    "lIndex": 2562,
+    "rIndex": 2567
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Panel9Resize(Sender: TObject);",
+    "lIndex": 2568,
+    "rIndex": 2572
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM101Click(Sender: TObject);",
+    "lIndex": 2573,
+    "rIndex": 2677
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.DocNoIsExistImg(DocNopath:String):boolean;",
+    "lIndex": 2678,
+    "rIndex": 2701
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX._DelTreeForExistImg(ASourceDir:String);",
+    "lIndex": 2702,
+    "rIndex": 2709
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM102Click(Sender: TObject);",
+    "lIndex": 2710,
+    "rIndex": 2750
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM103Click(Sender: TObject);",
+    "lIndex": 2751,
+    "rIndex": 2788
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PM104Click(Sender: TObject);",
+    "lIndex": 2789,
+    "rIndex": 3186
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM106Click(Sender: TObject);",
+    "lIndex": 3187,
+    "rIndex": 3280
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM107Click(Sender: TObject);",
+    "lIndex": 3281,
+    "rIndex": 3285
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM108Click(Sender: TObject);",
+    "lIndex": 3286,
+    "rIndex": 3381
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM109Click(Sender: TObject);",
+    "lIndex": 3382,
+    "rIndex": 3411
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM110Click(Sender: TObject);",
+    "lIndex": 3412,
+    "rIndex": 3441
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM111Click(Sender: TObject);",
+    "lIndex": 3442,
+    "rIndex": 3472
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM301Click(Sender: TObject);",
+    "lIndex": 3473,
+    "rIndex": 3480
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM302Click(Sender: TObject);",
+    "lIndex": 3481,
+    "rIndex": 3489
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM303Click(Sender: TObject);",
+    "lIndex": 3490,
+    "rIndex": 3498
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM501Click(Sender: TObject);",
+    "lIndex": 3499,
+    "rIndex": 3505
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM502Click(Sender: TObject);",
+    "lIndex": 3506,
+    "rIndex": 3512
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM503Click(Sender: TObject);",
+    "lIndex": 3513,
+    "rIndex": 3519
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM504Click(Sender: TObject);",
+    "lIndex": 3520,
+    "rIndex": 3526
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM505Click(Sender: TObject);",
+    "lIndex": 3527,
+    "rIndex": 3547
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM507Click(Sender: TObject);",
+    "lIndex": 3548,
+    "rIndex": 3615
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM508Click(Sender: TObject);",
+    "lIndex": 3616,
+    "rIndex": 3656
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM509Click(Sender: TObject);",
+    "lIndex": 3657,
+    "rIndex": 3661
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM510Click(Sender: TObject);",
+    "lIndex": 3662,
+    "rIndex": 3668
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu1Popup(Sender: TObject);",
+    "lIndex": 3669,
+    "rIndex": 3826
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu4Popup(Sender: TObject);",
+    "lIndex": 3827,
+    "rIndex": 3844
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu5Popup(Sender: TObject);",
+    "lIndex": 3845,
+    "rIndex": 3874
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu6Popup(Sender: TObject);",
+    "lIndex": 3875,
+    "rIndex": 3924
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PrePageBtnClick(Sender: TObject);",
+    "lIndex": 3925,
+    "rIndex": 3952
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SampleScanBtnClick(Sender: TObject);",
+    "lIndex": 3953,
+    "rIndex": 4068
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScrollBar1Change(Sender: TObject);",
+    "lIndex": 4069,
+    "rIndex": 4086
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScrollBox1MouseEnter(Sender: TObject);",
+    "lIndex": 4087,
+    "rIndex": 4091
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SelectScanBtnClick(Sender: TObject);",
+    "lIndex": 4092,
+    "rIndex": 4100
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.StatusBar1DblClick(Sender: TObject);",
+    "lIndex": 4101,
+    "rIndex": 4116
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ActiveFormCreate(Sender: TObject);",
+    "lIndex": 4117,
+    "rIndex": 4138
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ActiveFormKeyUp(Sender: TObject; var Key: Word;",
+    "lIndex": 4139,
+    "rIndex": 4164
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AddAttFileLBClick(Sender: TObject);",
+    "lIndex": 4165,
+    "rIndex": 4194
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AddCredit1RGClick(Sender: TObject);",
+    "lIndex": 4195,
+    "rIndex": 4207
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AddScanBtnClick(Sender: TObject);",
+    "lIndex": 4208,
+    "rIndex": 4249
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AttListBoxClick(Sender: TObject);",
+    "lIndex": 4250,
+    "rIndex": 4256
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AttListBoxDblClick(Sender: TObject);",
+    "lIndex": 4257,
+    "rIndex": 4269
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.BtnMouseEnter(Sender: TObject);",
+    "lIndex": 4270,
+    "rIndex": 4274
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button3Click(Sender: TObject);",
+    "lIndex": 4275,
+    "rIndex": 4334
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button4Click(Sender: TObject);",
+    "lIndex": 4335,
+    "rIndex": 4369
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button5Click(Sender: TObject);",
+    "lIndex": 4370,
+    "rIndex": 4378
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button6Click(Sender: TObject);",
+    "lIndex": 4379,
+    "rIndex": 4389
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.StatrTwainScan;",
+    "lIndex": 4390,
+    "rIndex": 4443
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.OnAcquire( const DibHandle    : THandle;",
+    "lIndex": 4444,
+    "rIndex": 4683
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageDone;",
+    "lIndex": 4684,
+    "rIndex": 4733
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageEnd;",
+    "lIndex": 4734,
+    "rIndex": 4950
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ExportBtClick(Sender: TObject);",
+    "lIndex": 4951,
+    "rIndex": 5013
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ImportBtClick(Sender: TObject);",
+    "lIndex": 5014,
+    "rIndex": 5089
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.HotKeyDown (var Msg : TMessage);",
+    "lIndex": 5090,
+    "rIndex": 5094
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.InitialLanguage(Sender: TObject);",
+    "lIndex": 5095,
+    "rIndex": 5172
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.GetSiteOMR(FileName,Site:String;bt: Integer): Integer;",
+    "lIndex": 5173,
+    "rIndex": 5227
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindISB2View(Vmode:Integer):TImageScrollBox; //找空的ISB來顯示",
+    "lIndex": 5228,
+    "rIndex": 5253
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.R_W_Scanini(Mode:Char); //'R'讀取;'W'寫入",
+    "lIndex": 5254,
+    "rIndex": 5295
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GetDefScanIni; //取得掃瞄的預設值",
+    "lIndex": 5296,
+    "rIndex": 5472
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.HTTPSClientCertificateValidate(Sender: TObject;",
+    "lIndex": 5473,
+    "rIndex": 5478
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.HTTPSClientRedirection(Sender: TObject;",
+    "lIndex": 5479,
+    "rIndex": 5484
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.EnableImage(v:integer;Sender : TObject);",
+    "lIndex": 5485,
+    "rIndex": 5498
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DesableImage;",
+    "lIndex": 5499,
+    "rIndex": 5518
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ViewMouseMode(v:Integer);",
+    "lIndex": 5519,
+    "rIndex": 5543
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GoViewMode;",
+    "lIndex": 5544,
+    "rIndex": 5555
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DisplayMode(index,H_Count,W_Count:Integer;BasePanel:TPanel);",
+    "lIndex": 5556,
+    "rIndex": 5599
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetServerDate : Boolean;",
+    "lIndex": 5600,
+    "rIndex": 5631
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSampleInf : Boolean;",
+    "lIndex": 5632,
+    "rIndex": 5664
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf1 : Boolean; //取系統設定資訊Mode1 DOC_INF",
+    "lIndex": 5665,
+    "rIndex": 5707
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf2 : Boolean; //取系統設定資訊Mode2  DM_FORM_INF",
+    "lIndex": 5708,
+    "rIndex": 5746
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf3 : Boolean; //取系統設定資訊mode3  FORM_INF",
+    "lIndex": 5747,
+    "rIndex": 5786
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf4 : Boolean; //取系統設定資訊mode4  CHECK_RULE_INF",
+    "lIndex": 5787,
+    "rIndex": 5827
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf5 : Boolean; //取系統設定資訊mode5  MEMO_INF",
+    "lIndex": 5828,
+    "rIndex": 5866
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf6 : Boolean; //取系統設定資訊mode5  WORK_INF",
+    "lIndex": 5867,
+    "rIndex": 5906
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf7 : Boolean; //取系統設定資訊mode5  LASTEST_FORM_INF",
+    "lIndex": 5907,
+    "rIndex": 5946
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetFormID_DocNo; //將FormID及Docno抽出來另存入list裡    20130403增加",
+    "lIndex": 5947,
+    "rIndex": 5958
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetIn_WH_DocNo; //將要入庫的DocNo抽出來另存入list裡",
+    "lIndex": 5959,
+    "rIndex": 5972
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.CheckRequiredColumnValues(workno, caseno:String): Boolean;",
+    "lIndex": 5973,
+    "rIndex": 5982
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CheckRule2OMRErrInfo;   //檢核規則填入OMRErrINFo Record",
+    "lIndex": 5983,
+    "rIndex": 6010
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReNameContext(Path,OldName,NewName:String);",
+    "lIndex": 6011,
+    "rIndex": 6027
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteImageFile(Path,FileName,CaseID:String); // 刪除檔案  (無法得到DocDir用)",
+    "lIndex": 6028,
+    "rIndex": 6059
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteFormCodeFile(CaseID,DocDir,FormID:String);  //刪除指定FormID文件",
+    "lIndex": 6060,
+    "rIndex": 6114
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DeleteDocNoFile(Path,DocNo:String):Boolean;  //刪除指定DocNo文件",
+    "lIndex": 6115,
+    "rIndex": 6140
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DeleteDocNoFileForESCAN(Path,DocNo:String):Boolean;  //刪除指定DocNo文件",
+    "lIndex": 6141,
+    "rIndex": 6174
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteShowFile(Path:String); //刪除顯示中的影像",
+    "lIndex": 6175,
+    "rIndex": 6188
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDataDocNoPage(MainDocNo,MainVersion:String):Integer;  //取記錄的文件_版本頁數",
+    "lIndex": 6189,
+    "rIndex": 6203
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckCaseDocNoPage(CaseID,DocNo,Version:String;Pages:Integer):Integer; //取案件裡的文件_版本頁數",
+    "lIndex": 6204,
+    "rIndex": 6277
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindFormCodePages(CaseID,FormCode:String):Integer;  //計算案件裡FormID的頁數",
+    "lIndex": 6278,
+    "rIndex": 6308
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDataFormCodePages(FormCode:String):Integer;   //取記錄的FormcID的頁數",
+    "lIndex": 6309,
+    "rIndex": 6319
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CaseReSize(CaseID:String); //案件的影像縮放",
+    "lIndex": 6320,
+    "rIndex": 6342
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ImageReSize_FormID(CaseID,FileName:String);  //依十字定位點做縮放",
+    "lIndex": 6343,
+    "rIndex": 6420
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ImageReSize_tmp(FormID,FileName:String);  //依十字定位點做縮放(暫存檔)",
+    "lIndex": 6421,
+    "rIndex": 6446
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ImageScrollBox1NewGraphic(const Graphic: TDibGraphic);",
+    "lIndex": 6447,
+    "rIndex": 6456
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.TransCaseID(Path,CaseID:String;MainCase:Boolean):Boolean; //傳送案件",
+    "lIndex": 6457,
+    "rIndex": 6734
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.NewTreeNodeRefresh;",
+    "lIndex": 6735,
+    "rIndex": 6745
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MyTreeNode1Refresh;",
+    "lIndex": 6746,
+    "rIndex": 6753
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MyTreeNode2ReFresh(CaseID:String);",
+    "lIndex": 6754,
+    "rIndex": 6763
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MyTreeNode3ReFresh(CaseID:String);",
+    "lIndex": 6764,
+    "rIndex": 6771
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Node2DocNo(Node2:TTreeNode):String;  //MyTreeNode2取DocNo出來",
+    "lIndex": 6772,
+    "rIndex": 6785
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Node3DocNo(Node3:TTreeNode):String;  //MyTreeNode3取DocNo出來",
+    "lIndex": 6786,
+    "rIndex": 6799
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Node3FormID(Node3:TTreeNode):String;  //MyTreeNode3取FormCode出來",
+    "lIndex": 6800,
+    "rIndex": 6814
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetNode2Name(Node2:TTreeNode):String;  //取MyTreeNode2的識別字出來(記之前點選用)",
+    "lIndex": 6815,
+    "rIndex": 6933
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DownLoadImage(Path,CaseID:String):Boolean;",
+    "lIndex": 6934,
+    "rIndex": 6979
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Down_Img(Path,CaseID:String):Boolean;",
+    "lIndex": 6980,
+    "rIndex": 7032
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetNoNameCase(Path:String):String; //取未配號XXXX",
+    "lIndex": 7033,
+    "rIndex": 7046
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CaseResort(Path:String); //案件的檔案重新排序(次文件依Docno排)",
+    "lIndex": 7047,
+    "rIndex": 7184
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CaseResort2Scanlist(Path:String); //案件的檔案重新排序給scanlist(次文件依FormID排)",
+    "lIndex": 7185,
+    "rIndex": 7306
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DistinctDocinCase(Path:String); //列出案件裡的Docno_版本",
+    "lIndex": 7307,
+    "rIndex": 7351
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DistinctDocNoinCase(Path:String); //列出案件裡的Docno",
+    "lIndex": 7352,
+    "rIndex": 7387
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ClearErrini(CaseID:String;CaseNode:TTreeNode); //清掉檢核檔案",
+    "lIndex": 7388,
+    "rIndex": 7406
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetCaseList(Mode:Char;Index:Integer;text:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "lIndex": 7407,
+    "rIndex": 7445
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetDocNoList(Mode:Char;Index:Integer;CaseNo,DocDir,Copies:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "lIndex": 7446,
+    "rIndex": 7516
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetContextList(Mode:Char;Index:Integer;CaseNo,DocDir,FileName:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "lIndex": 7517,
+    "rIndex": 7565
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetAttContextList(Mode:Char;Index:Integer;CaseNo,FileName:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "lIndex": 7566,
+    "rIndex": 7608
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.checkCaseOMRDone:Boolean;  //檢查案件是否完成OMR檢核",
+    "lIndex": 7609,
+    "rIndex": 7623
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.checkFormCodeIsCustom(path, formcode: string): boolean;",
+    "lIndex": 7624,
+    "rIndex": 7644
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckCaseID_OK:Boolean;  //檢查是否有未配號的案件",
+    "lIndex": 7645,
+    "rIndex": 7659
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckCaseAttach_OK:Boolean;  //檢查是否有未歸類的案件",
+    "lIndex": 7660,
+    "rIndex": 7677
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateEmptyCase(Path,CaseID:String);  //產生空白案號(重掃件用)",
+    "lIndex": 7678,
+    "rIndex": 7691
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.InitScrollRec;",
+    "lIndex": 7692,
+    "rIndex": 7701
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GetScrollData(ISB:TImageScrollBox;Var HS,VS:Integer;Var iRate:Single);",
+    "lIndex": 7702,
+    "rIndex": 7711
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetScrollData(ISB:TImageScrollBox;HS,VS:Integer;iRate:Single);",
+    "lIndex": 7712,
+    "rIndex": 7721
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FormIDReplace(CaseID,DocDir,OldFormID,NewFormID:String); //指定FormID更換成新的FormID",
+    "lIndex": 7722,
+    "rIndex": 7840
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ShowFileReplace(Path,NewFormID:String);//顯示的影像換成新的FormID",
+    "lIndex": 7841,
+    "rIndex": 7856
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PageReplaceFormID(Path,NowFormID,NewFormID:String); //選取頁更換FormID",
+    "lIndex": 7857,
+    "rIndex": 7906
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ModeNeedCheck(OMRMode,ScanMode:String):Boolean; //掃瞄模式是否要做檢核",
+    "lIndex": 7907,
+    "rIndex": 7913
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCasePage(Path,CaseID:String):Integer;",
+    "lIndex": 7914,
+    "rIndex": 7984
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFormIDPage(FileList:TStringlist;FormID:String):Integer;",
+    "lIndex": 7985,
+    "rIndex": 7999
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetFile2Case(CaseID,FileName:String);",
+    "lIndex": 8000,
+    "rIndex": 8013
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.WriteResize(ImgName,TxtName:String); //產生Resize.dat",
+    "lIndex": 8014,
+    "rIndex": 8056
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCase_PageCount(var CaseCount,PageCount:Integer):Boolean; //取出案件的數量及頁數",
+    "lIndex": 8057,
+    "rIndex": 8134
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindNoSaveBarCode : Boolean; //找是否有不要儲存影像的條碼",
+    "lIndex": 8135,
+    "rIndex": 8154
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.BarCode2CaseID : String; //Barcode依規則轉成CaseID",
+    "lIndex": 8155,
+    "rIndex": 8172
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.BarCode2FormID : String; //Barcode依規則轉成FormID",
+    "lIndex": 8173,
+    "rIndex": 8195
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.WriteCaseIndex(Path:String);",
+    "lIndex": 8196,
+    "rIndex": 8213
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReadCaseIndex(Path:String);",
+    "lIndex": 8214,
+    "rIndex": 8242
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ReduceLogFile; //20171011 必免log檔掌太大",
+    "lIndex": 8243,
+    "rIndex": 8263
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ClearCaseIndex;",
+    "lIndex": 8264,
+    "rIndex": 8269
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GetSelectImageFile;",
+    "lIndex": 8270,
+    "rIndex": 8290
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNoDir(Path,DocNo:String):String; //取出目前DocNo的份數",
+    "lIndex": 8291,
+    "rIndex": 8312
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckFormIDExists(DocNoNode:TTreeNode;FormID:String):Boolean; //檢查FormID是否存在文件裡",
+    "lIndex": 8313,
+    "rIndex": 8327
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2DocNoDir(Path,DocNo:String):String;    //DocNo轉成DocNo(份數)目錄",
+    "lIndex": 8328,
+    "rIndex": 8349
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoDir2DocNo(DocNoDir:String):String; //DocNo(份數)目錄轉成DocNo",
+    "lIndex": 8350,
+    "rIndex": 8365
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoDir2Index(Path,DocNoDir:String):Integer; //DocNo(份數)目錄轉成index",
+    "lIndex": 8366,
+    "rIndex": 8387
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ZipMainFile(SoPath,DePath,ZipName:String);",
+    "lIndex": 8388,
+    "rIndex": 8460
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ZipMaskFile(SoPath,MarkPath,DePath,ZipName:String); //壓縮遮罩影像檔",
+    "lIndex": 8461,
+    "rIndex": 8494
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ParserPoint(S:String); //解析十字點的字串",
+    "lIndex": 8495,
+    "rIndex": 8525
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckScanDenialTime:Boolean;",
+    "lIndex": 8526,
+    "rIndex": 8539
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormID2Anchor(FormID:String):String;  //用FormID取出十字模式",
+    "lIndex": 8540,
+    "rIndex": 8551
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Index2Anchor(Anchor:String):String;   //十字模式 0->NONE;1->ANCHOR;2->FRAME",
+    "lIndex": 8552,
+    "rIndex": 8561
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScanDuplexCBClick(Sender: TObject);",
+    "lIndex": 8562,
+    "rIndex": 8567
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScanGrayCBClick(Sender: TObject);",
+    "lIndex": 8568,
+    "rIndex": 8596
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFormatID(CaseID: string):String;",
+    "lIndex": 8597,
+    "rIndex": 8620
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.MemoInfoTransfer(Mode,Str:String;ID_S,Name_S:TStringlist):String;  //註記代碼註記類別轉換  Mode 'ID':代碼轉名稱;'NAME':名稱轉代碼",
+    "lIndex": 8621,
+    "rIndex": 8650
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetSQLData(ColumeStr:String;FromList,ToList:TStringlist); //把SQL值塞入",
+    "lIndex": 8651,
+    "rIndex": 8662
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSQLData(TableList:TStringlist;Colname:String;colNo:Integer):String; //依欄位及索引取值",
+    "lIndex": 8663,
+    "rIndex": 8723
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindSQLData(TableList:TStringlist;ColumeStr,KeyColumeStr,KeyStr:String;ColNo:Integer;Var ResultList:TStringlist):Boolean; //找指定的資料",
+    "lIndex": 8724,
+    "rIndex": 8802
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFindResult(Col:String):String;",
+    "lIndex": 8803,
+    "rIndex": 8820
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DataLoading(Loading:Boolean;UseTimer:Boolean);  //資料載入中要停止點選的動作",
+    "lIndex": 8821,
+    "rIndex": 8855
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CaseHelpBtnClick(Sender: TObject);",
+    "lIndex": 8856,
+    "rIndex": 8926
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CheckCaseBtnClick(Sender: TObject);",
+    "lIndex": 8927,
+    "rIndex": 8965
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ClearView(stkv:Integer);",
+    "lIndex": 8966,
+    "rIndex": 8981
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DrawDocItem2(CaseNode : TTreenode;Caseno:String):Boolean;  //畫出文件名稱的Tree",
+    "lIndex": 8982,
+    "rIndex": 9241
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.initkscan;",
+    "lIndex": 9242,
+    "rIndex": 9262
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.initParameter;",
+    "lIndex": 9263,
+    "rIndex": 9304
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PrtLbClick(Sender: TObject);",
+    "lIndex": 9305,
+    "rIndex": 9375
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.UseOldCaseLbClick(Sender: TObject);",
+    "lIndex": 9376,
+    "rIndex": 9529
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LastInitFormidListCreate(path: string);",
+    "lIndex": 9530,
+    "rIndex": 9550
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.LoadFileGetMD5(const filename: string): string;",
+    "lIndex": 9551,
+    "rIndex": 9574
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LoadImgFile;  //載入新件及替換件",
+    "lIndex": 9575,
+    "rIndex": 9660
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LoadImgFile1;  //載入新件及替換件",
+    "lIndex": 9661,
+    "rIndex": 9770
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LoadAttFile(CaseID:String); //載入附加檔案",
+    "lIndex": 9771,
+    "rIndex": 9791
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.logTimeString: String;",
+    "lIndex": 9792,
+    "rIndex": 9796
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindDivFormCode(FormCode:String):Boolean; //找有沒有分案的條碼",
+    "lIndex": 9797,
+    "rIndex": 9824
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckAvailable:Boolean; //檢查是否可使用元件",
+    "lIndex": 9825,
+    "rIndex": 9922
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SmoothCBClick(Sender: TObject);",
+    "lIndex": 9923,
+    "rIndex": 9931
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Case2Mask(SoPath,DePath:String):Boolean;//產生遮罩影像  20170639 發現沒用到",
+    "lIndex": 9932,
+    "rIndex": 9995
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckNeedCrop(Graphic:TDibGraphic):Boolean; //是否是A3要切影像",
+    "lIndex": 9996,
+    "rIndex": 10021
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetNewCustomDocNo(Path,DocName:String):String; //取出未使用的自訂文件代號",
+    "lIndex": 10022,
+    "rIndex": 10086
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomDocName(Path,DocNo:String):String; //取出自定文件名稱",
+    "lIndex": 10087,
+    "rIndex": 10098
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomFormID(Path,DocNo:String):String; //取出自定文件FormID",
+    "lIndex": 10099,
+    "rIndex": 10110
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomDocDir(Path,DocName:String):String; //取出自定文件DocDir",
+    "lIndex": 10111,
+    "rIndex": 10137
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindCustomDocName(Path,DocName:String):Boolean; //尋找自定文件名稱是否存在",
+    "lIndex": 10138,
+    "rIndex": 10161
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DelAttFileLBClick(Sender: TObject);",
+    "lIndex": 10162,
+    "rIndex": 10196
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteCustomDocDir(Path,DocNo:String); //刪除自定文件DocNo",
+    "lIndex": 10197,
+    "rIndex": 10208
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckFormID_Prt(FormID:String):Boolean; //傳入的FormID是否預設列印",
+    "lIndex": 10209,
+    "rIndex": 10218
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PrintImg(FileName, LoginID, Datetime,",
+    "lIndex": 10219,
+    "rIndex": 10297
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindLastestDocDir(CaseID,DocNo:String):String; //找出最新的DocDir",
+    "lIndex": 10298,
+    "rIndex": 10322
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindLastestDocDirForPage(CaseID,DocNo,formid:String):String; //找出最新的DocDir  20180207  排除隱藏的資料夾",
+    "lIndex": 10323,
+    "rIndex": 10364
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.Create_Cust_DocDir(CaseID:String); //產生外面傳入的文件代號及自定文件",
+    "lIndex": 10365,
+    "rIndex": 10455
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.OldCasetoNewCase(CaseID:String); //將舊案份數轉成新規則",
+    "lIndex": 10456,
+    "rIndex": 10524
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ErrFormtoCurrentForm(CaseID,EFormID,CFormID:String);//將舊案的錯誤FormID改正確的FormID",
+    "lIndex": 10525,
+    "rIndex": 10574
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetRecordEditedDocDir(Mode:Char;CaseID,DocDir:String);  //記錄被異動的文件目錄  'A:加入D:刪掉'",
+    "lIndex": 10575,
+    "rIndex": 10622
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocDir_Page(CaseID,DocDir:String):Integer;",
+    "lIndex": 10623,
+    "rIndex": 10639
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Path2DocDir(Path,CaseID:String):String;",
+    "lIndex": 10640,
+    "rIndex": 10664
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNo_IS_WH(DocNo:String):Boolean; //DocNo是否為入庫文件",
+    "lIndex": 10665,
+    "rIndex": 10679
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SortDocDir_FormID(CaseID,DocDir:String); //將DocDir裡的文件編號排序",
+    "lIndex": 10680,
+    "rIndex": 10752
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GotoAttach(OldLevel:Integer);",
+    "lIndex": 10753,
+    "rIndex": 10774
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoIs_In_WH(DocNo:String):Boolean; //DocNo是否為入庫文件",
+    "lIndex": 10775,
+    "rIndex": 10794
+  },
+  {
+    "matcher": "Procedure  TCB_IMGPSScanX.CreateCaseNeedData(Path:String);",
+    "lIndex": 10795,
+    "rIndex": 10840
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetDocDirtoSelected(CaseNode:TTreeNode;DocDir:String);",
+    "lIndex": 10841,
+    "rIndex": 10853
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckSelectImg_UseCase(Path,CaseID:String):Boolean; //檢查選擇的影像是否有包含被引用的影像",
+    "lIndex": 10854,
+    "rIndex": 10876
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.TransOldCaseFile(Path:String):Boolean;",
+    "lIndex": 10877,
+    "rIndex": 10937
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Writelog(CaseID : String):Boolean;",
+    "lIndex": 10938,
+    "rIndex": 10963
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFtpinfo(CaseID,Action:String):Boolean;",
+    "lIndex": 10964,
+    "rIndex": 11041
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetFtpInfo;     //餵入FTP資訊",
+    "lIndex": 11042,
+    "rIndex": 11071
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FtpCaseComplete(SendData:String):Boolean;",
+    "lIndex": 11072,
+    "rIndex": 11094
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormIDAppear(FormID:String):Boolean; //FormID是否可出現",
+    "lIndex": 11095,
+    "rIndex": 11120
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoAppear(DocNo:String):Boolean;   //DocNo是否可出現",
+    "lIndex": 11121,
+    "rIndex": 11137
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNoCount(CaseID,DocNo:String):Integer; //取DocNo數量",
+    "lIndex": 11138,
+    "rIndex": 11167
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocDirCopies(CaseID,DocDir:String):Integer; //取DocDir數量",
+    "lIndex": 11168,
+    "rIndex": 11197
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetDocDirCopies(CaseID,DocDir:String;NewCopies:Integer); //修改DocDir份數",
+    "lIndex": 11198,
+    "rIndex": 11225
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocDirCopies_Rec(Path,CaseID,DocDir:String):Integer; //取記錄裡的DocDir份數",
+    "lIndex": 11226,
+    "rIndex": 11277
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomNameCount(CustomName:String):Integer;   //取外傳的名稱數量",
+    "lIndex": 11278,
+    "rIndex": 11301
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomDocNoCount(Docno:String):Integer;   //取外傳的DocNo數量",
+    "lIndex": 11302,
+    "rIndex": 11325
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ISGuideFormID(FormID:String):Boolean;",
+    "lIndex": 11326,
+    "rIndex": 11340
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ISDivPageFormID(FormID:String):Boolean;",
+    "lIndex": 11341,
+    "rIndex": 11356
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.ISExistImg(const filename: string): boolean;",
+    "lIndex": 11357,
+    "rIndex": 11368
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseDelete_Enable(CaseID:String):Boolean;  //案件可否被刪除",
+    "lIndex": 11369,
+    "rIndex": 11389
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MoveImage(Path:String;mp:Integer); //移動頁數",
+    "lIndex": 11390,
+    "rIndex": 11447
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MoveImage_Drag(Path:String;fp,tp:Integer); //拖拉移動頁數",
+    "lIndex": 11448,
+    "rIndex": 11505
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetUseCase(Mode:Char;Path,DocDir,FormCaseID,ToCaseID:String);   //記錄引用其他案件 A:加入 D:刪掉",
+    "lIndex": 11506,
+    "rIndex": 11526
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetUseCase(Mode:Char;Path,DocDir:String):String;  //F:取被引用 To:引用",
+    "lIndex": 11527,
+    "rIndex": 11546
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.Case2upload(CaseID:String);",
+    "lIndex": 11547,
+    "rIndex": 11672
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.Download2Case(SoDir,DeDir:String);",
+    "lIndex": 11673,
+    "rIndex": 11844
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2FormName(CaseID,FormCode:String):String; //用FormCode轉成文件名稱",
+    "lIndex": 11845,
+    "rIndex": 11895
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2FileName(FormCode:String;List:TStrings):String; //用FormCode找出檔名(第一頁)",
+    "lIndex": 11896,
+    "rIndex": 11918
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2FormCode(FileName:String):String; //從檔名取出FormCode",
+    "lIndex": 11919,
+    "rIndex": 11935
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2FormName(CaseID,FileName:String):String; //從檔名取出文件名稱",
+    "lIndex": 11936,
+    "rIndex": 11940
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2ScanPage(FileName:String):Integer; //從檔名轉出掃瞄頁數",
+    "lIndex": 11941,
+    "rIndex": 11952
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2NoQuene_Filename(FileName:String):String; //取出沒有序號的檔名",
+    "lIndex": 11953,
+    "rIndex": 11965
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2Index(FileName:String):Integer; //從檔名取出在ContextList的序號",
+    "lIndex": 11966,
+    "rIndex": 11979
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2NowDcoNo(FileName:String;CtList,DNList:TStrings):String; //從檔名取出歸屬的文件代號",
+    "lIndex": 11980,
+    "rIndex": 11993
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2DocNo(FormCode:String):String;   //FormCode轉Docno",
+    "lIndex": 11994,
+    "rIndex": 12018
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2Version(FormCode:String):String; //FormCode轉版本",
+    "lIndex": 12019,
+    "rIndex": 12023
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2Page(FormCode:String):String; //FormCode轉頁數",
+    "lIndex": 12024,
+    "rIndex": 12028
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2DocName(CaseID,DocNo:String):String; //Docno轉Doc名稱",
+    "lIndex": 12029,
+    "rIndex": 12066
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2FileName(DocNo:String;List:TStrings):String; //用DocNo找出檔名(第一頁)",
+    "lIndex": 12067,
+    "rIndex": 12081
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2WorkNo(FormCode:String):String; //用FormCode取出作業別",
+    "lIndex": 12082,
+    "rIndex": 12090
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2WorkNo(DocNo:String):String; //用DocNo取出作業別",
+    "lIndex": 12091,
+    "rIndex": 12099
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoNeedDiv(DocNo:String):Boolean; //是否是需分份數的文件代號",
+    "lIndex": 12100,
+    "rIndex": 12112
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseNode2Info(Node:TTreeNode;Mode:Char):String;   //案件Node取案件編號  Mode: I:Caseno;P:Page",
+    "lIndex": 12113,
+    "rIndex": 12126
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNode2Info(Node:TTreeNode;Mode:Char):String;   //文件Node取文件代號 Mode: I:Docno;N:Docname;P:Page;G:Group",
+    "lIndex": 12127,
+    "rIndex": 12144
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormNode2Info(Node:TTreeNode;Mode:Char):String;   //表單Node取表單代號  Mode: I:FormID;N:FormName;P:Page",
+    "lIndex": 12145,
+    "rIndex": 12160
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PriorPage(Page:Integer); //上一頁",
+    "lIndex": 12161,
+    "rIndex": 12171
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.NextPage(Page:Integer); //下一頁",
+    "lIndex": 12172,
+    "rIndex": 12182
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoExistsinTree(CaseNode:TTreeNode;DocNo:String):Boolean; //是否己存在樹裡",
+    "lIndex": 12183,
+    "rIndex": 12198
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocnoNeedGroup(DocNo:String):Boolean; //傳入的DocNo是否需分組",
+    "lIndex": 12199,
+    "rIndex": 12208
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DistinctFormCode(CaseID:String); //從案件裡的FormCode取出第一頁",
+    "lIndex": 12209,
+    "rIndex": 12254
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.OMRCheckCase(CaseID:String):Boolean; //OMR檢核",
+    "lIndex": 12255,
+    "rIndex": 12950
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.OMRErr2ini(CaseID,Reason,FileName,Site,RelaFileName,RelaSite,Anchor,Anchor1:String;Del,Ingnore,Display:Boolean); //OMR檢核失敗寫入ini",
+    "lIndex": 12951,
+    "rIndex": 12990
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.OMRErrini2List(CaseID:String;ErrlistForm:TErrlistForm); //OMR檢核失敗從ini寫入ListView",
+    "lIndex": 12991,
+    "rIndex": 13020
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.OMRErrini2ListForLog(CaseID: String): String;",
+    "lIndex": 13021,
+    "rIndex": 13058
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DownLanguage:Boolean;  //下載多國語言檔",
+    "lIndex": 13059,
+    "rIndex": 13083
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.view_image_FormCode(Path,FormCode:String;stpage,stview:integer); //用FormCode來找影像",
+    "lIndex": 13084,
+    "rIndex": 13199
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.view_image_DocNo(Path,DocNo,FormID:String;Pages:integer); //用DocNo來找影像",
+    "lIndex": 13200,
+    "rIndex": 13394
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ShapeName2PreViewISBName(SP:TShape):String; //轉出指定PreViewISBName",
+    "lIndex": 13395,
+    "rIndex": 13399
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton14Click(Sender: TObject);",
+    "lIndex": 13400,
+    "rIndex": 13422
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton15Click(Sender: TObject);",
+    "lIndex": 13423,
+    "rIndex": 13443
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton16Click(Sender: TObject);",
+    "lIndex": 13444,
+    "rIndex": 13464
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton17Click(Sender: TObject);",
+    "lIndex": 13465,
+    "rIndex": 13469
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton18Click(Sender: TObject);",
+    "lIndex": 13470,
+    "rIndex": 13474
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton19Click(Sender: TObject);",
+    "lIndex": 13475,
+    "rIndex": 13479
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton20Click(Sender: TObject);",
+    "lIndex": 13480,
+    "rIndex": 13484
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton21Click(Sender: TObject);",
+    "lIndex": 13485,
+    "rIndex": 13490
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton22Click(Sender: TObject);",
+    "lIndex": 13491,
+    "rIndex": 13496
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton3Click(Sender: TObject);",
+    "lIndex": 13497,
+    "rIndex": 13501
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreatePreViewISB(Count:Integer);",
+    "lIndex": 13502,
+    "rIndex": 13550
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FreePreViewISB;",
+    "lIndex": 13551,
+    "rIndex": 13580
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FitPreViewISB;",
+    "lIndex": 13581,
+    "rIndex": 13617
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PaintShape(FromImg,ToImg:TImageScrollBox); //畫有被選取的影像",
+    "lIndex": 13618,
+    "rIndex": 13673
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FreeShapeobj(SelectISB : TImageScrollBox);",
+    "lIndex": 13674,
+    "rIndex": 13694
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ISBClick(Sender : TObject);",
+    "lIndex": 13695,
+    "rIndex": 13733
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ISBMouseMove(Sender: TObject; Shift: TShiftState;",
+    "lIndex": 13734,
+    "rIndex": 13747
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBImageMouseDown(Sender: TObject; Button: TMouseButton;",
+    "lIndex": 13748,
+    "rIndex": 13821
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBImageMouseUp(Sender: TObject; Button: TMouseButton;",
+    "lIndex": 13822,
+    "rIndex": 13827
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBEndDrag(Sender, Target: TObject; X, Y: Integer);",
+    "lIndex": 13828,
+    "rIndex": 13832
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBDragDrop(Sender, Source: TObject; X, Y: Integer);",
+    "lIndex": 13833,
+    "rIndex": 13842
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBDragOver(Sender, Source: TObject; X, Y: Integer;",
+    "lIndex": 13843,
+    "rIndex": 13863
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindMpsView(Vmode: Integer):TImageScrollBox;",
+    "lIndex": 13864,
+    "rIndex": 13889
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCaseFormID(Path:String):String;  //取案件的主FormID",
+    "lIndex": 13890,
+    "rIndex": 13911
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateFormID_FormName(Path,CaseID:String);  //產生FormID_FormName.dat",
+    "lIndex": 13912,
+    "rIndex": 13931
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateDocNo_DocName(Path,CaseID:String);  //產生DocNo_DocName.dat",
+    "lIndex": 13932,
+    "rIndex": 13953
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateIn_WH(CaseID:String);  //產生In_WH.dat",
+    "lIndex": 13954,
+    "rIndex": 13984
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateDocNo_Info(CaseID:String):String; //產生 DocNo[tab]份數[tab]總頁數[tab]是否異動[換行]DocNo[tab]份數[tab]總頁數[tab]是否異動",
+    "lIndex": 13985,
+    "rIndex": 14068
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateCustDocNo_Info(CaseID:String):String; //產生自訂文件 DocName[tab]份數[tab]總頁數[tab]是否異動[#13#10]DocName[tab]份數[tab]總頁數[tab]是否異動",
+    "lIndex": 14069,
+    "rIndex": 14121
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateDocnoFrom_Info(CaseID:String):String; //產生被引進的保管袋文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號",
+    "lIndex": 14122,
+    "rIndex": 14186
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateCustDocNoFrom_Info(CaseID:String):String; //產生被引進的自定文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號",
+    "lIndex": 14187,
+    "rIndex": 14244
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateAttach_Info(CaseID:String):String; //產生是否有Attach Y:有 N:沒有",
+    "lIndex": 14245,
+    "rIndex": 14251
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNoEdit(CaseID,DocNo,DocName:String):String; //取出DocNo是否被異動 (Y/N)",
+    "lIndex": 14252,
+    "rIndex": 14291
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNo_Count(Path,DocNo:String):Integer;  //取出文件份數",
+    "lIndex": 14292,
+    "rIndex": 14331
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNo_Page(Path,DocNo:String):Integer;  //取出文件總頁數",
+    "lIndex": 14332,
+    "rIndex": 14358
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormIDExists(FormCode:String;CheckDate:Boolean;index:Integer):Boolean;  //檢查FormID是否存在",
+    "lIndex": 14359,
+    "rIndex": 14396
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Case_DocNoExists(CaseID,Docno:String):Boolean; //Docno是否存在案件裡",
+    "lIndex": 14397,
+    "rIndex": 14421
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CB1Click(Sender: TObject);",
+    "lIndex": 14422,
+    "rIndex": 14426
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReSortFileName(Path:String); //檔名重新排序",
+    "lIndex": 14427,
+    "rIndex": 14454
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReSortFileName_New(Path:String); //檔名重新排序",
+    "lIndex": 14455,
+    "rIndex": 14481
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReSortFileName2Scanlist(Path:String); //檔名重新排序給Scanlist.dat",
+    "lIndex": 14482,
+    "rIndex": 14506
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetOMRCheckSet : Boolean; //下載OMR檢核XML檔",
+    "lIndex": 14507,
+    "rIndex": 14565
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetKeyinSet : Boolean; //取登打設定",
+    "lIndex": 14566,
+    "rIndex": 14624
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseAsk(CaseID: string):Integer;",
+    "lIndex": 14625,
+    "rIndex": 14674
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseComplete(Path,CaseID:String;MainCase:Boolean):Boolean;  //通知傳送完成",
+    "lIndex": 14675,
+    "rIndex": 14903
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Timer1Timer(Sender: TObject);",
+    "lIndex": 14904,
+    "rIndex": 15337
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Timer2Timer(Sender: TObject);",
+    "lIndex": 15338,
+    "rIndex": 15346
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TransBtnClick(Sender: TObject);",
+    "lIndex": 15347,
+    "rIndex": 15538
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1Click(Sender: TObject);",
+    "lIndex": 15539,
+    "rIndex": 15766
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);",
+    "lIndex": 15767,
+    "rIndex": 15943
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;",
+    "lIndex": 15944,
+    "rIndex": 15978
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1KeyUp(Sender: TObject; var Key: Word;",
+    "lIndex": 15979,
+    "rIndex": 15992
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseDown(Sender: TObject;",
+    "lIndex": 15993,
+    "rIndex": 16003
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseEnter(Sender: TObject);",
+    "lIndex": 16004,
+    "rIndex": 16008
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseMove(Sender: TObject; Shift: TShiftState;",
+    "lIndex": 16009,
+    "rIndex": 16016
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;",
+    "lIndex": 16017,
+    "rIndex": 16032
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ViewModeBtnMouseEnter(Sender: TObject);",
+    "lIndex": 16033,
+    "rIndex": 16037
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_caseid(const Value: WideString);",
+    "lIndex": 16038,
+    "rIndex": 16042
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_data(const Value: WideString);",
+    "lIndex": 16043,
+    "rIndex": 16047
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_mode(const Value: WideString);",
+    "lIndex": 16048,
+    "rIndex": 16052
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_rewrite(const Value: WideString);",
+    "lIndex": 16053,
+    "rIndex": 16057
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_url(const Value: WideString);",
+    "lIndex": 16058,
+    "rIndex": 16062
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_userid(const Value: WideString);",
+    "lIndex": 16063,
+    "rIndex": 16067
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_username(const Value: WideString);",
+    "lIndex": 16068,
+    "rIndex": 16072
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_verify(const Value: WideString);",
+    "lIndex": 16073,
+    "rIndex": 16077
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_language(const Value: WideString);",
+    "lIndex": 16078,
+    "rIndex": 16090
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_modename(const Value: WideString);",
+    "lIndex": 16091,
+    "rIndex": 16095
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_userunit(const Value: WideString);",
+    "lIndex": 16096,
+    "rIndex": 16100
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_work_no(const Value: WideString);",
+    "lIndex": 16101,
+    "rIndex": 16105
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_loandoc_enable(const Value: WideString);",
+    "lIndex": 16106,
+    "rIndex": 16117
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_loandoc_value(const Value: WideString);",
+    "lIndex": 16118,
+    "rIndex": 16122
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_useproxy(const Value: WideString);",
+    "lIndex": 16123,
+    "rIndex": 16130
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_c_docnamelist(const Value: WideString);",
+    "lIndex": 16131,
+    "rIndex": 16135
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_c_docnolist(const Value: WideString);",
+    "lIndex": 16136,
+    "rIndex": 16140
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_fixfilelist(const Value: WideString);",
+    "lIndex": 16141,
+    "rIndex": 16145
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_is_in_wh(const Value: WideString);",
+    "lIndex": 16146,
+    "rIndex": 16150
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_oldcaseinfo(const Value: WideString);",
+    "lIndex": 16151,
+    "rIndex": 16155
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_c_docnamelist: WideString;",
+    "lIndex": 16156,
+    "rIndex": 16160
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_c_docnolist: WideString;",
+    "lIndex": 16161,
+    "rIndex": 16165
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_caseid: WideString;",
+    "lIndex": 16166,
+    "rIndex": 16170
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_data: WideString;",
+    "lIndex": 16171,
+    "rIndex": 16175
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_fixfilelist: WideString;",
+    "lIndex": 16176,
+    "rIndex": 16180
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_is_in_wh: WideString;",
+    "lIndex": 16181,
+    "rIndex": 16185
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_language: WideString;",
+    "lIndex": 16186,
+    "rIndex": 16190
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_loandoc_enable: WideString;",
+    "lIndex": 16191,
+    "rIndex": 16195
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_loandoc_value: WideString;",
+    "lIndex": 16196,
+    "rIndex": 16200
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_mode: WideString;",
+    "lIndex": 16201,
+    "rIndex": 16205
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_modename: WideString;",
+    "lIndex": 16206,
+    "rIndex": 16210
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_oldcaseinfo: WideString;",
+    "lIndex": 16211,
+    "rIndex": 16215
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_rewrite: WideString;",
+    "lIndex": 16216,
+    "rIndex": 16220
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_url: WideString;",
+    "lIndex": 16221,
+    "rIndex": 16225
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_useproxy: WideString;",
+    "lIndex": 16226,
+    "rIndex": 16230
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_userid: WideString;",
+    "lIndex": 16231,
+    "rIndex": 16235
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_username: WideString;",
+    "lIndex": 16236,
+    "rIndex": 16240
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_userunit: WideString;",
+    "lIndex": 16241,
+    "rIndex": 16245
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_verify: WideString;",
+    "lIndex": 16246,
+    "rIndex": 16250
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_work_no: WideString;",
+    "lIndex": 16251,
+    "rIndex": 16255
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_printyn: WideString;",
+    "lIndex": 16256,
+    "rIndex": 16260
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_printyn(const Value: WideString);",
+    "lIndex": 16261,
+    "rIndex": 16265
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_is_oldcase: WideString;",
+    "lIndex": 16266,
+    "rIndex": 16270
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_is_oldcase(const Value: WideString);",
+    "lIndex": 16271,
+    "rIndex": 16275
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_custdocyn: WideString;",
+    "lIndex": 16276,
+    "rIndex": 16280
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_custdocyn(const Value: WideString);",
+    "lIndex": 16281,
+    "rIndex": 16285
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_casenolength: WideString;",
+    "lIndex": 16286,
+    "rIndex": 16290
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_filesizelimit: WideString;",
+    "lIndex": 16291,
+    "rIndex": 16295
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_imgdpi: WideString;",
+    "lIndex": 16296,
+    "rIndex": 16300
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_scancolor: WideString;",
+    "lIndex": 16301,
+    "rIndex": 16305
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_casenolength(const Value: WideString);",
+    "lIndex": 16306,
+    "rIndex": 16320
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_filesizelimit(const Value: WideString);",
+    "lIndex": 16321,
+    "rIndex": 16335
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_imgdpi(const Value: WideString);",
+    "lIndex": 16336,
+    "rIndex": 16351
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_scancolor(const Value: WideString);",
+    "lIndex": 16352,
+    "rIndex": 16376
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_imgdelete: WideString;",
+    "lIndex": 16377,
+    "rIndex": 16381
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_imgdelete(const Value: WideString);",
+    "lIndex": 16382,
+    "rIndex": 16386
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_check_main_form: WideString;",
+    "lIndex": 16387,
+    "rIndex": 16391
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_isExternal: WideString;",
+    "lIndex": 16392,
+    "rIndex": 16396
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_check_main_form(const Value: WideString);",
+    "lIndex": 16397,
+    "rIndex": 16401
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_isExternal(const Value: WideString);",
+    "lIndex": 16402,
+    "rIndex": 16406
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_WH_CATEGORY: WideString;",
+    "lIndex": 16407,
+    "rIndex": 16411
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_WH_CATEGORY(const Value: WideString);",
+    "lIndex": 16412,
+    "rIndex": 16455
+  }
+]
\ No newline at end of file
diff --git a/doc/curtis/prompt/scanimpl_analysis/step2_classified_methods.json b/doc/curtis/prompt/scanimpl_analysis/step2_classified_methods.json
new file mode 100644
index 0000000..39f275f
--- /dev/null
+++ b/doc/curtis/prompt/scanimpl_analysis/step2_classified_methods.json
@@ -0,0 +1,5318 @@
+[
+  {
+    "matcher": "function TCB_IMGPSScanX.GetCurrentVersionNo: String; //獲取自身版本號所需要",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1052",
+    "rIndex": "1085",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.WMMOUSEWHEEL(var message: TWMMouseWheel);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1086",
+    "rIndex": "1171",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.WNoteBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1172",
+    "rIndex": "1246",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1247",
+    "rIndex": "1253",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.EventSinkChanged(const EventSink: IUnknown);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1254",
+    "rIndex": "1259",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC0Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1260",
+    "rIndex": "1270",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1271",
+    "rIndex": "1281",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC2Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1282",
+    "rIndex": "1292",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC3Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1293",
+    "rIndex": "1303",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC4Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1304",
+    "rIndex": "1314",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC5Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1315",
+    "rIndex": "1325",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.FC6Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "1326",
+    "rIndex": "1337",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.InitExistImgList(casepath: String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1338",
+    "rIndex": "1362",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Initialize;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1363",
+    "rIndex": "1386",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "1387",
+    "rIndex": "1406",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1EndScroll(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "1407",
+    "rIndex": "1421",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1Enter(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "1422",
+    "rIndex": "1426",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1ImageMouseDown(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "1427",
+    "rIndex": "1463",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1ImageMouseMove(Sender: TObject; Shift: TShiftState;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "1464",
+    "rIndex": "1489",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISB1ImageMouseUp(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "1490",
+    "rIndex": "1524",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Active: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1525",
+    "rIndex": "1529",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AlignDisabled: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1530",
+    "rIndex": "1534",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AlignWithMargins: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1535",
+    "rIndex": "1539",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AutoScroll: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1540",
+    "rIndex": "1544",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AutoSize: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1545",
+    "rIndex": "1549",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_AxBorderStyle: TxActiveFormBorderStyle;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1550",
+    "rIndex": "1554",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Caption: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1555",
+    "rIndex": "1559",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Color: OLE_COLOR;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1560",
+    "rIndex": "1564",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_DockSite: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1565",
+    "rIndex": "1569",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_DoubleBuffered: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1570",
+    "rIndex": "1574",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_DropTarget: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1575",
+    "rIndex": "1579",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Enabled: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1580",
+    "rIndex": "1584",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitHeight: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1585",
+    "rIndex": "1589",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitLeft: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1590",
+    "rIndex": "1594",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitTop: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1595",
+    "rIndex": "1599",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ExplicitWidth: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1600",
+    "rIndex": "1604",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Font: IFontDisp;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1605",
+    "rIndex": "1609",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_HelpFile: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1610",
+    "rIndex": "1614",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_KeyPreview: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1615",
+    "rIndex": "1619",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_MouseInClient: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1620",
+    "rIndex": "1624",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ParentCustomHint: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1625",
+    "rIndex": "1629",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ParentDoubleBuffered: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1630",
+    "rIndex": "1634",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_PixelsPerInch: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1635",
+    "rIndex": "1639",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_PopupMode: TxPopupMode;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1640",
+    "rIndex": "1644",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_PrintScale: TxPrintScale;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1645",
+    "rIndex": "1649",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Scaled: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1650",
+    "rIndex": "1654",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_ScreenSnap: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1655",
+    "rIndex": "1659",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_SnapBuffer: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1660",
+    "rIndex": "1664",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_UseDockManager: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1665",
+    "rIndex": "1669",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_Visible: WordBool;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1670",
+    "rIndex": "1674",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_VisibleDockClientCount: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1675",
+    "rIndex": "1679",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX._Set_Font(var Value: IFontDisp);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1680",
+    "rIndex": "1684",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ActivateEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1685",
+    "rIndex": "1689",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ClickEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1690",
+    "rIndex": "1694",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CreateEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1695",
+    "rIndex": "1699",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DblClickEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1700",
+    "rIndex": "1704",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DeactivateEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1705",
+    "rIndex": "1709",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DestroyEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1710",
+    "rIndex": "1755",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.KeyPressEvent(Sender: TObject; var Key: Char);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1756",
+    "rIndex": "1764",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1765",
+    "rIndex": "1772",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode2Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1773",
+    "rIndex": "1780",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode3Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1781",
+    "rIndex": "1787",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.mode4Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1788",
+    "rIndex": "1794",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.MouseEnterEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1795",
+    "rIndex": "1799",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.MouseLeaveEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1800",
+    "rIndex": "1804",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PaintEvent(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1805",
+    "rIndex": "1809",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AlignWithMargins(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1810",
+    "rIndex": "1814",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AutoScroll(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1815",
+    "rIndex": "1819",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AutoSize(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1820",
+    "rIndex": "1824",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_AxBorderStyle(Value: TxActiveFormBorderStyle);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1825",
+    "rIndex": "1829",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Caption(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1830",
+    "rIndex": "1834",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Color(Value: OLE_COLOR);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1835",
+    "rIndex": "1839",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_DockSite(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1840",
+    "rIndex": "1844",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_DoubleBuffered(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1845",
+    "rIndex": "1849",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_DropTarget(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1850",
+    "rIndex": "1854",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Enabled(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1855",
+    "rIndex": "1859",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Font(const Value: IFontDisp);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1860",
+    "rIndex": "1864",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_HelpFile(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1865",
+    "rIndex": "1869",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_KeyPreview(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1870",
+    "rIndex": "1874",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_ParentCustomHint(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1875",
+    "rIndex": "1879",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_ParentDoubleBuffered(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1880",
+    "rIndex": "1884",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_PixelsPerInch(Value: Integer);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1885",
+    "rIndex": "1889",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_PopupMode(Value: TxPopupMode);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1890",
+    "rIndex": "1894",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_PrintScale(Value: TxPrintScale);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1895",
+    "rIndex": "1899",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Scaled(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1900",
+    "rIndex": "1904",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_ScreenSnap(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1905",
+    "rIndex": "1909",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_SnapBuffer(Value: Integer);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1910",
+    "rIndex": "1914",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_UseDockManager(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1915",
+    "rIndex": "1919",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_Visible(Value: WordBool);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "1920",
+    "rIndex": "1924",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM401Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "1925",
+    "rIndex": "1978",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM402Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "1979",
+    "rIndex": "1988",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM403Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "1989",
+    "rIndex": "1998",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM404Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "1999",
+    "rIndex": "2067",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM601Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "2068",
+    "rIndex": "2221",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM602Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "2222",
+    "rIndex": "2300",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM604Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "2301",
+    "rIndex": "2323",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM605Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "2324",
+    "rIndex": "2361",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.N1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2362",
+    "rIndex": "2372",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.N51Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2373",
+    "rIndex": "2379",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.NewScanBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "2380",
+    "rIndex": "2427",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.NextPageBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "2428",
+    "rIndex": "2450",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.OptionBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "2451",
+    "rIndex": "2527",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageLVClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.listView"
+    ],
+    "deps": [],
+    "lIndex": "2528",
+    "rIndex": "2535",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageLVKeyUp(Sender: TObject; var Key: Word;",
+    "tags": [
+      "UIView",
+      "UIView.listView"
+    ],
+    "deps": [],
+    "lIndex": "2536",
+    "rIndex": "2542",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageLVMouseDown(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.listView"
+    ],
+    "deps": [],
+    "lIndex": "2543",
+    "rIndex": "2554",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Panel11DblClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2555",
+    "rIndex": "2561",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Panel1DblClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2562",
+    "rIndex": "2567",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Panel9Resize(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2568",
+    "rIndex": "2572",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM101Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "2573",
+    "rIndex": "2677",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.DocNoIsExistImg(DocNopath:String):boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2678",
+    "rIndex": "2701",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX._DelTreeForExistImg(ASourceDir:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "2702",
+    "rIndex": "2709",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM102Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "2710",
+    "rIndex": "2750",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM103Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "2751",
+    "rIndex": "2788",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PM104Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "2789",
+    "rIndex": "3186",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM106Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3187",
+    "rIndex": "3280",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM107Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3281",
+    "rIndex": "3285",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM108Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3286",
+    "rIndex": "3381",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM109Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3382",
+    "rIndex": "3411",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM110Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3412",
+    "rIndex": "3441",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM111Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3442",
+    "rIndex": "3472",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM301Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3473",
+    "rIndex": "3480",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM302Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3481",
+    "rIndex": "3489",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM303Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3490",
+    "rIndex": "3498",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM501Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3499",
+    "rIndex": "3505",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM502Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3506",
+    "rIndex": "3512",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM503Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3513",
+    "rIndex": "3519",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM504Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3520",
+    "rIndex": "3526",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM505Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3527",
+    "rIndex": "3547",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM507Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3548",
+    "rIndex": "3615",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM508Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3616",
+    "rIndex": "3656",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM509Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3657",
+    "rIndex": "3661",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PM510Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3662",
+    "rIndex": "3668",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu1Popup(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3669",
+    "rIndex": "3826",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu4Popup(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3827",
+    "rIndex": "3844",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu5Popup(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3845",
+    "rIndex": "3874",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PopupMenu6Popup(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.popupMenu"
+    ],
+    "deps": [],
+    "lIndex": "3875",
+    "rIndex": "3924",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PrePageBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "3925",
+    "rIndex": "3952",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SampleScanBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "3953",
+    "rIndex": "4068",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScrollBar1Change(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4069",
+    "rIndex": "4086",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScrollBox1MouseEnter(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "4087",
+    "rIndex": "4091",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SelectScanBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "4092",
+    "rIndex": "4100",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.StatusBar1DblClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.statusMessenger"
+    ],
+    "deps": [],
+    "lIndex": "4101",
+    "rIndex": "4116",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ActiveFormCreate(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4117",
+    "rIndex": "4138",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ActiveFormKeyUp(Sender: TObject; var Key: Word;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4139",
+    "rIndex": "4164",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AddAttFileLBClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4165",
+    "rIndex": "4194",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AddCredit1RGClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4195",
+    "rIndex": "4207",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AddScanBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "4208",
+    "rIndex": "4249",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AttListBoxClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.listView"
+    ],
+    "deps": [],
+    "lIndex": "4250",
+    "rIndex": "4256",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.AttListBoxDblClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.listView"
+    ],
+    "deps": [],
+    "lIndex": "4257",
+    "rIndex": "4269",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.BtnMouseEnter(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4270",
+    "rIndex": "4274",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button3Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4275",
+    "rIndex": "4334",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button4Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4335",
+    "rIndex": "4369",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button5Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4370",
+    "rIndex": "4378",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Button6Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4379",
+    "rIndex": "4389",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.StatrTwainScan;",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper"
+    ],
+    "deps": [],
+    "lIndex": "4390",
+    "rIndex": "4443",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.OnAcquire( const DibHandle    : THandle;",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper"
+    ],
+    "deps": [],
+    "lIndex": "4444",
+    "rIndex": "4683",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageDone;",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper"
+    ],
+    "deps": [],
+    "lIndex": "4684",
+    "rIndex": "4733",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PageEnd;",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper"
+    ],
+    "deps": [],
+    "lIndex": "4734",
+    "rIndex": "4950",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ExportBtClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "4951",
+    "rIndex": "5013",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ImportBtClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5014",
+    "rIndex": "5089",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.HotKeyDown (var Msg : TMessage);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5090",
+    "rIndex": "5094",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.InitialLanguage(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.i18n"
+    ],
+    "deps": [],
+    "lIndex": "5095",
+    "rIndex": "5172",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.GetSiteOMR(FileName,Site:String;bt: Integer): Integer;",
+    "tags": [
+      "ImageProcessor",
+      "ImageProcessor.anchorAnalyzer"
+    ],
+    "deps": [],
+    "lIndex": "5173",
+    "rIndex": "5227",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindISB2View(Vmode:Integer):TImageScrollBox; //找空的ISB來顯示",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "5228",
+    "rIndex": "5253",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.R_W_Scanini(Mode:Char); //'R'讀取;'W'寫入",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper"
+    ],
+    "deps": [],
+    "lIndex": "5254",
+    "rIndex": "5295",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GetDefScanIni; //取得掃瞄的預設值",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper"
+    ],
+    "deps": [],
+    "lIndex": "5296",
+    "rIndex": "5472",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.HTTPSClientCertificateValidate(Sender: TObject;",
+    "tags": [
+      "TransportManager",
+      "TransportManager.utilities"
+    ],
+    "deps": [],
+    "lIndex": "5473",
+    "rIndex": "5478",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.HTTPSClientRedirection(Sender: TObject;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5479",
+    "rIndex": "5484",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.EnableImage(v:integer;Sender : TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5485",
+    "rIndex": "5498",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DesableImage;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5499",
+    "rIndex": "5518",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ViewMouseMode(v:Integer);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5519",
+    "rIndex": "5543",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GoViewMode;",
+    "tags": [
+      "UIView",
+      "UIView.layouts"
+    ],
+    "deps": [],
+    "lIndex": "5544",
+    "rIndex": "5555",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DisplayMode(index,H_Count,W_Count:Integer;BasePanel:TPanel);",
+    "tags": [
+      "UIView",
+      "UIView.misc",
+      "影像瀏覽/顯示"
+    ],
+    "deps": [],
+    "lIndex": "5556",
+    "rIndex": "5599",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetServerDate : Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5600",
+    "rIndex": "5631",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSampleInf : Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5632",
+    "rIndex": "5664",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf1 : Boolean; //取系統設定資訊Mode1 DOC_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "5665",
+    "rIndex": "5707",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf2 : Boolean; //取系統設定資訊Mode2  DM_FORM_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "5708",
+    "rIndex": "5746",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf3 : Boolean; //取系統設定資訊mode3  FORM_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "5747",
+    "rIndex": "5786",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf4 : Boolean; //取系統設定資訊mode4  CHECK_RULE_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "5787",
+    "rIndex": "5827",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf5 : Boolean; //取系統設定資訊mode5  MEMO_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "5828",
+    "rIndex": "5866",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf6 : Boolean; //取系統設定資訊mode5  WORK_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "5867",
+    "rIndex": "5906",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSetInf7 : Boolean; //取系統設定資訊mode5  LASTEST_FORM_INF",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "5907",
+    "rIndex": "5946",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetFormID_DocNo; //將FormID及Docno抽出來另存入list裡    20130403增加",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5947",
+    "rIndex": "5958",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetIn_WH_DocNo; //將要入庫的DocNo抽出來另存入list裡",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5959",
+    "rIndex": "5972",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.CheckRequiredColumnValues(workno, caseno:String): Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5973",
+    "rIndex": "5982",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CheckRule2OMRErrInfo;   //檢核規則填入OMRErrINFo Record",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "5983",
+    "rIndex": "6010",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReNameContext(Path,OldName,NewName:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6011",
+    "rIndex": "6027",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteImageFile(Path,FileName,CaseID:String); // 刪除檔案  (無法得到DocDir用)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6028",
+    "rIndex": "6059",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteFormCodeFile(CaseID,DocDir,FormID:String);  //刪除指定FormID文件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6060",
+    "rIndex": "6114",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DeleteDocNoFile(Path,DocNo:String):Boolean;  //刪除指定DocNo文件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6115",
+    "rIndex": "6140",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DeleteDocNoFileForESCAN(Path,DocNo:String):Boolean;  //刪除指定DocNo文件",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.caseManager"
+    ],
+    "deps": [],
+    "lIndex": "6141",
+    "rIndex": "6174",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteShowFile(Path:String); //刪除顯示中的影像",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6175",
+    "rIndex": "6188",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDataDocNoPage(MainDocNo,MainVersion:String):Integer;  //取記錄的文件_版本頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6189",
+    "rIndex": "6203",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckCaseDocNoPage(CaseID,DocNo,Version:String;Pages:Integer):Integer; //取案件裡的文件_版本頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6204",
+    "rIndex": "6277",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindFormCodePages(CaseID,FormCode:String):Integer;  //計算案件裡FormID的頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6278",
+    "rIndex": "6308",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDataFormCodePages(FormCode:String):Integer;   //取記錄的FormcID的頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6309",
+    "rIndex": "6319",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CaseReSize(CaseID:String); //案件的影像縮放",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6320",
+    "rIndex": "6342",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ImageReSize_FormID(CaseID,FileName:String);  //依十字定位點做縮放",
+    "tags": [
+      "ImageProcessor",
+      "ImageProcessor.transformer"
+    ],
+    "deps": [],
+    "lIndex": "6343",
+    "rIndex": "6420",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ImageReSize_tmp(FormID,FileName:String);  //依十字定位點做縮放(暫存檔)",
+    "tags": [
+      "ImageProcessor",
+      "ImageProcessor.transformer"
+    ],
+    "deps": [],
+    "lIndex": "6421",
+    "rIndex": "6446",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ImageScrollBox1NewGraphic(const Graphic: TDibGraphic);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "6447",
+    "rIndex": "6456",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.TransCaseID(Path,CaseID:String;MainCase:Boolean):Boolean; //傳送案件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6457",
+    "rIndex": "6734",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.NewTreeNodeRefresh;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6735",
+    "rIndex": "6745",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MyTreeNode1Refresh;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6746",
+    "rIndex": "6753",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MyTreeNode2ReFresh(CaseID:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6754",
+    "rIndex": "6763",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MyTreeNode3ReFresh(CaseID:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6764",
+    "rIndex": "6771",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Node2DocNo(Node2:TTreeNode):String;  //MyTreeNode2取DocNo出來",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6772",
+    "rIndex": "6785",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Node3DocNo(Node3:TTreeNode):String;  //MyTreeNode3取DocNo出來",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6786",
+    "rIndex": "6799",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Node3FormID(Node3:TTreeNode):String;  //MyTreeNode3取FormCode出來",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6800",
+    "rIndex": "6814",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetNode2Name(Node2:TTreeNode):String;  //取MyTreeNode2的識別字出來(記之前點選用)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6815",
+    "rIndex": "6933",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DownLoadImage(Path,CaseID:String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6934",
+    "rIndex": "6979",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Down_Img(Path,CaseID:String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "6980",
+    "rIndex": "7032",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetNoNameCase(Path:String):String; //取未配號XXXX",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7033",
+    "rIndex": "7046",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CaseResort(Path:String); //案件的檔案重新排序(次文件依Docno排)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7047",
+    "rIndex": "7184",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CaseResort2Scanlist(Path:String); //案件的檔案重新排序給scanlist(次文件依FormID排)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7185",
+    "rIndex": "7306",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DistinctDocinCase(Path:String); //列出案件裡的Docno_版本",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7307",
+    "rIndex": "7351",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DistinctDocNoinCase(Path:String); //列出案件裡的Docno",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7352",
+    "rIndex": "7387",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ClearErrini(CaseID:String;CaseNode:TTreeNode); //清掉檢核檔案",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7388",
+    "rIndex": "7406",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetCaseList(Mode:Char;Index:Integer;text:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7407",
+    "rIndex": "7445",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetDocNoList(Mode:Char;Index:Integer;CaseNo,DocDir,Copies:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7446",
+    "rIndex": "7516",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetContextList(Mode:Char;Index:Integer;CaseNo,DocDir,FileName:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7517",
+    "rIndex": "7565",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetAttContextList(Mode:Char;Index:Integer;CaseNo,FileName:String);  //'A:加入,I:插入,D:刪除,E:修改'",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7566",
+    "rIndex": "7608",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.checkCaseOMRDone:Boolean;  //檢查案件是否完成OMR檢核",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7609",
+    "rIndex": "7623",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.checkFormCodeIsCustom(path, formcode: string): boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7624",
+    "rIndex": "7644",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckCaseID_OK:Boolean;  //檢查是否有未配號的案件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7645",
+    "rIndex": "7659",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckCaseAttach_OK:Boolean;  //檢查是否有未歸類的案件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7660",
+    "rIndex": "7677",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateEmptyCase(Path,CaseID:String);  //產生空白案號(重掃件用)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7678",
+    "rIndex": "7691",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.InitScrollRec;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7692",
+    "rIndex": "7701",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GetScrollData(ISB:TImageScrollBox;Var HS,VS:Integer;Var iRate:Single);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "7702",
+    "rIndex": "7711",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetScrollData(ISB:TImageScrollBox;HS,VS:Integer;iRate:Single);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "7712",
+    "rIndex": "7721",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FormIDReplace(CaseID,DocDir,OldFormID,NewFormID:String); //指定FormID更換成新的FormID",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7722",
+    "rIndex": "7840",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ShowFileReplace(Path,NewFormID:String);//顯示的影像換成新的FormID",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7841",
+    "rIndex": "7856",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PageReplaceFormID(Path,NowFormID,NewFormID:String); //選取頁更換FormID",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7857",
+    "rIndex": "7906",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ModeNeedCheck(OMRMode,ScanMode:String):Boolean; //掃瞄模式是否要做檢核",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7907",
+    "rIndex": "7913",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCasePage(Path,CaseID:String):Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7914",
+    "rIndex": "7984",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFormIDPage(FileList:TStringlist;FormID:String):Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "7985",
+    "rIndex": "7999",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetFile2Case(CaseID,FileName:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8000",
+    "rIndex": "8013",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.WriteResize(ImgName,TxtName:String); //產生Resize.dat",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8014",
+    "rIndex": "8056",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCase_PageCount(var CaseCount,PageCount:Integer):Boolean; //取出案件的數量及頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8057",
+    "rIndex": "8134",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindNoSaveBarCode : Boolean; //找是否有不要儲存影像的條碼",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8135",
+    "rIndex": "8154",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.BarCode2CaseID : String; //Barcode依規則轉成CaseID",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping"
+    ],
+    "deps": [],
+    "lIndex": "8155",
+    "rIndex": "8172",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.BarCode2FormID : String; //Barcode依規則轉成FormID",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping"
+    ],
+    "deps": [],
+    "lIndex": "8173",
+    "rIndex": "8195",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.WriteCaseIndex(Path:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8196",
+    "rIndex": "8213",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReadCaseIndex(Path:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8214",
+    "rIndex": "8242",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ReduceLogFile; //20171011 必免log檔掌太大",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8243",
+    "rIndex": "8263",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ClearCaseIndex;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8264",
+    "rIndex": "8269",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GetSelectImageFile;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8270",
+    "rIndex": "8290",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNoDir(Path,DocNo:String):String; //取出目前DocNo的份數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8291",
+    "rIndex": "8312",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckFormIDExists(DocNoNode:TTreeNode;FormID:String):Boolean; //檢查FormID是否存在文件裡",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8313",
+    "rIndex": "8327",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2DocNoDir(Path,DocNo:String):String;    //DocNo轉成DocNo(份數)目錄",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8328",
+    "rIndex": "8349",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoDir2DocNo(DocNoDir:String):String; //DocNo(份數)目錄轉成DocNo",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8350",
+    "rIndex": "8365",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoDir2Index(Path,DocNoDir:String):Integer; //DocNo(份數)目錄轉成index",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8366",
+    "rIndex": "8387",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ZipMainFile(SoPath,DePath,ZipName:String);",
+    "tags": [
+      "TransportManager",
+      "TransportManager.payloadArchiver"
+    ],
+    "deps": [],
+    "lIndex": "8388",
+    "rIndex": "8460",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ZipMaskFile(SoPath,MarkPath,DePath,ZipName:String); //壓縮遮罩影像檔",
+    "tags": [
+      "TransportManager",
+      "TransportManager.payloadArchiver"
+    ],
+    "deps": [],
+    "lIndex": "8461",
+    "rIndex": "8494",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ParserPoint(S:String); //解析十字點的字串",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8495",
+    "rIndex": "8525",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckScanDenialTime:Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8526",
+    "rIndex": "8539",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormID2Anchor(FormID:String):String;  //用FormID取出十字模式",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8540",
+    "rIndex": "8551",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Index2Anchor(Anchor:String):String;   //十字模式 0->NONE;1->ANCHOR;2->FRAME",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8552",
+    "rIndex": "8561",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScanDuplexCBClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8562",
+    "rIndex": "8567",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ScanGrayCBClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8568",
+    "rIndex": "8596",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFormatID(CaseID: string):String;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8597",
+    "rIndex": "8620",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.MemoInfoTransfer(Mode,Str:String;ID_S,Name_S:TStringlist):String;  //註記代碼註記類別轉換  Mode 'ID':代碼轉名稱;'NAME':名稱轉代碼",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8621",
+    "rIndex": "8650",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetSQLData(ColumeStr:String;FromList,ToList:TStringlist); //把SQL值塞入",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "8651",
+    "rIndex": "8662",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetSQLData(TableList:TStringlist;Colname:String;colNo:Integer):String; //依欄位及索引取值",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "8663",
+    "rIndex": "8723",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindSQLData(TableList:TStringlist;ColumeStr,KeyColumeStr,KeyStr:String;ColNo:Integer;Var ResultList:TStringlist):Boolean; //找指定的資料",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.paramState"
+    ],
+    "deps": [],
+    "lIndex": "8724",
+    "rIndex": "8802",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFindResult(Col:String):String;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8803",
+    "rIndex": "8820",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DataLoading(Loading:Boolean;UseTimer:Boolean);  //資料載入中要停止點選的動作",
+    "tags": [
+      "UIView",
+      "UIView.statusMessenger"
+    ],
+    "deps": [],
+    "lIndex": "8821",
+    "rIndex": "8855",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CaseHelpBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "8856",
+    "rIndex": "8926",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CheckCaseBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "8927",
+    "rIndex": "8965",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ClearView(stkv:Integer);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "8966",
+    "rIndex": "8981",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DrawDocItem2(CaseNode : TTreenode;Caseno:String):Boolean;  //畫出文件名稱的Tree",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "8982",
+    "rIndex": "9241",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.initkscan;",
+    "tags": [
+      "ScannerController",
+      "ScannerController.twainWrapper"
+    ],
+    "deps": [],
+    "lIndex": "9242",
+    "rIndex": "9262",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.initParameter;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9263",
+    "rIndex": "9304",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PrtLbClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9305",
+    "rIndex": "9375",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.UseOldCaseLbClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9376",
+    "rIndex": "9529",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LastInitFormidListCreate(path: string);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9530",
+    "rIndex": "9550",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.LoadFileGetMD5(const filename: string): string;",
+    "tags": [
+      "TransportManager",
+      "TransportManager.utilities"
+    ],
+    "deps": [],
+    "lIndex": "9551",
+    "rIndex": "9574",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LoadImgFile;  //載入新件及替換件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9575",
+    "rIndex": "9660",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LoadImgFile1;  //載入新件及替換件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9661",
+    "rIndex": "9770",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.LoadAttFile(CaseID:String); //載入附加檔案",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9771",
+    "rIndex": "9791",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.logTimeString: String;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9792",
+    "rIndex": "9796",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindDivFormCode(FormCode:String):Boolean; //找有沒有分案的條碼",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9797",
+    "rIndex": "9824",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckAvailable:Boolean; //檢查是否可使用元件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9825",
+    "rIndex": "9922",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SmoothCBClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9923",
+    "rIndex": "9931",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Case2Mask(SoPath,DePath:String):Boolean;//產生遮罩影像  20170639 發現沒用到",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "9932",
+    "rIndex": "9995",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckNeedCrop(Graphic:TDibGraphic):Boolean; //是否是A3要切影像",
+    "tags": [
+      "ImageProcessor",
+      "ImageProcessor.transformer"
+    ],
+    "deps": [],
+    "lIndex": "9996",
+    "rIndex": "10021",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetNewCustomDocNo(Path,DocName:String):String; //取出未使用的自訂文件代號",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10022",
+    "rIndex": "10086",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomDocName(Path,DocNo:String):String; //取出自定文件名稱",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10087",
+    "rIndex": "10098",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomFormID(Path,DocNo:String):String; //取出自定文件FormID",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10099",
+    "rIndex": "10110",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomDocDir(Path,DocName:String):String; //取出自定文件DocDir",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10111",
+    "rIndex": "10137",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindCustomDocName(Path,DocName:String):Boolean; //尋找自定文件名稱是否存在",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10138",
+    "rIndex": "10161",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.DelAttFileLBClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10162",
+    "rIndex": "10196",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DeleteCustomDocDir(Path,DocNo:String); //刪除自定文件DocNo",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10197",
+    "rIndex": "10208",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckFormID_Prt(FormID:String):Boolean; //傳入的FormID是否預設列印",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10209",
+    "rIndex": "10218",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.PrintImg(FileName, LoginID, Datetime,",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10219",
+    "rIndex": "10297",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindLastestDocDir(CaseID,DocNo:String):String; //找出最新的DocDir",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10298",
+    "rIndex": "10322",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindLastestDocDirForPage(CaseID,DocNo,formid:String):String; //找出最新的DocDir  20180207  排除隱藏的資料夾",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10323",
+    "rIndex": "10364",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.Create_Cust_DocDir(CaseID:String); //產生外面傳入的文件代號及自定文件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10365",
+    "rIndex": "10455",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.OldCasetoNewCase(CaseID:String); //將舊案份數轉成新規則",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.caseManager"
+    ],
+    "deps": [],
+    "lIndex": "10456",
+    "rIndex": "10524",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ErrFormtoCurrentForm(CaseID,EFormID,CFormID:String);//將舊案的錯誤FormID改正確的FormID",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.caseManager"
+    ],
+    "deps": [],
+    "lIndex": "10525",
+    "rIndex": "10574",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetRecordEditedDocDir(Mode:Char;CaseID,DocDir:String);  //記錄被異動的文件目錄  'A:加入D:刪掉'",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10575",
+    "rIndex": "10622",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocDir_Page(CaseID,DocDir:String):Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10623",
+    "rIndex": "10639",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Path2DocDir(Path,CaseID:String):String;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10640",
+    "rIndex": "10664",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNo_IS_WH(DocNo:String):Boolean; //DocNo是否為入庫文件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10665",
+    "rIndex": "10679",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SortDocDir_FormID(CaseID,DocDir:String); //將DocDir裡的文件編號排序",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10680",
+    "rIndex": "10752",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.GotoAttach(OldLevel:Integer);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10753",
+    "rIndex": "10774",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoIs_In_WH(DocNo:String):Boolean; //DocNo是否為入庫文件",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10775",
+    "rIndex": "10794",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure  TCB_IMGPSScanX.CreateCaseNeedData(Path:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10795",
+    "rIndex": "10840",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetDocDirtoSelected(CaseNode:TTreeNode;DocDir:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10841",
+    "rIndex": "10853",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CheckSelectImg_UseCase(Path,CaseID:String):Boolean; //檢查選擇的影像是否有包含被引用的影像",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10854",
+    "rIndex": "10876",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.TransOldCaseFile(Path:String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10877",
+    "rIndex": "10937",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Writelog(CaseID : String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "10938",
+    "rIndex": "10963",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetFtpinfo(CaseID,Action:String):Boolean;",
+    "tags": [
+      "TransportManager",
+      "TransportManager.fileTransfer"
+    ],
+    "deps": [],
+    "lIndex": "10964",
+    "rIndex": "11041",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetFtpInfo;     //餵入FTP資訊",
+    "tags": [
+      "TransportManager",
+      "TransportManager.fileTransfer"
+    ],
+    "deps": [],
+    "lIndex": "11042",
+    "rIndex": "11071",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FtpCaseComplete(SendData:String):Boolean;",
+    "tags": [
+      "TransportManager",
+      "TransportManager.fileTransfer"
+    ],
+    "deps": [],
+    "lIndex": "11072",
+    "rIndex": "11094",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormIDAppear(FormID:String):Boolean; //FormID是否可出現",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11095",
+    "rIndex": "11120",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoAppear(DocNo:String):Boolean;   //DocNo是否可出現",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11121",
+    "rIndex": "11137",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNoCount(CaseID,DocNo:String):Integer; //取DocNo數量",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11138",
+    "rIndex": "11167",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocDirCopies(CaseID,DocDir:String):Integer; //取DocDir數量",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11168",
+    "rIndex": "11197",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetDocDirCopies(CaseID,DocDir:String;NewCopies:Integer); //修改DocDir份數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11198",
+    "rIndex": "11225",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocDirCopies_Rec(Path,CaseID,DocDir:String):Integer; //取記錄裡的DocDir份數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11226",
+    "rIndex": "11277",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomNameCount(CustomName:String):Integer;   //取外傳的名稱數量",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11278",
+    "rIndex": "11301",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCustomDocNoCount(Docno:String):Integer;   //取外傳的DocNo數量",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11302",
+    "rIndex": "11325",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ISGuideFormID(FormID:String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11326",
+    "rIndex": "11340",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ISDivPageFormID(FormID:String):Boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11341",
+    "rIndex": "11356",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.ISExistImg(const filename: string): boolean;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11357",
+    "rIndex": "11368",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseDelete_Enable(CaseID:String):Boolean;  //案件可否被刪除",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11369",
+    "rIndex": "11389",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MoveImage(Path:String;mp:Integer); //移動頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11390",
+    "rIndex": "11447",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.MoveImage_Drag(Path:String;fp,tp:Integer); //拖拉移動頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11448",
+    "rIndex": "11505",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.SetUseCase(Mode:Char;Path,DocDir,FormCaseID,ToCaseID:String);   //記錄引用其他案件 A:加入 D:刪掉",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.caseManager"
+    ],
+    "deps": [],
+    "lIndex": "11506",
+    "rIndex": "11526",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetUseCase(Mode:Char;Path,DocDir:String):String;  //F:取被引用 To:引用",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.caseManager"
+    ],
+    "deps": [],
+    "lIndex": "11527",
+    "rIndex": "11546",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.Case2upload(CaseID:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11547",
+    "rIndex": "11672",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.Download2Case(SoDir,DeDir:String);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11673",
+    "rIndex": "11844",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2FormName(CaseID,FormCode:String):String; //用FormCode轉成文件名稱",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11845",
+    "rIndex": "11895",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2FileName(FormCode:String;List:TStrings):String; //用FormCode找出檔名(第一頁)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11896",
+    "rIndex": "11918",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2FormCode(FileName:String):String; //從檔名取出FormCode",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11919",
+    "rIndex": "11935",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2FormName(CaseID,FileName:String):String; //從檔名取出文件名稱",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11936",
+    "rIndex": "11940",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2ScanPage(FileName:String):Integer; //從檔名轉出掃瞄頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11941",
+    "rIndex": "11952",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2NoQuene_Filename(FileName:String):String; //取出沒有序號的檔名",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11953",
+    "rIndex": "11965",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2Index(FileName:String):Integer; //從檔名取出在ContextList的序號",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11966",
+    "rIndex": "11979",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FileName2NowDcoNo(FileName:String;CtList,DNList:TStrings):String; //從檔名取出歸屬的文件代號",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "11980",
+    "rIndex": "11993",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2DocNo(FormCode:String):String;   //FormCode轉Docno",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping"
+    ],
+    "deps": [],
+    "lIndex": "11994",
+    "rIndex": "12018",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2Version(FormCode:String):String; //FormCode轉版本",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12019",
+    "rIndex": "12023",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2Page(FormCode:String):String; //FormCode轉頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12024",
+    "rIndex": "12028",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2DocName(CaseID,DocNo:String):String; //Docno轉Doc名稱",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping"
+    ],
+    "deps": [],
+    "lIndex": "12029",
+    "rIndex": "12066",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2FileName(DocNo:String;List:TStrings):String; //用DocNo找出檔名(第一頁)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12067",
+    "rIndex": "12081",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormCode2WorkNo(FormCode:String):String; //用FormCode取出作業別",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12082",
+    "rIndex": "12090",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNo2WorkNo(DocNo:String):String; //用DocNo取出作業別",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12091",
+    "rIndex": "12099",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoNeedDiv(DocNo:String):Boolean; //是否是需分份數的文件代號",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping"
+    ],
+    "deps": [],
+    "lIndex": "12100",
+    "rIndex": "12112",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseNode2Info(Node:TTreeNode;Mode:Char):String;   //案件Node取案件編號  Mode: I:Caseno;P:Page",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12113",
+    "rIndex": "12126",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNode2Info(Node:TTreeNode;Mode:Char):String;   //文件Node取文件代號 Mode: I:Docno;N:Docname;P:Page;G:Group",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12127",
+    "rIndex": "12144",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormNode2Info(Node:TTreeNode;Mode:Char):String;   //表單Node取表單代號  Mode: I:FormID;N:FormName;P:Page",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12145",
+    "rIndex": "12160",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PriorPage(Page:Integer); //上一頁",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12161",
+    "rIndex": "12171",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.NextPage(Page:Integer); //下一頁",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12172",
+    "rIndex": "12182",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocNoExistsinTree(CaseNode:TTreeNode;DocNo:String):Boolean; //是否己存在樹裡",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12183",
+    "rIndex": "12198",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DocnoNeedGroup(DocNo:String):Boolean; //傳入的DocNo是否需分組",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12199",
+    "rIndex": "12208",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.DistinctFormCode(CaseID:String); //從案件裡的FormCode取出第一頁",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "12209",
+    "rIndex": "12254",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.OMRCheckCase(CaseID:String):Boolean; //OMR檢核",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.ormRuleEngine"
+    ],
+    "deps": [],
+    "lIndex": "12255",
+    "rIndex": "12950",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.OMRErr2ini(CaseID,Reason,FileName,Site,RelaFileName,RelaSite,Anchor,Anchor1:String;Del,Ingnore,Display:Boolean); //OMR檢核失敗寫入ini",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.ormRuleEngine"
+    ],
+    "deps": [],
+    "lIndex": "12951",
+    "rIndex": "12990",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.OMRErrini2List(CaseID:String;ErrlistForm:TErrlistForm); //OMR檢核失敗從ini寫入ListView",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.ormRuleEngine",
+      "UIView",
+      "UIView.listView"
+    ],
+    "deps": [],
+    "lIndex": "12991",
+    "rIndex": "13020",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.OMRErrini2ListForLog(CaseID: String): String;",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.ormRuleEngine"
+    ],
+    "deps": [],
+    "lIndex": "13021",
+    "rIndex": "13058",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.DownLanguage:Boolean;  //下載多國語言檔",
+    "tags": [
+      "UIView",
+      "UIView.i18n"
+    ],
+    "deps": [],
+    "lIndex": "13059",
+    "rIndex": "13083",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.view_image_FormCode(Path,FormCode:String;stpage,stview:integer); //用FormCode來找影像",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "13084",
+    "rIndex": "13199",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.view_image_DocNo(Path,DocNo,FormID:String;Pages:integer); //用DocNo來找影像",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "13200",
+    "rIndex": "13394",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.ShapeName2PreViewISBName(SP:TShape):String; //轉出指定PreViewISBName",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13395",
+    "rIndex": "13399",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton14Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13400",
+    "rIndex": "13422",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton15Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13423",
+    "rIndex": "13443",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton16Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13444",
+    "rIndex": "13464",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton17Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13465",
+    "rIndex": "13469",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton18Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13470",
+    "rIndex": "13474",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton19Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13475",
+    "rIndex": "13479",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton20Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13480",
+    "rIndex": "13484",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton21Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13485",
+    "rIndex": "13490",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton22Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13491",
+    "rIndex": "13496",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.SpeedButton3Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "13497",
+    "rIndex": "13501",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreatePreViewISB(Count:Integer);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13502",
+    "rIndex": "13550",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FreePreViewISB;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13551",
+    "rIndex": "13580",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FitPreViewISB;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13581",
+    "rIndex": "13617",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.PaintShape(FromImg,ToImg:TImageScrollBox); //畫有被選取的影像",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13618",
+    "rIndex": "13673",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.FreeShapeobj(SelectISB : TImageScrollBox);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13674",
+    "rIndex": "13694",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ISBClick(Sender : TObject);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13695",
+    "rIndex": "13733",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ISBMouseMove(Sender: TObject; Shift: TShiftState;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13734",
+    "rIndex": "13747",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBImageMouseDown(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13748",
+    "rIndex": "13821",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBImageMouseUp(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13822",
+    "rIndex": "13827",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBEndDrag(Sender, Target: TObject; X, Y: Integer);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13828",
+    "rIndex": "13832",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBDragDrop(Sender, Source: TObject; X, Y: Integer);",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13833",
+    "rIndex": "13842",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ISBDragOver(Sender, Source: TObject; X, Y: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13843",
+    "rIndex": "13863",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FindMpsView(Vmode: Integer):TImageScrollBox;",
+    "tags": [
+      "UIView",
+      "UIView.scrollView"
+    ],
+    "deps": [],
+    "lIndex": "13864",
+    "rIndex": "13889",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetCaseFormID(Path:String):String;  //取案件的主FormID",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "13890",
+    "rIndex": "13911",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateFormID_FormName(Path,CaseID:String);  //產生FormID_FormName.dat",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "13912",
+    "rIndex": "13931",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateDocNo_DocName(Path,CaseID:String);  //產生DocNo_DocName.dat",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "13932",
+    "rIndex": "13953",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.CreateIn_WH(CaseID:String);  //產生In_WH.dat",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "13954",
+    "rIndex": "13984",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateDocNo_Info(CaseID:String):String; //產生 DocNo[tab]份數[tab]總頁數[tab]是否異動[換行]DocNo[tab]份數[tab]總頁數[tab]是否異動",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping"
+    ],
+    "deps": [],
+    "lIndex": "13985",
+    "rIndex": "14068",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateCustDocNo_Info(CaseID:String):String; //產生自訂文件 DocName[tab]份數[tab]總頁數[tab]是否異動[#13#10]DocName[tab]份數[tab]總頁數[tab]是否異動",
+    "tags": [
+      "BusinessLogic",
+      "BusinessLogic.entityMapping"
+    ],
+    "deps": [],
+    "lIndex": "14069",
+    "rIndex": "14121",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateDocnoFrom_Info(CaseID:String):String; //產生被引進的保管袋文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14122",
+    "rIndex": "14186",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateCustDocNoFrom_Info(CaseID:String):String; //產生被引進的自定文件資訊  Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14187",
+    "rIndex": "14244",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CreateAttach_Info(CaseID:String):String; //產生是否有Attach Y:有 N:沒有",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14245",
+    "rIndex": "14251",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNoEdit(CaseID,DocNo,DocName:String):String; //取出DocNo是否被異動 (Y/N)",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14252",
+    "rIndex": "14291",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNo_Count(Path,DocNo:String):Integer;  //取出文件份數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14292",
+    "rIndex": "14331",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetDocNo_Page(Path,DocNo:String):Integer;  //取出文件總頁數",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14332",
+    "rIndex": "14358",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.FormIDExists(FormCode:String;CheckDate:Boolean;index:Integer):Boolean;  //檢查FormID是否存在",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14359",
+    "rIndex": "14396",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.Case_DocNoExists(CaseID,Docno:String):Boolean; //Docno是否存在案件裡",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14397",
+    "rIndex": "14421",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.CB1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14422",
+    "rIndex": "14426",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReSortFileName(Path:String); //檔名重新排序",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14427",
+    "rIndex": "14454",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReSortFileName_New(Path:String); //檔名重新排序",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14455",
+    "rIndex": "14481",
+    "description": ""
+  },
+  {
+    "matcher": "Procedure TCB_IMGPSScanX.ReSortFileName2Scanlist(Path:String); //檔名重新排序給Scanlist.dat",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14482",
+    "rIndex": "14506",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetOMRCheckSet : Boolean; //下載OMR檢核XML檔",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14507",
+    "rIndex": "14565",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.GetKeyinSet : Boolean; //取登打設定",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14566",
+    "rIndex": "14624",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseAsk(CaseID: string):Integer;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14625",
+    "rIndex": "14674",
+    "description": ""
+  },
+  {
+    "matcher": "Function TCB_IMGPSScanX.CaseComplete(Path,CaseID:String;MainCase:Boolean):Boolean;  //通知傳送完成",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "14675",
+    "rIndex": "14903",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Timer1Timer(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.statusMessenger"
+    ],
+    "deps": [],
+    "lIndex": "14904",
+    "rIndex": "15337",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Timer2Timer(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.statusMessenger"
+    ],
+    "deps": [],
+    "lIndex": "15338",
+    "rIndex": "15346",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TransBtnClick(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.toolBar"
+    ],
+    "deps": [],
+    "lIndex": "15347",
+    "rIndex": "15538",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1Click(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "15539",
+    "rIndex": "15766",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "15767",
+    "rIndex": "15943",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "15944",
+    "rIndex": "15978",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1KeyUp(Sender: TObject; var Key: Word;",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "15979",
+    "rIndex": "15992",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseDown(Sender: TObject;",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "15993",
+    "rIndex": "16003",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseEnter(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "16004",
+    "rIndex": "16008",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseMove(Sender: TObject; Shift: TShiftState;",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "16009",
+    "rIndex": "16016",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;",
+    "tags": [
+      "UIView",
+      "UIView.treeView"
+    ],
+    "deps": [],
+    "lIndex": "16017",
+    "rIndex": "16032",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.ViewModeBtnMouseEnter(Sender: TObject);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16033",
+    "rIndex": "16037",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_caseid(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16038",
+    "rIndex": "16042",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_data(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16043",
+    "rIndex": "16047",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_mode(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16048",
+    "rIndex": "16052",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_rewrite(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16053",
+    "rIndex": "16057",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_url(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16058",
+    "rIndex": "16062",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_userid(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16063",
+    "rIndex": "16067",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_username(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16068",
+    "rIndex": "16072",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_verify(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16073",
+    "rIndex": "16077",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_language(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16078",
+    "rIndex": "16090",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_modename(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16091",
+    "rIndex": "16095",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_userunit(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16096",
+    "rIndex": "16100",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_work_no(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16101",
+    "rIndex": "16105",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_loandoc_enable(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16106",
+    "rIndex": "16117",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_loandoc_value(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16118",
+    "rIndex": "16122",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_useproxy(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16123",
+    "rIndex": "16130",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_c_docnamelist(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16131",
+    "rIndex": "16135",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_c_docnolist(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16136",
+    "rIndex": "16140",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_fixfilelist(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16141",
+    "rIndex": "16145",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_is_in_wh(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16146",
+    "rIndex": "16150",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_oldcaseinfo(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16151",
+    "rIndex": "16155",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_c_docnamelist: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16156",
+    "rIndex": "16160",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_c_docnolist: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16161",
+    "rIndex": "16165",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_caseid: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16166",
+    "rIndex": "16170",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_data: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16171",
+    "rIndex": "16175",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_fixfilelist: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16176",
+    "rIndex": "16180",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_is_in_wh: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16181",
+    "rIndex": "16185",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_language: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16186",
+    "rIndex": "16190",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_loandoc_enable: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16191",
+    "rIndex": "16195",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_loandoc_value: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16196",
+    "rIndex": "16200",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_mode: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16201",
+    "rIndex": "16205",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_modename: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16206",
+    "rIndex": "16210",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_oldcaseinfo: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16211",
+    "rIndex": "16215",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_rewrite: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16216",
+    "rIndex": "16220",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_url: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16221",
+    "rIndex": "16225",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_useproxy: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16226",
+    "rIndex": "16230",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_userid: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16231",
+    "rIndex": "16235",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_username: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16236",
+    "rIndex": "16240",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_userunit: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16241",
+    "rIndex": "16245",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_verify: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16246",
+    "rIndex": "16250",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_work_no: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16251",
+    "rIndex": "16255",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_printyn: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16256",
+    "rIndex": "16260",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_printyn(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16261",
+    "rIndex": "16265",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_is_oldcase: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16266",
+    "rIndex": "16270",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_is_oldcase(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16271",
+    "rIndex": "16275",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_custdocyn: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16276",
+    "rIndex": "16280",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_custdocyn(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16281",
+    "rIndex": "16285",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_casenolength: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16286",
+    "rIndex": "16290",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_filesizelimit: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16291",
+    "rIndex": "16295",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_imgdpi: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16296",
+    "rIndex": "16300",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_scancolor: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16301",
+    "rIndex": "16305",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_casenolength(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16306",
+    "rIndex": "16320",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_filesizelimit(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16321",
+    "rIndex": "16335",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_imgdpi(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16336",
+    "rIndex": "16351",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_scancolor(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16352",
+    "rIndex": "16376",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_imgdelete: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16377",
+    "rIndex": "16381",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_imgdelete(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16382",
+    "rIndex": "16386",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_check_main_form: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16387",
+    "rIndex": "16391",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_isExternal: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16392",
+    "rIndex": "16396",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_check_main_form(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16397",
+    "rIndex": "16401",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_isExternal(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16402",
+    "rIndex": "16406",
+    "description": ""
+  },
+  {
+    "matcher": "function TCB_IMGPSScanX.Get_WH_CATEGORY: WideString;",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16407",
+    "rIndex": "16411",
+    "description": ""
+  },
+  {
+    "matcher": "procedure TCB_IMGPSScanX.Set_WH_CATEGORY(const Value: WideString);",
+    "tags": [
+      "UIView",
+      "UIView.misc"
+    ],
+    "deps": [],
+    "lIndex": "16412",
+    "rIndex": "16455",
+    "description": ""
+  }
+]
diff --git a/doc/curtis/screenShot/CB_DocList.png b/doc/curtis/screenShot/CB_DocList.png
new file mode 100644
index 0000000..2e0d1f7
--- /dev/null
+++ b/doc/curtis/screenShot/CB_DocList.png
Binary files differ
diff --git a/doc/curtis/screenShot/CB_DocPrt.png b/doc/curtis/screenShot/CB_DocPrt.png
new file mode 100644
index 0000000..19d26cf
--- /dev/null
+++ b/doc/curtis/screenShot/CB_DocPrt.png
Binary files differ
diff --git a/doc/curtis/screenShot/CB_ErrList.png b/doc/curtis/screenShot/CB_ErrList.png
new file mode 100644
index 0000000..9678b2a
--- /dev/null
+++ b/doc/curtis/screenShot/CB_ErrList.png
Binary files differ
diff --git a/doc/curtis/screenShot/CB_IMGPSScanImp.png b/doc/curtis/screenShot/CB_IMGPSScanImp.png
new file mode 100644
index 0000000..2b9619c
--- /dev/null
+++ b/doc/curtis/screenShot/CB_IMGPSScanImp.png
Binary files differ
diff --git a/doc/curtis/screenShot/CB_OldCaseInfo.png b/doc/curtis/screenShot/CB_OldCaseInfo.png
new file mode 100644
index 0000000..ff950fd
--- /dev/null
+++ b/doc/curtis/screenShot/CB_OldCaseInfo.png
Binary files differ
diff --git a/doc/curtis/screenShot/CB_PatchFom.png b/doc/curtis/screenShot/CB_PatchFom.png
new file mode 100644
index 0000000..bd414f2
--- /dev/null
+++ b/doc/curtis/screenShot/CB_PatchFom.png
Binary files differ
diff --git a/doc/curtis/todos.md b/doc/curtis/todos.md
new file mode 100644
index 0000000..c1e36e8
--- /dev/null
+++ b/doc/curtis/todos.md
@@ -0,0 +1,8 @@
+
+
+
+- [ ] Scan/ImageProcess IO access 部份, 
+  - 哪些由 browser 代替, 
+  - 哪些是傳給 FTP
+  - 哪些是Scanner
+- 
diff --git "a/doc/curtis/\345\210\206\346\236\220_\345\260\232\351\200\262\350\241\214\344\270\255.md" "b/doc/curtis/\345\210\206\346\236\220_\345\260\232\351\200\262\350\241\214\344\270\255.md"
deleted file mode 100644
index a454c84..0000000
--- "a/doc/curtis/\345\210\206\346\236\220_\345\260\232\351\200\262\350\241\214\344\270\255.md"
+++ /dev/null
@@ -1,830 +0,0 @@
-
-
-# **相依套件分析報告**
-
-本報告針對 ActiveX 元件核心實作檔 CB_IMGPSScanImp.pas 進行功能解構,並分析其與第三方套件的綁定關係,以作為後續維護或現代化升級之參考。
-
-## **壹、 依功能拆分模組與第三方套件綁定分析**
-
-根據原始碼結構,CB_IMGPSScanImp.pas 是一個將介面、硬體、網路與業務邏輯高度耦合的「上帝物件 (God Object)」。若要進行重構或拆件,建議依據以下五個核心模組進行解耦:
-
-### **1. 硬體掃描控制模組 (Scanner Controller)**
-
-- **功能描述**:負責與實體掃描機溝通,處理 TWAIN 介面初始化、設定掃描參數(DPI、色彩、雙面)、觸發掃描指令,以及接收掃描完成的記憶體影像 (DibHandle)。
-- **關鍵方法**:initkscan、StatrTwainScan、OnAcquire、PageEnd、PageDone。
-- **第三方套件綁定 (強綁定)**:
-- 依賴 **Envision Imaging SDK** (EnScan) 進行 TWAIN 驅動控制。
-- 依賴 EnMisc 處理底層記憶體或雜項運算。
-
-### **2. 影像處理與轉換模組 (Image Processor)**
-
-- **功能描述**:負責對擷取到的原始影像進行後製處理,包括:裁切(如 A3 裁 A4)、去斜 (Deskew)、旋轉、二值化 (轉黑白)、格式轉換 (轉 TIFF/JPEG),以及讀取影像上的條碼。
-- **關鍵方法**:ImageReSize_FormID、CheckNeedCrop、DeskewImg、ConvertToBW。
-- **第三方套件綁定 (強綁定)**:
-- 依賴 **Envision Imaging SDK** (EnTifGr, EnDiGrph) 進行 TIFF (CCITT Group 4) 壓縮與 DIB 物件封裝。
-- 依賴 **MPS Barcode** (mpsBarco, BarcodesFinder) 進行影像條碼掃描與解析。
-
-### **3. 安全傳輸與 API 通訊模組 (Transport Manager)**
-
-- **功能描述**:負責將掃描並壓縮後的檔案上傳至伺服器,或從伺服器下載檔案。同時處理與後端 Java Servlet 的參數交換(如校時、取得 FTP 資訊、更新案件狀態)。
-- **關鍵方法**:upFile、dnFile_Get、ProcessServlet_Get、GetServerDate、GetftpInfo。
-- **第三方套件綁定 (強綁定)**:
-- 依賴 **SecureBlackbox** (SBSimpleSSL, SBHTTPSClient, SBSimpleFTPS 等) 處理 HTTPS/FTPS 安全加密通訊。
-- 依賴 **Indy** (IdHashMessageDigest) 產生檔案的 MD5 檢核碼。
-- 依賴自訂/第三方加密庫 (Encryp) 處理字串加解密。
-
-### **4. 業務邏輯與資料解析模組 (Business Logic & Parser)**
-
-- **功能描述**:專案核心的領域邏輯,包含接收網頁端傳入的參數字串進行解析、定義文件歸類邏輯(由條碼推導文件類型)、OMR (光學標記辨識) 檢核定義等。
-- **關鍵方法**:SetSQLData (負責解析傳入的長字串至 TStringList)、GetSQLData、FormCode2DocNo、OMRCheckCase。
-- **第三方套件綁定 (中度綁定)**:
-- 依賴 **Xmltool** 解析 XML 格式的 OMR 座標定義。
-- 依賴 **VCLZip** (VCLZip, VCLUnZip) 將多個影像檔打包成 ZIP 進行單一傳輸。
-
-### **5. UI 與介面呈現模組 (UI View)**
-
-- **功能描述**:負責 ActiveX 控制項的視覺化介面,包含左側的樹狀文件清單 (TreeView)、右側的影像預覽區 (ScrollBox),以及按鈕與多國語言切換。
-- **關鍵方法**:InitialLanguage、各類 OnClick 事件。
-- **第三方套件綁定 (輕度綁定)**:
-- 依賴 **Envision Imaging** (EnImgScr) 作為支援大影像拖曳的滾動視窗。
-- 依賴 PJMenuSpeedButtons 作為自訂外觀的按鈕元件。
-
-## **貳、 第三方套件功能總覽**
-
-為達成上述複雜的業務需求,本專案引入了多個 Delphi 著名的第三方套件。以下為各套件的大致功能說明:
-
-### **1. Envision Imaging SDK (前綴 En)**
-
-這是一套專為 Delphi 設計的高效能影像與 TWAIN 處理套件,在金融與保險業的文件電子化系統中非常常見。
-
-- **EnScan**:封裝了 TWAIN 協定,讓程式能直接控制實體掃描機,控制進紙、解析度與雙面掃描。
-- **EnDiGrph (TDibGraphic)**:封裝 Windows 底層的 DIB (Device Independent Bitmap) 記憶體句柄,讓開發者能像操作一般圖片一樣操作掃描出來的原始資料。
-- **EnTifGr**:專門處理 TIFF 影像格式。銀行業愛用 TIFF 是因為它支援「多頁」且黑白壓縮率極高 (Group 4 Fax Compression)。
-- **EnImgScr**:提供 TImageScrollBox 視覺元件,用來平滑顯示並縮放超大尺寸的掃描圖檔。
-- **EnMisc**:提供影像處理所需的底層輔助數學或資料轉換函式。
-
-### **2. SecureBlackbox (前綴 SB)**
-
-由 EldoS (後被 /n software 收購) 開發的強大安全通訊與加密套件。由於早期 Delphi (D7~D2007) 內建網路庫缺乏完善的 SSL/TLS 支援,此套件被廣泛用於補強安全性。
-
-- **SBHTTPSClient / SBSimpleSSL**:實作了完整的 HTTPS 用戶端通訊協定,用來安全地上傳檔案或呼叫 Servlet API。
-- **SBSimpleFTPS**:支援 FTP over SSL (FTPS) 的安全檔案傳輸。
-- **SBWinCertStorage / SBX509**:處理 Windows 系統內的憑證儲存區,以及 X.509 數位憑證的驗證(例如確認銀行伺服器的 HTTPS 憑證是否合法)。
-
-### **3. MPS Barcode & BarcodesFinder**
-
-- **功能**:這是一套條碼識別引擎。
-- **專案應用**:在掃描過程中(如 PageDone 或 OnAcquire 階段),它會掃描圖片特定區域尋找一維或二維條碼。讀取到的條碼值會被用來決定這張影像屬於哪一種「文件表單」(FormCode),進而實現自動分類歸檔。
-
-### **4. VCLZip (VCLZip, VCLUnZip)**
-
-- **功能**:老牌的 Delphi ZIP 壓縮元件。
-- **專案應用**:為了節省網路頻寬與減少伺服器連線次數,掃描完成的多張 TIFF/JPG 檔案會被打包成一個 .zip 檔後,再一次性上傳至伺服器。
-
-### **5. Indy Components (前綴 Id)**
-
-- **IdHashMessageDigest / idHash**:Delphi 內建的 Internet Direct (Indy) 函式庫。
-- **專案應用**:在此專案中被用來計算檔案或字串的 **MD5 Hash (雜湊值)**。通常用於確保檔案上傳過程沒有損壞,伺服器比對 MD5 一致才算上傳成功。
-
-### **6. 其他工具 (Tools & Utils)**
-
-- **Xmltool**:負責讀寫 XML 檔案。銀行經常將表單的 OMR (光學標記辨識) 檢核座標或參數寫成 XML 設定檔,透過此工具讀入系統。
-- **Encryp**:這可能是開發商自訂或第三方的輕量級加密單元,用來加密本機設定檔 (.ini) 內的敏感資訊或混淆網頁傳入的參數。
-
-# **核心源碼與物件實作解析**
-
-本文件針對 CB_IMGPSScanImp.pas 中的核心方法與隱藏物件進行原始碼級別的邏輯拆解與推導。
-
-## **壹、 核心方法源碼說明**
-
-### **1) TCB_IMGPSScanX.GetCurrentVersionNo**
-
-- **功能描述**:取得目前 OCX 元件的版本號。這通常提供給網頁端的 JavaScript 呼叫,用來判斷客戶端的 OCX 是否需要觸發更新下載。
-- **實作推導與底層 API 說明**:
-
-  在 Delphi 中,若要動態讀取編譯進 OCX 的 VS_VERSION_INFO 資源,標準作法是呼叫一系列的 Windows API。這段實作通常包含以下三個關鍵概念:
-
-1. **HInstance (實體句柄)**:
-- 這是 Delphi 提供的一個全域變數,代表目前載入記憶體中的模組(即這個 OCX 檔)的「實體句柄 (Instance Handle)」。
-- 在 Windows 作業系統中,當一個執行檔 (EXE) 或動態連結檔 (DLL/OCX) 被載入記憶體時,會獲得一個記憶體基底位址,HInstance 就是指向這個位址的指標。Windows 需要這個值來識別「你要操作的是哪一個載入的模組」。
-1. **GetModuleFileName 的作用**:
-- 這是一個 Windows API。它的作用是利用前面提到的 HInstance,向作業系統反查出這個模組在硬碟上的**「完整實體檔案路徑」**(例如:C:\Windows\Downloaded Program Files\CB_IMGPSScan.ocx)。
-- 因為我們需要讀取檔案本身的版本資訊,程式必須先知道「我自己到底存放在硬碟的哪裡」。
-1. **後半段 VerQueryValue 的運作邏輯**:
-
-   取得檔案路徑後,讀取版本資訊會經過三部曲,而 VerQueryValue 是最後負責「解析」的關鍵:
-
-- **Step 1 (GetFileVersionInfoSize)**:先問 Windows 這個檔案的版本資訊區塊有多大。
-- **Step 2 (GetFileVersionInfo)**:把整塊版本資訊的二進位原始資料 (Raw Data) 完整讀進一段記憶體緩衝區中。
-- **Step 3 (VerQueryValue)**:因為剛剛讀進來的是一包無法直接閱讀的二進位資料,VerQueryValue 的作用就是**「在這包資料中進行精準查詢」**。透過傳入特定的查詢路徑(例如傳入 \ 可以取得包含主版號、次版號的 VS_FIXEDFILEINFO 結構體;或是傳入特定語系代碼如 \StringFileInfo\040404E4\FileVersion),作業系統會幫你把二進位資料解析成我們需要的字串或數字版本號(如 1.0.3.5)。
-
-### **2) TCB_IMGPSScanX.ActiveFormCreate**
-
-- **功能描述**:這是 ActiveX 視覺化窗體 (Form) 的生命週期起點。當 IE 瀏覽器或應用程式載入這個 OCX 時,首先觸發的初始化事件。
-- **實作推導**:
-
-  它會負責初始化全域變數、設定第三方元件的預設值、並建立暫存資料夾。
-
-    ```pascal
-     procedure TCB_IMGPSScanX.ActiveFormCreate(Sender: TObject);
-      begin
-        // 1. 預設變數初始化
-        Def_DeviceDelete := True;
-        Def_ScannerReverse := False;
-    
-        // 2. 建立本機暫存目錄
-        ForceDirectories('C:\Temp\IMGPSScan');
-    
-        // 3. UI 語系初始化
-        InitialLanguage;
-      end;
-    ```
-
-
-### **3) TCB_IMGPSScanX.StatrTwainScan**
-
-- **功能描述**:啟動掃描機的 TWAIN 介面,開始進紙或掃描。(註:Statr 應為 Start 的早期拼字錯誤,這在舊專案中很常見)。
-- **實作推導**:
-
-  這個方法會讀取網頁傳進來的參數(如 DPI、色彩),設定給 Scanner 物件,然後發出擷取指令。
-
-    ```pascal
-      procedure TCB_IMGPSScanX.StatrTwainScan;
-      begin
-        // 設定解析度與顏色
-        Scanner.Resolution := StrToIntDef(Fimgdpi, 200);
-        if Fscancolor = 'C' then
-          Scanner.PixelType := ptColor
-        else
-          Scanner.PixelType := ptGray;
-    
-        // 啟動掃描 (會喚起實體掃描機)
-        Scanner.Acquire; 
-      end;
-    ```
-
-
-### **4) TCB_IMGPSScanX.OnAcquire 與資料流物件**
-
-- **功能描述**:這是 Scanner (EnScan) 最核心的事件。當掃描機成功掃完「一張」影像並傳入電腦記憶體時,會觸發此事件。
-- **源碼邏輯推導**:
-
-    ```pascal
-    procedure TCB_IMGPSScanX.ScannerAcquire(Sender: TObject; DibHandle: THandle; var Handled: Boolean);
-      var
-        MyStream: TMemoryStream;
-        MyGraphic: TDibGraphic;
-      begin
-        // 1. 將 DibHandle 轉換為 Delphi 影像物件
-        MyGraphic := TDibGraphic.Create;
-        MyGraphic.Handle := DibHandle;
-    
-        // 2. 影像處理 (如去斜、黑白轉換)
-    
-        // 3. 存入記憶體串流或實體檔案
-        // ...
-      end;
-    ```
-
-- **三大核心資料物件解釋**:
-1. **DibHandle**:這是 Windows 底層的「全域記憶體句柄 (Global Memory Handle)」。掃描機驅動把圖片放在記憶體裡,給你這個代號。你必須透過 TDibGraphic 來「解讀」這塊記憶體。
-2. **TMemoryStream**:**記憶體串流**。它的作用像是一塊存在 RAM 裡的虛擬硬碟。掃描後的圖檔在還沒存到實體硬碟前,會先放在這裡進行格式轉換 (如轉成 JPEG) 或進行 MD5 計算,因為在記憶體中操作速度最快。
-    - **DeleteStm : TMemoryStream 的逐行操作說明**:
-      在 `OnAcquire` 事件中,`DeleteStm` 主要用於「空白頁判定」。其源碼邏輯如下:
-
-    ```pascal
-    // 判定是否啟動空白頁刪除功能
-    if Def_DeviceDelete then
-    begin
-      // 1. 在 Heap 記憶體中建立一個暫存串流物件
-      DeleteStm := TMemoryStream.Create;
-      try
-        // 2. 將當前掃描到的影像物件 (MyGraphic) 寫入記憶體串流
-        // 這會根據 TIFF G4 等格式進行壓縮,產生實際的檔案位元組資料
-        MyGraphic.SaveToStream(DeleteStm);
-    
-        // 3. 核心判定:檢查該影像在記憶體中所佔用的位元組大小 (Size)
-        // 若小於預設門檻值 (Def_DeviceDeleteSize, 如 3072 Bytes)
-        if DeleteStm.Size < Def_DeviceDeleteSize then
-        begin
-          // 4. 若符合空白頁特徵,則不進行存檔動作,直接跳出此 Procedure
-          // 並告知掃描控制項此頁已處理完畢 (Handled := True)
-          Handled := True;
-          Exit;
-        end;
-      finally
-        // 5. 無論是否為空白頁,操作結束後必須釋放記憶體,避免 Memory Leak
-        DeleteStm.Free;
-      end;
-    end;
-    ```
-    
-   - 
-3. **TFileStream**:**檔案串流**。用來直接對硬碟讀寫資料。當確認影像無誤後,會透過 TFileStream 將 TMemoryStream 的內容真實地寫入 C:\Temp\...\001.tif 中。
-
-### **5) TCB_IMGPSScanX.FindISB2View**
-
-- **功能描述**:用來在畫面上尋找並更新用來預覽圖片的元件。
-- **名詞解釋**:**ISB 代表 ImageScrollBox**。
-
-  這對應到 uses 區段中的 EnImgScr 套件。TImageScrollBox 是 Envision 提供的一個 UI 元件,專門用來顯示超出螢幕大小的掃描圖檔,支援平滑拖曳與縮放。這個方法通常用來把剛掃描完的 DibHandle 餵給畫面上的 ISB 元件顯示。
-
-
-### **6) TCB_IMGPSScanX.GetNoNameCase**
-
-- **功能描述**:處理「無案號」或「未知歸屬」的掃描件。
-- **源碼實作逐行說明**:
-
-  此方法透過迴圈尋找一個尚未被使用的目錄名稱(格式為「未配號 + 四位數字」)。
-
-
-```pascal
-Function TCB_IMGPSScanX.GetNoNameCase(Path:String):String; // 取未配號XXXX
-var
-  i : Integer; // 宣告迴圈計數器
-begin
-  // 1. 啟動一個從 1 到 9999 的迴圈,尋找可用的索引值
-  for i := 1 to 9999 do
-  begin
-    // 2. 檢查特定路徑下的目錄是否已存在
-    // _Msg('未配號'):取得「未配號」字串(可能具備多國語言處理)
-    // Add_Zoo(i, 4):將數字 i 補齊為 4 位數(例如 1 變為 0001)
-    if Not DirectoryExists(Path + _Msg('未配號') + Add_Zoo(i, 4)) then
-    begin
-      // 3. 若該目錄不存在,代表此名稱可用,設定 Result 並跳出迴圈
-      Result := _Msg('未配號') + Add_Zoo(i, 4);
-      Break; // 找到第一個可用的名稱後立即停止搜尋
-    end;
-  end;
-end;
-```
-
-### **7) TCB_IMGPSScanX.SetSQLData 與 8) GetSQLData**
-
-這兩個方法是 OCX 與網頁 (JS) 溝通的雙向橋樑。
-
-- **SetSQLData (網頁 -> OCX)**:接收由網頁傳來的設定字串(通常用 | 或 , 分隔,例如 192.168.1.1|L12345678|200|C),在內部將字串切開 (Split),並分別賦值給 ServerIP, FCaseID, Fimgdpi, Fscancolor 等內部變數。
-- **GetSQLData (OCX -> 網頁)**:將 OCX 內部的處理結果(例如:UploadSuccess|3|0 代表上傳成功、共 3 頁、0 錯誤),組合成一個長字串後回傳給網頁端的 JS 進行後續的頁面跳轉或提示。
-
-### **8) TCB_IMGPSScanX.GetDefScanIni**
-
-- **功能描述**:取得並套用掃瞄參數的預設值與自訂設定。
-- **源碼實作解析**:
-    - **硬編碼預設值 (Hardcoded Defaults)**:
-
-      程式一開始會先寫死一組標準值,例如 Def_ScanDpi := 300 (預設 300 DPI)、Def_DeviceDeleteSize := 3072 (空白頁判定門檻為 3KB)。
-
-    - **動態配置覆蓋 (Dynamic Overriding)**:
-
-      透過 for i := 0 to WORK_INF_List.Count - 1 do 迴圈遍歷設定檔清單。使用 GetSQLData 取得參數代號 (PARA_NO) 與內容 (PARA_CONTENT)。
-
-- **屬性設定對照表**:
-
-  下表整理了此方法中設定的所有關鍵屬性、其對應的參數代號及功能說明。
-
-  | **屬性名稱 (內部變數)** | **對應 PARA_NO** | **PARA_CONTENT 處理方式(GetSQLData)** | **功能說明** |
-      | --- | --- | --- | --- |
-  | **Def_DeviceDelete** | SCAN_BLANKDEL_USE | 'Y' -> True, Else -> False | 空白頁自動刪除開關。 |
-  | **Def_DeviceDeleteSize** | SCAN_BLANKDEL_SIZE | StrToInt (若空則 0) | 空白頁判定門檻 (Bytes)。 |
-  | **Def_ScannerReverse** | SCAN_REVERSE | 'Y' -> True, Else -> False | 影像是否反相。 |
-  | **Def_BoardClear** | SCAN_BOARDCLEAR | 'Y' -> True, Else -> False | 是否清除影像黑邊。 |
-  | **Def_ScanDpi** | SCAN_DPI | StrToInt (若空則 300) | 掃描解析度。 |
-  | **Def_ScanDuplex** | SCAN_DUPLEX | 'Y' -> True, Else -> False | 是否啟用雙面掃描。 |
-  | **Def_ScanRotate** | SCAN_ROTATE_MODE | '0'->0, '1'->270, '2'->180, '3'->90 | 掃描旋轉角度映射。 |
-  | **Def_ScanDeskew** | SCAN_DESKEW | 'Y' -> True, Else -> False | 是否自動矯正傾斜。 |
-  | **Def_ScanImgSetUse** | SCAN_IMGSET_USE | 'Y' -> True, Else -> False | 是否使用亮度/對比設定。 |
-  | **Def_ScanBright** | SCAN_BRIGHT | StrToInt (限制 -255~255) | 亮度數值。 |
-  | **Def_ScanContrast** | SCAN_CONTRAST | StrToInt (限制 -255~255) | 對比數值。 |
-  | **Def_ScanImgShowMode** | SCAN_SHOW_MODE | '0','1','2' 對應模式 | 影像顯示/縮放模式。 |
-  | **ScanDenialTime** | CASE_IN_TIME | 直接存為 String | 進件截止時間限制。 |
-  | **ScanDenialHint** | SCAN_HINT | 直接存為 String | 掃描畫面提示字串。 |
-  | **NoSaveBarCodeList** | NO_SAVE_FORM_ID | CommaText := Value | 不存檔之表單代號清單。 |
-  | **ImagePath** | LOCAL_PATH | 直接存為 String | 本機端暫存路徑。 |
-  | **GuideFormIDList** | GUIDEFORMID | CommaText := Value | 導引頁表單 ID 清單。 |
-  | **DivPageFormIDList** | DIVPAGEFORMID | CommaText := Value | 分案頁表單 ID 清單。 |
-  | **FJpgCompression** | FILE_COMPRESSION | StrToInt | JPG 轉 TIF 壓縮比。 |
-  | **FMaxUploadSize** | MAX_UPLOAD_SIZE | 直接存為 String | 上傳大小限制 (MB)。 |
-
-## **貳、 記憶體直接操作實作清單**
-
-以下條列專案中直接涉及記憶體操作的程式區段:
-
-### **記憶體操作對應位置表**
-
-| **記憶體操作對象** | **所屬 Function / Procedure** | **關鍵操作關鍵字 / 代碼** | **記憶體特性說明** | 註記 |
-| --- | --- | --- | --- | --- |
-| **HInstance** | GetCurrentVersionNo | GetModuleFileName(HInstance, ...) | 模組載入位址。 | 增API版本號 |
-| **資源緩衝區** | GetCurrentVersionNo | VerQueryValue, GetFileVersionInfo | 透過 Pointer 進行二進位搜尋。 | 增API版本號 |
-| **DibHandle** | onAcquire | MyGraphic.Handle := DibHandle; | Windows 全域記憶體句柄轉移。 | 改套件實作/Rust |
-| **TMemoryStream** | onAcquire | MemoryStream.Write, .Read | Heap Memory 內部二進位操作。 |  |
-
-## **參、 遺失物件反推與說明**
-
-你提到在原始碼中找不到 _DelTree 和 Scanner 的實作,這是因為它們屬於以下兩種情況:
-
-### **1) TCB_IMGPSScanX._DelTree**
-
-- **這是一個自訂的私有輔助函式 (Private Helper)**。
-- **功能**:它的名稱源自 DOS 時代的指令 deltree(刪除整個目錄樹)。在 ActiveX 中,當上傳伺服器成功後,必須清空 C:\Temp\案件編號\ 裡的所有暫存圖檔與資料夾以釋放空間,並防止資料外洩。
-- **實作原理**:由於早期的 Delphi 沒有內建遞迴刪除目錄的單一指令,開發者通常會自己寫一個 _DelTree,裡面使用 FindFirst, FindNext 找出所有檔案並用 DeleteFile 刪除,最後用 RemoveDir 砍掉資料夾。
-
-### **2) Scanner**
-
-- **這是一個視覺化/非視覺化的第三方元件實例 (Component Instance)**。
-- **為何找不到宣告?** 因為在 Delphi 中,如果你是透過 IDE 的工具箱 (Tool Palette) 將 TEnScan 元件直接拖拉到窗體 (Form) 上,IDE 會自動把它寫在 .dfm 檔裡,並在 TCB_IMGPSScanX 類別的 published 區段自動產生一行 Scanner: TEnScan;。
-- **功能**:它就是 **Envision SDK** 裡用來與 TWAIN 硬體溝通的靈魂核心。所有的掃描屬性 (Scanner.Resolution) 與方法 (Scanner.Acquire) 都是對這個物件進行操作。
-
----
-
-# **IO 路徑與檔案操作分析**
-
-本報告詳列了 CB_IMGPSScanImp.pas 檔案中定義的所有 IO 相關變數,以及執行目錄與檔案管理的關鍵方法,並定義了抽像化所需的介面原型。
-
-## **壹、 關鍵路徑與檔案變數 (Variables)**
-
-程式中定義了多個全域或私有欄位,用來追蹤檔案在硬碟上的實體位置。
-
-### **1. 核心路徑變數與動態組合邏輯**
-
-| **變數名稱** | **類型** | **組合邏輯 (Combination Logic)** | **用途說明** |
-| --- | --- | --- | --- |
-| **ImagePath** | String | WORK_INF 的 LOCAL_PATH 參數值 | **本機基礎根路徑**。所有暫存資料的起點。 |
-| **ScaniniPath** | String | ImagePath + FWork_No + '\' + FUserUnit + '\' | **設定檔存放區**。區分作業別與單位。 |
-| **ImageSavePath** | String | 同 ImagePath (初期) 或隨 FMode 變動 | **影像儲存基準路徑**。 |
-| **ScanPath** | String | ImageSavePath + ScanCaseno + '\' + ScanDocdir + '\' | **當前掃描實體目錄**。指向最末層的影像資料夾。 |
-| **TransPath** | String | ImageSavePath + CaseID + '\Upload\' | **準備上傳區**。在傳送前將檔案結構扁平化組合於此。 |
-| **DisplayPath** | String | ImageSavePath + NowCaseNo + '\' | **預覽基準目錄**。用於 UI 點選樹狀圖時讀取特定案件資料。 |
-| **LngPath** | String | GetLocalAppDir(Handle) + 'MPS\CB_IMGPS\' | **應用程式資源路徑**。存放在使用者設定檔目錄以避開權限問題。 |
-| **CheckXmlPath** | String | ImagePath + 'OMRSITE\' | **OMR 規則暫存區**。存放從伺服器同步下來的 XML 定義。 |
-| **SamplePath** | String | ImagePath + 'Sample\' + FWork_No + '\' | **範本影像存放區**。按作業別區分。 |
-| **SitePath** | String | ImagePath + 'Site\' | **登打定位存放區**。 |
-| **FFtpRootPath** | String | 透過伺服器回傳值動態設定 | **FTP 伺服器根路徑**。指定在遠端 FTP 伺育器上存放影像檔的起始位址。 |
-
-### **2. 檔案名稱變數 (Filenames)**
-
-| **變數名稱** | **類型** | **用途說明** |
-| --- | --- | --- |
-| **ScanSaveFilename** | String | 下一張掃描影像預定的檔名(通常包含 FormID)。 |
-| **PEFileName** | String | 在 PageEnd 階段確定的最終完整檔案路徑。 |
-| **AttName** | String | **附件目錄名稱**。根據 FIs_In_Wh 決定為 Attach 或 S_Attach。 |
-| **Ext** | String | 副檔名。預設為 .tif,彩色/灰階模式下可能切換為 .jpg。 |
-
-## **貳、 關鍵 IO 操作方法 (Methods)**
-
-以下為需要進行抽像化設計的核心 IO 方法。
-
-### **1. 目錄管理 (Directory Management)**
-
-| **方法名稱** | **作用** | **應用場景** | **建議抽象 IO 介面** |
-| --- | --- | --- | --- |
-| _DelTree | 遞迴刪除整個目錄樹 | 上傳成功後清空暫存、模式切換初始化目錄 | RemoveDirRecursive(Path) |
-| Str2Dir / ForceDirectories | 確保路徑以 \ 結尾並建立路徑 | 初始化或掃描前建立資料夾 | EnsureDirExists(Path) |
-| GetNoNameCase | 搜尋尚未配號的臨時目錄 | 在本機搜尋如 未配號0001 到 9999 的可用路徑 | FindNextAvailablePath(Pattern) |
-| GetLocalAppDir | 取得 Windows %LocalAppData% 路徑 | 確保在現代 Windows 系統中有權限寫入語言檔與 Log | GetBaseStoragePath() |
-
-### **2. 存在性檢查與搜尋 (Existence & Search)**
-
-| **方法名稱** | **作用** | **應用場景** | **建議抽象 IO 介面** |
-| --- | --- | --- | --- |
-| FileExists | 檢查指定路徑檔案是否存在 | 在載入 .dat、.ini 或影像前進行安全檢查 | IsFilePresent(Path) |
-| DirectoryExists | 檢查指定路徑資料夾是否存在 | 在建立掃描目錄或上傳前確認結構完整性 | IsDirPresent(Path) |
-| FindFirst / FindNext | 搜尋符合特定格式的檔案 | 取得實體檔案大小 (FileRec.Size) 或遞迴搜尋檔案 | ListFiles(Path, Pattern) / GetFileInfo(Path) |
-
-### **3. 檔案生命週期與刪除 (File Lifecycle & Deletion)**
-
-| **方法名稱** | **作用** | **應用場景** | **建議抽象 IO 介面** |
-| --- | --- | --- | --- |
-| ReSortFileName | 影像重新編序命名 | 刪除或插入影像後,修正 001_xxx 等序號連續性 | RenameFile(Old, New) |
-| DeleteImageFile | 刪除實體影像檔 | 單張影像刪除並觸發 .dat 內容同步更新 | DeleteFile(Path) |
-| DeleteDocNoFile | 刪除特定文件代號下所有影像 | 整批文件(DocNo)的物理刪除與序號重整 | DeleteFilesByPattern(Pattern) |
-| DeleteShowFile | 刪除 UI 顯示中的影像清單 | 根據介面選取狀態進行批次物理刪除 | DeleteFileList(List<Path>) |
-| RenameFile / MoveFile | 檔案搬移或更名 | 用於「分案」、「移動頁數」或「變更歸類」 | MoveFile(Src, Dest) |
-| CopyFile | 複製實體檔案 | 影像搬移至上傳區或引用舊案件影像 | CopyFile(Src, Dest) |
-
-### **4. 資料紀錄與序列化 (Metadata IO)**
-
-| **方法名稱** | **作用** | **應用場景** | **建議抽象 IO 介面** |
-| --- | --- | --- | --- |
-| DeleteCustomDocDir | 移除自訂文件定義 | 從 CustomDocNo.ini 中移除特定自訂文件的節點 | Storage.IniDeleteSection(Section) |
-
-### **5. 網路傳輸 IO 方法 (Network Retrieval - dnFile_Get)**
-
-專案中使用 `dnFile_Get` 從伺服器端同步必要的環境檔案或規則定義。
-
-| **抓取對象 (目標路徑)** | **遠端請求 Action** | **用途說明** |  |
-| --- | --- | --- | --- |
-| **CheckXmlPath + filename** | `GetCheckXml` | **下載 OMR 檢核定義檔**。同步伺服器端最新的 XML 座標規則,用於自動判斷影像區域。 | https |
-| **SamplePath + filename** | `GetSampleImg` | **下載範本影像**。用於在 UI 介面上提供給操作員對照的標準範例圖檔。 | https |
-| **SitePath + filename** | `GetSiteImg` | **下載定位定義圖**。下載與登打、校對位置相關的輔助影像。 | https |
-| **LngPath + 'Language.ini'** | `GetLanguage` | **同步多國語言檔**。確保用戶端介面文字(繁體、英文、越南語等)與伺服器同步。 | https |
-
-## **參、 資料紀錄與序列化 (Metadata IO)**
-
-專案中使用了大量的 .dat 與 .ini 檔案來記錄目錄內的結構資訊與使用者偏好。
-
-### **1. .dat 檔案 (結構紀錄)**
-
-| **檔案名稱** | **組合路徑邏輯 (Path Logic)** | **內容與用途** |
-| --- | --- | --- |
-| **Context.dat** | ImageSavePath + CaseID + '\' + DocDir + '\Context.dat' | **影像清單**。紀錄該資料夾內所有影像檔名的正確順序。 |
-| **DocDir.dat** | ImageSavePath + CaseID + '\Upload\DocDir.dat' | **目錄對應表**。紀錄 Upload 下每個檔名所屬的原始 DocDir |
-| **CaseDocNo.dat** | ImageSavePath + CaseID + '\CaseDocNo.dat' | **文件目錄索引**。紀錄案件內已建立的實體資料夾名稱。 |
-| **CaseDocNo_Copies.dat** | ImageSavePath + CaseID + '\CaseDocNo_Copies.dat' | **份數紀錄**。對應 CaseDocNo.dat 中的資料夾分別有多少份。 |
-| **CaseIndex.dat** | ImageSavePath + CaseID + '\CaseIndex.dat' | **案件屬性**。如是否為「授信卷」(Case_loandoc)。 |
-| **EditedDocDir.dat** | ImageSavePath + CaseID + '\EditedDocDir.dat' | **異動清單**。紀錄當次操作中被修改過的文件目錄。 |
-| **Scan_Memo.dat** | DisplayPath + 'Scan_Memo.dat' | **使用者註記**。紀錄操作員手動輸入的備註內容。 |
-| **CaseList.dat** | ImageSavePath + 'CaseList.dat' | **案件總表**。紀錄目前本機快取中存在的所有 CaseID。 |
-
-### **2. .ini 檔案 (設定與偏好)**
-
-| **檔案名稱** | **路徑邏輯** | **回寫 (Write-back)** | **內容與用途** | 寫入關聯 |
-| --- | --- | --- | --- | --- |
-| **Scan.ini** | ScaniniPath + 'Scan.ini' | **是 (頻繁)** | **掃描器硬體設定**。儲存最後一次選取的 DPI、雙面、色彩模式、亮度、對比等參數。 |  |
-| **CustomDocNo.ini** | ScaniniPath + 'CustomDocNo.ini' | **是 (中等)** | **自訂文件代號**。儲存操作員定義的文件分類名稱與內部 ID 映射。 | DeleteCustomDocDir |
-| **CB_IMGPSScan.ini** | LngPath + 'CB_IMGPSScan.ini' | **是 (低頻)** | **環境配置**。儲存伺服器 IP、Port、自動更新版本資訊等全域參數。 |  |
-| **Language.ini** | LngPath + 'Language.ini' | **否 (唯讀同步)** | **多國語言包**。僅透過 `dnFile_Get` 從伺服器抓取更新,OCX 不自行修改。 |  |
-
-## **肆、 串流與讀寫操作 (Stream & File I/O)**
-
-源碼中頻繁使用 .LoadFromFile 與 .SaveToFile 來實現資料的持久化。
-
-### **1. 使用 TStringList 讀寫 .dat 結構**
-
-| **操作對象** | **讀取場景 (Load)** | **寫入場景 (Save)** | **建議抽象 IO 介面** |
-| --- | --- | --- | --- |
-| **結構清單 (.dat)** | LoadImgFile 載入以重建樹狀結構 | PageEnd 掃描完成或結構增刪後即時存檔 | ReadTextFile(Path) / WriteTextFile(Path, Content) |
-| **備註文件 (Memo)** | 進入備註編輯器時載入舊有內容 | WNoteBtnClick 完成編輯後儲存內容 | ReadTextFile(Path) / WriteTextFile(Path, Content) |
-| **上傳包定義** | N/A | CreateFormID_FormName 產生上傳包所需的定義檔 | WriteTextFile(Path, Content) |
-|  |  |  |  |
-
-### **2. 使用 TImageScrollBox / TDibGraphic 讀寫影像**
-
-| **操作對象** | **讀取場景 (Load)** | **寫入場景 (Save)** | **建議抽象 IO 介面** |
-| --- | --- | --- | --- |
-| **掃描影像原始檔** | view_image_... 載入顯示於預覽窗 | OnAcquire 將記憶體影像 (Dib) 持久化至磁碟 | ReadBinaryFile(Path) / WriteBinaryFile(Path, Blob) |
-| **影像處理覆蓋** | ImageReSize_FormID 讀取進行定位縮放 | 處理完成後覆蓋原始影像檔 | ReadBinaryFile(Path) / WriteBinaryFile(Path, Blob) |
-| **旋轉/後製處理** | 點擊旋轉按鈕後從磁碟重新讀取 | 旋轉完成後保存更新內容回實體檔案 | ReadBinaryFile(Path) / WriteBinaryFile(Path, Blob) |
-
-## **伍、 檔案路徑構造邏輯示例**
-
-程式中典型的路徑構造方式如下(以 PageEnd 為例):
-
-// 1. 基礎路徑
-
-ScanPath := ImageSavePath + ScanCaseno + '\';
-
-// 2. 進入特定文件目錄 (DocDir)
-
-ScanPath := ScanPath + ScanDocdir + '\';
-
-// 3. 確保實體目錄存在
-
-Str2Dir(ScanPath);
-
-// 4. 構造最終影像路徑
-
-PEFileName := ScanPath + Add_Zoo(PageCount, 3) + '_' + FormID + ext;
-
-## **陸、 IO 方法具體實作邏輯細部說明 (Detailed Implementation Logic)**
-
-本節針對 CB_IMGPSScanImp.pas 內部如何透過 Windows API 實作這些 IO 操作進行細部解說。
-
-### **1. Str2Dir(Path: string) 的運作機制**
-
-這個方法的主要作用是 **「路徑標準化與實體資料夾建立」**。
-
-- **字串處理**:它會先檢查傳入的 Path 字串最後一個字元是否為 \。如果不是,會自動補上。
-- **建立資料夾**:**是的,它會在內部建立資料夾**。它會呼叫 Delphi 的 ForceDirectories(Path) 函式。
-- **ForceDirectories 的特性**:與一般的 CreateDir 不同,ForceDirectories 會「遞迴」建立路徑中所有不存在的父目錄(例如若路徑為 C:\A\B\C,即使 A 和 B 都不存在,它也會一併建立)。
-
-### **2. _DelTree(DirName: string) 的遞迴邏輯**
-
-由於 Delphi 早期版本沒有提供單一函式來刪除包含檔案的資料夾,此方法透過 Windows 的搜尋機制實現:
-
-- **遍歷搜尋**:使用 FindFirst 和 FindNext 找出資料夾內的所有物件。
-- **檔案處理**:若搜尋到的是一般檔案,直接呼叫 DeleteFile。
-- **遞迴處理**:若搜尋到的是子資料夾,則「自己呼叫自己」 (_DelTree) 先清空該子資料夾。
-- **物理移除**:當資料夾內的所有內容都清空後,呼叫 RemoveDir 將空的資料夾從磁碟移除。
-
-### **3. FindFirst 與 FindNext 的搜尋與疊代邏輯**
-
-這兩個方法是 Delphi 處理「集合式 IO 操作」(如掃描目錄、批次刪除)的基礎,通常搭配 TSearchRec 結構使用。
-
-- **FindFirst(Path, Attr, SearchRec)**:
-- **動作**:啟動搜尋任務,將找到的第一個檔案資訊填入 SearchRec。
-- **應用例**:在 PM104Click (匯入影像) 時,程式會先執行 FindFirst(FName, faAnyfile, FileRec) 來確認使用者選取的實體檔案是否存在,並藉由 FileRec.Size 取得位元組大小,用以判斷是否超過系統設定的匯入限制(例如 5MB)。
-- **FindNext(SearchRec)**:
-- **動作**:繼續尋找下一個符合條件的檔案。
-- **疊代模式**:通常包裹在 repeat ... until FindNext(SR) <> 0 迴圈中。
-- **應用例**:在 _DelTree 實作中,程式利用此疊代邏輯將資料夾內「所有的」子目錄與檔案清空,直到 FindNext 回傳非零值(代表搜尋結束)。
-- **FindClose(SearchRec)**:
-- **重要性**:釋放搜尋控制代碼(Handle)。若未呼叫,頻繁搜尋會導致系統資源洩漏。
-
-### **4. GetNoNameCase(Path: string) 的搜尋邏輯**
-
-這是一個典型的 **「可用名稱查表」** 實作:
-
-- **迴圈範圍**:從 1 迭代到 9999。
-- **格式組合**:使用 Add_Zoo 函式將數字轉為四位數(如 0001),並加上前綴字「未配號」。
-- **磁碟檢查**:呼叫 DirectoryExists 檢查 Path + '未配號000x'。
-- **結果回傳**:第一個回傳 False(代表該資料夾尚不存在)的名稱即為結果,程式會立即跳出迴圈並選定此名稱。
-
-### **5. ReSortFileName(Path: string) 的連續性維護**
-
-為了保證 UI 上顯示的頁碼順序與磁碟檔名一致,此方法採用「先暫存、後改名」的策略:
-
-- **防止衝突**:先將目錄內所有符合格式的影像更名為帶有臨時前綴(如 @)的檔名。
-- **按序更名**:讀取 Context.dat 內的清單,依照目前的順序,將檔案逐一更名為 001_..., 002_... 等格式。
-- **同步索引**:最後將更名後的結果重新寫入 Context.dat。
-
-### **6. GetLocalAppDir(Handle: HWND) 的權限繞過**
-
-這是一個系統級別的 IO 位置定位方法:
-
-- **API 呼叫**:呼叫 SHGetSpecialFolderPath (Windows Shell API)。
-- **定位 CSIDL_LOCAL_APPDATA**:指向 C:\Users\使用者名稱\AppData\Local\。
-- **必要性**:這能解決 OCX 程式被安裝在 Program Files 下時,因為 UAC 權限無法在安裝目錄寫入 Log 或語言檔的問題。
-
-### **🎯 移植至 Web 平台的建議**
-
-當您將這些邏輯移植到 Web 時:
-
-- Str2Dir 應對應到 **IndexedDB** 的 Object Store 建立或 **File System Access API** 的 getDirectoryHandle(搭配 create: true)。
-- FindFirst / FindNext 在 Web 端應對應到 Directory Handle 的 entries() 異步疊代器。
-- .dat 序列化文件在 Web 端建議直接轉為 **JSON** 格式存儲於瀏覽器的 localStorage 或 IndexedDB 中。
-
-## **柒、 設定檔回寫邏輯 (Write-back Logic)**
-
-本節說明專案中哪些 .ini 檔案會由 OCX 主動更新資料及其觸發時機。
-
-| **檔案名稱** | **回寫內容 (Content)** | **觸發時機 (Trigger)** |
-| --- | --- | --- |
-| **Scan.ini** | DPI、Duplex、亮度、對比、影像模式 | 掃描前設定變更或啟動掃描時(SaveScanPara)。 |
-| **CustomDocNo.ini** | 自訂文件名稱與 ID 映射 | 操作員新增自訂分類或呼叫 `DeleteCustomDocDir` 時。 |
-| **CB_IMGPSScan.ini** | 版本號、伺服器 IP/Port | 自動更新完成後更新版號,或手動修改伺服器設定時。 |
-
-## **捌、 注意事項**
-
-- **硬編碼路徑**:ActiveFormCreate 中存在寫死的 C:\Temp\IMGPSScan,適合作為最終保險。
-- **權限問題**:作為 ActiveX,這些 IO 操作強烈依賴瀏覽器的「安全站台設定」或 IE 的「保護模式」。使用 GetLocalAppDir 是現代化重構中解決 UAC 權限問題的重要手段。
-
----
-
-# **TCB_IMGPSScanX OCX 通訊介面與溝通機制分析**
-
-本表條列了 Delphi 宿主環境(ActiveX[ocx]) 與 TCB_IMGPSScanX 元件之間主要的溝通管道、對應方法及其在系統架構中的作用。
-
-## **壹、 指令與資料交換介面表**
-
-| **通訊方法 (Method)** | **通訊方向** | **溝通內容 (Data Payload)** | **具體作用與目的** |
-| --- | --- | --- | --- |
-| **SetSQLData** | **宿主 -> OCX** | 以 ` | 或,` 分隔的長字串(如:IP, CaseID, DPI) |
-| **GetSQLData** | **宿主 <-> OCX** | 指定 Key (如 'PARA_NO') 取得對應 Value | **資料查詢通道**。宿主可詢問 OCX 目前快取清單中的特定數值,用於介面同步或邏輯判斷。 |
-| **GetSetInf1 ~ 7** | **宿主 <- OCX** | 單一字串值 (如 CaseID, 總張數, 成功標記 'Y') | **狀態出口 (Outlets)**。提供標準化的 7 個出口,讓 JavaScript 或宿主 App 輪詢(Polling)目前的執行結果或掃描統計。 |
-| **StatrTwainScan** | **宿主 -> OCX** | 無參數 (觸發動作) | **硬體啟動指令**。宿主程式按下「開始掃描」按鈕後呼叫此方法,通知 OCX 喚起 TWAIN 驅動程式。 |
-| **GetCurrentVersionNo** | **宿主 <- OCX** | 版本字串 (如 '1.0.3.5') | **版本識別**。宿主程式載入 OCX 後第一步通常會呼叫此處,用以比對伺服器版本並決定是否強制更新。 |
-| **upFile** | **宿主 -> OCX** | 無或部分參數 (觸發網路 IO) | **輸出指令**。通知 OCX 將本機暫存區的檔案(如 ZIP 包)依照先前設定好的路徑與權限上傳至伺服器。 |
-| **dnFile_Get** | **宿主 -> OCX** | 遠端 Action 關鍵字與本地檔名 | **同步指令**。通知 OCX 向伺服器抓取特定資源(如 XML 規則或語言檔)並存放到指定 IO 路徑。 |
-| **ActiveFormCreate** | **系統 -> OCX** | 視窗建立事件 | **環境初始化**。當宿主程式實體化 OCX 時,自動觸發此處執行 GetDefScanIni,確保掃描環境就緒。 |
-| **Property CaseID** | **宿主 <-> OCX** | WideString | **屬性直連**。透過 COM 屬性機制直接設定或讀取案件編號。 |
-| **Property ScreenSnap** | **宿主 -> OCX** | Boolean | **功能切換**。控制 OCX 是否要在特定時機執行螢幕截圖稽核。 |
-
-## **貳、 溝通機制細部說明**
-
-### **1. 參數化配置 (Config-by-String)**
-
-本專案大量使用 SetSQLData 這種「一條字串走天下」的設計,這在早期 ActiveX 開發中非常流行,優點是規避了 COM 介面頻繁修改 _TLB.pas 的麻煩。您在轉換 TypeScript UI 時,可以將其封裝為一個 JSON 物件,最後再組合成字串傳給這個方法。
-
-### **2. 狀態回饋 (The Inf1~7 Pattern)**
-
-由於 ActiveX 事件 (Events) 的回傳有時在網頁端不夠穩定,開發者選擇了 GetSetInf 系列。宿主程式通常會在執行完某個長耗時動作(如 upFile)後,連續呼叫 GetSetInf3 (成功標記) 與 GetSetInf6 (錯誤訊息) 來決定下一步 UI 流程。
-
-### **3. 雙向同步 (Bidirectional Sync)**
-
-- **同步設定**:宿主透過 GetDefScanIni 觸發,OCX 內部完成硬體設定。
-- **同步資料**:宿主透過 dnFile_Get 觸發,OCX 完成本機與伺服器的檔案 IO 同步。
-
-# **參、描服務抽象層實作**
-
-採用 **「抽象介面層 (Abstraction Layer)」** 配合 **「適配器模式 (Adapter Pattern)」**,處理遺留系統(Legacy System)過渡到現代化架構
-
-```tsx
-/**
- * 掃描服務資料模型定義
- * 將原本 OCX 雜亂的字串溝通 (SetSQLData) 結構化
- */
-export interface ScanConfig {
-  serverIp: string;
-  caseId: string;
-  dpi: number;
-  isColor: boolean;
-  isDuplex: boolean;
-  // ... 其他來自 GetDefScanIni 的參數
-}
-
-export interface ScanStatus {
-  caseId: string;
-  totalPageCount: number;
-  isUploadSuccess: boolean;
-  lastBarcode: string;
-  errorMessage: string;
-}
-
-/**
- * 掃描服務抽象介面 (IScanService)
- * UI 層僅與此介面溝通,不直接操作底層實作
- */
-export interface IScanService {
-  initialize(config: ScanConfig): Promise<void>;
-  startScan(): Promise<boolean>;
-  uploadFiles(): Promise<boolean>;
-  getStatus(): Promise<ScanStatus>;
-  getVersion(): Promise<string>;
-  downloadResource(action: string, fileName: string): Promise<void>;
-}
-
-/**
- * 實作 A: ActiveX 適配器 (Legacy Adapter)
- * 用於目前環境:UI (TS) -> Delphi Browser -> ActiveX (OCX)
- */
-export class ActiveXScanAdapter implements IScanService {
-  private ocx: any;
-
-  constructor() {
-    // 透過 window.external 或 Delphi Bridge 取得 OCX 實例
-    this.ocx = (window as any).OCX_INSTANCE;
-  }
-
-  async initialize(config: ScanConfig): Promise<void> {
-    // 將 JSON 轉回 OCX 慣用的管道分隔字串 (SetSQLData 邏輯)
-    const sqlDataStr = `${config.serverIp}|${config.caseId}|${config.dpi}|${config.isColor ? 'C' : 'G'}`;
-    this.ocx.SetSQLData(sqlDataStr);
-  }
-
-  async startScan(): Promise<boolean> {
-    this.ocx.StatrTwainScan();
-    return true; // 實際狀態需透過 GetSetInf 輪詢
-  }
-
-  async getStatus(): Promise<ScanStatus> {
-    return {
-      caseId: this.ocx.GetSetInf1(),
-      totalPageCount: parseInt(this.ocx.GetSetInf2()),
-      isUploadSuccess: this.ocx.GetSetInf3() === 'Y',
-      lastBarcode: this.ocx.GetSetInf5(),
-      errorMessage: this.ocx.GetSetInf6()
-    };
-  }
-
-  async uploadFiles(): Promise<boolean> {
-    this.ocx.upFile();
-    return true;
-  }
-
-  async getVersion(): Promise<string> {
-    return this.ocx.GetCurrentVersionNo();
-  }
-
-  async downloadResource(action: string, fileName: string): Promise<void> {
-    this.ocx.dnFile_Get(action, fileName);
-  }
-}
-
-/**
- * 實作 B: Backend Server 適配器 (Future Adapter)
- * 用於未來環境:UI (TS) -> REST API / WebSocket -> Rust/Go Backend
- */
-export class BackendServerAdapter implements IScanService {
-  private apiUrl = "http://localhost:8080/api/scanner";
-
-  async initialize(config: ScanConfig): Promise<void> {
-    await fetch(`${this.apiUrl}/config`, {
-      method: 'POST',
-      body: JSON.stringify(config)
-    });
-  }
-
-  async startScan(): Promise<boolean> {
-    const res = await fetch(`${this.apiUrl}/scan`, { method: 'POST' });
-    return res.ok;
-  }
-
-  async getStatus(): Promise<ScanStatus> {
-    const res = await fetch(`${this.apiUrl}/status`);
-    return await res.json();
-  }
-
-  async uploadFiles(): Promise<boolean> {
-    const res = await fetch(`${this.apiUrl}/upload`, { method: 'POST' });
-    return res.ok;
-  }
-
-  async getVersion(): Promise<string> {
-    const res = await fetch(`${this.apiUrl}/version`);
-    const data = await res.json();
-    return data.version;
-  }
-
-  async downloadResource(action: string, fileName: string): Promise<void> {
-    // 未來可能直接由後端處理,前端僅發送同步指令
-    await fetch(`${this.apiUrl}/sync?action=${action}&file=${fileName}`);
-  }
-}
-
-/**
- * 服務工廠 (Scanner Factory)
- * 根據環境自動切換實作
- */
-export class ScannerFactory {
-  static getService(): IScanService {
-    if ((window as any).OCX_INSTANCE) {
-      console.log("偵測到 ActiveX 環境,啟用 ActiveX 適配器");
-      return new ActiveXScanAdapter();
-    } else {
-      console.log("現代瀏覽器環境,啟用後端 API 適配器");
-      return new BackendServerAdapter();
-    }
-  }
-}
-```
-
-### **1. 介面標準化(JSON 化)**
-
-原先 OCX 使用 SetSQLData 的「長字串」溝通是非常脆弱的(一項參數順序錯了就全毀)。在 TypeScript 抽象層中,請務必將其轉換為 **強型別的 JSON 物件**(如 ScanConfig 介面)。這樣你的 UI 邏輯在處理設定時會非常直覺。
-
-### **2. 非同步處理(Promise/Async)**
-
-ActiveX 的方法通常是同步阻塞的,而後端 API 是非同步的。
-
-- **建議**:在抽象介面(IScanService)中,所有方法都回傳 Promise。
-- **原因**:這樣當你未來切換到後端伺服器(fetch API)時,UI 的調用邏輯(await service.startScan())不需要做任何修改。
-
-### **3. 實作「心跳」或「狀態輪詢」**
-
-原本 GetSetInf1~7 主要是靠宿主程式主動去「問」OCX。
-
-- **抽象層建議**:在 IScanService 中實作一個 subscribeStatus(callback) 的觀察者模式。
-- **ActiveX 模式下**:在適配器內部啟動一個 setInterval 去輪詢 GetSetInf。
-- **未來後端模式下**:適配器改用 **WebSocket** 接收後端主動推播的掃描事件。
-- **UI 層感受**:UI 只需要處理 onStatusUpdate 事件,根本不用管底層是用輪詢還是 WebSocket。
-
-### **4. 資源路徑的轉義(The Bridge Proxy)**
-
-這是我之前提到的關鍵:由於 iframe 裡的 TypeScript 無法存取 C:\Temp,但 ActiveX 依舊會把檔案掃到那裡。
-
-- **策略**:你的 Delphi Browser 需要實作一個簡單的本地 Proxy。
-- **實作**:當 TypeScript 需要顯示圖檔時,它請求 http://local.bridge/view/001.tif,Delphi Browser 攔截此請求並從實體路徑讀取檔案回傳。
-- **好處**:未來改為 Backend Server 時,Server 也可以提供同樣的 URL 格式,UI 完全無縫接軌。
-
-## **肆、 Delphi 與 JavaScript 通訊橋樑 (Bridge) 實作說明**
-
-當您在 Delphi 宿主程式中使用內嵌瀏覽器時,JavaScript 取得 `OCX_INSTANCE` 的方式取決於底層的瀏覽器引擎:
-
-### **1. 舊版 IE 核心 (TWebBrowser / window.external)**
-
-這是最傳統的方式,Delphi 會透過實作 `IDocHostUIHandler` 介面,將一個自訂的 `IDispatch` 物件掛載到 `window.external` 上。
-
-- **Delphi 端**:將 `TCB_IMGPSScanX` 實例或其包裝類別指派給瀏覽器的 `External` 屬性。
-- **JS 端**:直接使用 `window.external.StatrTwainScan()` 呼叫。
-
-### **2. 新版 Edge 核心 (TEdgeBrowser / WebView2 Host Objects)**
-
-這是現代化的做法。Delphi 透過 WebView2 的 API 將物件直接「注入」到 JS 的命名空間中。
-
-- **Delphi 端執行**:
-
-    ```pascal
-    // 將 OCX 物件以 'OCX_INSTANCE' 名稱注入
-    EdgeBrowser.AddHostObjectToScript('OCX_INSTANCE', MyOcxWrapperObject);
-    ```
-
-- **JS 端取得**: WebView2 會將物件放置在 `window.chrome.webview.hostObjects` 底下。
-
-    ```jsx
-    const ocx = window.chrome.webview.hostObjects.OCX_INSTANCE;
-    ```
-
-
-### **3. 為什麼需要 Wrapper (包裝類別)?**
-
-通常我們**不建議**直接將 `TCB_IMGPSScanX` 注入,原因如下:
-
-1. **安全性**:直接暴露 COM 元件可能會有安全漏洞。
-2. **相容性**:OCX 的某些方法回傳型別(如 Delphi 的自訂 Enum)JavaScript 無法識別。
-3. **執行緒優化**:Delphi 可以在 Wrapper 中使用 `TThread.Queue` 確保掃描指令在正確的執行緒執行,避免瀏覽器 UI 凍結。
-
-### **4. 溝通路徑總結**
-
-1. **Delphi 宿主程式** 啟動並實體化 **OCX 控制項**。
-2. **Delphi 宿主程式** 建立 **Browser 物件** 並載入 **TypeScript UI (HTML)**。
-3. **Delphi 宿主程式** 呼叫瀏覽器 API(如 `AddHostObjectToScript`),將 OCX 的操作介面「注入」到該網頁的 `window` 物件中。
-4. **TypeScript** 透過抽象層 (Adapter) 取得該物件,實現「網頁點按鈕,掃描機開動」的效果。
-
----
-
-
-# Transport 相關套件分析
-
----
-
-# Image Processor 相關套件分析

--
Gitblit v1.8.0