{ ============================================================================== 方法名稱:Initialize 引用相依:TDibGraphic 方法描述:初始化元件狀態。註冊各類視窗與滑鼠事件處理函式(如 OnActivate, OnClick , OnCreate 等),並設定多項預設參數,包含 MpsKey、瀏覽窗邊界、檔案副檔名、 案件與表單編號長度、去直線容忍值及切圖條碼類型。 ============================================================================== } procedure TCB_IMGPSScanX.Initialize; begin inherited Initialize; OnActivate := ActivateEvent; OnClick := ClickEvent; OnCreate := CreateEvent; OnDblClick := DblClickEvent; OnDeactivate := DeactivateEvent; OnDestroy := DestroyEvent; OnKeyPress := KeyPressEvent; OnMouseEnter := MouseEnterEvent; OnMouseLeave := MouseLeaveEvent; OnPaint := PaintEvent; MpsKey := 'fbim'; Seg := 3; //瀏覽窗的邊界 Ext := '.tif'; SafePixel := 20; CaseIDLength := 16; //案件編號長度 16碼 20170222 在用網頁參數來取代 FormIDLength := 15; //FormID長度 15碼 20170222 發現是用來辨識條碼用的 ///DocNoLength := 8; //DocNo長度 8碼 (1~8) //20170222 發現沒用到就註解吧 Bt :=4; //去直線時橫線判斷的容忍值 CropBarcode := 'CC';//要切影像的條碼 end; { ============================================================================== 方法名稱:Get_Active 引用相依: 方法描述:獲取元件的 Active 狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_Active: WordBool; begin Result := Active; end; { ============================================================================== 方法名稱:Get_AlignDisabled 引用相依: 方法描述:獲取元件的 AlignDisabled 狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_AlignDisabled: WordBool; begin Result := AlignDisabled; end; { ============================================================================== 方法名稱:Get_AlignWithMargins 引用相依: 方法描述:獲取元件的 AlignWithMargins 狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_AlignWithMargins: WordBool; begin Result := AlignWithMargins; end; { ============================================================================== 方法名稱:Get_AutoScroll 引用相依: 方法描述:獲取元件的 AutoScroll 狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_AutoScroll: WordBool; begin Result := AutoScroll; end; { ============================================================================== 方法名稱:Get_AutoSize 引用相依: 方法描述:獲取元件的 AutoSize 狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_AutoSize: WordBool; begin Result := AutoSize; end; { ============================================================================== 方法名稱:Get_AxBorderStyle 引用相依: 方法描述:獲取元件的 AxBorderStyle 邊框樣式。 ============================================================================== } function TCB_IMGPSScanX.Get_AxBorderStyle: TxActiveFormBorderStyle; begin Result := Ord(AxBorderStyle); end; { ============================================================================== 方法名稱:Get_Caption 引用相依: 方法描述:獲取元件的標題文字。 ============================================================================== } function TCB_IMGPSScanX.Get_Caption: WideString; begin Result := WideString(Caption); end; { ============================================================================== 方法名稱:Get_Color 引用相依: 方法描述:獲取元件的背景顏色。 ============================================================================== } function TCB_IMGPSScanX.Get_Color: OLE_COLOR; begin Result := OLE_COLOR(Color); end; { ============================================================================== 方法名稱:Get_DockSite 引用相依: 方法描述:獲取元件的 DockSite 狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_DockSite: WordBool; begin Result := DockSite; end; { ============================================================================== 方法名稱:Get_DoubleBuffered 引用相依: 方法描述:獲獲取元件的 DoubleBuffered 狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_DoubleBuffered: WordBool; begin Result := DoubleBuffered; end; { ============================================================================== 方法名稱:Get_DropTarget 引用相依: 方法描述:獲取元件的 DropTarget 狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_DropTarget: WordBool; begin Result := DropTarget; end; { ============================================================================== 方法名稱:Get_Enabled 引用相依: 方法描述:獲取元件的啟用狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_Enabled: WordBool; begin Result := Enabled; end; { ============================================================================== 方法名稱:Get_ExplicitHeight 引用相依: 方法描述:獲取元件的明確高度。 ============================================================================== } function TCB_IMGPSScanX.Get_ExplicitHeight: Integer; begin Result := ExplicitHeight; end; { ============================================================================== 方法名稱:Get_ExplicitLeft 引用相依: 方法描述:獲取元件的明確左座標。 ============================================================================== } function TCB_IMGPSScanX.Get_ExplicitLeft: Integer; begin Result := ExplicitLeft; end; { ============================================================================== 方法名稱:Get_ExplicitTop 引用相依: 方法描述:獲取元件的明確頂座標。 ============================================================================== } function TCB_IMGPSScanX.Get_ExplicitTop: Integer; begin Result := ExplicitTop; end; { ============================================================================== 方法名稱:Get_ExplicitWidth 引用相依: 方法描述:獲取元件的明確寬度。 ============================================================================== } function TCB_IMGPSScanX.Get_ExplicitWidth: Integer; begin Result := ExplicitWidth; end; { ============================================================================== 方法名稱:Get_Font 引用相依: 方法描述:獲取元件的字型。 ============================================================================== } function TCB_IMGPSScanX.Get_Font: IFontDisp; begin GetOleFont(Font, Result); end; { ============================================================================== 方法名稱:Get_HelpFile 引用相依: 方法描述:獲取元件的說明檔路徑。 ============================================================================== } function TCB_IMGPSScanX.Get_HelpFile: WideString; begin Result := WideString(HelpFile); end; { ============================================================================== 方法名稱:Get_KeyPreview 引用相依: 方法描述:獲取元件的鍵盤預覽狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_KeyPreview: WordBool; begin Result := KeyPreview; end; { ============================================================================== 方法名稱:Get_MouseInClient 引用相依: 方法描述:獲取滑鼠是否在元件內部區域。 ============================================================================== } function TCB_IMGPSScanX.Get_MouseInClient: WordBool; begin Result := MouseInClient; end; { ============================================================================== 方法名稱:Get_ParentCustomHint 引用相依: 方法描述:獲取元件的 ParentCustomHint 狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_ParentCustomHint: WordBool; begin Result := ParentCustomHint; end; { ============================================================================== 方法名稱:Get_ParentDoubleBuffered 引用相依: 方法描述:獲取元件的 ParentDoubleBuffered 狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_ParentDoubleBuffered: WordBool; begin Result := ParentDoubleBuffered; end; { ============================================================================== 方法名稱:Get_PixelsPerInch 引用相依: 方法描述:獲取元件的 PixelsPerInch 設定。 ============================================================================== } function TCB_IMGPSScanX.Get_PixelsPerInch: Integer; begin Result := PixelsPerInch; end; { ============================================================================== 方法名稱:Get_PopupMode 引用相依: 方法描述:獲取元件的彈出視窗模式。 ============================================================================== } function TCB_IMGPSScanX.Get_PopupMode: TxPopupMode; begin Result := Ord(PopupMode); end; { ============================================================================== 方法名稱:Get_PrintScale 引用相依: 方法描述:獲取元件的列印縮放比例。 ============================================================================== } function TCB_IMGPSScanX.Get_PrintScale: TxPrintScale; begin Result := Ord(PrintScale); end; { ============================================================================== 方法名稱:Get_Scaled 引用相依: 方法描述:獲取元件的 Scaled 縮放狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_Scaled: WordBool; begin Result := Scaled; end; { ============================================================================== 方法名稱:Get_ScreenSnap 引用相依: 方法描述:獲取元件的 ScreenSnap 狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_ScreenSnap: WordBool; begin Result := ScreenSnap; end; { ============================================================================== 方法名稱:Get_SnapBuffer 引用相依: 方法描述:獲取元件的 SnapBuffer 設定。 ============================================================================== } function TCB_IMGPSScanX.Get_SnapBuffer: Integer; begin Result := SnapBuffer; end; { ============================================================================== 方法名稱:Get_UseDockManager 引用相依: 方法描述:獲取元件是否使用 Dock 管理。 ============================================================================== } function TCB_IMGPSScanX.Get_UseDockManager: WordBool; begin Result := UseDockManager; end; { ============================================================================== 方法名稱:Get_Visible 引用相依: 方法描述:獲取元件的顯示狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_Visible: WordBool; begin Result := Visible; end; { ============================================================================== 方法名稱:Get_VisibleDockClientCount 引用相依: 方法描述:獲取元件的可見 Dock 客戶端數量。 ============================================================================== } function TCB_IMGPSScanX.Get_VisibleDockClientCount: Integer; begin Result := VisibleDockClientCount; end; { ============================================================================== 方法名稱:_Set_Font 引用相依: 方法描述:設定元件的字型。 ============================================================================== } procedure TCB_IMGPSScanX._Set_Font(var Value: IFontDisp); begin SetOleFont(Font, Value); end; { ============================================================================== 方法名稱:mode1Click 引用相依: 方法描述:切換至檢視模式 0(單頁顯示),呼叫 GoViewMode 更新佈局,並隱藏 Panel14 控制面版。 ============================================================================== } procedure TCB_IMGPSScanX.mode1Click(Sender: TObject); begin VMode := 0; GoViewMode; //ScrollBar1Change(Self); Panel14.Visible := False; end; { ============================================================================== 方法名稱:mode2Click 引用相依: 方法描述:切換至檢視模式 1(兩頁顯示),呼叫 GoViewMode 更新佈局,並顯示 Panel14 控制面版。 ============================================================================== } procedure TCB_IMGPSScanX.mode2Click(Sender: TObject); begin VMode := 1; GoViewMode; //ScrollBar1Change(Self); Panel14.Visible := True; end; { ============================================================================== 方法名稱:mode3Click 引用相依: 方法描述:切換至檢視模式 2(多頁網格顯示),呼叫 GoViewMode 更新佈局,並觸發捲軸變 動以重新載入影像。 ============================================================================== } procedure TCB_IMGPSScanX.mode3Click(Sender: TObject); begin VMode := 2; GoViewMode; ScrollBar1Change(Self); end; { ============================================================================== 方法名稱:mode4Click 引用相依: 方法描述:切換至檢視模式 3(自定義檢視模式),呼叫 GoViewMode 更新佈局,並觸發捲軸 變動以重新載入影像。 ============================================================================== } procedure TCB_IMGPSScanX.mode4Click(Sender: TObject); begin VMode := 3; GoViewMode; ScrollBar1Change(Self); end; { ============================================================================== 方法名稱:Set_AlignWithMargins 引用相依: 方法描述:設定元件的 AlignWithMargins 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_AlignWithMargins(Value: WordBool); begin AlignWithMargins := Value; end; { ============================================================================== 方法名稱:Set_AutoScroll 引用相依: 方法描述:設定元件的 AutoScroll 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_AutoScroll(Value: WordBool); begin AutoScroll := Value; end; { ============================================================================== 方法名稱:Set_AutoSize 引用相依: 方法描述:設定元件的 AutoSize 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_AutoSize(Value: WordBool); begin AutoSize := Value; end; { ============================================================================== 方法名稱:Set_AxBorderStyle 引用相依: 方法描述:設定元件的 AxBorderStyle 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_AxBorderStyle(Value: TxActiveFormBorderStyle); begin AxBorderStyle := TActiveFormBorderStyle(Value); end; { ============================================================================== 方法名稱:Set_Caption 引用相依: 方法描述:設定元件的標題文字。 ============================================================================== } procedure TCB_IMGPSScanX.Set_Caption(const Value: WideString); begin Caption := TCaption(Value); end; { ============================================================================== 方法名稱:Set_Color 引用相依: 方法描述:設定元件的背景顏色。 ============================================================================== } procedure TCB_IMGPSScanX.Set_Color(Value: OLE_COLOR); begin Color := TColor(Value); end; { ============================================================================== 方法名稱:Set_DockSite 引用相依: 方法描述:設定元件的 DockSite 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_DockSite(Value: WordBool); begin DockSite := Value; end; { ============================================================================== 方法名稱:Set_DoubleBuffered 引用相依: 方法描述:設定元件的 DoubleBuffered 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_DoubleBuffered(Value: WordBool); begin DoubleBuffered := Value; end; { ============================================================================== 方法名稱:Set_DropTarget 引用相依: 方法描述:設定元件的 DropTarget 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_DropTarget(Value: WordBool); begin DropTarget := Value; end; { ============================================================================== 方法名稱:Set_Enabled 引用相依: 方法描述:設定元件的啟用狀態。 ============================================================================== } procedure TCB_IMGPSScanX.Set_Enabled(Value: WordBool); begin Enabled := Value; end; { ============================================================================== 方法名稱:Set_Font 引用相依: 方法描述:設定元件的字型。 ============================================================================== } procedure TCB_IMGPSScanX.Set_Font(const Value: IFontDisp); begin SetOleFont(Font, Value); end; { ============================================================================== 方法名稱:Set_HelpFile 引用相依: 方法描述:設定元件的說明檔路徑。 ============================================================================== } procedure TCB_IMGPSScanX.Set_HelpFile(const Value: WideString); begin HelpFile := string(Value); end; { ============================================================================== 方法名稱:Set_KeyPreview 引用相依: 方法描述:設定元件的鍵盤預覽狀態。 ============================================================================== } procedure TCB_IMGPSScanX.Set_KeyPreview(Value: WordBool); begin KeyPreview := Value; end; { ============================================================================== 方法名稱:Set_ParentCustomHint 引用相依: 方法描述:設定元件的 ParentCustomHint 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_ParentCustomHint(Value: WordBool); begin ParentCustomHint := Value; end; { ============================================================================== 方法名稱:Set_ParentDoubleBuffered 引用相依: 方法描述:設定元件的 ParentDoubleBuffered 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_ParentDoubleBuffered(Value: WordBool); begin ParentDoubleBuffered := Value; end; { ============================================================================== 方法名稱:Set_PixelsPerInch 引用相依: 方法描述:設定元件的 PixelsPerInch 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_PixelsPerInch(Value: Integer); begin PixelsPerInch := Value; end; { ============================================================================== 方法名稱:Set_PopupMode 引用相依: 方法描述:設定元件的彈出視窗模式。 ============================================================================== } procedure TCB_IMGPSScanX.Set_PopupMode(Value: TxPopupMode); begin PopupMode := TPopupMode(Value); end; { ============================================================================== 方法名稱:Set_PrintScale 引用相依: 方法描述:設定元件的列印縮放比例。 ============================================================================== } procedure TCB_IMGPSScanX.Set_PrintScale(Value: TxPrintScale); begin PrintScale := TPrintScale(Value); end; { ============================================================================== 方法名稱:Set_Scaled 引用相依: 方法描述:設定元件的 Scaled 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_Scaled(Value: WordBool); begin Scaled := Value; end; { ============================================================================== 方法名稱:Set_ScreenSnap 引用相依: 方法描述:設定元件的 ScreenSnap 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_ScreenSnap(Value: WordBool); begin ScreenSnap := Value; end; { ============================================================================== 方法名稱:Set_SnapBuffer 引用相依: 方法描述:設定元件的 SnapBuffer 屬性。 ============================================================================== } procedure TCB_IMGPSScanX.Set_SnapBuffer(Value: Integer); begin SnapBuffer := Value; end; { ============================================================================== 方法名稱:Set_UseDockManager 引用相依: 方法描述:設定元件是否使用 Dock 管理。 ============================================================================== } procedure TCB_IMGPSScanX.Set_UseDockManager(Value: WordBool); begin UseDockManager := Value; end; { ============================================================================== 方法名稱:Set_Visible 引用相依: 方法描述:設定元件的顯示狀態。 ============================================================================== } procedure TCB_IMGPSScanX.Set_Visible(Value: WordBool); begin Visible := Value; end; { ============================================================================== 方法名稱:N1Click 引用相依: 方法描述:彈出對話框要求使用者輸入目標頁碼,呼叫 MoveImage 將當前顯示的影像移動 到指定的位置。 ============================================================================== } procedure TCB_IMGPSScanX.N1Click(Sender: TObject); var mp:string; begin mp := InputBox(_Msg('移動頁數'),_Msg('請輸入移入頁碼'),''); if (mp <> '') then begin MoveImage(DisplayPath+NowDocDir+'\',strtoint(mp)); end; end; { ============================================================================== 方法名稱:N51Click 引用相依: 方法描述:切換至檢視模式 4,呼叫 GoViewMode 更新佈局,並觸發捲軸變動以重新載入影 像。 ============================================================================== } procedure TCB_IMGPSScanX.N51Click(Sender: TObject); begin VMode := 4; GoViewMode; ScrollBar1Change(Self); end; { ============================================================================== 方法名稱:Panel11DblClick 引用相依: 方法描述:Panel11 的連按兩下事件,目前實作已註解掉。 ============================================================================== } procedure TCB_IMGPSScanX.Panel11DblClick(Sender: TObject); begin // Button3.Visible := not Button3.Visible; //Button4.Visible := not Button4.Visible; //self.FCustDocYN := 'N'; end; { ============================================================================== 方法名稱:Panel1DblClick 引用相依: 方法描述:Panel1 的連按兩下事件,用於切換 Button1 與 Button2 的顯示狀態。 ============================================================================== } procedure TCB_IMGPSScanX.Panel1DblClick(Sender: TObject); begin Button1.Visible := not Button1.Visible; Button2.Visible := not Button2.Visible; end; { ============================================================================== 方法名稱:Panel9Resize 引用相依: 方法描述:當 Panel9 大小改變時,呼叫 GoViewMode 重新調整影像佈局。 ============================================================================== } procedure TCB_IMGPSScanX.Panel9Resize(Sender: TObject); begin GoViewMode; end; { ============================================================================== 方法名稱:DocNoIsExistImg 引用相依:FileExists, LoadFromFile 方法描述:檢查指定的文件目錄路徑下是否存在影像檔案。首先讀取目錄中的 Context.da t 檔案,接著遍歷清單中的所有檔名並檢查實際檔案是否存在。若發現任何一個 影像檔案存在則回傳 False(表示非空),否則回傳 True。 ============================================================================== } function TCB_IMGPSScanX.DocNoIsExistImg(DocNopath:String):boolean; var i:integer; ST:TStringList; begin Result:=False; ST:=TStringList.Create; if FileExists(DocNopath+'\Context.dat') then /////20190319 Hong 當有空的Docno目錄時會掛掉,增加這行 ST.loadFromfile(DocNopath+'\Context.dat'); for I := 0 to ST.Count - 1 do begin if ISExistImg(DocNopath+ST.Strings[i]) then begin Result:=False; Exit; Break; end; end; Result:=True; end; { ============================================================================== 方法名稱:_DelTreeForExistImg 引用相依:_DelTree 方法描述:存根方法,目前未包含具體實作邏輯。 ============================================================================== } procedure TCB_IMGPSScanX._DelTreeForExistImg(ASourceDir:String); var i:integer; ST:TStringList; begin end; { ============================================================================== 方法名稱:ScrollBar1Change 引用相依: 方法描述:捲軸變動處理,目前實作已透過 Exit 暫時停用。 ============================================================================== } procedure TCB_IMGPSScanX.ScrollBar1Change(Sender: TObject); begin Exit; If (TreeView1.Selected = MyTreenode1) or (TreeView1.Selected.ImageIndex = 6) Then begin view_image_FormCode(DisplayPath,'ShowAll',ScrollBar1.Position,1); end Else IF (TreeView1.Selected = MyTreenode2) then begin view_image_FormCode(DisplayPath,NowDocNo,ScrollBar1.Position,1); end Else if (TreeView1.Selected = MyTreenode3) then begin view_image_FormCode(DisplayPath,NowFormCode,ScrollBar1.Position,1); end; end; { ============================================================================== 方法名稱:ActiveFormKeyUp 引用相依: 方法描述:處理 ActiveForm 按鍵放開事件。當文字輸入框取得焦點且有選取影像時,攔截 上下方向鍵並將其轉化為 PriorPage 或 NextPage 翻頁操作,並同步滾動捲軸 。 ============================================================================== } procedure TCB_IMGPSScanX.ActiveFormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Edit1.Focused then begin if selectISB = nil then Exit; if (Key =VK_UP) then begin PriorPage(SelectPage); if (SelectISB.Parent.Top-4) < 0 then scrollBox1.VertScrollBar.Position := scrollBox1.VertScrollBar.Position + SelectISB.Parent.Top-4; //ISBClick(TImageScrollBox(FindComponent(ISBName+'1'))); end; if (Key =VK_Down) then begin NextPage(SelectPage); if SelectISB.Parent.Top+SelectISB.Parent.Height+4 > scrollBox1.Height then ScrollBox1.VertScrollBar.Position := scrollBox1.VertScrollBar.Position + (SelectISB.Parent.Top+SelectISB.Parent.Height-ScrollBox1.Height+8); //scrollBox1.VertScrollBar.ScrollPos := SelectISB.Parent.Top+SelectISB.Parent.Height; //ISBClick(TImageScrollBox(FindComponent(ISBName+'2'))); end; end; end; { ============================================================================== 方法名稱:AddAttFileLBClick 引用相依:FileExists, CopyFile 方法描述:處理「加入附加電子檔」按鈕點擊。開啟檔案對話框選取多個 PDF 檔案,支援覆 蓋檢查。執行 CopyFile 將檔案複製到案件目錄下,並呼叫 SetAttContextList 更新附加檔案清單後載入顯示。 ============================================================================== } procedure TCB_IMGPSScanX.AddAttFileLBClick(Sender: TObject); var i : Integer; Addfile : String; begin OpenDialog1.Filter := 'PDF files|*.pdf'; OpenDialog1.Options := [ofAllowMultiSelect]; if OpenDialog1.Execute then begin ShowText :=_Msg('檔案加入中,請稍候'); DataLoading(True,True); for i := 0 to OpenDialog1.Files.Count - 1 do begin AddFile := HTTPEncode(UTF8Encode(ExtractFileName(OpenDialog1.Files.Strings[i]))); if FileExists(ImageSavePath+NowCaseno+'\'+AddFile) then begin if Messagedlg(Format(_Msg('%s己存在,是否覆蓋??'),[Addfile]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel Then Continue; SetAttContextList('D',-1,NowCaseno,AddFile); end; // AttFileGB.Visible := True; //附加電子檔窗 //20120207楊玉說不在這加電子檔先拿掉 // Splitter2.Visible := True; CopyFile(Pchar(OpenDialog1.Files.Strings[i]),Pchar(ImageSavePath+NowCaseno+'\'+AddFile),False); SetAttContextList('A',-1,NowCaseno,AddFile); LoadAttFile(NowCaseno); end; end; DataLoading(False,False); end; { ============================================================================== 方法名稱:AddCredit1RGClick 引用相依: 方法描述:處理信用註記點擊,更新 Case_loandoc 狀態並寫入索引檔。 ============================================================================== } procedure TCB_IMGPSScanX.AddCredit1RGClick(Sender: TObject); begin if DisplayPath <> '' then begin Case AddCredit1RG.ItemIndex of -1:Case_loandoc := ''; 0:Case_loandoc := 'Y'; 1:Case_loandoc := 'N'; end; WriteCaseIndex(DisplayPath); end; end; { ============================================================================== 方法名稱:BtnMouseEnter 引用相依: 方法描述:當滑鼠進入按鈕區域時,顯示該按鈕的 Hint 文字提示。 ============================================================================== } procedure TCB_IMGPSScanX.BtnMouseEnter(Sender: TObject); begin AddToolTip(TBitBtn(Sender).Handle,nil,0,Pchar(TBitBtn(Sender).Hint),nil,0,0); end; { ============================================================================== 方法名稱:Button3Click 引用相依:initkscan 方法描述:工程師測試用按鈕。用於顯示當前系統環境變數與參數狀態,包含伺服器 URL、 案件資訊、權限、DPI 設定及各類長度限制,最後重新載入影像檔案。 ============================================================================== } procedure TCB_IMGPSScanX.Button3Click(Sender: TObject); begin //Showmessage(CreateDocNo_Info(NowCaseNo)+#13+'******'+#13+CreateCustDocNo_Info(NowCaseNo)); //Showmessage(NowSelectFileList.Text); //SetIn_WH_DocNo; //CreateIn_WH(self.NowCaseno); //Create_Cust_DocDir(NowCaseNo); //Showmessage(self.GetDocNoDir(self.DisplayPath,'111')); //Case2upload(NowCaseNo); //mkdir(DisplayPath+'Test\'); //Download2Case(DisplayPath+'Upload\',DisplayPath+'Test\'); //CreateFormID_FormName(DisplayPath); //產生FormID_FormName.dat //CreateDocNo_DocName(DisplayPath); //產生DocNo_Name.dat //Showmessage(CreateDocNo_Info(DisplayPath)); //產生 Docno,份數,頁數;Docno,份數,頁數 的回傳字串 //lb1.Caption:='AAAAAAAAAAA'; //Showmessage(CreateDocnoFrom_Info(NowCaseno)); //Showmessage(self.CreateCustDocNoFrom_Info(NowCaseno)); //ShowMessage('FMaxUploadSize='+FMaxUploadSize); //initkscan; showmessage('FUrl='+FUrl+#10#13+ 'FCaseID='+FCaseID+#10#13+ 'FMode='+FMode+#10#13+ 'FModeName='+FModeName+#10#13+ 'FWork_no='+FWork_no+#10#13+ 'FUserID='+FUserID+#10#13+ 'FUserName='+FUserName+#10#13+ 'FUserUnit='+FUserUnit+#10#13+ 'FData='+FData+#10#13+ 'FVerify='+FVerify+#10#13+ 'FReWrite='+FReWrite+#10#13+ 'FLanguage='+FLanguage+#10#13+ 'FLoanDoc_Value='+FLoanDoc_Value+#10#13+ 'FLoanDoc_Enable='+FLoanDoc_Enable+#10#13+ 'FUseProxy='+FUseProxy+#10#13+ 'FC_DocNoList='+FC_DocNoList+#10#13+ 'FC_DocNameList='+FC_DocNameList+#10#13+ 'FFixFileList='+FFixFileList+#10#13+ 'FIs_In_Wh='+FIs_In_Wh+#10#13+ 'FOldCaseInfo='+FOldCaseInfo+#10#13+ 'FPrintyn='+FPrintyn+#10#13+ 'FIs_OldCase='+FIs_OldCase+#10#13+ 'FCustDocYN='+FCustDocYN); ShowMessage('FImgDPI='+IntToStr(FImgDPI)+#10#13+ 'FScanColor='+ IntToStr(FScanColor)+#10#13+ 'FFileSizeLimit='+ IntToStr(FFileSizeLimit) +#10#13+ 'FCaseNoLength='+ IntToStr(FCaseNoLength) +#10#13+ 'FImgDelete='+ FImgDelete+#10#13+ 'FIsExternal='+ FIsExternal+#10#13+ 'FWH_category='+FWH_category+ 'FCheck_main_form='+ FCheck_main_form+#10#13+ 'FMaxUploadSize='+FMaxUploadSize); //FImgDelete:='Y'; LoadImgFile; { ShowMessage('UpLPoint='+IntToStr(UpLPoint.X)+','+IntToStr(UpLPoint.Y)+#10#13+ 'UpRPoint='+IntToStr(UpRPoint.X)+','+IntToStr(UpRPoint.Y)+#10#13+ 'DownLPoint='+IntToStr(DownLPoint.X)+','+IntToStr(DownLPoint.Y)+#10#13+ 'DownRPoint='+IntToStr(DownRPoint.X)+','+IntToStr(DownRPoint.Y)); } end; { ============================================================================== 方法名稱:Button4Click 引用相依: 方法描述:工程師測試用按鈕。用於傾印內部多個 TStringList 與 Record 資料,包含 OM R 錯誤資訊、表單與檢核規則清單、範本與已存在影像清單等,用於除錯。 ============================================================================== } procedure TCB_IMGPSScanX.Button4Click(Sender: TObject); var i:integer; str:String; begin //Showmessage(self.Doc_Inf_List.Text); //LoadImgFile; //LoadImgFile1; //ISB1.MouseMode:=mmAmplifier; str:=''; for I := 1 to 11 do // 看 OMRErrInfo 的內容 begin str:=str+BoolToStr(OMRErrInfo[i].Display,true)+',' +BoolToStr(OMRErrInfo[i].Ignore,true)+','+OMRErrInfo[i].Info+',' +OMRErrInfo[i].Mode+#10#13; end; ShowMessage('OMRErrInfo='+str); ShowMessage('Doc_Inf_List='+Doc_Inf_List.Text); ShowMessage('DM_FORM_INF_List='+DM_FORM_INF_List.Text) ; ShowMessage('FORM_INF_List='+FORM_INF_List.Text) ; ShowMessage('CHECK_RULE_INF_List='+CHECK_RULE_INF_List.Text) ; ShowMessage('MEMO_INF_List='+MEMO_INF_List.Text) ; ShowMessage('WORK_INF_List='+WORK_INF_List.Text) ; ShowMessage('LASTEST_FORM_INF_List='+LASTEST_FORM_INF_List.Text) ; ShowMessage('SampleFormIDList='+SampleFormIDList.Text); ShowMessage('ExistImgList='+ExistImgList.Text); ShowMessage('LastInitFormidList='+LastInitFormidList.Text); ShowMessage('IN_WH_DocNoList='+IN_WH_DocNoList.Text); // SampleFormIDList.Add('31A00101011706A'); // SampleFormIDList.Add('31A00101021706A'); // SampleFormIDList.Add('31A00101031706A'); end; { ============================================================================== 方法名稱:Button5Click 引用相依:SetFtpInfo, IIS_Ftp 方法描述:測試 FTP 上傳功能。連線 FTP 後嘗試將特定的 PDF 檔案上傳至伺服器路徑。 ============================================================================== } procedure TCB_IMGPSScanX.Button5Click(Sender: TObject); begin GetftpInfo(NowCaseno,'upload'); SetFtpInfo; IIS_Ftp.FtpsConnect; IIS_Ftp.FtpsToMain(FFtpExtraPath,NowCaseno+'.pdf','d:\1.pdf',display1); end; { ============================================================================== 方法名稱:Button6Click 引用相依:SetFtpInfo, IIS_Ftp, Rotate, FJpgCompression, Scanner 方法描述:測試 FTP 下載功能。連線 FTP 後嘗試從伺服器下載 ZIP 案件檔至本地。 ============================================================================== } procedure TCB_IMGPSScanX.Button6Click(Sender: TObject); begin GetftpInfo(NowCaseno,'download'); SetFtpInfo; IIS_Ftp.FtpsConnect; IIS_Ftp.FtpsCWD(IIS_Ftp.FtpPath); IIS_Ftp.FtpsReceive(NowCaseNo+'.zip','d:\'+NowCaseNo+'.zip'); end; { ============================================================================== 方法名稱:ExportBtClick 引用相依:SaveToFile, FileExists, En_DecryptionStr_Base64, dnFile, dnFile_Get 方法描述:處理「匯出授權檔」按鈕點擊。透過 HTTPS 下載掃瞄與檢視用的 .lic 授權檔案 。將授權檔連同加密的 mps.dat 檔案打包成帶有密碼保護的 mps.zip 壓縮包, 完成後清理暫存檔並提示路徑。 ============================================================================== } procedure TCB_IMGPSScanX.ExportBtClick(Sender: TObject); var SendData : String; EnCodeDateTime : String; S : TStringlist; SFileName,VFileName : String; begin SFileName := En_DecryptionStr_Base64('E','MPSLIC_SCAN.lic','9338430'); VFileName := En_DecryptionStr_Base64('E','MPSLIC_VIEW.lic','9338430'); IIS_File2Web.S_LicEnName := SFileName; IIS_File2Web.V_LicEnName := VFileName; /////下載MPSLIC_SCAN.lic ////// EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey); //SendData := 'checktime='+EnCodeDateTime+'&workno=CW&formid=MPSLIC_SCAN.lic'+'&mode=sample'; //if not dnFile(HTTPSClient,Furl,'servlet/CWC03',SendData,LngPath+SFileName,FReWrite,Memo1,False,DownImgStatus) then SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file=MPSLIC_SCAN.lic'; if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/sample',SendData,LngPath+SFileName,FReWrite,Memo1,False,DownImgStatus) then begin Showmessage(_Msg('檢查註冊檔案時,網路發生錯誤!!')+_Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason); Exit; end; /////下載MPSLIC_SCAN.lic ///// /////下載MPSLIC_VIEW.lic ////// EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey); //SendData := 'checktime='+EnCodeDateTime+'&workno=CW&formid=MPSLIC_VIEW.lic'+'&mode=sample'; //這裡改成必傳CW 20121212 //if not dnFile(HTTPSClient,Furl,'service/slic/SLIC04/sample',SendData,LngPath+VFileName,FReWrite,Memo1,False,DownImgStatus) then SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file=MPSLIC_VIEW.lic'; if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/sample',SendData,LngPath+VFileName,FReWrite,Memo1,False,DownImgStatus) then begin Showmessage(_Msg('檢查註冊檔案時,網路發生錯誤!!')+_Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason); Exit; end; /////下載MPSLIC_VIEW.lic ///// ////壓zip///// S := TStringlist.Create; try S.Add(En_DecryptionStr_Base64('E',GetDate,'9338430')); S.Add(SFileName); S.Add(VFileName); S.SaveToFile(LngPath+'mps.dat'); S.Clear; S.Add(LngPath+'mps.dat'); S.Add(LngPath+SFileName); S.Add(LngPath+VFileName); if FileExists(LngPath+'mps.zip') then DeleteFile(LngPath+'mps.zip'); ExecuteZip_Pwd(LngPath+'mps.zip',LngPath,S,False,False,'9338430'); finally S.Free; DeleteFile(LngPath+SFileName); DeleteFile(LngPath+VFileName); DeleteFile(LngPath+'mps.dat'); end; ////壓zip////// Showmessage(_Msg('匯出完成,匯出檔案:')+LngPath+'mps.zip'); end; { ============================================================================== 方法名稱:ImportBtClick 引用相依:Str2Dir, FileExists, LoadFromFile, RenameFile, _DelTree, En_Decrypti onStr_Base64, upFile 方法描述:處理「匯入授權檔」按鈕點擊。選取 mps.zip 授權包後進行解壓與過期驗證。驗 證通過後對授權檔執行重新命名,並透過 upFile 函式逐一上傳至伺服器範本 目錄,過程中會嚴格檢查 Session 與回傳狀態。 ============================================================================== } procedure TCB_IMGPSScanX.ImportBtClick(Sender: TObject); var SendData : String; EnCodeDateTime : String; S : TStringlist; SFileName,VFileName : String; OpenDialog1 : TOpenDialog; ZipPath : String; ZipFile,ZipName : String; LicName : String; i : Integer; begin OpenDialog1 := TOpenDialog.Create(self); S := TStringlist.Create; try OpenDialog1.Filter := 'Zip files (*.zip)|*.ZIP'; if OpenDialog1.Execute then begin ZipFile:= ExtractFileName(OpenDialog1.FileName); ZipName := Copy(ZipFile,1,length(ZipFile)-length(ExtractFileExt(OpenDialog1.FileName))); ZipPath := LngPath+ZipName+'\'; str2dir(ZipPath); if not ExecuteUnZip_Pwd(OpenDialog1.FileName,ZipPath,False,'9338430') then Showmessage(_Msg('無法解壓縮')); if not FileExists(ZipPath+'mps.dat') then begin Showmessage(_Msg('格式不符,無法匯入')); Exit; end; S.LoadFromFile(ZipPath+'mps.dat'); if (En_DecryptionStr_Base64('D',S.Strings[0],'9338430')<> ServerDate) then begin Showmessage(_Msg('檔案過期,無法匯入')); Exit; end; for i := 1 to S.Count -1 do begin LicName := En_DecryptionStr_Base64('D',S.Strings[i],'9338430'); RenameFile(ZipPath+S.Strings[i],ZipPath+LicName); if (LicName = 'MPSLIC_SCAN.lic') or (LicName = 'MPSLIC_VIEW.lic') then /////上傳MPSLICXXXX.lic //// //if not upFile(HTTPSClient,FUrl,'servlet/CWC04','formid='+LicName+'@workno=CW@mode=sample','file',ZipPath+LicName,FReWrite,Memo1,False) then //begin SendData := 'data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file_name='+LicName; if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/sample',SendData,'file',ZipPath+LicName,FReWrite,Memo1,False) then begin Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_MSg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')'); DataLoading(False,False); Exit; end; if memo1.Lines.Strings[0] = '1' then begin Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+memo1.Lines.Strings[1]); DataLoading(False,False); Exit; end Else if Pos('',Memo1.Lines.Text) > 0 then begin Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入')); DataLoading(False,False); Exit; end; /////上傳MPSLICXXXX.lic ///// end; end; Finally OpenDialog1.Free; S.Free; _DelTree(ZipPath); end; Showmessage(_Msg('匯入完成')); end; { ============================================================================== 方法名稱:HTTPSClientCertificateValidate 引用相依:HTTPSClientCertificateValidate 方法描述:HTTPS 用戶端憑證驗證回呼函數,預設直接將 Validate 設為 True,以接受所 有伺服器憑證。 ============================================================================== } procedure TCB_IMGPSScanX.HTTPSClientCertificateValidate(Sender: TObject; X509Certificate: TElX509Certificate; var Validate: Boolean); begin Validate := True; end; { ============================================================================== 方法名稱:HTTPSClientRedirection 引用相依: 方法描述:處理 HTTPS 客戶端的重導向事件,目前為空實作。 ============================================================================== } procedure TCB_IMGPSScanX.HTTPSClientRedirection(Sender: TObject; const OldURL: string; var NewURL: string; var AllowRedirection: Boolean); begin AllowRedirection := True; end; { ============================================================================== 方法名稱:EnableImage 引用相依: 方法描述:啟用滑鼠工具列功能,更新按鈕圖示並切換滑鼠模式。 ============================================================================== } procedure TCB_IMGPSScanX.EnableImage(v:integer;Sender : TObject); var bmp : Tbitmap; begin DesableImage; bmp := TBitmap.Create; try ImageList3.GetBitmap(v,bmp); TBitBtn(Sender).Glyph.Assign(bmp); finally bmp.Free; end; ViewMouseMode(v); end; { ============================================================================== 方法名稱:DesableImage 引用相依: 方法描述:停用所有工具列功能。重置點選狀態,將所有功能按鈕(FC0-FC6)圖示切換為灰 階,並將所有影像捲軸盒的滑鼠模式切換回一般使用者模式。 ============================================================================== } procedure TCB_IMGPSScanX.DesableImage; var bmp : Tbitmap; i : integer; begin NowClick := -1; bmp := Tbitmap.Create; try For i:= 0 to 6 do begin ImageList4.GetBitmap(i,bmp); TBitBtn(FindComponent('FC'+IntToStr(i))).Glyph.Assign(bmp); bmp.Width:=0; bmp.Handle:=0; end; finally bmp.Free; end; ViewMouseMode(NowClick); end; { ============================================================================== 方法名稱:ViewMouseMode 引用相依: 方法描述:設定全域的滑鼠作業模式。根據參數對應至放大鏡、縮放、拖曳、旋轉或刪除等模 式,並同步更新所有影像捲軸盒(ISB1-ISB8)的屬性,確保行為一致。 ============================================================================== } Procedure TCB_IMGPSScanX.ViewMouseMode(v:Integer); var i : Integer; Md : TMouseMode; ISB : TImageScrollBox; begin //ShowMessage(IntToStr(v)); case v of -1 : Md := TMouseMode(mmUser); 0 : Md := TMouseMode(mmAmplifier); 1 : Md := TMouseMode(mmZoom); 2 : Md := TMouseMode(mmDrag); 3 : Md := TMouseMode(mmR270); 4 : Md := TMouseMode(mmR180); 5 : Md := TMouseMode(mmR90); 6 : Md := TMouseMode(mmDelete); end; for i := 1 to 8 do begin ISB := TImageScrollBox(FindComponent('ISB'+inttostr(i))); ISB.MouseMode := TMouseMode(Md); //Label3.Caption:='v='+IntToStr(v)+' time'+FormatDateTime('yyyy/mm/dd HH:MM:SS', now); end; end; { ============================================================================== 方法名稱:GoViewMode 引用相依: 方法描述:依檢視模式索引 VMode,呼叫 DisplayMode 來調整佈局。 ============================================================================== } Procedure TCB_IMGPSScanX.GoViewMode; begin case VMode of 0: DisplayMode(VMode,1,1,Panel9); 1: DisplayMode(VMode,1,1,Panel9); 2: DisplayMode(VMode,2,2,Panel9); 3: DisplayMode(VMode,2,3,Panel9); 4: DisplayMode(VMode,2,4,Panel9); end; end; { ============================================================================== 方法名稱:DisplayMode 引用相依: 方法描述:調整影像視窗的網格佈局(1x1, 2x2 等)。隱藏所有影像面板後,根據行數與列 數計算面板寬高與位置,重新排列並顯示。同時調整標記框 Shape1 的大小,最 後更新模式圖示並初始化首個視窗。 ============================================================================== } Procedure TCB_IMGPSScanX.DisplayMode(index,H_Count,W_Count:Integer;BasePanel:TPanel); Var W,H,T,L:Integer; i,n,Count: Integer; Pl :TPanel; bmp : TBitmap; begin for i := 1 to 8 do begin TPanel(Findcomponent('imgp'+inttostr(i))).Visible := False; end; W := Round((BasePanel.Width - ((W_Count+1) * Seg)) / W_Count); H := Round((BasePanel.Height -((H_Count+1) * Seg)) / H_Count); Count := 1; for i := 1 to H_Count do begin T := i * Seg + H * (i-1); for n := 1 to W_Count do begin L := n * Seg + W * (n-1); Pl := TPanel(Findcomponent('imgp'+inttostr(Count))); Pl.Visible := True; Pl.Left := L; Pl.Top := T; Pl.Width := W; Pl.Height := H; inc(Count); end; end; Shape1.Width := W + (Seg * 2); Shape1.Height := H + (Seg * 2); Shape1.Visible := True; bmp := Tbitmap.Create; try ImageList2.GetBitmap(index,bmp); ViewModeBtn.Glyph.Assign(bmp); finally bmp.Free; end; ISB1Click(ISB1); end; { ============================================================================== 方法名稱:CheckRequiredColumnValues 引用相依: 方法描述:檢查特定業務邏輯下的必填欄位。針對特定的 workno 與案號格式(caseno[9]) 判斷是否符合要求。 ============================================================================== } function TCB_IMGPSScanX.CheckRequiredColumnValues(workno, caseno:String): Boolean; begin // Result:=False; if (workno='HLN') and (caseno[9]='3') then Result:=True; if (workno='HLN') and (caseno[9]='4') then Result:=True; end; { ============================================================================== 方法名稱:CaseReSize 引用相依:ImageReSize_FormID, FileExists, LoadFromFile 方法描述:對案件執行影像縮放處理。清空舊有的檢核與定位錯誤記錄,隨後遍歷影像清單 ,對每個檔案執行 ImageReSize_FormID 處理。 ============================================================================== } Procedure TCB_IMGPSScanX.CaseReSize(CaseID:String); //案件的影像縮放 var S : TStringlist; FileName : String; i : Integer; begin {if FileExists(ImageSavePath+CaseID+'\ReSize.dat') then DeleteFile(ImageSavePath+CaseID+'\ReSize.dat');} if FileExists(ImageSavePath+CaseID+'\Upload\AnchorError.dat') then DeleteFile(ImageSavePath+CaseID+'\Upload\AnchorError.dat'); S := TStringlist.Create; try S.LoadFromFile(ImageSavePath+CaseID+'\Upload\Context.dat'); For i := 0 to S.Count -1 do begin FileName := S.Strings[i]; ImageReSize_FormID(CaseID,FileName); //依十字定位點做縮放 end; finally S.Free; end; end; { ============================================================================== 方法名稱:TransCaseID 引用相依:FileExists, LoadFromFile, CopyFile, FindFirst, _DelTree, upFile, Set FtpInfo, IIS_Ftp, FtpCaseComplete 方法描述:傳送案件核心程序。包含排序影像、產生描述檔(FormID/DocNo對照、OMR資訊、附 件狀態等)、建立 ZIP 壓縮包(含主圖與遮罩)並檢查大小。最後根據 HTTP 或 F TP 模式上傳至伺服器。上傳完成後針對異動模式處理舊件引入,並在最後清理 本地暫存目錄。 ============================================================================== } Function TCB_IMGPSScanX.TransCaseID(Path,CaseID:String;MainCase:Boolean):Boolean; //傳送案件 Var i,n,v: Integer; ZipFileList : TStringlist; UpFormID:String; pages : Integer; TransName : String; MaskPath : String; HaveMask : Boolean; S : String; SendData:String; Doc_Data,Doc_Data1 : String; In_Doc1,In_Doc2 : String; AttachYN : String; //是否有附件 Y:有 N:沒有 ST1,ST2,ST3:TStringList; str1,str2:String; must_formidStr :string; last_add_formidstr :string; ScanListStr:String; casepath:String; filesizeInt:integer; case_page:string; Fname:String; FileRec:TSearchrec; begin Result := True; TransName := CaseID; MaskPath := Path+'MaskImg\'; if fileExists(Path+'Context.dat') then begin ContextList.LoadFromFile(Path+'Context.dat'); Context_DocnoList.LoadFromFile(Path+'Context_DocNo.dat'); end; if FileExists(Path+'CustomDocNo.dat') then Cust_DocNoList.LoadFromFile(Path+'CustomDocNo.dat'); Pages := ContextList.Count; case_page:=IntToStr(pages); if (FMode = 'NSCAN') or (FMode = 'ESCAN') or (FMode = 'ASCAN') or (FMode = 'DSCAN') or (FMode = 'SSCAN') or (FMode = 'MSCAN') or (FMode = 'RI_SCAN') or (FMode = 'RSCAN') then begin //Showmessage('1'); UpformID := GetCaseFormID(Path); {if UpformID = '' then //20131213 yuu說不管主form begin Showmessage(_msg('取不到主FormID!!')); Result := False; DataLoading(False,False); Exit; end;} end; CaseResort2Scanlist(Path); //檔名照設定排序產生scanlist.dat //CaseResort(Path); //檔名照設定排序 CreateFormID_FormName(Path,CaseID); //產生FormID_FormName.dat CreateDocNo_DocName(Path,CaseID); //產生DocNo_Name.dat Doc_Data := CreateDocNo_Info(CaseID); //產生保管袋文件 Docno,份數,頁數;Docno,份數,頁數 的回傳字串 Doc_Data1 := CreateCustDocNo_Info(CaseID); //產生自定文件 Docname,份數,頁數;Docno,份數,頁數 的回傳字串 In_Doc1 := CreateDocnoFrom_Info(CaseID); //產生被引進的保管袋文件資訊 Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號 In_Doc2 := CreateCustDocNoFrom_Info(CaseID); //產生被引進的自定文件資訊 Docno[tab]份數[tab]案件編號#13#10Docno[tab]份數[tab]案件編號 AttachYN := CreateAttach_Info(CaseID); //是否還有附件 Y:有 N:沒有 ReadCaseIndex(Path); //LoanDoc := 'Y'; //產生遮罩影像 // if FWork_No = 'CW' then // HaveMask := Case2Mask(Path,MaskPath); //產生遮罩影像 // S := S +#13+'5-->'+ Timetostr(now); ///////必要formid 20170315 start ////////////////////////////// must_formidStr:=''; last_add_formidstr:=''; ST1:=TStringList.Create; ST1.LoadFromFile(path+'FormCode_Name.dat'); //ShowMessage(ST1.Text); //ShowMessage(LastInitFormidList.Text); ST2:=TStringList.Create; ST3:=TStringlist.Create; for I := 0 to ST1.Count - 1 do begin if (Pos('_',St1.Strings[i])<>1) and (Pos('_',St1.Strings[i])<>-1) then begin str1:=Copy(ST1.Strings[i],1,Pos('_',St1.Strings[i])-1); ST2.Add(str1); must_formidStr:= must_formidStr+str1+'@#,'; end; end; must_formidStr:=Copy(must_formidStr,1,Length(must_formidStr)-3) ; //ShowMessage('must_formidStr='+must_formidStr); //ShowMessage('AST2='+ST2.Text); for I := 0 to LastInitFormidList.Count - 1 do begin if ST2.IndexOf(LastInitFormidList.Strings[i]) <> -1 then begin ST2.Delete(ST2.IndexOf(LastInitFormidList.Strings[i])); end; end; //ShowMessage('BST2='+ST2.Text); for I := 0 to ST2.Count - 1 do begin last_add_formidstr:=last_add_formidstr+ST2.Strings[i]+'@#,'; end; last_add_formidstr:=Copy(last_add_formidstr,1,Length(last_add_formidstr)-3) ; ST3.LoadFromFile(path+'scanlist.dat'); for I := 0 to ST3.Count - 1 do begin if ScanListStr = '' then ScanListStr := FileName2FormCode(ST3.Strings[i]) else ScanListStr := Format('%s,%s',[ScanListStr,FileName2FormCode(ST3.Strings[i])]); end; ST1.Free; ST2.Free; ST3.Free; //ShowMessage('last_add_formidstr='+last_add_formidstr); ///////必要formid 20170315 end ////////////////////////// ///保留外部影像 start/////////////////////////////// casepath:= Copy(Path,1,pos('Upload',path)-1); //ShowMessage('casepath='+casepath); //FIsExternal:='Y'; if (FMode='ESCAN') and (FIsExternal='Y') then begin if FileExists(casepath+'Download\FirstImg.zip') then begin CopyFile(PWChar(casepath+'Download\FirstImg.zip'),PWChar(path+'FirstImg.zip'),false); end else begin CopyFile(PWChar(casepath+'Download\'+CaseID+'.zip'),PWChar(path+'FirstImg.zip'),false); end; end; ///保留外部影像 end/////////////////////////////// //file_size 計算 就先不做 20170316 filesizeInt:=0; //////壓檔///// ZipMainFile(Path,Path,'Img.zip'); if HaveMask then ZipMaskFile(Path,MaskPath,Path,'MaskImg.zip'); //有遮罩設定的才產生 /////壓檔//// ///檢查上傳的zip大小//// FName :=Path+ 'Img.zip'; FindFirst(FName, faAnyfile, FileRec); //FMaxUploadSize //ShowMessage(IntToStr(FileRec.Size)); //Result:=False; //exit; //目前上傳檔案大小為xxMB,已超過50MB,無法上傳 %.3f ,[FileRec.Size / 1048576] If FileRec.Size > StrtoInt(FMaxUploadSize) * 1048576 Then // 檢查檔案大小 Begin ShowMessage(Format(_Msg('%s目前上傳檔案大小為%.3fMB,已超過%sMB,無法上傳'),[caseid,FileRec.Size / 1048576,FMaxUploadSize])); //ShowMessage(Format('%s目前上傳檔案大小為%.3fMB,已超過'+FMaxUploadSize+'MB,無法上傳',[caseid,FileRec.Size / 1048576]) ); FindClose(FileRec); Result := False; Exit; End; FindClose(FileRec); ///檢查上傳的zip大小//// //ShowMessage('last_add_formidstr='+last_add_formidstr); if not GetftpInfo(CaseID,'upload') then //取案件上傳方式 begin //Showmessage(_Msg()Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+'.'); DownFileErrStr := _Msg('取案件上傳資訊失敗!!')+HttpErrStr; Result := False; Exit; end; SendData:='data='+HTTPEncode(UTF8Encode(FData)) +'&verify='+FVerify +'&form_id='+UpformID +'&loan_doc='+Case_loandoc +'&case_no='+TransName +'&doc_data='+HTTPEncode(UTF8Encode(Doc_Data)) +'&doc_data1='+HTTPEncode(UTF8Encode(Doc_Data1)) +'&attach='+AttachYN +'&case_page='+case_page +'&file_size='+IntToStr(filesizeInt) +'&must_formid='+must_formidStr //擁有的 formid +'&last_add_formid='+last_add_formidstr //當次新加的 formid +'&form_code='+ScanListStr //scanlist.dat 表單代號 +'&ftp_image_path='+FFtpExtraPath //加傳FTP目錄 HTTP上傳時會是空白 +'&in_doc1='+HTTPEncode(UTF8Encode(In_Doc1)) +'&in_doc2='+HTTPEncode(UTF8Encode(In_Doc2)); case TransMode of tsHttp : begin ////上傳///// ShowText := CaseID+_Msg('資料上傳中(Http),請稍候'); DataLoading(True,True); if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/caseupload',SendData,'file',Path+'Img.zip',FReWrite,Memo1,False) then begin Showmessage(Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+'.'); Result := False; Exit; end; if memo1.Lines.Strings[0] = '1' then begin Showmessage(Format(_Msg('')+_Msg(''),[CaseID])+memo1.Lines.Strings[1]+'。'); Result := False; Exit; end Else if Pos('',Memo1.Lines.Text) > 0 then begin Showmessage(Format(_Msg('')+_Msg('')+_Msg('閒置過久或被登出,請重新登入'),[CaseID])); Result := False; Exit; end; ////上傳//// end; tsFtp : begin ShowText := CaseID+_Msg('資料上傳中(Ftp),請稍候'); DataLoading(True,True); SetFtpInfo; try if not IIS_Ftp.FtpsConnect then begin Showmessage(Format('無法連上Ftp主機,錯誤原因:%s',[FtpErrReason])); Result := False; Exit; end; if not IIS_Ftp.FtpsToMain(FFtpExtraPath,CaseID+'.zip',Path+'Img.zip',display1) then begin Showmessage(Format(_msg('上傳案件(%s)時,發生錯誤,錯誤原因:%s'),[CaseID,FtpErrStr])); Result := False; Exit; end; if not FtpCaseComplete(SendData) then //Ftp上傳後通知完成 begin Showmessage(Format(_Msg('通知案件(%s)Ftp上傳完成時,發生錯誤!!'),[CaseID])+HttpErrStr); Result := False; Exit; end; finally IIS_Ftp.FtpsClose; end; end; end; if FMode = 'ESCAN' then //上傳舊件引入檔案 //20140616 原本先搬舊件再搬新件,改為先搬新件再搬舊件 begin if not TransOldCaseFile(ImageSavePath+CaseID+'\') then begin Result := False; Exit; end; end; // 呼叫Server完成 ///// {If not CaseComplete(Path,CaseID,MainCase) Then begin Showmessage(_Msg('通知案件傳送完成時,網路發生錯誤!!')+HttpErrStr); DataLoading(False,False); Result := False; Exit; end; } /// 呼叫Server完成//// ////刪檔//// //_DelTree(Path); //會只刪TransPath //ShowMessage('STOP'); _DelTree(ImageSavePath+CaseID); SetCaseList('D',-1,CaseID); ////刪檔//// end; { ============================================================================== 方法名稱:NewTreeNodeRefresh 引用相依: 方法描述:更新樹狀結構根節點文字,顯示總案件筆數與總頁數。 ============================================================================== } Procedure TCB_IMGPSScanX.NewTreeNodeRefresh; var v : Integer; begin //v := Pos('-',NewTreeNode.Text); //NewTreeNode.Text := Copy(NewTreeNode.Text,1,v-1)+'-共'+inttostr(NewTreeNode.Count)+'筆'; GetCase_PageCount(CaseCount,PageCount); v := Pos('-',NewTreeNode.Text); NewTreeNode.Text := Format(_Msg('%s-共%d筆共%d頁'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]); end; { ============================================================================== 方法名稱:MyTreeNode1Refresh 引用相依: 方法描述:更新樹狀結構案件層級節點文字,顯示該層下的項目數量。 ============================================================================== } Procedure TCB_IMGPSScanX.MyTreeNode1Refresh; var v : Integer; begin v := Pos('-',MyTreeNode1.Text); MyTreeNode1.Text := Format(_Msg('%s-%d筆'),[Copy(MyTreeNode1.Text,1,v-1),MyTreeNode1.Count]); end; { ============================================================================== 方法名稱:MyTreeNode2ReFresh 引用相依: 方法描述:重新整理並繪製指定案件的文件層級樹狀結構。 ============================================================================== } Procedure TCB_IMGPSScanX.MyTreeNode2ReFresh(CaseID:String); var P : Integer; begin //p:= ContextList.Count; //MytreeNode1.Text := Format(_Msg('%s-%d頁'),[CaseID,p]); DrawDocItem2(MytreeNode1,CaseID); //DrawDocItem(MytreeNode1,FORM_INF_List,CaseID); end; { ============================================================================== 方法名稱:MyTreeNode3ReFresh 引用相依: 方法描述:重新整理並繪製指定案件的表單層級樹狀結構。 ============================================================================== } Procedure TCB_IMGPSScanX.MyTreeNode3ReFresh(CaseID:String); begin //DrawDocItem1(MytreeNode1,Doc_Inf_List,CaseID); //201408280改 DrawDocItem2(MytreeNode1,CaseID); //DrawDocItem(MytreeNode1,FORM_INF_List,CaseID); end; { ============================================================================== 方法名稱:Node3FormID 引用相依: 方法描述:從樹狀結構節點 3(表單層)的文字中解析並提取表單 ID(FormID)。 ============================================================================== } Function TCB_IMGPSScanX.Node3FormID(Node3:TTreeNode):String; //MyTreeNode3取FormCode出來 var v,v1,v2 : Integer; begin v := Pos('{',Node3.Text); v1 := Pos('}',Node3.Text); v2 := Posend('-',Node3.Text); Result := Copy(Node3.Text,v+1,v1-v-1); IF v1 = 0 Then begin Result := ''; end; end; { ============================================================================== 方法名稱:GetNode2Name 引用相依:FileExists, Str2Dir, SaveToFile, LoadFromFile, DeleteDocNoFile, Copy File, DirectoryExists, En_DecryptionStr_Base64, dnFile 方法描述:提取文件層級節點的識別名稱字串,用於記錄與恢復節點選取狀態。 ============================================================================== } Function TCB_IMGPSScanX.GetNode2Name(Node2:TTreeNode):String; //取MyTreeNode2的識別字出來(記之前點選用) var v : Integer; begin v := Posend('-',Node2.Text); Result := Copy(Node2.Text,1,v-1); end; {Function TCB_IMGPSScanX.Down_Replace_Img(SPath,DPath,CaseID:String):Boolean; var EnCodeDateTime : String; DownUrl : String; SC,Main_C : TStringlist; i,n : Integer; FormID,DocNo,Version : String; OldFName,NewMainFName,NewSubFName : String; AttPath : String; begin SC := TStringlist.Create; Main_C := TStringlist.Create; try Result := True; HaveAppDoc := False; EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey); DownUrl := FUrl+CaseID+'&checktime='+EnCodeDateTime; if not dnFile(HTTPSClient,DownUrl,'','',DPath+CaseID+'.zip',FReWrite,Memo1,False,DownImgStatus) then begin HttpErrStr := _Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason; Result := False; Exit; end; if Memo1.Lines.Strings[0] = '1' then begin HttpErrStr :=_Msg('錯誤原因:')+memo1.Lines.Strings[1]; Result := False; Exit; end Else if Pos('',Memo1.Lines.Text) > 0 then begin HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'); Result := False; Exit; end; AttPath := DPath + 'AttFile\'; if FileExists(DPath+CaseID+'.zip') then begin ExecuteUnZip(DPath+CaseID+'.zip',DPath,True); if FileExists(DPath+'img.zip') then begin ExecuteUnZip(DPath+'img.zip',DPath,False); end; if FileExists(DPath+'att.zip') then begin Str2Dir(AttPath); ExecuteUnZip(DPath+'att.zip',AttPath,False); end; end Else begin if ((FMode = 'FSCAN') or (FMode = 'ISCAN')) and (Memo1.Lines.Strings[0] ='NO_FILE') then //FGIS前台匯入件沒有影像是對的 begin SC.Clear; SC.SaveToFile(DPath+'Context.dat'); end Else begin HttpErrStr := _Msg('找不到影像'); Result := False; Exit; end; end; if FileExists(SPath+'Context.dat') then SC.LoadFromFile(SPath+'Context.dat'); for I := 0 to SC.Count - 1 do begin FormID := FileName2FormCode(SC.Strings[i]); DocNo := FormCode2DocNo(FormID); Version := FormCode2Version(FormID); If FindSQLData(Doc_Inf_List,'ADD_SCAN_RULE','DOC_NO,DOC_VERSION',DocNo+','+Version,0,FindResult) Then begin if GetFindResult('ADD_SCAN_RULE') = 'R' then //替換的先刪再加 20101026 User由刪FormCode改刪DocNo begin //DeleteFormCodeFile(DPath,FormID); ContextList.LoadFromFile(DPath+'Context.dat'); DeleteDocNoFile(DPath,DocNo); end; end; end; for I := 0 to SC.Count - 1 do //複製補充進來的影像 begin OldFName := SC.Strings[i]; Main_C.LoadFromFile(DPath+'Context.dat'); //NewMainFName:= Add_Zoo(Main_C.Count+1,3)+Copy(OldFName,4,length(OldFName)-3); NewMainFName:= Add_Zoo(Main_C.Count+1,3)+FileName2NoQuene_Filename(OldFName); FormID := FileName2FormCode(OldFName); DocNo := FormCode2DocNo(FormID); Version := FormCode2Version(FormID); If FindSQLData(Doc_Inf_List,'ADD_SCAN_RULE','DOC_NO,DOC_VERSION',DocNo+','+Version,0,FindResult) Then begin CopyFile(PWideChar(SPath+OldFName),PWideChar(DPath+NewMainFName),False); end; if FormID = '' then //附件 begin CopyFile(PWideChar(SPath+OldFName),PWideChar(DPath+NewMainFName),False); end; Main_C.Add(NewMainFName); Main_C.SaveToFile(DPath+'Context.dat'); end; finally SC.Free; Main_C.Free; end; ///加入的電子檔匯入案件裡 if DirectoryExists(SPath+'AttFile\') then AttFile_Arrange(SPath+'AttFile\',DPath+'AttFile\'); end;} { ============================================================================== 方法名稱:DownLoadImage 引用相依:SetFtpInfo, IIS_Ftp 方法描述:處理影像下載流程。根據案件上傳/下載方式(HTTP 或 FTP),從伺服器下載對應 的 ZIP 檔案並解壓縮至本地案件目錄,供後續異動或補件使用。 ============================================================================== } Function TCB_IMGPSScanX.DownLoadImage(Path,CaseID:String):Boolean; begin Result := True; if not GetftpInfo(CaseID,'download') then //取案件下載方式 begin DownFileErrStr := _Msg('取案件下載資訊失敗,')+HttpErrStr; Result := False; Exit; end; case TransMode of tsHttp: begin ShowText := _Msg('案件下載中(Http),請稍候'); DataLoading(True,True); If not Down_Img(ImageSavePath+FCaseID+'\Download\',FCaseID) then begin Showmessage(FCaseID+_msg('載入異動影像時,網路發生錯誤')+HttpErrStr); DataLoading(False,False); Exit; end; end; tsFtp: begin ShowText := _Msg('案件下載中(Ftp),請稍候'); DataLoading(True,True); SetFtpInfo; if not IIS_Ftp.FtpsConnect then begin DownFileErrStr := Format(_Msg('無法連上Ftp主機,錯誤原因:%s')+#13+'%s',[FtpErrReason,FTPSClient1.LastReceivedReply]); Result := False; Exit; end; if not IIS_Ftp.FtpsDownloadFile(FFtpExtraPath,CaseID+'.zip',Path+CaseID+'.zip',display1) then begin DownFileErrStr := Format(_Msg('錯誤原因:%s'),[FtpErrStr]); Result := False; Exit; end; ExecuteUnZip(Path+CaseID+'.zip',Path,False); DeleteFile(Path+CaseID+'.zip'); end; end; end; { ============================================================================== 方法名稱:Down_Img 引用相依:FileExists, Str2Dir, En_DecryptionStr_Base64, dnFile_Get, dnFile 方法描述:透過 HTTPS 從伺服器下載案件影像。下載 ZIP 檔案(含 img.zip 與 att.zip) 後執行本地解壓縮,將主影像與附件部署至指定目錄。 ============================================================================== } Function TCB_IMGPSScanX.Down_Img(Path,CaseID:String):Boolean; var EnCodeDateTime : String; SendData : String; AttPath : String; begin Result := True; EnCodeDateTime := En_DecryptionStr_Base64('E',ServerDate+GetBalance2Time(Balance),Mpskey); ///service/slic/SLIC04/case?data=&verify=&case_no=&file= SendData := 'data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&case_no='+CaseID+'&file='; //ShowMessage(SendData); if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/case',SendData,Path+CaseID+'.zip',FReWrite,Memo1,False,DownImgStatus) then begin HttpErrStr := _Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason; Result := False; Exit; end; if Memo1.Lines.Strings[0] = '1' then begin HttpErrStr :=_Msg('錯誤原因:')+memo1.Lines.Strings[1]+'。'; Result := False; Exit; end Else if Pos('',Memo1.Lines.Text) > 0 then begin HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'); Result := False; Exit; end; //ShowMessage('替換zip'); AttPath := Path + 'AttFile\'; if FileExists(Path+CaseID+'.zip') then begin ExecuteUnZip(Path+CaseID+'.zip',Path,True); if FileExists(Path+'img.zip') then begin ExecuteUnZip(Path+'img.zip',Path,False); end; if FileExists(Path+'att.zip') then begin Str2Dir(AttPath); ExecuteUnZip(Path+'att.zip',AttPath,False); end; end Else begin HttpErrStr := _Msg('找不到影像'); Result := True; Exit; end; end; { ============================================================================== 方法名稱:GetNoNameCase 引用相依:GetNoNameCase, DirectoryExists 方法描述:在指定的本地路徑中尋找尚未被佔用的「未配號XXXX」目錄名稱。 ============================================================================== } Function TCB_IMGPSScanX.GetNoNameCase(Path:String):String; //取未配號XXXX var i : Integer; begin for i := 1 to 9999 do begin if Not DirectoryExists(Path+_Msg('未配號')+Add_Zoo(i,4)) then begin Result := _Msg('未配號')+Add_Zoo(i,4); Break; end; end; end; { ============================================================================== 方法名稱:CaseResort 引用相依:LoadFromFile, FileExists, RenameFile, SaveToFile, ReSortFileName 方法描述:對案件檔案進行實體重新排序。依據文件清單(Doc_Inf_List)的順序,對主文件 與次文件進行更名與重新編號,確保檔名序號符合業務邏輯。 ============================================================================== } Procedure TCB_IMGPSScanX.CaseResort(Path:String); //案件的檔案重新排序(次文件依Docno排) var i,n,v,v1 : Integer; S,S1 : TStringlist; FormID,OldName,NewName,DocNo,Doc_Type:String; x : Integer; begin S := TStringlist.Create; S1 := TStringlist.Create; try S.LoadFromFile(Path+'Context.dat'); X := 0; {for I := 1 to FORM_INF_List.Count - 1 do //在FormID有設定的 //主文件 照SQL排 20101028改 begin FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i); if FormCode2FileName(FormID,S) = '' then Continue; Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i); for n := 0 to S.Count - 1 do begin if (S.Strings[n][1] <> '*') and (FileName2FormCode(S.Strings[n]) = FormID) and (Doc_Type='1') then begin Inc(X); OldName := S.Strings[n]; //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編 NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編 S.Strings[n] := '*'+S.Strings[n]; S1.Add(OldName+','+NewName); end; end; end;} {for I := 0 to FORM_INF_List.Count - 1 do //次文件 照FormID 1~8碼+掃瞄順序排 20110512為了某個文件要先打的原因要求改 begin for n := 0 to S.Count - 1 do begin FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i); Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i); if (S.Strings[n][1] <> '*') and (Copy(FileName2FormCode(S.Strings[n]),1,8) = Copy(FormID,1,8)) and (Doc_Type='2') then begin Inc(X); OldName := S.Strings[n]; NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編 S.Strings[n] := '*'+S.Strings[n]; S1.Add(OldName+','+NewName); end; end; end;} for I := 0 to Doc_Inf_List.Count - 1 do //主文件 照文件代碼+掃瞄順序排 20101101改 20110512晚上又說改回來 begin DocNo := GetSQLData(Doc_Inf_List,'DOC_NO',i); if DocNo2FileName(DocNo,S) = '' then Continue; Doc_Type := GetSQLData(Doc_Inf_List,'DOC_TYPE',i); for n := 0 to S.Count - 1 do begin if (S.Strings[n][1] <> '*') and (FormCode2DocNo(FileName2FormCode(S.Strings[n])) = DocNo) and (Doc_Type='1') then begin Inc(X); OldName := S.Strings[n]; //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編 NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編 S.Strings[n] := '*'+S.Strings[n]; S1.Add(OldName+','+NewName); end; end; end; for I := 0 to Doc_Inf_List.Count - 1 do //次文件 照文件代碼+掃瞄順序排 20101101改 20110512晚上又說改回來 begin DocNo := GetSQLData(Doc_Inf_List,'DOC_NO',i); if DocNo2FileName(DocNo,S) = '' then Continue; Doc_Type := GetSQLData(Doc_Inf_List,'DOC_TYPE',i); for n := 0 to S.Count - 1 do begin if (S.Strings[n][1] <> '*') and (FormCode2DocNo(FileName2FormCode(S.Strings[n])) = DocNo) and (Doc_Type='2') then begin Inc(X); OldName := S.Strings[n]; //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編 NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編 S.Strings[n] := '*'+S.Strings[n]; S1.Add(OldName+','+NewName); end; end; end; {for n := 0 to S.Count - 1 do //次文件 照掃瞄順序排 20101028改 begin FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i); Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i); for i := 0 to FORM_INF_List.Count - 1 do begin if (S.Strings[n][1] <> '*') and (FileName2FormCode(S.Strings[n]) = FormID) and (Doc_Type='2') then begin Inc(X); OldName := S.Strings[n]; NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編 S.Strings[n] := '*'+S.Strings[n]; S1.Add(OldName+','+NewName); end; end; end;} for i := 0 to S.Count - 1 do //FormID沒設定的或附件 begin if S.Strings[i][1] <> '*' then begin Inc(X); OldName := S.Strings[i]; //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); S.Strings[i] := '*'+S.Strings[i]; S1.Add(OldName+','+NewName); end; end; S.Clear; for i := 0 to S1.Count - 1 do //開始轉換檔名 begin v := Pos(',',S1.Strings[i]); v1 := length(S1.Strings[i]); OldName := copy(S1.Strings[i],1,v-1); NewName := copy(S1.Strings[i],v+1,v1-v); if FileExists(Path+OldName) then begin ReNameFile(Path+OldName,Path+NewName); S.Add(NewName); S.SaveToFile(Path+'Context.dat'); end; end; ReSortFileName(Path); finally S.Free; S1.Free; end; end; { ============================================================================== 方法名稱:CaseResort2Scanlist 引用相依:FileExists, LoadFromFile, RenameFile, SaveToFile, ReSortFileName 方法描述:產生依表單代號排序的影像清單(scanlist.dat),用於上傳。 ============================================================================== } Procedure TCB_IMGPSScanX.CaseResort2Scanlist(Path:String); //案件的檔案重新排序給scanlist(次文件依FormID排) var i,n,v,v1 : Integer; S,S1 : TStringlist; FormID,OldName,NewName,DocNo,Doc_Type:String; x : Integer; begin S := TStringlist.Create; S1 := TStringlist.Create; try if FileExists(Path+'Context.dat') then S.LoadFromFile(Path+'Context.dat'); X := 0; for I := 1 to FORM_INF_List.Count - 1 do //在FormID有設定的 //主文件 照SQL排 20101028改 begin FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i); if FormCode2FileName(FormID,S) = '' then Continue; Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i); for n := 0 to S.Count - 1 do begin if (S.Strings[n][1] <> '*') and (FileName2FormCode(S.Strings[n]) = FormID) and (Doc_Type='1') then begin Inc(X); OldName := S.Strings[n]; //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編 NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編 S.Strings[n] := '*'+S.Strings[n]; S1.Add(OldName+','+NewName); end; end; end; for I := 0 to FORM_INF_List.Count - 1 do //次文件 照SQL排 20110512為了某個文件要先打的原因要求改 begin FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i); if FormCode2FileName(FormID,S) = '' then Continue; Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i); for n := 0 to S.Count - 1 do begin if (S.Strings[n][1] <> '*') and (FileName2FormCode(S.Strings[n]) = FormID) and (Doc_Type='2') then begin Inc(X); OldName := S.Strings[n]; //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編 NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); //從原有數量加1開始編 S.Strings[n] := '*'+S.Strings[n]; S1.Add(OldName+','+NewName); end; end; end; {for I := 0 to Doc_Inf_List.Count - 1 do //次文件 照文件代碼+掃瞄順序排 20101101改 20110512晚上又說改回來 begin DocNo := GetSQLData(Doc_Inf_List,'DOC_NO',i); Doc_Type := GetSQLData(Doc_Inf_List,'DOC_TYPE',i); for n := 0 to S.Count - 1 do begin if (S.Strings[n][1] <> '*') and (FormCode2DocNo(FileName2FormCode(S.Strings[n])) = DocNo) and (Doc_Type='2') then begin Inc(X); OldName := S.Strings[n]; NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編 S.Strings[n] := '*'+S.Strings[n]; S1.Add(OldName+','+NewName); end; end; end;} {for n := 0 to S.Count - 1 do //次文件 照掃瞄順序排 20101028改 begin for i := 0 to FORM_INF_List.Count - 1 do begin FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i); Doc_Type := GetSQLData(FORM_INF_List,'T2.DOC_TYPE',i); if (S.Strings[n][1] <> '*') and (FileName2FormCode(S.Strings[n]) = FormID) and (Doc_Type='2') then begin Inc(X); OldName := S.Strings[n]; NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); //從原有數量加1開始編 S.Strings[n] := '*'+S.Strings[n]; S1.Add(OldName+','+NewName); end; end; end;} for i := 0 to S.Count - 1 do //FormID沒設定的或附件 begin if S.Strings[i][1] <> '*' then begin Inc(X); OldName := S.Strings[i]; //NewName := Add_Zoo(S.Count+x,3)+Copy(OldName,4,length(OldName)-3); NewName := Add_Zoo(S.Count+x,3)+FileName2NoQuene_Filename(OldName); S.Strings[i] := '*'+S.Strings[i]; S1.Add(OldName+','+NewName); end; end; S.Clear; for i := 0 to S1.Count - 1 do //開始轉換檔名 begin v := Pos(',',S1.Strings[i]); v1 := length(S1.Strings[i]); OldName := copy(S1.Strings[i],1,v-1); NewName := copy(S1.Strings[i],v+1,v1-v); //if FileExists(Path+OldName) then //begin //ReNameFile(Path+OldName,Path+NewName); S.Add(NewName); S.SaveToFile(Path+'scanlist.dat'); //end; end; ReSortFileName2Scanlist(Path); finally S.Free; S1.Free; end; end; { ============================================================================== 方法名稱:DistinctDocinCase 引用相依:LoadFromFile, LoadFileGetMD5 方法描述:列出案件目錄下所有具備文件編號與版本的唯一組合。 ============================================================================== } Procedure TCB_IMGPSScanX.DistinctDocinCase(Path:String); //列出案件裡的Docno_版本 var i,n,v : Integer; S : TStringlist; FormCode,DocNo,Ver : String; Doc_Ver : String; Exists : Boolean; begin S := TSTringlist.Create; try DocNo_VerinCase.Clear; S.LoadFromFile(Path+'Context.dat'); for I := 0 to S.Count - 1 do begin if FWH_category='N' then begin if (ISExistImg(Path+S.Strings[i])) or (reSizeExistImgList.IndexOf(LoadFileGetMD5(Path+S.Strings[i]))<>-1) then begin Continue; end; end; FormCode := FileName2FormCode(S.Strings[i]); DocNo := FormCode2DocNo(FormCode); Ver := FormCode2Version(FormCode); if (Docno <> '') and (Ver <> '') then begin Doc_Ver := DocNo+'_'+Ver; Exists := False; for n := 0 to DocNo_VerinCase.Count-1 do begin if Doc_Ver = DocNo_VerinCase.Strings[n] then begin Exists := True; Break; end; end; if not Exists then DocNo_VerinCase.Add(Doc_Ver); end; end; finally S.Free; end; end; { ============================================================================== 方法名稱:DistinctDocNoinCase 引用相依:LoadFromFile 方法描述:列出案件目錄下所有實際存在的文件編號(DocNo)。 ============================================================================== } Procedure TCB_IMGPSScanX.DistinctDocNoinCase(Path:String); //列出案件裡的Docno var i,n,v : Integer; S : TStringlist; FormCode,DocNo,Ver : String; Exists : Boolean; begin S := TSTringlist.Create; try CaseDocNoList.Clear; S.LoadFromFile(Path+'Context.dat'); for I := 0 to S.Count - 1 do begin FormCode := FileName2FormCode(S.Strings[i]); DocNo := FormCode2DocNo(FormCode); if (Docno <> '') then begin Exists := False; for n := 0 to CaseDocNoList.Count-1 do begin if DocNo = CaseDocNoList.Strings[n] then begin Exists := True; Break; end; end; if not Exists then CaseDocNoList.Add(DocNo); end; end; finally S.Free; end; end; { ============================================================================== 方法名稱:ClearErrini 引用相依:FileExists 方法描述:清除指定案件的所有檢核輔助檔案(如 Checkerr.ini, OMRCheckOk 等),並將 樹狀節點恢復為預設的影像索引狀態。 ============================================================================== } Procedure TCB_IMGPSScanX.ClearErrini(CaseID:String;CaseNode:TTreeNode); //清掉檢核檔案 var i : Integer; begin if FileExists(ImageSavePath+CaseID+'\Checkerr.ini') then DeleteFile(ImageSavePath+CaseID+'\Checkerr.ini'); if FileExists(ImageSavePath+CaseID+'\CheckMemo.dat') then DeleteFile(ImageSavePath+CaseID+'\CheckMemo.dat'); {if FileExists(ImageSavePath+CaseID+'\ReSize.dat') then //20110421拿掉 因為記錄會不見 DeleteFile(ImageSavePath+CaseID+'\ReSize.dat');} if FileExists(ImageSavePath+CaseID+'\RemoveMemo.dat') then DeleteFile(ImageSavePath+CaseID+'\RemoveMemo.dat'); if FileExists(ImageSavePath+CaseID+'\OMRCheckOk.dat') then DeleteFile(ImageSavePath+CaseID+'\OMRCheckOk.dat'); CaseHelpBtn.Visible := False; CaseNode.ImageIndex := 2; CaseNode.SelectedIndex := 2; end; { ============================================================================== 方法名稱:SetCaseList 引用相依:FileExists, LoadFromFile, SaveToFile 方法描述:維護本地案件清單資料。支援對 CaseList.dat 執行加入、插入、刪除或修改案 號操作,確保本地磁碟目錄與資料清單狀態同步。 ============================================================================== } Procedure TCB_IMGPSScanX.SetCaseList(Mode:Char;Index:Integer;text:String); //'A:加入,I:插入,D:刪除,E:修改' var i : Integer; begin CaseList.Clear; if FileExists(ImageSavePath + 'CaseList.dat') then CaseList.LoadFromFile(ImageSavePath + 'CaseList.dat'); case Mode of 'A':begin CaseList.Add(Text); end; 'I':begin CaseList.Insert(Index,Text); end; 'E':begin CaseList.Strings[Index] := Text; end; 'D':begin if Index <> -1 then CaseList.Delete(Index) Else if (text <> '') then begin for i := 0 to CaseList.Count - 1 do begin if Text = CaseList.Strings[i] then begin CaseList.Delete(i); Break; end; end; end; if CaseList.Count = 0 then DeleteFile(ImageSavePath + 'CaseList.dat'); end; end; if CaseList.Count > 0 then CaseList.SaveToFile(ImageSavePath+'CaseList.dat'); end; { ============================================================================== 方法名稱:SetDocNoList 引用相依:FileExists, LoadFromFile, SaveToFile 方法描述:維護案件的文件目錄清單(CaseDocNo.dat)與份數清單(CaseDocNo_Copies.dat )。根據 Mode 參數執行「加入 (A)」、「插入 (I)」、「修改 (E)」或「刪除 (D)」操作 。刪除時支援透過索引或目錄名稱進行,並會同步更新異動記錄(SetRecordEdit edDocDir)。最後將更新後的清單存回檔案。 ============================================================================== } Procedure TCB_IMGPSScanX.SetDocNoList(Mode:Char;Index:Integer;CaseNo,DocDir,Copies:String); //'A:加入,I:插入,D:刪除,E:修改' var i : Integer; CaseDocNoList : TStringlist; CaseDocNo_copiesList : TStringlist; begin CaseDocNoList := TStringlist.Create; CaseDocNo_CopiesList := TStringlist.Create; try CaseDocNoList.Clear; if FileExists(ImageSavePath+CaseNo+'\CaseDocNo.dat') then CaseDocNoList.LoadFromFile(ImageSavePath+CaseNo+'\CaseDocNo.dat'); if FileExists(ImageSavePath+CaseNo+'\CaseDocNo_Copies.dat') then CaseDocNo_CopiesList.LoadFromFile(ImageSavePath+CaseNo+'\CaseDocNo_Copies.dat'); case Mode of 'A':begin CaseDocNoList.Add(DocDir); CaseDocNo_CopiesList.Add(Copies); SetRecordEditedDocDir('A',CaseNo,DocDir); end; 'I':begin CaseDocNoList.Insert(Index,DocDir); CaseDocNo_CopiesList.Insert(Index,Copies); end; 'E':begin CaseDocNoList.Strings[Index] := DocDir; CaseDocNo_CopiesList.Strings[Index] := Copies; end; 'D':begin if Index <> -1 then begin //SetRecordEditedDocDir('D',CaseNo,CaseDocNoList.Strings[Index]); //20140624 修改刪除文件時也記一筆異動,刪掉會無法通知前端網頁有異動 SetRecordEditedDocDir('A',CaseNo,CaseDocNoList.Strings[Index]); //20170912 要刪除 不然我寫不下去 CaseDocNoList.Delete(Index); CaseDocNo_CopiesList.Delete(Index); end Else if (DocDir <> '') then begin for i := 0 to CaseDocNoList.Count - 1 do begin if DocDir = CaseDocNoList.Strings[i] then begin //SetRecordEditedDocDir('D',CaseNo,CaseDocNoList.Strings[i]); //20140624 修改刪除文件時也記一筆異動,刪掉會無法通知前端網頁有異動 SetRecordEditedDocDir('A',CaseNo,CaseDocNoList.Strings[i]); //20170912 要刪除 不然我寫不下去 CaseDocNoList.Delete(i); CaseDocNo_CopiesList.Delete(i); Break; end; end; end; if ContextList.Count = 0 then begin DeleteFile(ImageSavePath+CaseNo+'\CaseDocNo.dat'); end; end; end; //Showmessage('abc'+#13+ImageSavePath+CaseNo+'\CaseDocNo.dat'+#13+inttostr(CaseDocNoList.Count)+#13+CaseDocNoList.Text); if CaseDocNoList.Count >= 0 then begin CaseDocNoList.SaveToFile(ImageSavePath+CaseNo+'\CaseDocNo.dat'); CaseDocNo_CopiesList.SaveToFile(ImageSavePath+CaseNo+'\CaseDocNo_Copies.dat'); //Showmessage('存了'); end; finally CaseDocNoList.Free; CaseDocNo_CopiesList.Free; end; end; { ============================================================================== 方法名稱:SetContextList 引用相依:FileExists, LoadFromFile, SaveToFile 方法描述:維護特定文件目錄下的影像檔案清單(Context.dat)。支援「加入」、「插入」、「修 改」與「刪除」模式。操作前會先從磁碟載入既有的清單,執行變動後再存回,並記 錄該文件目錄已被異動。 ============================================================================== } Procedure TCB_IMGPSScanX.SetContextList(Mode:Char;Index:Integer;CaseNo,DocDir,FileName:String); //'A:加入,I:插入,D:刪除,E:修改' var i : Integer; //DocNo:String; begin //DocNo := FormCode2DocNo(FileName2FormCode(FileName)); //ShowMessage('FileName='+FileName); if DocDir = '' then DocDir := AttName ; //附件 ContextList.Clear; if FileExists(ImageSavePath+CaseNo+'\'+DocDir+'\Context.dat') then ContextList.LoadFromFile(ImageSavePath+CaseNo+'\'+DocDir+'\Context.dat'); SetRecordEditedDocDir('A',CaseNo,DocDir); //記錄文件有異動 case Mode of 'A':begin ContextList.Add(FileName); end; 'I':begin ContextList.Insert(Index,FileName); end; 'E':begin ContextList.Strings[Index] := FileName; end; 'D':begin if Index <> -1 then begin ContextList.Delete(Index); end Else if (text <> '') then begin for i := 0 to ContextList.Count - 1 do begin if FileName = ContextList.Strings[i] then begin ContextList.Delete(i); Break; end; end; end; if ContextList.Count = 0 then DeleteFile(ImageSavePath+CaseNo+'\'+DocDir+'\Context.dat'); end; end; if ContextList.Count > 0 then begin ContextList.SaveToFile(ImageSavePath+CaseNo+'\'+DocDir+'\Context.dat'); end; end; { ============================================================================== 方法名稱:SetAttContextList 引用相依:FileExists, LoadFromFile, SaveToFile 方法描述:維護案件的附件檔案清單(AttContext.dat)。邏輯與 SetContextList 相似,針 對附件目錄進行檔案名稱的「加入」、「插入」、「修改」與「刪除」管理,並將結果持 久化至磁碟。 ============================================================================== } Procedure TCB_IMGPSScanX.SetAttContextList(Mode:Char;Index:Integer;CaseNo,FileName:String); //'A:加入,I:插入,D:刪除,E:修改' var i : Integer; begin AttContextList.Clear; if FileExists(ImageSavePath+CaseNo+'\AttContext.dat') then AttContextList.LoadFromFile(ImageSavePath+CaseNo+'\AttContext.dat'); case Mode of 'A':begin AttContextList.Add(FileName); end; 'I':begin AttContextList.Insert(Index,FileName); end; 'E':begin AttContextList.Strings[Index] := FileName; end; 'D':begin if Index <> -1 then begin AttContextList.Delete(Index); end Else if (text <> '') then begin for i := 0 to AttContextList.Count - 1 do begin if FileName = AttContextList.Strings[i] then begin AttContextList.Delete(i); Break; end; end; end; if AttContextList.Count = 0 then DeleteFile(ImageSavePath+CaseNo+'\AttContext.dat'); end; end; if AttContextList.Count > 0 then begin AttContextList.SaveToFile(ImageSavePath+CaseNo+'\AttContext.dat'); end; end; { ============================================================================== 方法名稱:checkCaseOMRDone 引用相依: 方法描述:檢查當前案件是否已完成 OMR 檢核。遍歷 NewTreeNode 中的所有項目,判斷其 ImageIndex 是否皆為 7(代表已檢核通過的圖示索引),若有任何一項未達成 則回傳 False。 ============================================================================== } Function TCB_IMGPSScanX.checkCaseOMRDone:Boolean; //檢查案件是否完成OMR檢核 var i : Integer; begin Result := True; for I := 0 to NewTreeNode.Count - 1 do begin if NewTreeNode.Item[i].ImageIndex <> 7 then begin Result := False; Break; end; end; end; { ============================================================================== 方法名稱:checkFormCodeIsCustom 引用相依: 方法描述:檢查指定的表單代碼(FormCode)是否為自定義文件。透過讀取 CustomDocNo.in i 設定檔中的 FormID 資訊,比對傳入的代碼是否與設定值一致。 ============================================================================== } function TCB_IMGPSScanX.checkFormCodeIsCustom(path, formcode: string): boolean; var i:integer; ini : Tmeminifile; str1:String; begin //ShowMessage(path); ini := Tmeminifile.Create(Path+'CustomDocNo.ini'); str1:=ini.ReadString(Copy(formcode,1,8),'FormID',''); //ShowMessage('str1'+str1); if str1 = formcode then begin Result:=True; end else begin Result := False; end; end; { ============================================================================== 方法名稱:CheckCaseID_OK 引用相依: 方法描述:檢查樹狀結構中是否存在「未配號」的案件。遍歷所有節點,若節點文字包含「未 配號」字樣則回傳 False。 ============================================================================== } Function TCB_IMGPSScanX.CheckCaseID_OK:Boolean; //檢查是否有未配號的案件 var i,n : Integer; begin Result := True; for i := 0 to NewTreeNode.Count - 1 do begin if Pos(_msg('未配號'),NewTreeNode.Item[i].Text) > 0 then begin Result := False; Break; end; end; end; { ============================================================================== 方法名稱:CheckCaseAttach_OK 引用相依: 方法描述:檢查樹狀結構中是否存在「未歸類」的文件。遞迴遍歷案件下的所有子節點,若有 任何節點文字包含「未歸類」則回傳 False。 ============================================================================== } Function TCB_IMGPSScanX.CheckCaseAttach_OK:Boolean; //檢查是否有未歸類的案件 var i,j : Integer; begin Result := True; for i := 0 to NewTreeNode.Count - 1 do begin for j := 0 to NewTreeNode.Item[i].Count - 1 do begin if Pos(_msg('未歸類'),NewTreeNode.Item[i].Item[j].Text) > 0 then begin Result := False; Break; end; end; end; end; { ============================================================================== 方法名稱:CreateEmptyCase 引用相依:SaveToFile 方法描述:產生一個空白的案件結構,主要用於重掃件。建立必要的目錄,並產生初始的 Co ntext.dat 與更新 CaseList.dat。 ============================================================================== } Procedure TCB_IMGPSScanX.CreateEmptyCase(Path,CaseID:String); //產生空白案號(重掃件用) var S : TStringlist; begin S := TStringlist.Create; try S.SaveToFile(Path+CaseID+'\Context.dat'); S.Add(FCaseID); S.SaveToFile(Path+'CaseList.dat') finally S.Free; end; end; { ============================================================================== 方法名稱:InitScrollRec 引用相依: 方法描述:初始化影像捲軸記錄,將 1 到 8 號影像視窗的水平與垂直捲軸位置重設為 0。 ============================================================================== } Procedure TCB_IMGPSScanX.InitScrollRec; var i : Integer; begin for I := 1 to 8 do begin ScrollRec[i].HScroll := 0; ScrollRec[i].VScroll := 0; end; end; { ============================================================================== 方法名稱:FormIDReplace 引用相依:FileExists, LoadFromFile, DirectoryExists, CopyFile, RenameFile, Sav eToFile 方法描述:將指定文件中的舊表單代碼替換為新代碼。首先決定目標目錄(考慮是否分份數 、補件狀況),若目標目錄不存在則建立。接著將符合舊代碼的檔案複製到新目錄 下並重新命名(產生新序號),同時更新新目錄的 Context.dat 與清單。最後刪 除原目錄中的舊代碼檔案。 ============================================================================== } Procedure TCB_IMGPSScanX.FormIDReplace(CaseID,DocDir,OldFormID,NewFormID:String); //指定FormID更換成新的FormID var i : Integer; OldFileList,NewFileList : TStringlist; NewDocNo,NewDocDir:String; FormID : String; OldFile,NewFile:String; Ext : String; ST1:TStringList; begin ST1:=TStringList.Create; OldFileList := TStringlist.Create; NewFileList := TStringlist.Create; try NewDocNo := FormCode2DocNo(NewFormID); NewDocDir := FindLastestDocDir(CaseID,NewDocNo); /////20190319 Hong 原本的程式判斷怪怪的先Mark在下方,改用這段 if DocNoNeedDiv(NewDocNo) then //要分份數 begin if ((FormCode2Page(NewFormID) = '01') and (GetDocDir_Page(CaseID,NewDocDir)>0)) or (NewDocDir = '') then begin NewDocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',NewDocNo); end else begin //20171016 真對補件影響 所加的判斷 ST1.Clear; if FileExists(ImageSavePath + CaseID+'\'+NewDocDir+'\Context.dat') then begin ST1.LoadFromFile(ImageSavePath + CaseID+'\'+NewDocDir+'\Context.dat'); if (ST1.Count > 0) and ISExistImg(ImageSavePath + CaseID+'\'+NewDocDir+'\'+ST1.Strings[0]) then //20181210 多增加判斷ST1>0 否則會有機會出現List out of bound Hong begin NewDocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',NewDocNo); end; end; end; end Else //不分份數 begin if NewDocNo <> '' then NewDocDir := NewDocNo else //Attach 附件 NewDocDir := DocNo2DocNoDir(ImageSavePath + CaseID+'\',NewDocNo); end; {if NewDocDir = '' then begin if DocNoNeedDiv(NewDocNo) then begin NewDocDir:=DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',NewDocNo); end else begin NewDocDir := NewDocNo; end; end; //ShowMessage('NewDocDir='+NewDocDir); if DocNoNeedDiv(NewDocNo) and (FormCode2Page(NewFormID)='01') then begin NewDocDir := DocNo2DocNoDir(ImageSavePath+CaseID+'\',NewDocNo); end else begin ST1.Clear; if FileExists(ImageSavePath + NowCaseno+'\'+NewDocDir+'\Context.dat') then begin ST1.LoadFromFile(ImageSavePath + NowCaseno+'\'+NewDocDir+'\Context.dat'); if ISExistImg(ImageSavePath + NowCaseno+'\'+NewDocDir+'\'+ST1.Strings[0]) then begin NewDocDir := DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',NewDocNo); end; end; end; } if Not DirectoryExists(ImageSavePath+CaseID+'\'+NewDocDir) then begin MkDir(ImageSavePath+CaseID+'\'+NewDocDir); SetDocNoList('A',-1,CaseID,NewDocDir,'1'); end; if FileExists(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat') then OldFileList.LoadFromFile(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat'); if FileExists(ImageSavePath+CaseID+'\'+NewDocDir+'\Context.dat') then NewFileList.LoadFromFile(ImageSavePath+CaseID+'\'+NewDocDir+'\Context.dat'); for i := 0 to OldFileList.Count - 1 do begin OldFile := OldFileList.Strings[i]; Ext := ExtractFileExt(OldFile); if FileName2FormCode(OldFile) = OldFormID then begin NewFile := Add_Zoo(NewFileList.Count+1,3)+'_'+NewFormID+Ext; CopyFile(PWideChar(ImageSavePath+CaseID+'\'+DocDir+'\'+OldFile),PWideChar(ImageSavePath+CaseID+'\'+NewDocDir+'\'+NewFile),False); NewFileList.Add(NewFile); SetContextList('A',-1,CaseID,NewDocDir,NewFile); end; end; DeleteFormCodeFile(CaseID,DocDir,OldFormID); {for i := 0 to S.Count - 1 do begin FormID := FileName2FormCode(S.Strings[i]); if FormID = OldFormID then begin OldFile := S.Strings[i]; Ext := ExtractFileExt(OldFile); //NewFile := Copy(S.Strings[i],1,3)+'_'+NewFormID+Ext; NewFile := Add_Zoo(FileName2ScanPage(S.Strings[i]),3)+'_'+NewFormID+Ext; ReNameFile(Path+OldFile,Path+NewFile); S.Strings[i] := NewFile; end; end; S.SaveToFile(Path+'Context.dat'); ContextList.LoadFromFile(Path+'Context.dat'); } finally OldFileList.Free; NewFileList.Free; ST1.Free; end; end; { ============================================================================== 方法名稱:ShowFileReplace 引用相依:RenameFile 方法描述:將當前顯示清單(NowShowFileList)中的檔案更名為新的表單代碼。遍歷檔案, 保留原序號但替換 FormID 部分,執行實體更名並同步更新全域的 ContextLis t 記錄。 ============================================================================== } Procedure TCB_IMGPSScanX.ShowFileReplace(Path,NewFormID:String);//顯示的影像換成新的FormID var i,n : Integer; OldFile,NewFile:String; Ext : String; begin for i := 0 to NowShowFileList.Count - 1 do begin OldFile := NowShowFileList.Strings[i]; Ext := ExtractFileExt(OldFile); NewFile := Add_Zoo(FileName2ScanPage(OldFile),3)+'_'+NewFormID+Ext; ReNameFile(Path+OldFile,Path+NewFile); SetContextList('E',FileName2Index(OldFile),NowCaseno,NowDocNo,NewFile); end; end; { ============================================================================== 方法名稱:PageReplaceFormID 引用相依:LoadFromFile, RenameFile, SaveToFile 方法描述:針對影像列表(PageLV)中選取的頁面進行表單代碼更換。先過濾出符合條件的 檔案,再對選取項執行實體檔案更名(更新 FormID 部分),最後同步更新 Conte xt.dat 檔案內容。 ============================================================================== } Procedure TCB_IMGPSScanX.PageReplaceFormID(Path,NowFormID,NewFormID:String); //選取頁更換FormID var i,n : Integer; S,S1 : TStringlist; OldFile,NewFile:String; Ext : String; begin S := TStringlist.Create; S1 := TStringlist.Create; try S.LoadFromFile(Path+'Context.dat'); for i := 0 to S.Count - 1 do begin if NowFormID = 'ALL' then S1.Add(S.Strings[i]) Else if NowFormID = 'Err' then begin if not FormIDExists(FileName2FormCode(S.Strings[i]),False,0) then S1.Add(S.Strings[i]) end Else begin if NowFormID = FileName2FormCode(S.Strings[i]) then S1.Add(S.Strings[i]) end; end; for I := 0 to PageLV.Items.Count - 1 do begin if PageLV.Items.Item[i].Selected then begin OldFile := S1.Strings[i]; Ext := ExtractFileExt(OldFile); //NewFile := Copy(S1.Strings[i],1,3)+'_'+NewFormID+Ext; NewFile := Add_Zoo(FileName2ScanPage(S1.Strings[i]),3)+'_'+NewFormID+Ext; ReNameFile(Path+OldFile,Path+NewFile); for n := 0 to S.Count - 1 do begin if OldFile = S.Strings[n] then S.Strings[n] := NewFile; end; end; end; S.SaveToFile(Path+'Context.dat'); ContextList.LoadFromFile(Path+'Context.dat'); finally S.Free; S1.Free; end; end; { ============================================================================== 方法名稱:ModeNeedCheck 引用相依: 方法描述:判斷目前的掃瞄模式是否需要執行 OMR 檢核。 ============================================================================== } Function TCB_IMGPSScanX.ModeNeedCheck(OMRMode,ScanMode:String):Boolean; //掃瞄模式是否要做檢核 begin Result := False; if Pos(ScanMode,OMRMode) > 0 then Result := True; end; { ============================================================================== 方法名稱:GetCasePage 引用相依:FileExists, LoadFromFile 方法描述:計算案件的總影像頁數。遍歷案件下所有的文件目錄(CaseDocNo.dat),讀取每 個目錄的 Context.dat 並累加檔案數量。過程中會考慮入庫/非入庫文件的權 限與顯示過濾條件,最後也包含附件目錄的計數。 ============================================================================== } Function TCB_IMGPSScanX.GetCasePage(Path,CaseID:String):Integer; var DocDirList,FileList,ST1 :TStringlist; iDocDir,iDocNo : String; i,n,Count : Integer; begin Count := 0; DocDirList := TStringlist.Create; FileList := TStringlist.Create; ST1:=TStringList.Create; try if FileExists(Path+CaseID+'\CaseDocNo.dat') then DocDirList.LoadFromFile(Path+CaseID+'\CaseDocNo.dat'); //Showmessage(DocDirList.Text); for i := 0 to DocDirList.Count - 1 do begin iDocDir := DocDirList.Strings[i]; iDocno := DocNoDir2DocNo(iDocDir); {if (((FIs_In_Wh = 'Y') and (not DocNoIs_In_WH(iDocNo))) or //入庫掃描不看非入庫文件 ((FIs_In_Wh = 'N') and (DocNoIs_In_WH(iDocNo)))) and ((iDocNo <> 'Attach') and (Copy(iDocNo,1,5)<>'ZZZZZ')) then //非入庫掃描不看入庫文件 begin Continue; end;} //if not DocNoAppear(iDocNo) then Continue; //20170817 先註解 FileList.Clear; if FileExists(Path+CaseID+'\'+iDocDir+'\Context.dat') then begin FileList.LoadFromFile(Path+CaseID+'\'+iDocDir+'\Context.dat'); if (FWH_category='N') and (FIs_In_Wh='Y') then begin ST1.Clear; for n := 0 to FileList.Count - 1 do begin if ISExistImg(Path+CaseID+'\'+iDocDir+'\'+FileList.Strings[n]) then begin ST1.Add(FileList.Strings[n]); end; end; for n := 0 to ST1.Count - 1 do begin if (FileList.IndexOf(ST1.Strings[n])<>-1) and (not DocNoIs_In_WH(iDocNo)) then begin FileList.Delete(FileList.IndexOf(ST1.Strings[n])); end; end; end Else if not DocNoAppear(iDocNo) then Continue; //20180925 Hong覺得應該要加這段 end; Count := Count+ FileList.Count; end; if FileExists(Path+CaseID+'\'+AttName+'\Context.dat') then begin FileList.LoadFromFile(Path+CaseID+'\'+AttName+'\Context.dat'); Count := Count+ FileList.Count; end; Result := Count; finally DocDirList.Free; FileList.Free; ST1.free; end; end; { ============================================================================== 方法名稱:GetFormIDPage 引用相依: 方法描述:在指定的檔案清單中,計算符合特定表單代碼(FormID)的影像頁數。 ============================================================================== } Function TCB_IMGPSScanX.GetFormIDPage(FileList:TStringlist;FormID:String):Integer; var i,Cnt : Integer; begin Cnt := 0; for i := 0 to FileList.Count - 1 do begin if FormID = FileName2FormCode(FileList.Strings[i]) then begin inc(Cnt); end; end; Result := Cnt; end; { ============================================================================== 方法名稱:SetFile2Case 引用相依:LoadFromFile, SaveToFile 方法描述:將指定的檔案名稱加入到案件的主 Context.dat 清單中。 ============================================================================== } Procedure TCB_IMGPSScanX.SetFile2Case(CaseID,FileName:String); var S :TStringlist; begin S := TStringlist.Create; try S.LoadFromFile(ImageSavePath+CaseID+'\Context.dat'); S.Add(FileName); S.SaveToFile(ImageSavePath+CaseID+'\Context.dat'); finally S.Free; end; end; { ============================================================================== 方法名稱:WriteResize 引用相依:LoadFromFile, FileExists, SaveToFile 方法描述:產生影像縮放記錄檔(Resize.dat)。載入影像後比對原始標記(Tag)中的長寬資 訊與實際 Graphic 的長寬,若有變動則將差異記錄至文字檔中。 ============================================================================== } Procedure TCB_IMGPSScanX.WriteResize(ImgName,TxtName:String); //產生Resize.dat var TagTxt : String; RecHeight,RecWidth : String; ImgHeight,ImgWidth : String; S : TStringlist; v,v1:Integer; begin ImageScrollBox1.LoadFromFile(ImgName,1); ImgHeight := Inttostr(ImageScrollBox1.Graphic.Height); ImgWidth := Inttostr(ImageScrollBox1.Graphic.Width); Try TagTxt := GetTag(ImgName); Except TagTxt := ''; End; if TagTxt <> '' then begin S := TStringlist.Create; try S.CommaText := TagTxt; if S.Count = 2 then begin v := Pos(':',S.Strings[0]); v1 := length(S.Strings[0]); RecHeight := Copy(S.Strings[0],v+1,v1-v); v := Pos(':',S.Strings[1]); v1 := length(S.Strings[1]); RecWidth := Copy(S.Strings[1],v+1,v1-v); end; S.Clear; if FileExists(TxtName) then S.LoadFromFile(TxtName); if (RecHeight <> '') and (RecWidth <> '') and ((RecHeight<>ImgHeight) or (RecWidth<>ImgWidth)) then S.Add(ExtractfileName(ImgName)+',原長:'+RecHeight+',原寬:'+RecWidth+',長變動:'+ImgHeight+',寬變動:'+ImgWidth); S.SaveToFile(TxtName); finally S.Free; end; end; end; { ============================================================================== 方法名稱:GetCase_PageCount 引用相依:FileExists, LoadFromFile 方法描述:獲取所有案件的總數量與總頁數。讀取 CaseList.dat 取得案件清單,逐一計算 各案件目錄與附件目錄下的影像檔案數。針對非入庫且當次掃瞄的特殊情況,會 額外檢查 EditedDocDir.dat 以精確計算實際變動的頁數。 ============================================================================== } Function TCB_IMGPSScanX.GetCase_PageCount(var CaseCount,PageCount:Integer):Boolean; //取出案件的數量及頁數 var i,n,k: Integer; CaseList,DocList,FileList,ST1 : TStringlist; begin Result := False; CaseCount := 0; PageCount := 0; CaseList := TStringlist.Create; DocList := TStringlist.Create; FileList := TStringlist.Create; ST1:= TStringlist.Create; try ImageSavePath := ImagePath; CaseList.Clear; if FileExists(ImageSavePath + 'CaseList.dat') then CaseList.LoadFromFile(ImageSavePath + 'CaseList.dat'); CaseCount := CaseCount+CaseList.Count; //ShowMessage('ImageSavePath='+ImageSavePath+#10#13+'CaseList.Count='+IntToStr(CaseList.Count)); for i := 0 to CaseList.Count - 1 do begin DocList.Clear; If FileExists(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo.dat') Then DocList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo.dat'); //ShowMessage('DocList='+DocList.Text); for n := 0 to DocList.Count - 1 do begin //ShowMessage(DocList.Strings[n]+','+BoolToStr(DocNoAppear(DocNoDir2DocNo(DocList.Strings[n])),true)); if not DocNoAppear(DocNoDir2DocNo(DocList.Strings[n])) then Continue; FileList.Clear; If FileExists(ImageSavePath+CaseList.Strings[i]+'\'+DocList.Strings[n]+'\Context.dat') Then FileList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\'+DocList.Strings[n]+'\Context.dat'); PageCount := PageCount+FileList.Count; end; //Showmessage(inttostr(PageCount)); FileList.Clear; If FileExists(ImageSavePath+CaseList.Strings[i]+'\'+Attname+'\Context.dat') Then FileList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\'+Attname+'\Context.dat'); //Showmessage(ImageSavePath+CaseList.Strings[i]+'\'+Attname+'\Context.dat'); //Showmessage('FileList='+FileList.Text); PageCount := PageCount+FileList.Count; //Showmessage('PageCount='+inttostr(PageCount)); if (FWH_category='N') and (FIs_In_Wh='Y') then //20170912 針對非入庫並當次掃描做頁數計算 begin if FileExists(ImageSavePath+NowCaseno+'\EditedDocDir.dat') then begin ST1.LoadFromFile(ImageSavePath+NowCaseno+'\EditedDocDir.dat'); for n := 0 to ST1.Count - 1 do begin if ST1.Strings[n]=AttName then Continue; //ShowMessage(ST1.Strings[n]+','+BoolToStr(DocNoIs_In_WH(DocNoDir2DocNo(ST1.Strings[n])),true)); if not DocNoIs_In_WH(DocNoDir2DocNo(ST1.Strings[n])) then begin FileList.Clear; if FileExists(ImageSavePath+CaseList.Strings[i]+'\'+ST1.Strings[n]+'\Context.dat') then begin FileList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\'+ST1.Strings[n]+'\Context.dat'); for k := 0 to FileList.Count - 1 do begin if not ISExistImg(ImageSavePath+CaseList.Strings[i]+'\'+ST1.Strings[n]+'\'+FileList.Strings[k]) then PageCount := PageCount+1; end; end; end; end; end; end; end; Finally CaseList.Free; DocList.Free; FileList.Free; ST1.Free end; Result := True; end; { ============================================================================== 方法名稱:FindNoSaveBarCode 引用相依: 方法描述:檢查目前的條碼資訊中是否包含被標記為「不儲存影像」的條碼。遍歷所有辨識 到的條碼,並與排除清單(NoSaveBarCodeList)進行比對,若匹配則回傳 True。 ============================================================================== } Function TCB_IMGPSScanX.FindNoSaveBarCode : Boolean; //找是否有不要儲存影像的條碼 var i,n : Integer; begin Result := False; for i := 1 to MpsBarcodeinf.Count do begin for n := 0 to NoSaveBarCodeList.Count - 1 do begin if MpsBarcodeinf.Text[i] = NoSaveBarCodeList.Strings[n] then begin Result := True; Break; end; end; if Result then Break; end; end; { ============================================================================== 方法名稱:WriteCaseIndex 引用相依:SaveToFile 方法描述:將案件的信用註記狀態(Case_loandoc)寫入到指定路徑下的 CaseIndex.dat 檔案中。 ============================================================================== } Procedure TCB_IMGPSScanX.WriteCaseIndex(Path:String); Var S : TStringlist; begin if Path = '' then Exit; S := TStringlist.Create; try try S.Add(Case_loandoc); S.SaveToFile(Path+'CaseIndex.dat'); except on E: Exception do end; finally S.Free; end; end; { ============================================================================== 方法名稱:ReadCaseIndex 引用相依:FileExists, LoadFromFile 方法描述:從磁碟讀取案件索引檔(CaseIndex.dat)。載入信用註記狀態,並據此更新畫面 上 AddCredit1RG 選項組的選取狀態(Y 設為第一項,N 設為第二項)。若檔案不 存在但有預設值,則自動建立檔案。 ============================================================================== } Procedure TCB_IMGPSScanX.ReadCaseIndex(Path:String); Var S : TStringlist; begin AddCredit1RG.ItemIndex := -1; S := TStringlist.Create; try if FileExists(Path+'CaseIndex.dat') then begin S.LoadFromFile(Path+'CaseIndex.dat'); Case_loandoc := S.Strings[0]; end; if (Case_loandoc = '') and (FLoanDoc_Value <> '') then begin Case_loandoc := FLoanDoc_Value; WriteCaseIndex(Path); end; if Case_loandoc = 'Y' then AddCredit1RG.ItemIndex := 0 Else if Case_loandoc = 'N' then AddCredit1RG.ItemIndex := 1; finally S.Free; end; end; { ============================================================================== 方法名稱:ReduceLogFile 引用相依:FileExists, LoadFromFile, SaveToFile 方法描述:防止日誌檔案過大。檢查 IMGPSCheck.log,若行數超過 100,000 行,則自動刪 除最前面的 10,000 行記錄並重新存檔。 ============================================================================== } procedure TCB_IMGPSScanX.ReduceLogFile; //20171011 必免log檔掌太大 var ST1:TStringlist; I:integer; begin ST1:=TStringList.Create; if FileExists(LngPath+'IMGPSCheck.log') then begin ST1.LoadFromFile(LngPath+'IMGPSCheck.log'); if ST1.count>100000 then begin for I := 0 to 10000 do begin ST1.Delete(0); end; ST1.SaveToFile(LngPath+'IMGPSCheck.log'); end; end; ST1.Free; end; { ============================================================================== 方法名稱:ClearCaseIndex 引用相依: 方法描述:重設案件索引相關的 UI 狀態,將信用註記選項設為不可用且取消選取。 ============================================================================== } Procedure TCB_IMGPSScanX.ClearCaseIndex; begin AddCredit1RG.Enabled := False; AddCredit1RG.ItemIndex := -1; end; { ============================================================================== 方法名稱:GetSelectImageFile 引用相依: 方法描述:取得當前所有被選取的影像檔案路徑。遍歷畫面上的 TShape 元件(選取框),透 過名稱關聯找到對應的影像捲軸盒(ISB),並將其載入的檔名加入到 NowSelect FileList 清單中。 ============================================================================== } Procedure TCB_IMGPSScanX.GetSelectImageFile; var i : Integer; FormID,FormName,DocNo : String; PreNode2Name : String; iFormID : String; iISBName : String; iISB : TImageScrollBox; begin NowSelectFileList.Clear; for i := 0 to ComponentCount -1 do begin if (Components[i] is TShape) and (copy(Components[i].Name,1,2)='SP') then begin iISBName := ShapeName2PreViewISBName(TShape(Components[i])); iISB := TImageScrollBox(FindComponent(iISBName)); NowSelectFileList.Add(iISB.FileName); end; end; end; { ============================================================================== 方法名稱:GetDocNoDir 引用相依:DirectoryExists 方法描述:根據文件編號產生下一個可用的目錄名稱(用於區分份數)。若文件編號不為空, 會遞增序號並檢查磁碟目錄是否存在,直到找到未使用的名稱(格式如 DocNo_1 );若編號為空則回傳附件目錄名稱。 ============================================================================== } Function TCB_IMGPSScanX.GetDocNoDir(Path,DocNo:String):String; //取出目前DocNo的份數 var i : Integer; iDocNo : String; begin if (DocNo <> '') then begin i := 0; Repeat begin inc(i); iDocNo := Format('%s_%d',[DocNo,i]); end; until not DirectoryExists(Path+iDocNo); Result := iDocNo; end Else begin Result := AttName; end; end; { ============================================================================== 方法名稱:CheckFormIDExists 引用相依: 方法描述:檢查特定的表單代碼(FormID)是否已經存在於樹狀結構中指定文件的子節點中 。 ============================================================================== } Function TCB_IMGPSScanX.CheckFormIDExists(DocNoNode:TTreeNode;FormID:String):Boolean; //檢查FormID是否存在文件裡 var i : Integer; begin Result := False; for i := 0 to DocNoNode.Count - 1 do begin if FormID = Node3FormID(DocNoNode.Item[i]) then begin Result := True; break; end; end; end; { ============================================================================== 方法名稱:DocNo2DocNoDir 引用相依:DirectoryExists 方法描述:類似 GetDocNoDir,但產生的目錄名稱格式為 DocNo(1)。透過循環檢查目錄是 否存在,自動產生下一個可用的份數目錄名稱。 ============================================================================== } Function TCB_IMGPSScanX.DocNo2DocNoDir(Path,DocNo:String):String; //DocNo轉成DocNo(份數)目錄 var i : Integer; iDocNo : String; begin if (DocNo <> '') then begin i := 0; Repeat begin inc(i); iDocNo := Format('%s(%d)',[DocNo,i]); end; until not DirectoryExists(Path+iDocNo); Result := iDocNo; end Else begin Result := AttName; end; end; { ============================================================================== 方法名稱:DocNoDir2DocNo 引用相依: 方法描述:將包含份數括號的目錄名稱(如 A001(2))還原為原始的文件編號(如 A001)。排 除附件目錄後,尋找左括號的位置並擷取前面的字串。 ============================================================================== } Function TCB_IMGPSScanX.DocNoDir2DocNo(DocNoDir:String):String; //DocNo(份數)目錄轉成DocNo var v,ln : Integer; begin if (DocNoDir <> 'Attach') and (DocNoDir <> 'S_Attach') then begin v := Pos('(',DocNoDir); if v > 0 then Result := Copy(DocNoDir,1,v-1) else Result := DocNoDir; end Else Result := DocNoDir end; { ============================================================================== 方法名稱:DocNoDir2Index 引用相依:LoadFromFile 方法描述:將文件目錄名稱轉換為其在 CaseDocNo.dat 清單中的索引位置。 ============================================================================== } Function TCB_IMGPSScanX.DocNoDir2Index(Path,DocNoDir:String):Integer; //DocNo(份數)目錄轉成index var i : Integer; CaseNo_List : TStringlist; begin Result := -1; CaseNo_List := TStringlist.Create; try CaseNo_List.LoadFromFile(Path+'CaseDocNo.dat'); for i := 0 to CaseNo_List.Count - 1 do begin if DocNoDir = CaseNo_List.Strings[i] then begin Result := i; Break; end; end; finally CaseNo_List.Free; end; end; { ============================================================================== 方法名稱:ParserPoint 引用相依: 方法描述:解析代表影像十字點座標的字串。將包含四個端點(左上、左下、右上、右下)座標 及長寬資訊的字串拆解,並轉換為 TPoint 結構存入全域變數中,若字串格式不 符則全部重設為 (0,0)。 ============================================================================== } Procedure TCB_IMGPSScanX.ParserPoint(S:String); //解析十字點的字串 var PointList : TStringlist; Rect : TRect; begin PointList := TStringlist.Create; try PointList.Text := S; IF PointList.Count <> 6 Then begin UpLPoint := Str2Point('0,0'); UpRPoint := Str2Point('0,0'); DownLPoint := Str2Point('0,0'); DownRPoint := Str2Point('0,0'); Point_Width := '0'; Point_Height := '0'; end Else begin UpLPoint := Str2Point(PointList[0]); DownLPoint := Str2Point(PointList[1]); UpRPoint := Str2Point(PointList[2]); DownRPoint := Str2Point(PointList[3]); Point_Width := PointList[4]; Point_Height := PointList[5]; end; finally PointList.Free; end; end; { ============================================================================== 方法名稱:CheckScanDenialTime 引用相依: 方法描述:檢查目前時間是否已超過系統設定的「禁止掃瞄時間」。 ============================================================================== } Function TCB_IMGPSScanX.CheckScanDenialTime:Boolean; Var NowTime : String; begin NowTime := GetBalance2Time(Balance); NowTime := Copy(NowTime,1,2)+':'+Copy(NowTime,3,2)+':'+Copy(NowTime,5,2); Result := True; if ScanDenialTime <> '' then begin if StrtoTime(NowTime) >= StrtoTime(ScanDenialTime) then Result := False; end; end; { ============================================================================== 方法名稱:FormID2Anchor 引用相依: 方法描述:根據表單代碼(FormID)從 FORM_INF_List 中查詢對應的定位模式(ANCHOR 模 式),並回傳轉換後的模式字串(NONE/ANCHOR/FRAME)。 ============================================================================== } Function TCB_IMGPSScanX.FormID2Anchor(FormID:String):String; //用FormID取出十字模式 var Anchor : String; begin Result := 'NONE'; IF FindSQLData(FORM_INF_List,'T1.ANCHOR','T1.FORM_ID',FormID,0,FindResult) then begin ANCHOR := UpperCase(GetFindResult('T1.ANCHOR')); end; Result := Index2Anchor(Anchor); end; { ============================================================================== 方法名稱:Index2Anchor 引用相依: 方法描述:將數值型的定位模式索引(0, 1, 2)轉換為易讀的模式名稱字串。 ============================================================================== } Function TCB_IMGPSScanX.Index2Anchor(Anchor:String):String; //十字模式 0->NONE;1->ANCHOR;2->FRAME begin if Anchor = '0' then Result := 'NONE' else if Anchor = '1' then Result := 'ANCHOR' else if Anchor = '2' then Result := 'FRAME'; end; { ============================================================================== 方法名稱:ScanDuplexCBClick 引用相依: 方法描述:處理雙面掃瞄勾選框點擊事件,同步更新全域的 ScanDuplex 變數。 ============================================================================== } procedure TCB_IMGPSScanX.ScanDuplexCBClick(Sender: TObject); begin ScanDuplex := ScanDuplexCB.Checked; //R_W_ScanIni('W'); //user要求改成預設後不能改 end; { ============================================================================== 方法名稱:ScanGrayCBClick 引用相依:ifGray256, ifBlackWhite, ifTrueColor 方法描述:根據掃瞄勾選框狀態,設定掃瞄色彩模式(灰階、全彩或黑白)。 ============================================================================== } procedure TCB_IMGPSScanX.ScanGrayCBClick(Sender: TObject); begin if ScanGrayCB.Checked then begin ScanColor:=ifGray256; end else begin if FScanColor = 0 then begin ScanColor := ifBlackWhite; end; if FScanColor = 1 then begin //ScanColor := ifGray256 ; ScanColor := ifBlackWhite; // end; if FScanColor = 2 then begin ScanColor := ifTrueColor ; end; end; end; { ============================================================================== 方法名稱:GetFormatID 引用相依:FileExists, LoadFromFile 方法描述:從案件索引檔(CaseIndex.dat)中獲取案件的 FormatID(主鍵值)。目前實作為 存根,包含讀取邏輯但未回傳特定欄位。 ============================================================================== } Function TCB_IMGPSScanX.GetFormatID(CaseID: string):String; Var S : TStringlist; FormatID : String; begin Result := ''; S := TStringlist.Create; try if FileExists(ImageSavePath+CaseID+'\CaseIndex.dat') then begin S.LoadFromFile(ImageSavePath+CaseID+'\CaseIndex.dat'); //Format_ID := S.Strings[5]; //主鍵值 (報價單號or續保單號or保單號碼or保險證號or原案件受編) //Result := Format_ID; //Handle_No := S.Strings[0]; //經辦代號 //Cen_Uid := S.Strings[1]; //被保人ID //Cen_Cliname := S.Strings[2]; //被保人姓名 //Cen_Platno := S.Strings[3]; //車號 //Case_Priority := S.Strings[4];//案件等級 end; finally S.Free; end; end; { ============================================================================== 方法名稱:MemoInfoTransfer 引用相依: 方法描述:註記代碼與類別名稱的轉換函數。支援「代碼轉名稱」或「名稱轉代碼」兩種模式, 若無匹配代碼則預設為「自行輸入」。 ============================================================================== } Function TCB_IMGPSScanX.MemoInfoTransfer(Mode,Str:String;ID_S,Name_S:TStringlist):String; //註記代碼註記類別轉換 Mode 'ID':代碼轉名稱;'NAME':名稱轉代碼 var i : Integer; begin if Mode = 'ID' then begin Result := _Msg('自行輸入'); for i := 0 to ID_S.Count - 1 do begin if Str = ID_S.Strings[i] then begin Result := Name_S.Strings[i]; Break; end; end; end else if Mode = 'NAME' then begin Result := '00'; for i := 0 to Name_S.Count - 1 do begin if Str = Name_S.Strings[i] then begin Result := ID_S.Strings[i]; Break; end; end; end; end; { ============================================================================== 方法名稱:SetSQLData 引用相依: 方法描述:將 SQL 查詢結果格式化後塞入目標字串清單。此方法會先清除目標清單 (ToLi st),第一行加入欄位定義字串 (ColumeStr),隨後將來源清單 (FromList) 中 扣除標題後的資料列依序填入,用於更新系統本地的資料快取。 ============================================================================== } Procedure TCB_IMGPSScanX.SetSQLData(ColumeStr:String;FromList,ToList:TStringlist); //把SQL值塞入 var i : Integer; begin ToList.Clear; ToList.Add(ColumeStr); For i := 1 to FromList.Count -1 do begin ToList.Add(FromList.Strings[i]); end; end; { ============================================================================== 方法名稱:GetSQLData 引用相依: 方法描述:從結構化字串清單中提取特定欄位的值。邏輯如下: 1. 解析 TableList 的第一行(欄位定義)以確定目標欄位 (Colname) 的索引 位置。 2. 讀取指定行 (colNo) 的資料字串,該字串使用 '!@!' 作為欄位分隔符。 3. 透過循環將資料拆分並存入臨時清單,最後返回對應欄位索引位置的數值內 容。若找不到欄位或索引超出範圍,則返回空字串。 ============================================================================== } Function TCB_IMGPSScanX.GetSQLData(TableList:TStringlist;Colname:String;colNo:Integer):String; //依欄位及索引取值 var i,col,v,v1 : Integer; ColStr,DataStr: TStringList; TmpStr : String; P1,p2 : Integer; begin Result := ''; ColStr := TStringList.Create; DataStr := TSTringList.Create; ColStr.CommaText := TableList.Strings[0]; TmpStr := TableList.Strings[ColNo]; //DataStr.Text:=StringReplace(TmpStr,'!@!',#13,[rfReplaceAll]); While Length(Tmpstr) > 0 do begin v:= Pos('!@!',TmpStr); v1 := Length(TmpStr); If v > 0 Then begin DataStr.Add(Copy(TmpStr,1,v-1)); TmpStr := Copy(TmpStr,v+3,V1-(V-2)); end Else begin DataStr.Add(TmpStr); TmpStr := ''; end; end; For i := 0 to ColStr.Count-1 do begin IF ColStr.Strings[i] = ColName Then begin Result := ''; If (DataStr.Count > 0) and (i<=DataStr.Count-1) Then Result := DataStr.Strings[i]; //If (DataStr.Count > 0) and (i<=DataStr.Count-1) Then //begin {if i = 0 then begin P1 := 1; p2 := PosN('!@!',TmpStr,1)-1; end else begin P1 := PosN('!@!',TmpStr,i)+3; p2 := PosN('!@!',TmpStr,i+1)-p1; end; Result :=Copy(tmpstr,p1,p2);} //end; //Result := DataStr.Strings[i]; Break; end; end; ColStr.Free; DataStr.Free; end; { ============================================================================== 方法名稱:FindSQLData 引用相依: 方法描述:在資料快取清單中搜尋符合鍵值的紀錄。核心邏輯: 1. 支援多個鍵值比對 (KeyColumeStr 與 KeyStr 可包含多個欄位)。 2. 若 ColNo 為 0,則從頭搜尋清單;若非 0 則僅檢查該指定行。 3. 搜尋時會調用 GetSQLData 提取欄位值並與目標鍵值比對。 4. 一旦匹配成功,會將 ColumeStr 中指定的所有欄位名稱及其對應數值(格式 為「欄位名,數值」)填入 ResultList 中並返回 True。若搜尋無結果則返回 Fal se。 ============================================================================== } Function TCB_IMGPSScanX.FindSQLData(TableList:TStringlist;ColumeStr,KeyColumeStr,KeyStr:String;ColNo:Integer;Var ResultList:TStringlist):Boolean; //找指定的資料 Var i,n,Findindex : Integer; ColList,KeyColList,KeyList : TStringlist; Cols,Keycols,keys :String; Find:Boolean; begin ResultList.Clear; if (KeyStr = '') or (TableList.Count <= 1) then begin Result := False; Exit; end; ColList := TStringlist.Create; KeyColList := TStringlist.Create; KeyList := TStringlist.Create; try ColList.CommaText := ColumeStr; KeyColList.CommaText := KeyColumeStr; KeyList.CommaText := KeyStr; if ColNo = 0 then begin for i := 1 to TableList.Count -1 do //找key對不對 begin Findindex := i; for n := 0 to KeyColList.Count - 1 do begin Find := True; Keycols := KeyColList.Strings[n]; keys := KeyList.Strings[n]; //Showmessage(keys); //Showmessage(TableList.Strings[i]); if GetSQLData(TableList,Keycols,i) = keys then //對.繼續 //if Pos('!@!'+keys+'!@!','!@!'+TableList.Strings[i]+'!@!') >0 then //在資料列前後加!@! 用pos的方式來改善速度 //20130521發現找資料會有問題 Continue Else //不對.離開 begin Find := False; Break; end; end; if Find then Break; // 找到了離開 end; end Else begin i := ColNo; Findindex := i; for n := 0 to KeyColList.Count - 1 do begin Find := True; Keycols := KeyColList.Strings[n]; keys := KeyList.Strings[n]; //if GetSQLData(TableList,Keycols,i) = keys then //對.繼續 if Pos('!@!'+keys+'!@!','!@!'+TableList.Strings[i]+'!@!') >0 then //在資料列前後加!@! 用pos的方式來改善速度 Continue Else //不對.離開 begin Find := False; Break; end; end; end; if Find then //有找到key begin for n := 0 to ColList.Count -1 do begin Cols := ColList.Strings[n]; ResultList.Add(Cols+','+GetSQLData(TableList,Cols,Findindex)); end; end; finally Result := Find; ColList.Free; KeyColList.Free; KeyList.Free; end; end; { ============================================================================== 方法名稱:GetFindResult 引用相依: 方法描述:從資料查詢結果(FindResult)中,根據指定的欄位名稱(Col)提取對應的值。 ============================================================================== } Function TCB_IMGPSScanX.GetFindResult(Col:String):String; var i,v,v1 : Integer; S,RCol,RValue : String; begin Result := ''; for I := 0 to FindResult.Count - 1 do begin S := FindResult.Strings[i]; v := Pos(',',S); v1 := length(S); RCol := copy(S,1,v-1); RValue := Copy(S,v+1,v1-v); if Col =RCol then Result := RValue; end; end; { ============================================================================== 方法名稱:ClearView 引用相依: 方法描述:清空指定的影像顯示區域。將索引從 stkv 到 8 的 TImageScrollBox 檔名重 設為空,並清空對應的標籤文字,最後釋放預覽資源並將焦點設回 ISB1。 ============================================================================== } procedure TCB_IMGPSScanX.ClearView(stkv:Integer); var i:integer; ISB : TImageScrollBox; lb : TLabel; begin For i:= stkv to 8 do begin ISB := TImageScrollBox(FindComponent('ISB'+intToStr(i))); ISB.FileName := ''; Lb := TLabel(FindComponent('Lb'+intToStr(i))); Lb.Caption := ''; end; FreePreViewISB; ISB1Click(ISB1); end; { ============================================================================== 方法名稱:initParameter 引用相依:ifBlackWhite, ifGray256, ifTrueColor 方法描述:初始化掃瞄相關參數。設定檔案大小限制(預設 5MB)、DPI(預設 300)以及掃瞄 顏色模式(黑白、灰階、全彩),並同步更新 UI 狀態(如 ScanGrayCB)。 ============================================================================== } procedure TCB_IMGPSScanX.initParameter; begin // if FCaseNoLength=0 then // begin // // end; if FFileSizeLimit = 0 then begin FFileSizeLimit := 5*1024; end; if FImgDPI=0 then begin FImgDPI := 300; ScanDpi := FImgDPI; end else begin //FImgDPI := StrToInt(Value); ScanDpi := FImgDPI; end; if FScanColor = 0 then begin ScanColor := ifBlackWhite; end; if FScanColor = 1 then begin ScanColor := ifGray256 ; ScanGrayCB.Checked:=True; end; if FScanColor = 2 then begin ScanColor := ifTrueColor ; end; end; { ============================================================================== 方法名稱:PrtLbClick 引用相依:LoadFromFile 方法描述:處理「列印」按鈕點擊。首先產生上傳用的暫存影像結構,接著開啟 TPrintForm 供使用者勾選欲列印的文件。確認後呼叫 PrintImg 進行實體列印,並記錄操作 日誌。 ============================================================================== } procedure TCB_IMGPSScanX.PrtLbClick(Sender: TObject); var Width : Double; Height : Double; i : Integer; DocDirList,FileList :TStringlist; iDocDir,iDocNo : String; PrtDialog : TPrintDialog; S : String; begin ShowText := _Msg('列印中,請稍候'); DataLoading(True,True); Case2upload(NowCaseNo); //產生原影像結構 //ontextList.LoadFromFile(ImageSavePath+NowCaseNo+'\Upload\Context.dat'); PrintForm := TPrintForm.create(Self); DocDirList := TStringlist.Create; FileList := TStringlist.Create; try FileList.LoadFromFile(ImageSavePath+NowCaseNo+'\Upload\Context.dat'); DocDirList.LoadFromFile(ImageSavePath+NowCaseNo+'\Upload\DocDir.dat'); InitialLanguage(PrintForm); //載入多國語言 PrintForm.CheckListBox1.Items.Clear; For i := 0 to FileList.Count - 1 do begin iDocDir := DocDirList.Strings[i]; iDocno := DocNoDir2DocNo(iDocDir); if not DocNoAppear(iDocNo) then Continue; PrintForm.CheckListBox1.Items.Add(FileList.Strings[i]); if CheckFormID_Prt(FileName2FormCode(FileList.Strings[i])) then PrintForm.CheckListBox1.Checked[i] := True; PrintForm.ListBox1.Items.Add(Add_Zoo(i+1,3)) end; If (PrintForm.ShowModal = mrOK) then begin S := ''; for I := 0 to PrintForm.CheckListBox1.Count -1 do begin if PrintForm.CheckListBox1.Checked[i] then begin if S = '' then S := S+PrintForm.CheckListBox1.Items[i] Else S := S+#13+PrintForm.CheckListBox1.Items[i]; end; end; if S = '' then begin Showmessage(_msg('尚未選擇欲列印文件')); Exit; end Else begin PrintImg(S,FUserID,ServerDate,ImageSavePath+NowCaseNo+'\Upload\'); If not Writelog(NowCaseNo) then begin //Showmessage('false'); end; end; end; finally DataLoading(False,False); PrintForm.Free; end; end; { ============================================================================== 方法名稱:UseOldCaseLbClick 引用相依:FileExists, LoadFromFile, DirectoryExists, CopyFile, SaveToFile 方法描述:處理「使用舊件」功能。開啟 TOldCaseInfoForm 讓使用者選擇舊有案件的文件。 選定後,將舊件影像複製到新案件目錄下,自動產生新序號檔名,建立關聯記錄( UseCase.dat),並同步更新新案件的文件清單與樹狀統計。 ============================================================================== } procedure TCB_IMGPSScanX.UseOldCaseLbClick(Sender: TObject); var i,n : Integer; CaseID,Year,BS_No,IS_Old : String; OldCaseInfoForm : TOldCaseInfoForm; OldCaseInfoList,Caseinfolist,FileList,DocNoList,iFileList,iDocNoList,iDocNo_CopiesList : TStringlist; OldDocdir,OldDocNo,OldDocName,NewDocDir,FileName : String; OldPath,NewPath,OldFile,NewFile:String; Oldcopies:Integer; begin OldCaseInfoForm := TOldCaseInfoForm.Create(Self); OldCaseInfoList := TStringlist.Create; Caseinfolist := TStringlist.Create; FileList := TStringlist.Create; DocNoList := TStringlist.Create; iDocNo_CopiesList := TStringlist.Create; iFileList := TStringlist.Create; iDocNoList := TStringlist.Create; OldCaseInfoForm.OldDocDirList := TStringlist.Create; OldCaseInfoForm.OldDocNameList := TStringlist.Create; OldCaseInfoForm.IN_WH_DocNoList := TStringlist.Create; OldCaseInfoForm.OldCopiesList := TStringlist.Create; try InitialLanguage(OldCaseInfoForm); //載入多國語言 OldCaseInfoForm.Notebook1.ActivePage := 'CaseInfo'; OldCaseInfoForm.ImageSavePath := ImageSavePath; OldCaseInfoForm.CaseID := NowCaseNo; OldCaseInfoForm.Furl := Furl; OldCaseInfoForm.Fdata := FData; OldCaseInfoForm.FVerify := FVerify; OldCaseInfoForm.FReWrite := FReWrite; OldCaseInfoForm.FOldCaseInfo := FOldCaseInfo; //OldCaseInfoList 案件編號@#,年度@#,業務別@#,是否舊件@#,文件編號[份數]@#,文件編號[份數] tab 案件編號@#,年度@#,業務別@#,是否舊件@#,文件編號[份數]@#,文件編號[份數] OldCaseInfoList.StrictDelimiter := true; OldCaseInfoList.Delimiter := #9; OldCaseInfoList.DelimitedText := FOldCaseInfo; //Showmessage(FOldCaseInfo); //Showmessage(OldCaseInfoList.Text); OldCaseInfoForm.IN_WH_DocNoList.Assign(IN_WH_DocNoList); OldCaseInfoForm.FIs_In_Wh := FIs_In_Wh; for i := 0 to OldCaseInfoList.Count - 1 do begin Caseinfolist:=SplitString('@#,',OldCaseInfoList.Strings[i]); //Caseinfolist.Delimiter := '_'; //Caseinfolist.DelimitedText := OldCaseInfoList.Strings[i]; CaseID := Caseinfolist.Strings[0]; Year := Caseinfolist.Strings[1]; BS_No := Caseinfolist.Strings[2]; IS_Old := Caseinfolist.Strings[3]; With OldCaseInfoForm.OldCaseLV.Items.Add do begin Caption := CaseID; SubItems.Add(Year); SubItems.Add(BS_No); SubItems.Add(IS_Old); end; end; if OldCaseInfoForm.ShowModal = MrOk then begin OldPath := ImageSavePath+NowCaseNo+'\'+OldCaseInfoForm.UseCaseID+'\'; NewPath := ImageSavePath+NowCaseNo+'\'; iDocNoList.Clear; if FileExists(NewPath+'CaseDocNo.dat') then iDocNoList.LoadFromFile(NewPath+'CaseDocNo.dat'); if FileExists(NewPath+'CaseDocNo_Copies.dat') then iDocNo_CopiesList.LoadFromFile(NewPath+'CaseDocNo_Copies.dat'); for i := 0 to OldCaseInfoForm.OldDocDirList.Count - 1 do begin FileList.LoadFromFile(OldPath+'Context.dat'); DocNoList.LoadFromFile(OldPath+'DocDir.dat'); OldDocName := OldCaseInfoForm.OldDocNameList.Strings[i]; OldDocDir := OldCaseInfoForm.OldDocDirList.Strings[i]; OldDocNo := DocNoDir2DocNo(OldDocDir); if Copy(OldDocNo,1,5)<>'ZZZZZ' then begin if DocNoNeedDiv(OldDocNo) then NewDocDir := DocNo2DocNoDir(NewPath,OldDocNo) else NewDocDir := OldDocNo; end Else begin NewDocDir := GetNewCustomDocNo(NewPath,OldDocName); end; SetRecordEditedDocDir('A',NowCaseNo,NewDocDir); iFileList.Clear; if FileExists(NewPath+NewDocDir+'\Context.dat') then iFileList.LoadFromFile(NewPath+NewDocDir+'\Context.dat'); if Not DirectoryExists(NewPath+NewDocDir) then begin iDocNoList.Add(NewDocDir); Oldcopies := GetDocDirCopies(NowCaseNo+'\'+OldCaseInfoForm.UseCaseID,OldDocDir); //舊案的CaseID 放在新案CaseID目錄裡 if FileExists(ImageSavePath+NowCaseNo+'\'+OldCaseInfoForm.UseCaseID+'\CaseDocNo_Copies.dat') then iDocNo_CopiesList.Add(inttostr(Oldcopies)) else begin OldCopies := GetDocDircopies_Rec(OldPath,OldCaseInfoForm.UseCaseID,OldDocDir); iDocNo_CopiesList.Add(inttostr(Oldcopies)); //iDocNo_CopiesList.Add('1'); end; MkDir(NewPath+NewDocDir); end; SetUseCase('A',NewPath,NewDocDir,OldCaseInfoForm.UseCaseID,''); //NewDocDir 從哪來的 SetUseCase('A',OldPath,OldDocDir,'',NowCaseNo); //OldDocDir 去哪了 StringtoFile('Y',OldPath+'UseCase.dat'); //要上傳 for n := 0 to DocNoList.Count - 1 do begin if OldDocDir = DocNoList.Strings[n] then begin OldFile := FileList.Strings[n]; if Copy(NewDocDir,1,5)<>'ZZZZZ' then NewFile := Add_Zoo(iFileList.Count+1,3)+FileName2NoQuene_Filename(OldFile) Else NewFile := Add_Zoo(iFileList.Count+1,3)+'_'+GetCustomFormID(NewPath,NewDocDir)+ExtractFileExt(OldFile); iFileList.Add(NewFile); CopyFile(PwideChar(OldPath+OldFile),Pwidechar(NewPath+NewDocDir+'\'+NewFile),False); end; end; iFileList.SaveToFile(NewPath+NewDocDir+'\Context.dat'); end; iDocNoList.SaveToFile(NewPath+'CaseDocNo.dat'); iDocNo_CopiesList.SaveToFile(NewPath+'CaseDocNo_Copies.dat'); DrawDocItem2(MyTreeNode1,NowCaseNo); //MyTreeNode1.Text := Format('%s-%d'+_Msg('頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]); MyTreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]); NewTreeNodeRefresh; ClearErrini(NowCaseno,MyTreeNode1); //清掉檢核記錄 end; finally OldCaseInfoForm.OldDocDirList.Free; OldCaseInfoForm.OldDocNameList.Free; OldCaseInfoForm.OldCopiesList.Free; OldCaseInfoList.Free; Caseinfolist.Free; FileList.Free; DocNoList.Free; iDocNo_CopiesList.Free; iFileList.Free; iDocNoList.Free; OldCaseInfoForm.Free; end; end; { ============================================================================== 方法名稱:LastInitFormidListCreate 引用相依:LoadFromFile 方法描述:從 FormCode_Name.dat 檔案中提取表單代碼(底線前的部分),並將其加入到 L astInitFormidList 清單中。 ============================================================================== } procedure TCB_IMGPSScanX.LastInitFormidListCreate(path: string); var i:integer; ST1:TStringList; str1:string; begin //ShowMessage('path='+path); ST1:=TStringList.Create; ST1.LoadFromFile(path+'FormCode_Name.dat'); for I := 0 to ST1.Count - 1 do begin if (Pos('_',St1.Strings[i])<>1) and (Pos('_',St1.Strings[i])<>-1) then begin str1:=Copy(ST1.Strings[i],1,Pos('_',St1.Strings[i])-1); LastInitFormidList.Add(str1); end; end; ST1.Free; end; { ============================================================================== 方法名稱:LoadFileGetMD5 引用相依:LoadFileGetMD5, TIdHashMessageDigest5 方法描述:計算指定檔案的 MD5 雜湊值。方法會以唯讀模式開啟檔案串流 (TFileStream) ,利用 TIdHashMessageDigest5 元件處理串流內容,並返回以十六進位字串表 示的 MD5 值。此功能主要用於確認影像檔案在傳輸或處理前後的完整性與一致 性,防止資料受損或被重複處理。 ============================================================================== } function TCB_IMGPSScanX.LoadFileGetMD5(const filename: string): string; var Stream: TFileStream; //Buffer: array[0..1023] of AnsiChar; Buffer: array[0..1023] of AnsiChar; TempStr: string; i: Integer; idmd5:TIdHashMessageDigest5; //import IdHashMessageDigest, idHash begin idmd5 := TIdHashMessageDigest5.Create; try Stream := TFileStream.Create(filename, fmOpenRead); Stream.Read(Buffer[0], SizeOf(Buffer)); result := idmd5.HashStreamAsHex(Stream) ; finally idmd5.Free; Stream.Free; end; end; { ============================================================================== 方法名稱:LoadImgFile 引用相依:FileExists, LoadFromFile, SaveToFile 方法描述:載入當前所有的影像案件至樹狀結構。清空舊有節點後,讀取 CaseList.dat,為 每個案件建立父節點,並呼叫 DrawDocItem2 繪製子文件與表單。同時會根據 O MR 檢核狀態設定對應的案件圖示。 ============================================================================== } procedure TCB_IMGPSScanX.LoadImgFile; //載入新件及替換件 Var i,v,v1,m : Integer; CasePage : integer; TempName : String; BarName : String; DocName : String; //S : String; begin ClearView(1); PageLV.Clear; AttListBox.Items.Clear; AddAttFileLB.Enabled := False; DelAttFileLB.Enabled := False; DisplayPath := ''; ClearCaseIndex; CaseHelpBtn.Visible := False; //Del_Sub_NothingPath(ImageSavePath); //清掉案件目錄是空的 TreeView1.Items.Clear; NewTreeNode := nil; MyTreenode1 := nil; MyTreenode2 := nil; MyTreenode3 := nil; NewTreeNode := TreeView1.Items.Add(nil,Format(_Msg('%s-共%d筆共%d頁'),[FModeName,0,0])); NewTreenode.ImageIndex := 0; NewTreenode.SelectedIndex := 0; Del_Sub_NothingPath(ImageSavePath); //清掉案件目錄是空的 GetCase_PageCount(CaseCount,PageCount); CaseList.Clear; if FileExists(ImageSavePath + 'CaseList.dat') then CaseList.LoadFromFile(ImageSavePath + 'CaseList.dat'); for i := 0 to CaseList.Count - 1 do begin CaseDocNoList.Clear; if FileExists(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo.dat') then CaseDocNoList.LoadFromFile(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo.dat'); if not FileExists(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo_Copies.dat') then begin CaseDocNo_CopiesList.Clear; for m := 0 to CaseDocNoList.Count - 1 do begin CaseDocNo_CopiesList.Add('1'); CaseDocNo_CopiesList.SaveToFile(ImageSavePath+CaseList.Strings[i]+'\CaseDocNo_Copies.dat'); end; end; CasePage := GetCasePage(ImageSavePath,CaseList.Strings[i]); //ShowMessage('CasePage='+IntToStr(CasePage)); MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d頁'),[CaseList.Strings[i],CasePage])); MytreeNode1.ImageIndex := 1; MytreeNode1.SelectedIndex := 1; DrawDocItem2(MytreeNode1,CaseList.Strings[i]); //長出文件名稱的樹並傳回是否有申請書的影像 if Pos(_Msg('未配號'),CaseList.Strings[i]) > 0 then begin MytreeNode1.ImageIndex := 5; MytreeNode1.SelectedIndex := 5; end; If FileExists(ImageSavePath+CaseList.Strings[i]+'\OMRCheckOk.dat') Then begin MytreeNode1.ImageIndex := 7; MytreeNode1.SelectedIndex := 7; CaseHelpBtn.Visible := False; end Else IF FileExists(ImageSavePath+CaseList.Strings[i]+'\Checkerr.ini') Then begin MyTreenode1.ImageIndex := 5; MyTreenode1.SelectedIndex := 5; //AllEnforceLb.Visible := True; //全部強迫送件 end; end; MyTreenode1 := nil; MyTreenode2 := nil; If NewTreeNode <> nil Then begin TreeView1.Selected := NewTreeNode; NewTreeNode.Expand(False); end; IF (NewTreeNode <> nil) and (NewTreeNode.Count > 0) Then begin GetCase_PageCount(CaseCount,PageCount); v := Pos('-',NewTreeNode.Text); NewTreeNode.Text := Format(_Msg('%s-共%d筆共%d頁'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]); end; end; { ============================================================================== 方法名稱:LoadImgFile1 引用相依:FileExists, LoadFromFile, SaveToFile 方法描述:載入影像檔案的另一種實作版本。包含更細緻的 Context_DocNo.dat 管理,若 檔案不存在會自動掃描 ContextList 並根據 FormCode 產生對應的文件編號 記錄。主要用於特定的資料結構載入。 ============================================================================== } procedure TCB_IMGPSScanX.LoadImgFile1; //載入新件及替換件 Var i,n,v,v1,m : Integer; p : integer; iCaseNo,iDocNo : String; TempName : String; BarName : String; DocName : String; //S : String; begin ClearView(1); PageLV.Clear; DisplayPath := ''; ClearCaseIndex; CaseHelpBtn.Visible := False; //Del_Sub_NothingPath(ImageSavePath); //清掉案件目錄是空的 TreeView1.Items.Clear; NewTreeNode := nil; MyTreenode1 := nil; MyTreenode2 := nil; MyTreenode3 := nil; NewTreeNode := TreeView1.Items.Add(nil,Format(_Msg('%s-共%d筆共%d頁'),[FModeName,0,0])); NewTreenode.ImageIndex := 0; NewTreenode.SelectedIndex := 0; Del_Sub_NothingPath(ImageSavePath); //清掉案件目錄是空的 GetCase_PageCount(CaseCount,PageCount); CaseList.Clear; if FileExists(ImageSavePath + 'CaseList.dat') then CaseList.LoadFromFile(ImageSavePath + 'CaseList.dat'); for n := 0 to CaseList.Count - 1 do begin iCaseNo := CaseList.Strings[n]; CaseDocNoList.Clear; if FileExists(ImageSavePath+CaseList.Strings[n]+'\DocNoList.dat') then CaseDocNoList.LoadFromFile(ImageSavePath+CaseList.Strings[n]+'\DocNoList.dat'); for m := 0 to CaseDocNoList.Count - 1 do begin iDocNo := CaseDocNoList.Strings[i]; MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d頁'),[CaseList.Strings[n],p])); MytreeNode1.ImageIndex := 1; MytreeNode1.SelectedIndex := 1; end; ContextList.Clear; Context_DocnoList.Clear; If FileExists(ImageSavePath+CaseList.Strings[n]+'\Context.dat') Then begin ContextList.LoadFromFile(ImageSavePath+CaseList.Strings[n]+'\Context.dat'); if FileExists(ImageSavePath+CaseList.Strings[n]+'\Context_DocNo.dat') then Context_DocnoList.LoadFromFile(ImageSavePath+CaseList.Strings[n]+'\Context_DocNo.dat') else begin for m := 0 to ContextList.Count - 1 do begin Context_DocnoList.Add(FormCode2DocNo(FileName2FormCode(ContextList.Strings[m]))); end; Context_DocnoList.SaveToFile(ImageSavePath+CaseList.Strings[n]+'\Context_DocNo.dat'); end; Cust_DocNoList.Clear; if FileExists(ImageSavePath+CaseList.Strings[n]+'\CustomDocNo.dat') then Cust_DocNoList.LoadFromFile(ImageSavePath+CaseList.Strings[n]+'\CustomDocNo.dat'); P := ContextList.Count; MytreeNode1 := TreeView1.Items.AddChild(NewTreeNode,Format(_Msg('%s-%d頁'),[CaseList.Strings[n],p])); MytreeNode1.ImageIndex := 1; MytreeNode1.SelectedIndex := 1; //DrawDocItem1(MytreeNode1,Doc_Inf_List,CaseList.Strings[n]); //長出文件名稱的樹並傳回是否有申請書的影像 DrawDocItem2(MytreeNode1,CaseList.Strings[n]); //長出文件名稱的樹並傳回是否有申請書的影像 20140820改 if Pos(_Msg('未配號'),CaseList.Strings[n]) > 0 then begin MytreeNode1.ImageIndex := 5; MytreeNode1.SelectedIndex := 5; end; If FileExists(ImageSavePath+CaseList.Strings[n]+'\OMRCheckOk.dat') Then begin MytreeNode1.ImageIndex := 7; MytreeNode1.SelectedIndex := 7; CaseHelpBtn.Visible := False; end Else IF FileExists(ImageSavePath+CaseList.Strings[n]+'\Checkerr.ini') Then begin MyTreenode1.ImageIndex := 5; MyTreenode1.SelectedIndex := 5; //AllEnforceLb.Visible := True; //全部強迫送件 end; end; end; MyTreenode1 := nil; MyTreenode2 := nil; If NewTreeNode <> nil Then begin TreeView1.Selected := NewTreeNode; NewTreeNode.Expand(False); end; ContextList.Clear; IF (NewTreeNode <> nil) and (NewTreeNode.Count > 0) Then begin GetCase_PageCount(CaseCount,PageCount); v := Pos('-',NewTreeNode.Text); NewTreeNode.Text := Format(_Msg('%s-共%d筆共%d頁'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]); end; end; { ============================================================================== 方法名稱:LoadAttFile 引用相依:FileExists, LoadFromFile 方法描述:載入指定案件的附件檔案。讀取 AttContext.dat,將附件檔名解碼後加入到 At tListBox 列表中。 ============================================================================== } procedure TCB_IMGPSScanX.LoadAttFile(CaseID:String); //載入附加檔案 var AttContextList : TStringlist; i : Integer; begin AttListBox.Clear; AttContextList := TStringlist.Create; try if FileExists(ImageSavePath+CaseID+'\AttContext.dat') then begin AttContextList.LoadFromFile(ImageSavePath+CaseID+'\AttContext.dat'); end; for i := 0 to AttContextList.Count - 1 do begin AttListBox.Items.Add(UTF8Decode(HTTPDEcode(AttContextList.Strings[i]))); end; finally AttContextList.Free; end; end; { ============================================================================== 方法名稱:logTimeString 引用相依: 方法描述:產生帶有當前日期時間與案件編號的日誌前綴字串。 ============================================================================== } function TCB_IMGPSScanX.logTimeString: String; begin Result:=FormatDateTime('yyyymmdd hh:mm:ss',now) +' caseNo='+NowCaseno+' '; end; { ============================================================================== 方法名稱:FindDivFormCode 引用相依: 方法描述:檢查特定的表單代碼是否具有「分案」屬性。從 FORM_INF_List 中查詢該表單的 DIVISION 欄位,判斷是否包含目前的作業模式(如 NSCAN/ISCAN)。 ============================================================================== } Function TCB_IMGPSScanX.FindDivFormCode(FormCode:String):Boolean; //找有沒有分案的條碼 var i : Integer; DelBarCode : String; S : TStringlist; iMode : String; begin Result := False; iMode := FMode; S := TStringlist.Create; try IF FindSQLData(FORM_INF_List,'T1.FORM_ID,T1.DIVISION','T1.FORM_ID',FormCode,0,FindResult) then begin S.CommaText := GetFindResult('T1.DIVISION'); for i := 0 to S.Count - 1 do //可能有多組 begin if S.Strings[i] = iMode then begin Result := True; Break; end; end; end; finally S.Free; end; end; { ============================================================================== 方法名稱:CheckAvailable 引用相依:FileExists, dnFile_Get, dnFile, upFile 方法描述:檢查元件的使用授權。透過 HTTPS 下載掃瞄授權檔,並驗證 MacID、註冊數量與 使用期限。若尚未註冊且仍有額度,則自動進行註冊並上傳新的授權檔至伺服器 。最後在狀態列顯示註冊資訊。 ============================================================================== } Function TCB_IMGPSScanX.CheckAvailable:Boolean; //檢查是否可使用元件 var SendData : String; Msg:String; Nowcount,Totalcount,Lic_Idx : Integer; MacID,IPStr,LegalDate :String; begin Result := False; /////下載MPSLIC_SCAN.lic ////// SendData:='data='+HTTPEncode(UTF8Encode(FData))+'&verify='+FVerify+'&work_no=PLN&file=MPSLIC_SCAN.lic'; if not dnFile_Get(HTTPSClient,Furl,'service/imgpsc/IMGPSC04/sample',SendData,LngPath+'MPSLIC_SCAN.lic',FReWrite,Memo1,False,DownImgStatus) then begin Showmessage(_Msg('檢查註冊檔案時,網路發生錯誤!!')+_Msg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason); Exit; end; /////下載MPSLIC_SCAN.lic /// if CheckLicensebyIP_new(LngPath+'MPSLIC_SCAN.lic',MacID,IPStr,LegalDate,Msg,Nowcount,Totalcount,Lic_Idx) then //檢查是否己註冊過 begin if (LegalDate <> '') and (ServerDate>LegalDate) and (Lic_Idx>(Totalcount)) then begin Showmessage(_Msg('已經超過可使用期限及超出授權數請連絡廠商')); Result := False; //Exit; end else Result := True; end Else begin if Msg <> '' then begin Showmessage(Format(_Msg('註冊檔有問題,請連絡廠商 錯誤原因:%s'),[Msg])); Result := false; Exit; end Else begin if (LegalDate <> '') and (ServerDate>LegalDate) and (NowCount =0 ) then begin Lic_Idx := 0; Showmessage(_Msg('已經超過可使用期限請連絡廠商')); Result := False; //Exit; end //else if (LegalDate = '') and (Nowcount >= Totalcount+10) then //超過註冊數量 else if ((LegalDate = '') or ((LegalDate <> '') and (ServerDate>LegalDate)) ) and (Nowcount >= Totalcount) then //超過註冊數量 20150717 yuu說拿掉送的10個 begin Lic_Idx := 0; Showmessage(_Msg('已經超過授權數請連絡廠商')); Result := False; end Else //未超過註冊數量要寫入註冊檔 begin {if Messagedlg(_Msg('您尚未註冊授權是否要進行註冊??'),MtConfirmation,[mbyes,mbcancel],0) = mrcancel then begin Result := False; Exit; end;} ShowText := _Msg('授權中,請稍候'); AddLicense(LngPath+'MPSLIC_SCAN.lic',MacID,IPStr,Msg); Nowcount := Nowcount + 1; DataLoading(True,True); /////上傳MPSLICSCAN.lic //// SendData:='data='+HTTPEncode(UTF8Encode(FData))+'@verify='+FVerify+'@work_no=PLN@file_name=MPSLIC_SCAN.lic'; if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/sample',SendData,'file',LngPath+'MPSLIC_SCAN.lic',FReWrite,Memo1,False) then begin Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_MSg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')'); DataLoading(False,False); Exit; end; if memo1.Lines.Strings[0] = '1' then begin Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+memo1.Lines.Strings[1]); DataLoading(False,False); Exit; end Else if Pos('',Memo1.Lines.Text) > 0 then begin Showmessage(_Msg('檢查註冊時,網路發生錯誤!!')+_Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入')); DataLoading(False,False); Exit; end; /////上傳MPSLICSCAN.lic ///// //Sleep(30000); //第一次註冊睡30秒 先不睡 Result := True; end; end; end; if FileExists(LngPath+'MPSLIC_SCAN.lic') then DeleteFile(LngPath+'MPSLIC_SCAN.lic'); if LegalDate = '' then StatusBar1.Panels[4].Text := Format(_Msg('註冊號:%s 剩餘註冊數:%s'),[MacID,inttostr(Totalcount-Nowcount)]); if LegalDate <> '' then StatusBar1.Panels[4].Text := '*'+Format(_Msg('註冊號:%s 剩餘註冊數:%s'),[MacID+'('+inttostr(Lic_Idx)+')',inttostr(Totalcount-Nowcount)]); end; { ============================================================================== 方法名稱:SmoothCBClick 引用相依:Image_Smooth 方法描述:處理「影像平滑化」勾選框。若勾選,則對 ISB1 的影像執行平滑化處理並重新繪 製。 ============================================================================== } procedure TCB_IMGPSScanX.SmoothCBClick(Sender: TObject); begin if SmoothCB.Checked then begin Image_Smooth(ISB1.Graphic); ISB1.Redraw(True); end; end; { ============================================================================== 方法名稱:Case2Mask 引用相依:FindPoint, DirectoryExists, _DelTree, Str2Dir, LoadFromFile, FileExi sts 方法描述:產生案件的遮罩影像(用於遮蔽敏感個資)。讀取 Context.dat,針對每張影像尋 找定位點,並依據對應表單的 XML 定義執行區域遮罩,最後存入指定目錄。 ============================================================================== } Function TCB_IMGPSScanX.Case2Mask(SoPath,DePath:String):Boolean;//產生遮罩影像 20170639 發現沒用到 var XT : TXMLTool; i : Integer; S : TStringlist; SiteList : TStringlist; FormID : String; ColEName : String; FileName : String; nodename : String; Site : String; Anchor : String; begin Result := False; if DirectoryExists(DePath) then _DelTree(DePath); Str2Dir(DePath); DeleteFile(SoPath+'MaskImg.zip'); SiteList := TStringlist.Create; S := TStringlist.Create; XT := TXMLTool.Create; try S.LoadFromFile(SoPath+'Context.dat'); for I := 0 to S.Count - 1 do begin SiteList.Clear; ImageScrollBox1.LoadFromFile(SoPath+S.Strings[i],1); FormID := FileName2FormCode(S.Strings[i]); Anchor := FormID2Anchor(FormID); //ParserPoint(CropMpsV.FindPoint(Anchor)); FindPoint(ImageScrollBox1.Graphic,UpLPoint,UpRPoint,DownLPoint,Anchor); if FileExists(CheckXmlPath+FWork_no+'\'+FormID+'.xml') then //沒有Xml就不用遮罩 begin XT.LoadFromFile(CheckXmlPath+FWork_no+'\'+FormID+'.xml'); if XT.SubNodes['/form/settype10/'].First then Repeat ColEName := XT.SubNodes['/form/settype10/'].NodeName; if XT.SubNodes['/form/settype10/'+ColEName+'/'].First then Repeat nodename := XT.SubNodes['/form/settype10/'+ColEName+'/'].NodeName; If nodename <> '@coldesc' then begin Site := XT.Node['/form/settype10/'+ColEName+'/'+nodename+'/'].Attributes['colxy']; SiteList.Add(Site); Result := True; //有設定 end Else begin //ColCName := XT['/form/settype1/'+ColEName+'/'+nodename+'/']; end; Until not XT.SubNodes['/form/settype10/'+ColEName+'/'].Next; Until not XT.SubNodes['/form/settype10/'].Next ; FieldMask(ImageScrollBox1,SiteList.Text,'Mask',UpLPoint); end; SaveAnnotation(ImageScrollBox1,DePath+S.Strings[i]); end; finally SiteList.Free; S.Free; XT.Free; end; end; { ============================================================================== 方法名稱:DelAttFileLBClick 引用相依: 方法描述:處理「刪除附件電子檔」點擊。確認使用者選取的檔案後,從磁碟刪除實體檔案並 呼叫 SetAttContextList 移除清單記錄。完成後重新載入附件清單並提示。 ============================================================================== } procedure TCB_IMGPSScanX.DelAttFileLBClick(Sender: TObject); var AttFile : String; SelectCount : Integer; i : Integer; begin SelectCount := 0; for i := 0 to AttListBox.Items.Count - 1 do begin if AttListBox.Selected[i] then inc(SelectCount); end; if SelectCount = 0 then begin Showmessage(_Msg('請選擇要刪除的電子檔')); Exit; end; if SelectCount > 0 then begin if Messagedlg(Format(_Msg('是否刪除這%d筆??'),[SelectCount]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel then Exit; for i := 0 to AttListBox.Items.Count - 1 do begin if AttListBox.Selected[i] then begin AttFile := HTTPEncode(UTF8Encode(AttListBox.Items.Strings[i])); DeleteFile(ImageSavePath+NowCaseNo+'\'+AttFile); SetAttContextList('D',-1,NowCaseno,AttFile); end; end; end; LoadAttFile(NowCaseNo); Showmessage(_msg('刪除完成')); end; { ============================================================================== 方法名稱:CheckFormID_Prt 引用相依: 方法描述:查詢指定表單(FormID)是否被設定為預設列印。透過 FORM_INF_List 檢核 IS_ PRINT 欄位是否為 'Y'。 ============================================================================== } Function TCB_IMGPSScanX.CheckFormID_Prt(FormID:String):Boolean; //傳入的FormID是否預設列印 begin Result := False; If FindSQLData(FORM_INF_List,'T1.IS_PRINT','T1.FORM_ID',FormID,0,FindResult) Then begin if GetFindResult('T1.IS_PRINT') = 'Y' Then Result := True; end; end; { ============================================================================== 方法名稱:PrintImg 引用相依:TDibGraphic 方法描述:執行影像列印的核心程序。開啟列印對話框供選擇印表機,隨後遍歷檔案清單, 逐一載入影像、套用浮水印後發送至印表機。支援多頁列印於同一個任務或分頁 處理。 ============================================================================== } procedure TCB_IMGPSScanX.PrintImg(FileName, LoginID, Datetime, Path: WideString); var PrintMode : TEnvisionPrintMode; GraphicPrinter : TDibGraphicPrinter; PrtDialog : TPrintDialog; S : TStringlist; i,Pages,Page : Integer; Prt_String : String; Prt_H : Integer; procedure PrintWithManualPrintJob(LoginID,DateTime:String;Pages,Page:Integer); begin If Page = 1 Then begin { if UsePrintJob is False, Printer.BeginDoc and Printer.EndDoc must be called by the user. This allows printing multiple images in the same job (or page). } GraphicPrinter.UsePrintJob := False; { if UsePrintJob is False, the print job name that appears in the print manager must be specified in using the Title property of the Printer object. Otherwise, if UsePrintJob is True, the Title property of the TDibGraphicPrinter object is used to specify the job name. } Printer.Title := _Msg('影像列印'); end; IF (Page mod 2) = 1 Then Printer.BeginDoc Else Printer.NewPage; ImageScrollBox1.DisplayedGraphic.Canvas.Font.Size := 24; //ImageScrollBox1.DisplayedGraphic.Canvas.TextOut(20,20, _Msg('列印人員:')+LoginID+' '+_Msg('列印分行:')+FUserUnit+' '+_Msg('列印日期:')+DateTime); GraphicPrinter.Print(ImageScrollBox1.DisplayedGraphic); { this shows how to print text on a page. Printer.Canvas.TextOut(10,10, 'Envision Image Library'); } If ((Page mod 2) = 0) or (Page = pages) Then Printer.EndDoc; end; procedure PrintWithAutoPrintJob; begin GraphicPrinter.UsePrintJob := True; GraphicPrinter.Title := _Msg('影像列印'); GraphicPrinter.Print(ImageScrollBox1.Graphic); end; begin S := TStringlist.Create; GraphicPrinter := TDibGraphicPrinter.Create; PrtDialog := TPrintDialog.Create(self); //PrtDialog.Copies:=99; try IF PrtDialog.Execute Then begin S.Text := FileName; Pages := S.Count; for i := 0 to S.Count -1 do begin ImageScrollBox1.LoadFromFile(Path+S.Strings[i],1); watermark2(Image1.Picture.Bitmap,70,'',ImageScrollBox1.DisplayedGraphic); PrintWithManualPrintJob(LoginID,DateTime,Pages,i+1); end; end; Finally PrtDialog.Free; GraphicPrinter.Free; S.Free; end; end; { ============================================================================== 方法名稱:FindLastestDocDir 引用相依:FileExists, LoadFromFile 方法描述:針對指定的文件編號,從 CaseDocNo.dat 中反向尋找最新的份數目錄名稱(例 如 A001(2))。 ============================================================================== } Function TCB_IMGPSScanX.FindLastestDocDir(CaseID,DocNo:String):String; //找出最新的DocDir var i : Integer; DocNoList,FileList : TStringlist; begin Result := ''; DocNoList := TStringlist.Create; FileList := TStringlist.Create; try if FileExists(ImageSavePath+CaseID+'\CaseDocNo.dat') then DocNoList.LoadFromFile(ImageSavePath+CaseID+'\CaseDocNo.dat'); for i := DocNoList.Count-1 downto 0 do begin if Copy(DocNoList.Strings[i],1,length(DocNo)) = DocNo then begin Result := DocNoList.Strings[i]; Break; end; end; finally DocNoList.Free; FileList.Free; end; end; { ============================================================================== 方法名稱:FindLastestDocDirForPage 引用相依:FileExists, LoadFromFile 方法描述:類似 FindLastestDocDir,但額外呼叫 DocNoIsExistImg 確保該目錄下確實存 在影像檔案,若為空目錄則不視為有效結果。 ============================================================================== } Function TCB_IMGPSScanX.FindLastestDocDirForPage(CaseID,DocNo,formid:String):String; //找出最新的DocDir 20180207 排除隱藏的資料夾 var i,j:integer; DocNoList,FileList : TStringlist; Imglist: TStringlist; DirIsHide:Boolean; begin Result := ''; DocNoList := TStringlist.Create; FileList := TStringlist.Create; imglist := TStringlist.Create; try if FileExists(ImageSavePath+CaseID+'\CaseDocNo.dat') then DocNoList.LoadFromFile(ImageSavePath+CaseID+'\CaseDocNo.dat'); for i := DocNoList.Count-1 downto 0 do begin if Copy(DocNoList.Strings[i],1,length(DocNo)) = DocNo then begin //ShowMessage(ImageSavePath+CaseID+'\'+DocNoList.Strings[i]); if not DocNoIsExistImg(ImageSavePath+CaseID+'\'+DocNoList.Strings[i]+'\') then begin //ShowMessage('DDDDD'); Result := ''; Break; end else begin Result := DocNoList.Strings[i]; Break; end; end; end; finally DocNoList.Free; FileList.Free; imglist.Free; end; end; { ============================================================================== 方法名稱:SortDocDir_FormID 引用相依:FileExists, LoadFromFile, RenameFile, SaveToFile 方法描述:對文件目錄內的影像檔案依表單代碼(FormID)進行重新排序。先提取所有檔案 的 FormID 並排序,依序產生新檔名進行更名,最後更新 Context.dat 檔案順 序。 ============================================================================== } Procedure TCB_IMGPSScanX.SortDocDir_FormID(CaseID,DocDir:String); //將DocDir裡的文件編號排序 var i,n,v,ln : Integer; Exists:Boolean; FileList,SortFileList,FormIDList : TStringlist; FormID,iFormID:String; OldName,NewName : String; begin FileList := TStringlist.Create; SortFileList := TStringlist.Create; FormIDList := TStringlist.Create; try if FileExists(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat') then begin FileList.LoadFromFile(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat'); ////取出FormID///// for i := 0 to FileList.Count - 1 do begin FormID := FileName2FormCode(FileList.Strings[i]); if (FormID = 'Attach') or (FormID = 'S_Attach') then Continue; //附件離開 Exists := False; for n := 0 to FormIDList.Count - 1 do //查一下FORMID是否已經存在了 begin if FormID = FormIDList.Strings[n] then begin Exists := True; Break; end; end; if not Exists then FormIDList.Add(FormID); end; FormIDList.Sort; //排序後產要更名的清單 for i := 0 to FormIDList.Count - 1 do begin iFormID := FormIDList.Strings[i]; for n := 0 to FileList.Count - 1 do begin if FileName2FormCode(FileList.Strings[n]) = iFormID then begin SortFileList.Add(FileList.Strings[n]+','+'@'+Add_Zoo(SortFileList.Count+1,3)+'_'+iFormID+ExtractFileExt(FileList.Strings[n])); end; end; end; FileList.Clear; //更名成新順序的檔名 for i := 0 to SortFileList.Count - 1 do begin v := Pos(',',SortFileList.Strings[i]); ln := Length(SortFileList.Strings[i]); OldName := Copy(SortFileList.Strings[i],1,v-1); NewName := Copy(SortFileList.Strings[i],v+1,ln-v); RenameFile(ImageSavePath+CaseID+'\'+DocDir+'\'+OldName,ImageSavePath+CaseID+'\'+DocDir+'\'+NewName); FileList.Add(NewName); end; //去掉@開頭 for i := 0 to FileList.Count - 1 do begin OldName := FileList.Strings[i]; NewName := StringReplace(OldName,'@','',[rfReplaceAll]); ReNameFile(ImageSavePath+CaseID+'\'+DocDir+'\'+OldName,ImageSavePath+CaseID+'\'+DocDir+'\'+NewName); FileList.Strings[i] := NewName; end; FileList.SaveToFile(ImageSavePath+CaseID+'\'+DocDir+'\Context.dat'); end; finally FileList.Free; SortFileList.Free; FormIDList.Free; end; end; { ============================================================================== 方法名稱:GotoAttach 引用相依: 方法描述:將樹狀結構的焦點跳轉至案件的附件節點。 ============================================================================== } Procedure TCB_IMGPSScanX.GotoAttach(OldLevel:Integer); var i : Integer; begin for i := 0 to MyTreeNode1.Count - 1 do begin if Pos('Attach',MyTreeNode1.Item[i].Text) > 0 then begin if OldLevel = 2 then begin TreeView1.Selected := MyTreeNode1.Item[i]; end else if OldLevel = 3 then begin TreeView1.Selected := MyTreeNode1.Item[i].Item[0]; end; Break; end; end; //TreeView1click(nil); end; { ============================================================================== 方法名稱:SetDocDirtoSelected 引用相依: 方法描述:在樹狀結構中自動選取符合指定目錄名稱的節點。 ============================================================================== } Procedure TCB_IMGPSScanX.SetDocDirtoSelected(CaseNode:TTreeNode;DocDir:String); var i : Integer; begin for i := 0 to CaseNode.Count - 1 do begin if Pos(DocDir+'{',CaseNode.Item[i].Text) > 0 then begin TreeView1.Selected := CaseNode.Item[i]; end; end; end; { ============================================================================== 方法名稱:CheckSelectImg_UseCase 引用相依: 方法描述:檢查當前選取的影像所在的文件目錄是否已被其他程序引用(UseKey 標記為 ' T')。 ============================================================================== } Function TCB_IMGPSScanX.CheckSelectImg_UseCase(Path,CaseID:String):Boolean; //檢查選擇的影像是否有包含被引用的影像 var i : Integer; iISBName : String; iISB : TImageScrollBox; ImgPath,DocDir : String; begin Result := False; for i := 0 to ComponentCount -1 do begin if (Components[i] is TShape) and (copy(Components[i].Name,1,2)='SP') then begin //Showmessage(Components[i].Name); iISBName := ShapeName2PreViewISBName(TShape(Components[i])); iISB := TImageScrollBox(FindComponent(iISBName)); ImgPath := ExtractFilePath(iISB.FileName); DocDir := Path2DocDir(ImgPath,CaseID); if GetUseCase('T',Path,DocDir) <> '' then Result := True; end; end; end; { ============================================================================== 方法名稱:ISExistImg 引用相依:LoadFileGetMD5 方法描述:透過 MD5 雜湊值比對,檢查指定的影像檔案是否已存在於 ExistImgList 清單 中。 ============================================================================== } function TCB_IMGPSScanX.ISExistImg(const filename: string): boolean; begin if ExistImgList.IndexOf(LoadFileGetMD5(filename))<>-1 then begin Result:=True; end else begin Result:=False; end; end; { ============================================================================== 方法名稱:MoveImage 引用相依:LoadFromFile, RenameFile, SaveToFile, ReSortFileName 方法描述:執行影像頁面的位置移動。先對目錄下所有檔案進行臨時更名(加上 @ 標記), 根據選取狀態重新排列清單順序,最後更新 Context.dat 並重新排序實體檔案 。 ============================================================================== } Procedure TCB_IMGPSScanX.MoveImage(Path:String;mp:Integer); //移動頁數 var i,n,inx:Integer; FList,D_Flist:TStringlist; begin FList := TStringlist.Create; D_Flist := TStringlist.Create; try FList.LoadFromFile(Path+'Context.dat'); //Showmessage(Path); //Showmessage(Flist.Text); for i := 0 to FList.Count - 1 do begin Renamefile(Path+Flist.Strings[i],path+'@'+Flist.Strings[i]); Flist.Strings[i]:= '@'+Flist.Strings[i]; end; for i := 0 to ComponentCount -1 do begin if (Components[i] is TShape) and (copy(Components[i].Name,1,2)='SP') then begin inx := strtoint(Copy(TShape(Components[i]).Name,3,length(TShape(Components[i]).Name)-2)); D_Flist.Add(Flist.Strings[inx-1]); //Renamefile(Path+Flist.Strings[inx-1],path+'@'+Flist.Strings[inx-1]); end; end; //Showmessage('aa'); for i := 0 to D_Flist.Count -1 do begin for n := 0 to FList.Count - 1 do begin //if Flist.Strings[n]=StringReplace(D_Flist.Strings[i],'@','',[rfReplaceAll]) then if Flist.Strings[n]=D_Flist.Strings[i] then begin Flist.Delete(n); Break; end; end; end; //Showmessage('bb'); for i := 0 to D_Flist.Count - 1 do begin Flist.Insert(mp-1+i,D_Flist.Strings[i]); end; Flist.SaveToFile(Path+'Context.dat'); //Showmessage(Flist.Text); //Showmessage('CC'); ReSortFileName(Path); TreeView1click(self); finally FList.Free; D_Flist.Free; end; end; { ============================================================================== 方法名稱:MoveImage_Drag 引用相依:LoadFromFile, RenameFile, SaveToFile, ReSortFileName 方法描述:處理影像拖拉移動。邏輯與 MoveImage 相似,但針對單一來源索引移動至目標 索引的情境進行排列。 ============================================================================== } Procedure TCB_IMGPSScanX.MoveImage_Drag(Path:String;fp,tp:Integer); //拖拉移動頁數 var i,n,inx:Integer; FList,D_Flist:TStringlist; begin FList := TStringlist.Create; D_Flist := TStringlist.Create; try FList.LoadFromFile(Path+'Context.dat'); for i := 0 to FList.Count - 1 do begin Renamefile(Path+Flist.Strings[i],path+'@'+Flist.Strings[i]); Flist.Strings[i]:= '@'+Flist.Strings[i]; end; D_Flist.Add(Flist.Strings[fp-1]); {for i := 0 to ComponentCount -1 do begin if (Components[i] is TShape) and (copy(Components[i].Name,1,2)='SP') then begin inx := strtoint(Copy(TShape(Components[i]).Name,3,length(TShape(Components[i]).Name)-2)); D_Flist.Add(Flist.Strings[inx-1]); //Renamefile(Path+Flist.Strings[inx-1],path+'@'+Flist.Strings[inx-1]); end; end;} //Showmessage('aa'); for i := 0 to D_Flist.Count -1 do begin for n := 0 to FList.Count - 1 do begin //if Flist.Strings[n]=StringReplace(D_Flist.Strings[i],'@','',[rfReplaceAll]) then if Flist.Strings[n]=D_Flist.Strings[i] then begin Flist.Delete(n); Break; end; end; end; //Showmessage('bb'); for i := 0 to D_Flist.Count - 1 do begin Flist.Insert(tp-1+i,D_Flist.Strings[i]); end; Flist.SaveToFile(Path+'Context.dat'); //Showmessage(Flist.Text); //Showmessage('CC'); ReSortFileName(Path); TreeView1click(self); finally FList.Free; D_Flist.Free; end; end; { ============================================================================== 方法名稱:PriorPage 引用相依: 方法描述:跳轉至上一頁影像。根據當前頁碼尋找前一個影像捲軸盒組件(ISB),若存在則 觸發其點擊事件。 ============================================================================== } Procedure TCB_IMGPSScanX.PriorPage(Page:Integer); //上一頁 var iISB : TImageScrollBox; begin iISB := TImageScrollBox(FindComponent(ISBName+inttostr(Page-1))); if iISB <> nil then begin ISBClick(iISB); end; end; { ============================================================================== 方法名稱:NextPage 引用相依: 方法描述:跳轉至下一頁影像。根據當前頁碼尋找下一個影像捲軸盒組件(ISB),若存在則 觸發其點擊事件。 ============================================================================== } Procedure TCB_IMGPSScanX.NextPage(Page:Integer); //下一頁 var iISB : TImageScrollBox; begin iISB := TImageScrollBox(FindComponent(ISBName+inttostr(Page+1))); if iISB <> nil then begin ISBClick(iISB); end; end; { ============================================================================== 方法名稱:view_image_FormCode 引用相依:LoadFromFile 方法描述:根據表單代碼(FormCode)顯示對應的影像。支援顯示全部影像(ShowAll)或指定 表單的影像。若是顯示全部,會重置視窗並建立縮圖;若指定特定表單,則遍歷 C ontextList 尋找匹配的檔案,載入至影像捲軸盒(ISB),並設定縮放模式(zmFit toPage 或指定百分比)與捲軸位置,最後更新頁碼標籤資訊。 ============================================================================== } procedure TCB_IMGPSScanX.view_image_FormCode(Path,FormCode:String;stpage,stview:integer); //用FormCode來找影像 var i,p:integer; ISB : TImageScrollBox; lb : TLabel; v ,v1 : Integer; page : Integer; List_FormCode,Err_FormCode: String; iFormID : String; begin ShowText := _Msg('影像顯示中,請稍候'); DataLoading(True,True); IF FormCode = 'ShowAll' then //顯示所有的影像 (因為附件會傳空字串,所以用ShowAll) begin ClearView(1); CreatePreViewISB(ContextList.Count); For i := Stpage-1 to ContextList.Count -1 do begin ISB := TImageScrollBox(FindComponent(ISBName+intToStr(stview+i))); ISB.AntiAliased := True; if ISB.ZoomPercent > 100 then ISB.AntiAliased := False; ISB.LoadFromFile(Path+ContextList.Strings[i],1); {GetScrollData(ISB,HS,VS,iRate); if iRate = 0 then ISB.ZoomMode := zmFittoPage Else ISB.ZoomPercent := iRate; ISB.HorzScrollBar.Position := HS; ISB.VertScrollBar.Position := VS; List_FormCode := FileName2FormCode(ContextList.Strings[i]); lb := TLabel(FindComponent('lb'+intToStr(stview))); lb.Caption := Format(_Msg('第%s頁'),[Add_Zoo(i+1,3)]); If List_FormCode = '' Then lb.Caption := lb.Caption+'('+FormCode2FormName(List_FormCode)+')' Else lb.Caption := lb.Caption+'('+FormCode2FormName(List_FormCode)+'-'+List_FormCode+')'; Inc(Stview); If ((VMode = 0) and (Stview>1)) or ((VMode = 1) and ((Stview>2))) or ((VMode = 2) and ((Stview>4))) or ((VMode = 3) and ((Stview>6))) or ((VMode = 4) and ((Stview>8))) Then break; } end; FitPreViewISB; end Else //顯示指定FormCode的影像 begin If (TreeView1.Selected <> nil) Then begin If Stpage = 0 Then Stpage := 1; Page := 0; ClearView(stview); If Stpage > ContextList.Count Then Exit; For i := 0 to ContextList.Count -1 do begin List_FormCode := FileName2FormCode(ContextList.Strings[i]); {iFormID := GetMainFormID(List_FormCode); if iFormID <> '' then List_FormCode := iFormID;} Err_FormCode := 'NoCode'; if (List_Formcode <> '') and (not FormIDExists(List_Formcode,False,0)) then Err_FormCode := 'Err'; IF (List_FormCode = FormCode) or (Err_FormCode=Formcode) or (FormCode2DocNo(List_FormCode) = FormCode) Then begin Inc(Page); IF Page< Stpage Then Continue; ISB := TImageScrollBox(FindComponent('ISB'+intToStr(stview))); ISB.AntiAliased := True; if ISB.ZoomPercent > 100 then ISB.AntiAliased := False; ISB.LoadFromFile(Path+ContextList.Strings[i],1); GetScrollData(ISB,HS,VS,iRate); if iRate = 0 then ISB.ZoomMode := zmFittoPage Else ISB.ZoomPercent := iRate; ISB.HorzScrollBar.Position := HS; ISB.VertScrollBar.Position := VS; {if not SortMode then begin SetScrollData(MPSViewX,MPSViewX.HorzScrollBarPos,MPSViewX.VertScrollBarPos,MPSViewX.ZoomPercent); end;} //MPSViewX.ImageZoomMode := zmFullpage; //MPSViewX.AntiAliased := True; lb := TLabel(FindComponent('lb'+intToStr(stview))); lb.Caption := Format(_Msg('第%s頁'),[Add_Zoo(i+1,3)]); If List_FormCode = '' Then lb.Caption := lb.Caption+'('+FormCode2FormName(NowCaseno,List_FormCode)+')' Else lb.Caption := lb.Caption+'('+FormCode2FormName(NowCaseNo,List_FormCode)+'-'+List_FormCode+')'; Inc(Stview); end; If ((VMode = 0) and (Stview>1)) or ((VMode = 1) and ((Stview>2))) or ((VMode = 2) and ((Stview>4))) or ((VMode = 3) and ((Stview>6))) or ((VMode = 4) and ((Stview>8))) Then break; end; end; end; ISB1Click(ISB1); DataLoading(False,False); end; { ============================================================================== 方法名稱:view_image_DocNo 引用相依:DpiResize, FileExists, LoadFromFile, DirectoryExists 方法描述:根據文件代號(DocNo)或表單代號(FormID)顯示影像。函式包含三種模式:顯示 案件內所有影像(ShowAll)、顯示指定文件夾(如 Attach)下的影像,以及顯示指 定文件代號下特定表單的影像。處理過程中會檢查在席狀態(In_WH)、執行影像 DPI 調整、建立縮圖預覽視窗,並逐一載入檔案至對應的 ISB 元件中,最後自動 點擊首張影像以進行預覽。 ============================================================================== } procedure TCB_IMGPSScanX.view_image_DocNo(Path,DocNo,FormID:String;Pages:integer); //用DocNo來找影像 var i,n,p:integer; ISB : TImageScrollBox; lb : TLabel; v ,v1 : Integer; List_DocNo,Trans_DocNo,List_FormCode,Form_Page: String; iDocNo : String; iGroupNo,page,Ct,int1 : Integer; ST1:TStringList; begin ShowText := _Msg('影像顯示中,請稍候'); DataLoading(True,True); ST1:=TStringList.Create; //Display1.Lines.Clear; IF DocNo = 'ShowAll' then //顯示所有的影像 (因為附件會傳空字串,所以用ShowAll) begin ClearView(1); if GetCasePage(ImageSavePath,NowCaseno) > 30 then begin DataLoading(False,False); Exit; end; CreatePreViewISB(GetCasePage(ImageSavePath,NowCaseno)); //Showmessage(inttostr(GetCasePage(ImageSavePath,NowCaseno))); Ct := 0; For i := 0 to CaseDocNoList.Count-1 do begin if (FWH_category='N') and (FIs_In_Wh='Y') then begin if FileExists(ImageSavePath+NowCaseno+'\EditedDocDir.dat') then begin ST1.LoadFromFile(ImageSavePath+NowCaseno+'\EditedDocDir.dat'); end; end; iDocNo := CaseDocNoList.Strings[i]; //ShowMessage('ST1.Count='+IntToStr(ST1.Count)); if ST1.Count<>0 then begin if ST1.IndexOf(iDocNo)<>-1 then begin end else begin if not DocNoAppear(DocNoDir2DocNo(iDocNo)) then continue; //20170817 這不能被註解 end; end else begin if not DocNoAppear(DocNoDir2DocNo(iDocNo)) then continue; //20170817 這不能被註解 end; ContextList.Clear; if FileExists(Path+iDocNo+'\Context.dat') then ContextList.LoadFromFile(Path+iDocNo+'\Context.dat'); //ShowMessage('ContextList='+ContextList.Text); for n := 0 to ContextList.Count - 1 do begin if (FWH_category='N') and (FIs_In_Wh='Y') then begin if ISExistImg(Path+iDocNo+'\'+ContextList.Strings[n]) then begin if not DocNoIs_In_WH(Copy(iDocNo,1,8)) then begin Continue; end; end; end; inc(Ct); ISB := TImageScrollBox(FindComponent(ISBName+intToStr(Ct))); ISB.AntiAliased := True; if ISB.ZoomPercent > 100 then ISB.AntiAliased := False; ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[n],1); DpiResize(ISB.Graphic,36,False); ISB.Redraw(true); end; end; //if DirectoryExists(Path+'Attach') then if DirectoryExists(Path+AttName) then begin //iDocNo := 'Attach'; iDocNo := AttName; ContextList.Clear; if FileExists(Path+iDocNo+'\Context.dat') then ContextList.LoadFromFile(Path+iDocNo+'\Context.dat'); for n := 0 to ContextList.Count - 1 do begin inc(Ct); ISB := TImageScrollBox(FindComponent(ISBName+intToStr(Ct))); ISB.AntiAliased := True; if ISB.ZoomPercent > 100 then ISB.AntiAliased := False; ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[n],1); end; end; FitPreViewISB; end Else if (DocNo <> '') and (FormID = '') then //顯示指定DocNo+組別的影像 附件傳 Attach begin //顯示 文件層下的影像 iDocNo := DocNo; ContextList.Clear; if FileExists(Path+iDocNo+'\Context.dat') then ContextList.LoadFromFile(Path+iDocNo+'\Context.dat'); //ShowMessage('ContextList.Count='+IntToStr(ContextList.Count)); CreatePreViewISB(ContextList.Count); //ShowMessage(IntToStr(ContextList.Count)); int1:=0; //ShowMessage(BoolToStr(DocNoIs_In_WH(Copy(iDocNo,1,8)),true)); For i := 0 to ContextList.Count -1 do begin if (FWH_category='N') and (FIs_In_Wh='Y') then begin if ISExistImg(Path+iDocNo+'\'+ContextList.Strings[i]) then begin if not DocNoIs_In_WH(Copy(iDocNo,1,8)) and ( iDocNo<>'Attach') then begin inc(int1); Continue; end; end; end; //ShowMessage(Path+iDocNo+'\'+ContextList.Strings[i]); ISB := TImageScrollBox(FindComponent(ISBName+intToStr(i+1-int1))); ISB.AntiAliased := True; if ISB.ZoomPercent > 100 then ISB.AntiAliased := False; ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[i],1); DpiResize(ISB.Graphic,36,False); ISB.Redraw(true); end; FitPreViewISB; end Else if (FormID <> '') {and (FormID <> 'Attach')} then //顯示指定FormID的影像 begin If (TreeView1.Selected <> nil) Then begin iDocNo := DocNo; ContextList.Clear; if FileExists(Path+iDocNo+'\Context.dat') then ContextList.LoadFromFile(Path+iDocNo+'\Context.dat'); iGroupNo := 0; page := 0; Ct := 0; CreatePreViewISB(Pages); //ShowMessage('formID page'+IntToStr(Pages)+', ContextList='+ContextList.Text); For i := 0 to ContextList.Count -1 do begin if FileName2FormCode(ContextList.Strings[i]) = FormID then begin if (FWH_category='N') and (FIs_In_Wh='Y') then begin //ShowMessage(Path+iDocNo+'\'+ContextList.Strings[i]); //ShowMessage(BoolToStr(ISExistImg(Path+iDocNo+'\'+ContextList.Strings[i]),true)); if ISExistImg(Path+iDocNo+'\'+ContextList.Strings[i]) then begin if not DocNoIs_In_WH(FormCode2DocNo(FormID)) then Continue; end; end; inc(Ct); ISB := TImageScrollBox(FindComponent(ISBName+intToStr(Ct))); //ShowMessage(ISB.Name); ISB.AntiAliased := True; if ISB.ZoomPercent > 100 then ISB.AntiAliased := False; ISB.LoadFromFile(Path+iDocNo+'\'+ContextList.Strings[i],1); DpiResize(ISB.Graphic,36,False); ISB.Redraw(true); //NowShowFileList.Add(ContextList.Strings[i]); end; end; FitPreViewISB; end; end; if FindComponent(ISBName+'1') <> nil then begin ISBClick(TImageScrollBox(FindComponent(ISBName+'1'))); end; ISB1Click(ISB1); DataLoading(False,False); end; { ============================================================================== 方法名稱:CB1Click 引用相依: 方法描述:處理核取方塊點擊,設定是否要在掃描時顯示 TWAIN 使用者介面(TwainShowUI )。 ============================================================================== } procedure TCB_IMGPSScanX.CB1Click(Sender: TObject); begin TwainShowUI := CB1.Checked; end; { ============================================================================== 方法名稱:ViewModeBtnMouseEnter 引用相依: 方法描述:當滑鼠進入檢視模式按鈕時,顯示該按鈕的 Hint 文字作為工具提示(Tooltip) 。 ============================================================================== } procedure TCB_IMGPSScanX.ViewModeBtnMouseEnter(Sender: TObject); begin AddToolTip(TBitBtn(Sender).Parent.Handle,nil,0,Pchar(TBitBtn(Sender).Hint),nil,0,0); end; { ============================================================================== 方法名稱:Set_caseid 引用相依: 方法描述:設定內部變數 FCaseID 的值。 ============================================================================== } procedure TCB_IMGPSScanX.Set_caseid(const Value: WideString); begin FCaseID := Value; end; { ============================================================================== 方法名稱:Set_data 引用相依: 方法描述:設定內部變數 FData 的值。 ============================================================================== } procedure TCB_IMGPSScanX.Set_data(const Value: WideString); begin FData := Value; end; { ============================================================================== 方法名稱:Set_mode 引用相依: 方法描述:設定作業模式(FMode),並將傳入的字串轉換為大寫。 ============================================================================== } procedure TCB_IMGPSScanX.Set_mode(const Value: WideString); begin FMode := UpperCase(Value); end; { ============================================================================== 方法名稱:Set_rewrite 引用相依: 方法描述:設定是否強制覆蓋檔案的標記(FReWrite)。 ============================================================================== } procedure TCB_IMGPSScanX.Set_rewrite(const Value: WideString); begin FReWrite := Value; end; { ============================================================================== 方法名稱:Set_url 引用相依: 方法描述:設定後端伺服器的基礎 URL 路徑。 ============================================================================== } procedure TCB_IMGPSScanX.Set_url(const Value: WideString); begin FUrl := Value; end; { ============================================================================== 方法名稱:Set_userid 引用相依: 方法描述:設定當前登入的使用者代號。 ============================================================================== } procedure TCB_IMGPSScanX.Set_userid(const Value: WideString); begin FUserID := Value; end; { ============================================================================== 方法名稱:Set_username 引用相依: 方法描述:設定當前登入的使用者名稱。 ============================================================================== } procedure TCB_IMGPSScanX.Set_username(const Value: WideString); begin FUserName := Value; end; { ============================================================================== 方法名稱:Set_verify 引用相依: 方法描述:設定 API 呼叫所需的驗證字串。 ============================================================================== } procedure TCB_IMGPSScanX.Set_verify(const Value: WideString); begin FVerify := Value; end; { ============================================================================== 方法名稱:Set_language 引用相依:FileExists 方法描述:設定語系代碼並執行初始化。會自動修正語系格式(如 zh-tw 轉 zh_tw),若語 言檔存在則觸發介面語系切換。 ============================================================================== } procedure TCB_IMGPSScanX.Set_language(const Value: WideString); begin FLanguage := lowercase(Value); if FLanguage='zh-tw' then begin FLanguage:='zh_tw' end; if FileExists(LngPath+'Language.lng') then begin InitialLanguage(Self); //載入多國語言 end; end; { ============================================================================== 方法名稱:Set_modename 引用相依: 方法描述:設定作業模式的顯示名稱。 ============================================================================== } procedure TCB_IMGPSScanX.Set_modename(const Value: WideString); begin FModeName := Value; end; { ============================================================================== 方法名稱:Set_userunit 引用相依: 方法描述:設定使用者所屬的單位代碼。 ============================================================================== } procedure TCB_IMGPSScanX.Set_userunit(const Value: WideString); begin FUserUnit := Value; end; { ============================================================================== 方法名稱:Set_work_no 引用相依: 方法描述:設定當前的業務別(WORK_NO)。 ============================================================================== } procedure TCB_IMGPSScanX.Set_work_no(const Value: WideString); begin FWork_no := Value; end; { ============================================================================== 方法名稱:Set_loandoc_enable 引用相依: 方法描述:設定信用註記功能是否啟用。根據參數(Y/I)動態切換 AddCredit1RG 元件的可 用性與可見度。 ============================================================================== } procedure TCB_IMGPSScanX.Set_loandoc_enable(const Value: WideString); begin FLoanDoc_Enable := Value; if FLoanDoc_Enable = 'Y' then AddCredit1RG.Enabled := True; if FLoanDoc_Enable = 'I' then begin AddCredit1RG.Visible := False; Panel5.Visible := False; end; end; { ============================================================================== 方法名稱:Set_loandoc_value 引用相依: 方法描述:設定信用註記的具體數值。 ============================================================================== } procedure TCB_IMGPSScanX.Set_loandoc_value(const Value: WideString); begin FLoanDoc_Value := Value; end; { ============================================================================== 方法名稱:Set_useproxy 引用相依: 方法描述:設定系統是否使用 Proxy 代理伺服器進行網路連線。 ============================================================================== } procedure TCB_IMGPSScanX.Set_useproxy(const Value: WideString); begin FUseProxy := UpperCase(Value); if FUseProxy = 'Y' then UseProxy := True; //要不要用Proxy end; { ============================================================================== 方法名稱:Set_c_docnamelist 引用相依: 方法描述:設定預設的文件名稱清單。 ============================================================================== } procedure TCB_IMGPSScanX.Set_c_docnamelist(const Value: WideString); begin FC_DocNameList := Value; end; { ============================================================================== 方法名稱:Set_c_docnolist 引用相依: 方法描述:設定預設的文件代號清單。 ============================================================================== } procedure TCB_IMGPSScanX.Set_c_docnolist(const Value: WideString); begin FC_DocNoList := Value; end; { ============================================================================== 方法名稱:Set_fixfilelist 引用相依: 方法描述:設定固定的檔案清單字串。 ============================================================================== } procedure TCB_IMGPSScanX.Set_fixfilelist(const Value: WideString); begin FFixFileList := Value; end; { ============================================================================== 方法名稱:Set_is_in_wh 引用相依: 方法描述:設定是否為在席(In-Warehouse)作業模式。 ============================================================================== } procedure TCB_IMGPSScanX.Set_is_in_wh(const Value: WideString); begin FIs_In_Wh := UpperCase(Value); end; { ============================================================================== 方法名稱:Set_oldcaseinfo 引用相依: 方法描述:設定舊案件的相關資訊字串。 ============================================================================== } procedure TCB_IMGPSScanX.Set_oldcaseinfo(const Value: WideString); begin FOldCaseInfo := Value; end; { ============================================================================== 方法名稱:Get_c_docnamelist 引用相依: 方法描述:獲取預設文件名稱清單的存根函式,目前未實作回傳內容。 ============================================================================== } function TCB_IMGPSScanX.Get_c_docnamelist: WideString; begin end; { ============================================================================== 方法名稱:Get_c_docnolist 引用相依: 方法描述:獲取預設文件代號清單的存根函式,目前未實作回傳內容。 ============================================================================== } function TCB_IMGPSScanX.Get_c_docnolist: WideString; begin end; { ============================================================================== 方法名稱:Get_caseid 引用相依: 方法描述:獲取內部案件編號(FCaseID)。 ============================================================================== } function TCB_IMGPSScanX.Get_caseid: WideString; begin end; { ============================================================================== 方法名稱:Get_data 引用相依: 方法描述:獲取內部資料字串(FData)。 ============================================================================== } function TCB_IMGPSScanX.Get_data: WideString; begin end; { ============================================================================== 方法名稱:Get_fixfilelist 引用相依: 方法描述:獲取固定的檔案清單字串(FFixFileList)。 ============================================================================== } function TCB_IMGPSScanX.Get_fixfilelist: WideString; begin end; { ============================================================================== 方法名稱:Get_is_in_wh 引用相依: 方法描述:獲取是否為在席作業模式的標記(FIs_In_WH)。 ============================================================================== } function TCB_IMGPSScanX.Get_is_in_wh: WideString; begin end; { ============================================================================== 方法名稱:Get_language 引用相依: 方法描述:獲取當前設定的語系代碼(FLanguage)。 ============================================================================== } function TCB_IMGPSScanX.Get_language: WideString; begin end; { ============================================================================== 方法名稱:Get_loandoc_enable 引用相依: 方法描述:獲取信用註記功能是否啟用的狀態。 ============================================================================== } function TCB_IMGPSScanX.Get_loandoc_enable: WideString; begin end; { ============================================================================== 方法名稱:Get_loandoc_value 引用相依: 方法描述:獲取當前設定的信用註記數值。 ============================================================================== } function TCB_IMGPSScanX.Get_loandoc_value: WideString; begin end; { ============================================================================== 方法名稱:Get_mode 引用相依: 方法描述:獲取當前作業模式(FMode)。 ============================================================================== } function TCB_IMGPSScanX.Get_mode: WideString; begin end; { ============================================================================== 方法名稱:Get_modename 引用相依: 方法描述:獲取作業模式的顯示名稱(FModeName)。 ============================================================================== } function TCB_IMGPSScanX.Get_modename: WideString; begin end; { ============================================================================== 方法名稱:Get_oldcaseinfo 引用相依: 方法描述:獲取舊案件的相關資訊字串(FOldCaseInfo)。 ============================================================================== } function TCB_IMGPSScanX.Get_oldcaseinfo: WideString; begin end; { ============================================================================== 方法名稱:Get_rewrite 引用相依: 方法描述:獲取是否強制覆蓋檔案的標記(FReWrite)。 ============================================================================== } function TCB_IMGPSScanX.Get_rewrite: WideString; begin end; { ============================================================================== 方法名稱:Get_url 引用相依: 方法描述:獲取後端伺服器的基礎 URL(FUrl)。 ============================================================================== } function TCB_IMGPSScanX.Get_url: WideString; begin end; { ============================================================================== 方法名稱:Get_useproxy 引用相依: 方法描述:獲取是否使用 Proxy 代理伺服器的設定。 ============================================================================== } function TCB_IMGPSScanX.Get_useproxy: WideString; begin end; { ============================================================================== 方法名稱:Get_userid 引用相依: 方法描述:獲取當前登入的使用者代號(FUserID)。 ============================================================================== } function TCB_IMGPSScanX.Get_userid: WideString; begin end; { ============================================================================== 方法名稱:Get_username 引用相依: 方法描述:獲取當前登入的使用者名稱(FUserName)。 ============================================================================== } function TCB_IMGPSScanX.Get_username: WideString; begin end; { ============================================================================== 方法名稱:Get_userunit 引用相依: 方法描述:獲取使用者所屬的單位代碼(FUserUnit)。 ============================================================================== } function TCB_IMGPSScanX.Get_userunit: WideString; begin end; { ============================================================================== 方法名稱:Get_verify 引用相依: 方法描述:獲取 API 驗證字串(FVerify)。 ============================================================================== } function TCB_IMGPSScanX.Get_verify: WideString; begin end; { ============================================================================== 方法名稱:Get_work_no 引用相依: 方法描述:獲取當前的業務別代碼(FWork_No)。 ============================================================================== } function TCB_IMGPSScanX.Get_work_no: WideString; begin end; { ============================================================================== 方法名稱:Get_printyn 引用相依: 方法描述:獲取是否預設列印的標記(FPrintyn)。 ============================================================================== } function TCB_IMGPSScanX.Get_printyn: WideString; begin end; { ============================================================================== 方法名稱:Set_printyn 引用相依: 方法描述:設定是否預設列印的標記,並將傳入值轉換為大寫。 ============================================================================== } procedure TCB_IMGPSScanX.Set_printyn(const Value: WideString); begin FPrintyn := UpperCase(Value); end; { ============================================================================== 方法名稱:Get_is_oldcase 引用相依: 方法描述:獲取是否為舊件處理模式的標記(FIs_OldCase)。 ============================================================================== } function TCB_IMGPSScanX.Get_is_oldcase: WideString; begin end; { ============================================================================== 方法名稱:Set_is_oldcase 引用相依: 方法描述:設定是否為舊件處理模式,並將傳入值轉換為大寫。 ============================================================================== } procedure TCB_IMGPSScanX.Set_is_oldcase(const Value: WideString); begin FIs_OldCase := UpperCase(Value); end; { ============================================================================== 方法名稱:Get_custdocyn 引用相依: 方法描述:獲取是否支援自定義文件的標記(FCustDocYN)。 ============================================================================== } function TCB_IMGPSScanX.Get_custdocyn: WideString; begin end; { ============================================================================== 方法名稱:Set_custdocyn 引用相依: 方法描述:設定是否支援自定義文件,並將傳入值轉換為大寫。 ============================================================================== } procedure TCB_IMGPSScanX.Set_custdocyn(const Value: WideString); begin FCustDocYN := UpperCase(Value); end; { ============================================================================== 方法名稱:Get_casenolength 引用相依: 方法描述:獲取案件編號的長度限制。 ============================================================================== } function TCB_IMGPSScanX.Get_casenolength: WideString; begin end; { ============================================================================== 方法名稱:Get_filesizelimit 引用相依: 方法描述:獲取單一影像檔案的大小限制(KB)。 ============================================================================== } function TCB_IMGPSScanX.Get_filesizelimit: WideString; begin end; { ============================================================================== 方法名稱:Get_imgdpi 引用相依: 方法描述:獲取掃描影像的 DPI 設定值。 ============================================================================== } function TCB_IMGPSScanX.Get_imgdpi: WideString; begin end; { ============================================================================== 方法名稱:Get_scancolor 引用相依: 方法描述:獲取掃描顏色模式的索引值。 ============================================================================== } function TCB_IMGPSScanX.Get_scancolor: WideString; begin end; { ============================================================================== 方法名稱:Set_casenolength 引用相依: 方法描述:設定案件編號的長度限制。若傳入值為空字串則設為 0;否則將字串轉換為整數 後賦值給 FCaseNoLength 與全域變數 CaseIDLength。 ============================================================================== } procedure TCB_IMGPSScanX.Set_casenolength(const Value: WideString); begin if Value ='' then begin FCaseNoLength := 0 ; CaseIDLength := FCaseNoLength; end else begin FCaseNoLength := StrToInt(Value) ; CaseIDLength := FCaseNoLength; end; end; { ============================================================================== 方法名稱:Set_filesizelimit 引用相依: 方法描述:設定影像檔案的大小限制(KB)。若傳入值為空,則預設為 5120 KB (5MB);否則 將字串轉換為整數後賦值給 FFileSizeLimit。 ============================================================================== } procedure TCB_IMGPSScanX.Set_filesizelimit(const Value: WideString); begin //ShowMessage(Value); FFileSizeLimit:=0; if Value ='' then begin FFileSizeLimit := 5*1024; end else begin FFileSizeLimit := StrToInt(Value); end; end; { ============================================================================== 方法名稱:Set_imgdpi 引用相依: 方法描述:設定掃描 DPI。若傳入值為空,則預設為 300 DPI;否則將字串轉整數後賦值給 FImgDPI,並同步更新全域變數 ScanDpi 與 Def_ScanDpi。 ============================================================================== } procedure TCB_IMGPSScanX.Set_imgdpi(const Value: WideString); begin if Value ='' then begin FImgDPI := 300; ScanDpi := FImgDPI; end else begin FImgDPI := StrToInt(Value); ScanDpi := FImgDPI; Def_ScanDpi := FImgDPI; end; end; { ============================================================================== 方法名稱:Set_scancolor 引用相依:ifBlackWhite, ifGray256, ifTrueColor 方法描述:設定掃描色彩模式。將傳入的數值字串轉為整數。0 代表黑白(ifBlackWhite),1 代表灰階(ifGray256),2 代表全彩(ifTrueColor)。此函式會同步更新 FScanC olor 與全域變數 ScanColor,確保掃描器使用正確的色彩模式。 ============================================================================== } procedure TCB_IMGPSScanX.Set_scancolor(const Value: WideString); begin if value='' then begin FScanColor := 0; ScanColor := ifBlackWhite; end else begin FScanColor := StrToInt(Value); ScanColor := ifBlackWhite; end; if FScanColor = 1 then begin ScanColor := ifGray256 ; end; if FScanColor = 2 then begin ScanColor := ifTrueColor ; end; end; { ============================================================================== 方法名稱:Get_imgdelete 引用相依: 方法描述:獲取影像刪除權限的標記(FImgDelete)。 ============================================================================== } function TCB_IMGPSScanX.Get_imgdelete: WideString; begin end; { ============================================================================== 方法名稱:Set_imgdelete 引用相依: 方法描述:設定影像刪除權限。 ============================================================================== } procedure TCB_IMGPSScanX.Set_imgdelete(const Value: WideString); begin FImgDelete:=Value; end; { ============================================================================== 方法名稱:Get_check_main_form 引用相依: 方法描述:獲取是否檢查主表單的標記(FCheck_main_form)。 ============================================================================== } function TCB_IMGPSScanX.Get_check_main_form: WideString; begin end; { ============================================================================== 方法名稱:Get_isExternal 引用相依: 方法描述:獲取是否為外部呼叫模式的標記(FIsExternal)。 ============================================================================== } function TCB_IMGPSScanX.Get_isExternal: WideString; begin end; { ============================================================================== 方法名稱:Set_check_main_form 引用相依: 方法描述:設定是否檢查主表單。 ============================================================================== } procedure TCB_IMGPSScanX.Set_check_main_form(const Value: WideString); begin FCheck_main_form := Value; end; { ============================================================================== 方法名稱:Set_isExternal 引用相依: 方法描述:設定是否為外部呼叫模式。 ============================================================================== } procedure TCB_IMGPSScanX.Set_isExternal(const Value: WideString); begin FIsExternal:=Value; end; { ============================================================================== 方法名稱:Get_WH_CATEGORY 引用相依: 方法描述:獲取倉庫類別資訊(FWH_category)。 ============================================================================== } function TCB_IMGPSScanX.Get_WH_CATEGORY: WideString; begin end; { ============================================================================== 方法名稱:Set_WH_CATEGORY 引用相依: 方法描述:設定倉庫類別(WH_CATEGORY)。此範圍除包含 setter 實作外,亦涵蓋了組件的 initialization 初始區段,負責註冊 ActiveForm 工廠並設定多組授權金鑰(L icenseKey),確保 OCX 運作環境與權限正確初始化。 ============================================================================== } procedure TCB_IMGPSScanX.Set_WH_CATEGORY(const Value: WideString); begin FWH_category:=Value; end; 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'); SetLicenseKey('A6A94A8D91B08A9D58F300C0573EA9EF1B9DB0BF69B90E13B958DB4CB6B44F5A' + '4EE9CB22C9A68C2D07ED52ED4D13C755D890E4074996755361E6CDE2A6F1B563' + '5DDC8999AC4D71FB092EA9F1F87BFA25694FBF0D6D250087D2B39629713FCCB0' + 'D0A83135BC14FC63A4E8331CFF9E24C45C2D9CFD837EB70BAFDB79A75B7B97D5' + 'E9EB271685118C29D90A7C85E7793908989E295DA50021C795A448366026E975' + 'F49EA75B721B80427B99E5CF24A225FB498C07946ED7B806B483654C00D85C66' + 'E34215CA3EDEF1D4C3F5896090E97E1E2C9752BA2D5B49EE58CF19A0D374077F' + '6D13B90B6FED22D9EBC3AD6CDC76E595E08725BF2E12B8EF30A524A2E00504DF'); end.