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