{ ============================================================================== 方法名稱:WNoteBtnClick 引用相依:FileExists, LoadFromFile, SaveToFile 方法描述:開啟備註編輯視窗。首先初始化多國語言並從 MEMO_INF_List 載入註記範本資 訊。若存在 Scan_Memo.dat,則讀取既有的註記內容。顯示 TSortMemoForm 供使 用者編輯,確認後將編輯結果存回 Scan_Memo.dat。最後視需要觸發 CaseHelpB tnClick 以更新狀態。 ============================================================================== } procedure TCB_IMGPSScanX.WNoteBtnClick(Sender: TObject); var i,n,v,v1:Integer; SortMemoForm : TSortMemoForm; M_Content,M_ID,M_Name : String; S : TStringlist; begin ShowText := _Msg('備註輸入中,請稍候'); DataLoading(True,True); SortMemoForm := TSortMemoForm.Create(Self); S := TStringlist.Create; try InitialLanguage(SortMemoForm); //載入多國語言 SortMemoForm.ContentList := TStringlist.Create; //註記內容 SortMemoForm.MemoIDList := TStringlist.Create; //註記代號 SortMemoForm.MemoNameList := TStringlist.Create; //註記名稱 for i := 1 to MEMO_INF_List.Count - 1 do begin M_Content := GetSQLData(MEMO_INF_List,'T1.MEMO_CONTENT',i); M_ID := GetSQLData(MEMO_INF_List,'T1.MEMO_TYPE',i); M_Name := GetSQLData(MEMO_INF_List,'T2.MEMO_TYPE_NAME',i); SortMemoForm.ComboBox1.Items.Add(M_Name+'-->'+M_Content); SortMemoForm.ContentList.Add(M_Content); //註記內容 SortMemoForm.MemoIDList.Add(M_ID); //註記代號 SortMemoForm.MemoNameList.Add(M_Name); //註記名稱 end; if FileExists(DisplayPath+'Scan_Memo.dat') then begin S.LoadFromFile(DisplayPath+'Scan_Memo.dat'); for I := 0 to S.Count - 1 do begin v := Pos(',',S.Strings[i]); v1 := length(S.Strings[i]); M_ID := copy(S.Strings[i],1,v-1); M_Name := MemoInfoTransfer('ID',M_ID,SortMemoForm.MemoIDList,SortMemoForm.MemoNameList); M_Content := copy(S.Strings[i],v+1,v1-v); SortMemoForm.ResoureMemo.Add(M_Name+'-->'+M_Content); With SortMemoForm.MemoLV.Items.Add do begin Caption := M_Content; SubItems.Add(M_Name); end; end; end; if SortMemoForm.ShowModal = mrOk then begin S.Clear; for I := 0 to SortMemoForm.MemoLV.Items.Count - 1 do begin M_Content := SortMemoForm.MemoLV.Items.Item[i].Caption; M_Name := SortMemoForm.MemoLV.Items.Item[i].SubItems.Strings[0]; M_ID := MemoInfoTransfer('NAME',M_Name,SortMemoForm.MemoIDList,SortMemoForm.MemoNameList); S.Add(M_ID+','+M_Content); end; S.SaveToFile(DisplayPath+'Scan_Memo.dat'); end; SortMemoForm.ContentList.Free; //註記內容 SortMemoForm.MemoIDList.Free; //註記代號 SortMemoForm.MemoNameList.Free; //註記名稱 finally SortMemoForm.Free; S.Free; DataLoading(False,False); if Ch_WriteNote then begin Ch_WriteNote := False; CaseHelpBtnClick(self); ErrIndex := 0; end; end; end; { ============================================================================== 方法名稱:FC0Click 引用相依: 方法描述:工具列功能按鈕 0 的點擊處理。若重複點擊則關閉影像顯示(DesableImage), 否則啟用索引為 0 的影像顯示(EnableImage)並更新 NowClick 狀態。 ============================================================================== } procedure TCB_IMGPSScanX.FC0Click(Sender: TObject); begin IF NowClick = 0 Then begin DesableImage; Exit; end; EnableImage(0 ,Sender); NowClick := 0; end; { ============================================================================== 方法名稱:FC1Click 引用相依: 方法描述:工具列功能按鈕 1 的點擊處理。若重複點擊則關閉影像顯示,否則啟用索引為 1 的影像顯示並更新 NowClick 狀態。 ============================================================================== } procedure TCB_IMGPSScanX.FC1Click(Sender: TObject); begin IF NowClick = 1 Then begin DesableImage; Exit; end; EnableImage(1 ,Sender); NowClick := 1; end; { ============================================================================== 方法名稱:FC2Click 引用相依: 方法描述:工具列功能按鈕 2 的點擊處理。若重複點擊則關閉影像顯示,否則啟用索引為 2 的影像顯示並更新 NowClick 狀態。 ============================================================================== } procedure TCB_IMGPSScanX.FC2Click(Sender: TObject); begin IF NowClick = 2 Then begin DesableImage; Exit; end; EnableImage(2,Sender); NowClick := 2; end; { ============================================================================== 方法名稱:FC3Click 引用相依: 方法描述:工具列功能按鈕 3 的點擊處理。若重複點擊則關閉影像顯示,否則啟用索引為 3 的影像顯示並更新 NowClick 狀態。 ============================================================================== } procedure TCB_IMGPSScanX.FC3Click(Sender: TObject); begin IF NowClick = 3 Then begin DesableImage; Exit; end; EnableImage(3 ,Sender); NowClick := 3; end; { ============================================================================== 方法名稱:FC4Click 引用相依: 方法描述:工具列功能按鈕 4 的點擊處理。若重複點擊則關閉影像顯示,否則啟用索引為 4 的影像顯示並更新 NowClick 狀態。 ============================================================================== } procedure TCB_IMGPSScanX.FC4Click(Sender: TObject); begin IF NowClick = 4 Then begin DesableImage; Exit; end; EnableImage(4 ,Sender); NowClick := 4; end; { ============================================================================== 方法名稱:FC5Click 引用相依: 方法描述:工具列功能按鈕 5 的點擊處理。若重複點擊則關閉影像顯示,否則啟用索引為 5 的影像顯示並更新 NowClick 狀態。 ============================================================================== } procedure TCB_IMGPSScanX.FC5Click(Sender: TObject); begin IF NowClick = 5 Then begin DesableImage; Exit; end; EnableImage(5 ,Sender); NowClick := 5; end; { ============================================================================== 方法名稱:FC6Click 引用相依: 方法描述:工具列功能按鈕 6 的點擊處理。目前的實作已註解掉原有的影像啟用邏輯,改 為直接呼叫 PM605Click(nil),即觸發右鍵選單中的刪除影像功能。 ============================================================================== } procedure TCB_IMGPSScanX.FC6Click(Sender: TObject); begin {IF NowClick = 6 Then begin DesableImage; Exit; end; EnableImage(6 ,Sender); NowClick := 6;} PM605Click(nil); end; { ============================================================================== 方法名稱:NewScanBtnClick 引用相依:StatrTwainScan 方法描述:點擊「新案掃瞄」按鈕的處理。首先檢查初始化狀態。針對重掃(RSCAN)、異動(ESC AN)或重掃指定件(DSCAN),會自動選取新件節點並觸發追加掃瞄。若是全新掃瞄 ,則重設掃瞄模式與路徑,清空清單,最後呼叫 StatrTwainScan 啟動掃瞄程序, 並在結束後重新載入影像檔案。 ============================================================================== } procedure TCB_IMGPSScanX.NewScanBtnClick(Sender: TObject); begin IF not InitialOk Then begin Showmessage(_msg('資訊尚未下載完成,請稍候或重新進入')); Exit; end; LogFile1.LogToFile(logTimeString+'掃瞄開始'); if (FMode = 'RSCAN') or (FMode = 'ESCAN') or (FMode = 'DSCAN') then begin if NewTreeNode.Count > 0 then begin TreeView1.Selected := NewTreeNode.Item[0]; TreeView1click(nil); FirstDocDir := ''; NowGuideFormID := ''; NowDivPageFormID :=''; AddScanBtnclick(nil); end; end Else begin TreeView1.Selected := NewTreeNode; NewTreeNode.Expand(False); TreeView1Click(self); Panel1.Enabled := False; Panel2.Enabled := False; ScanMode := smNew; ScanInfo.ImageCount := 0; ScanPath := ''; ScanCaseno := ''; NowGuideFormID := ''; NowDivPageFormID :=''; ClearView(1); ContextList.Clear; Try StatrTwainScan; LogFile1.LogToFile(logTimeString+'掃瞄結束'); Except Panel1.Enabled := True; Panel2.Enabled := True; end; Panel1.Enabled := True; Panel2.Enabled := True; LoadImgFile; end; end; { ============================================================================== 方法名稱:NextPageBtnClick 引用相依: 方法描述:處理「下一頁」按鈕點擊。若有選取影像,則呼叫 NextPage 跳轉至下一頁,並判 斷選取影像的位置是否超出目前滾輪區域的高度,若是則自動調整 ScrollBox1 的垂直捲軸位置,以確保新頁面影像能正確顯示在視線範圍內。 ============================================================================== } procedure TCB_IMGPSScanX.NextPageBtnClick(Sender: TObject); var page : Integer; begin {page := ScrollBar1.Position; Case Vmode of 0 : Inc(page); 1 : Page := Page + 2; 2 : Page := Page + 4; 3 : Page := Page + 6; 4 : Page := Page + 8; end; IF page <= ScrollBar1.Max Then begin ScrollBar1.Position := page; end;} if selectISB = nil then Exit; 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); end; { ============================================================================== 方法名稱:OptionBtnClick 引用相依:Scanner 方法描述:處理「掃瞄參數設定」按鈕點擊。首先確認系統初始化是否完成,接著建立 TPatc hDlg 對話框並載入多國語言。將目前的掃瞄設定(如自動刪除空白頁、DPI、單/ 雙面、反白、去邊、去偏斜、亮度、對比、旋轉角度及顯示模式等)同步至對話框。使 用者完成設定後,將新參數存回系統變數,並呼叫 R_W_ScanIni 將設定寫入設 定檔。 ============================================================================== } procedure TCB_IMGPSScanX.OptionBtnClick(Sender: TObject); var PatchDlg : TPatchDlg; i : Integer; begin IF not InitialOk Then begin Showmessage(_msg('資訊尚未下載完成,請稍候或重新進入')); Exit; end; ShowText := _Msg('掃瞄參數設定中,請稍候'); DataLoading(True,True); PatchDlg := TPatchDlg.Create(self); try InitialLanguage(PatchDlg); //載入多國語言 PatchDlg.BlankuseCB.Checked := DeviceDelete; if PatchDlg.BlankuseCB.Checked then PatchDlg.SpinEdit5.Enabled := True else PatchDlg.SpinEdit5.Enabled := False; PatchDlg.SpinEdit5.Value := DeviceDeleteSize; For i := 0 to PatchDlg.ComboBox1.Items.Count -1 do begin If inttostr(ScanDpi) = PatchDlg.ComboBox1.Items.Strings[i] Then PatchDlg.ComboBox1.ItemIndex := i; end; PatchDlg.DuplexCB.Checked := ScanDuplex; PatchDlg.ReverseCB.Checked := ScannerReverse; PatchDlg.BorderCB.Checked := BoardClear; PatchDlg.DeskewCB.Checked := ScanDeskew; PatchDlg.ImgSetUseCB.Checked := ScanImgSetUse; PatchDlg.SpinEdit1.Value := ScanBright; PatchDlg.SpinEdit2.Value := ScanContrast; case ScanRotate of 0 : PatchDlg.ScanRotateRG.ItemIndex := 0; 270 : PatchDlg.ScanRotateRG.ItemIndex := 1; 180 : PatchDlg.ScanRotateRG.ItemIndex := 2; 90 : PatchDlg.ScanRotateRG.ItemIndex := 3; end; Case ScanImgShowMode of 0 : PatchDlg.ScanShowRG.ItemIndex := 0; 1 : PatchDlg.ScanShowRG.ItemIndex := 1; 2 : PatchDlg.ScanShowRG.ItemIndex := 2; end; If PatchDlg.ShowModal = mrOk then begin DeviceDelete := PatchDlg.BlankuseCB.Checked; DeviceDeleteSize := PatchDlg.SpinEdit5.Value; ScanDpi := Strtoint(PatchDlg.ComboBox1.Text); ScannerReverse := PatchDlg.ReverseCB.Checked; BoardClear := PatchDlg.BorderCB.Checked; ScanDeskew := PatchDlg.DeskewCB.Checked; ScanDuplex := PatchDlg.DuplexCB.Checked; ScanImgSetUse := PatchDlg.ImgSetUseCB.Checked; ScanBright := PatchDlg.SpinEdit1.Value; ScanContrast := PatchDlg.SpinEdit2.Value; Case PatchDlg.ScanRotateRG.ItemIndex of 0:ScanRotate := 0; 1:ScanRotate := 270; 2:ScanRotate := 180; 3:ScanRotate := 90; end; Case PatchDlg.ScanShowRG.ItemIndex of 0:ScanImgShowMode := 0; 1:ScanImgShowMode := 1; 2:ScanImgShowMode := 2; end; R_W_ScanIni('W'); ScanDuplexCB.Checked := ScanDuplex; end; finally PatchDlg.Free; DataLoading(False,False); end; end; { ============================================================================== 方法名稱:PrePageBtnClick 引用相依: 方法描述:處理「上一頁」按鈕點擊。跳轉至前一頁並判斷影像位置,若向上超出捲軸區域則 自動滾動垂直捲軸,將影像帶入可見區域。 ============================================================================== } procedure TCB_IMGPSScanX.PrePageBtnClick(Sender: TObject); var page : Integer; begin {page := ScrollBar1.Position; Case Vmode of 0 : dec(page); 1 : Page := Page - 2; 2 : Page := Page - 4; 3 : Page := Page - 6; 4 : Page := Page - 8; end; IF page >= ScrollBar1.min Then begin ScrollBar1.Position := page; end Else ScrollBar1.Position := 1; } if selectISB = nil then Exit; 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; { ============================================================================== 方法名稱:SampleScanBtnClick 引用相依:FileExists, LoadFromFile, SaveToFile, StatrTwainScan, upFile 方法描述:處理「範本掃瞄」按鈕點擊。切換為範本模式並引導使用者輸入 FormID,掃瞄後 產生 TIF 與 JPG 影像。隨後透過 HTTPS 將範本上傳至伺服器,上傳過程中會 嚴格檢查網路狀態、Session 有效性與伺服器回傳結果。 ============================================================================== } procedure TCB_IMGPSScanX.SampleScanBtnClick(Sender: TObject); var SampleFormID : String; SendData : String; buttonSelected : Integer; begin ScanMode := smSample; ClearView(1); Vmode := 0; //切成單頁 GoViewMode; ScanInfo.ImageCount := 0; ScanPath := SamplePath; ScanCaseno := ''; ContextList.Clear; ShowText := _Msg('範本掃描中,請稍候'); DataLoading(True,True); SampleFormID := UpperCase(InputBox(_Msg('範本檔掃瞄輸入畫面'),_Msg('請輸入文件編號'),'')); if SampleFormIDList.IndexOf(SampleFormID)<>-1 then begin // Show a custom dialog buttonSelected := messagedlg(SampleFormID+_Msg('已有範本,是否取代?'),mtCustom, [mbYes,mbCancel], 0); if buttonSelected = mrCancel then begin DataLoading(false,false); Exit; end; end; if SampleFormID <> '' then begin if FormIDExists(SampleFormID,False,0) then begin ScanSaveFilename := SampleFormID + '.tif'; end Else begin Showmessage(Format(_Msg('FormID:%s尚未註冊'),[SampleFormID])); Panel1.Enabled := True; Panel2.Enabled := True; DataLoading(false,false); Exit; end; SampleAnchorMode := FormID2Anchor(SampleFormID); Panel1.Enabled := False; Panel2.Enabled := False; //ShowMessage('AAAAA'); Try StatrTwainScan; Except Panel1.Enabled := True; Panel2.Enabled := True; end; if (ISB1.FileName <> '') and FileExists(SamplePath+SampleFormID+'.tif') then begin ShowText := _Msg('範本傳送中,請稍候'); DataLoading(True,True); //多存一份jpg ImageScrollBox1.LoadFromFile(SamplePath+SampleFormID+'.tif',1); BWTif2Jpg(ImageScrollBox1.Graphic); ImageScrollBox1.SaveToFile(SamplePath+SampleFormID+'.jpg'); //多存一份jpg NowWork_No := FormCode2WorkNo(SampleFormID); SendData := 'data='+FData+'&verify='+FVerify+'&work_no='+FWork_no+'&file_name='+SampleFormID+'.tif'; if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/sample',SendData,'file',SamplePath+SampleFormID+'.tif',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; if FileExists(SamplePath+SampleFormID+'.jpg') then //傳送JPG影像 begin SendData := 'data='+FData+'&verify='+FVerify+'&work_no='+FWork_no+'&file_name='+SampleFormID+'.jpg'; if not upFile(HTTPSClient,FUrl,'service/imgpsc/IMGPSC02/sample',SendData,'file',SamplePath+SampleFormID+'.jpg',FReWrite,Memo1,False) then begin Showmessage(_Msg('傳送範本檔案(JPG)時,網路發生錯誤!!')+_MSg('錯誤代碼:')+Inttostr(HttpError.HttpErrorCode)+' '+HttpError.HttpReason+')'); DataLoading(False,False); Exit; end; if memo1.Lines.Strings[0] = '1' then begin Showmessage(_Msg('傳送範本檔案(JPG)時,網路發生錯誤!!')+_Msg('錯誤原因:')+memo1.Lines.Strings[1]); DataLoading(False,False); Exit; end Else if Pos('',Memo1.Lines.Text) > 0 then begin Showmessage(_Msg('傳送範本檔案(JPG)時,網路發生錯誤!!')+_Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入')); DataLoading(False,False); Exit; end; end; Showmessage(_Msg('傳送完成')); end; end; DataLoading(False,False); end; { ============================================================================== 方法名稱:SelectScanBtnClick 引用相依:SelectScanner, scanner.SelectScanner, Scanner 方法描述:開啟系統掃瞄器選擇視窗。 ============================================================================== } procedure TCB_IMGPSScanX.SelectScanBtnClick(Sender: TObject); begin Panel1.Enabled := False; Panel2.Enabled := False; scanner.SelectScanner; Panel1.Enabled := True; Panel2.Enabled := True; end; { ============================================================================== 方法名稱:AddScanBtnClick 引用相依:StatrTwainScan 方法描述:處理「追加掃瞄」按鈕點擊。檢查狀態後設定掃瞄模式為 smInsert(插入模式), 初始化掃瞄參數並啟動 StatrTwainScan。完成後重新繪製樹狀結構、更新筆數 統計並清空檢核記錄,最後自動選取新文件節點。 ============================================================================== } procedure TCB_IMGPSScanX.AddScanBtnClick(Sender: TObject); var P,v : Integer; begin IF not InitialOk Then begin Showmessage(_Msg('資訊尚未下載完成,請稍候或重新進入')); Exit; end; if MyTreeNode1 = nil then begin Showmessage(_Msg('請先選擇案件')); Exit; end; Panel1.Enabled := False; Panel2.Enabled := False; ScanMode := smInsert; ScanInfo.ImageCount := ContextList.Count; ScanPath := DisplayPath; ScanCaseno := NowCaseno; ScanDocDir := NowDocDir; Try StatrTwainScan; Except Panel1.Enabled := True; Panel2.Enabled := True; end; Panel1.Enabled := True; Panel2.Enabled := True; DrawDocItem2(MytreeNode1,NowCaseno); //DrawDocItem(MytreeNode1,FORM_INF_List,NowCaseno); //P := ContextList.Count; GetCase_PageCount(CaseCount,PageCount); v := Pos('-',NewTreeNode.Text); NewTreeNode.Text := Format(_Msg('%s-共%d筆共%d頁'),[Copy(NewTreeNode.Text,1,v-1),CaseCount,PageCount]); MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseno)]); ClearErrini(NowCaseno,MyTreeNode1); //清掉檢核記錄 SetDocDirtoSelected(MyTreeNode1,FirstDocDir); TreeView1Click(self); end; { ============================================================================== 方法名稱:CaseHelpBtnClick 引用相依: 方法描述:處理檢核失敗(補件/更正)按鈕點擊。開啟 TErrlistForm 顯示 OMR 檢核錯誤 清單供使用者操作。若使用者完成更正並按確定,則會根據目前模式(ISCAN/NSC AN 等)將更新後的影像資料上傳至伺服器,並在完成後重新載入影像、提示使用 者。 ============================================================================== } procedure TCB_IMGPSScanX.CaseHelpBtnClick(Sender: TObject); var ErrlistForm : TErrlistForm; S : TStringlist; UpFormID : String; Anchor : String; begin ShowText := _Msg('處理檢核失敗中,請稍候'); DataLoading(True,True); LogFile1.LogToFile(logTimeString+'處理檢核失敗中開始'); ErrlistForm := TErrlistForm.Create(Self); RejectCase := False; S := TStringlist.Create; try InitialLanguage(ErrlistForm); Application.ProcessMessages; ErrlistForm.LogFile1.LogFile:=LogFile1.LogFile; ErrlistForm.DeleteBt.Caption := ErrlistForm.DeleteBt.Caption+'(&D)'; ErrlistForm.iniPath := ImageSavePath + NowCaseNo+'\upload\'; OMRErrini2List(NowCaseno,ErrlistForm); ErrlistForm.ErrListLV.ItemIndex := ErrIndex; ErrlistForm.Timer1.Enabled := true; if ErrlistForm.ShowModal = mrok then begin TransPath := ImageSavePath+NowCaseNo+'\upload\'; if FMode = 'ISCAN' then TransPath := ImageSavePath + NowCaseNo+'\DownTemp\'; ShowText := NowCaseNo+_Msg('資料上傳中,請稍候'); DataLoading(True,True); if FMode = 'ISCAN' then begin If Not TransCaseID(TransPath,NowCaseNo,True) Then //傳送案件 begin DataLoading(False,False); Exit; end; end Else begin If Not TransCaseID(TransPath,NowCaseNo,True) Then //傳送案件 begin DataLoading(False,False); Exit; end; end; CaseHelpBtn.Visible := False; LoadImgFile; if (FMode='NSCAN') or (FMode='DSCAN') then begin Showmessage(NowCaseNo+_Msg('影像上傳完成。此案已進入下一流程。')); end; if FMode='ESCAN' then begin Showmessage(NowCaseNo+_Msg('影像已補件完成。')); end; DataLoading(False,False); end Else begin MyTreeNode2ReFresh(NowCaseNo); end; finally ErrlistForm.Free; DataLoading(False,False); S.Free; end; end; { ============================================================================== 方法名稱:CheckCaseBtnClick 引用相依:SaveToFile 方法描述:執行所有案件的批次檢核。遍歷 NewTreeNode 下的所有案件,對尚未檢核通過( ImageIndex 不為 7 或 5)的案件呼叫 OMRCheckCase 進行檢核。若檢核成功則 建立 OMRCheckOk.dat 標記檔。最後刷新影像與樹狀顯示。 ============================================================================== } procedure TCB_IMGPSScanX.CheckCaseBtnClick(Sender: TObject); Var CaseID : String; i,n,v : Integer; S : TStringlist; begin //if TreeView1.Selected = nil then Exit; //if TreeView1.Selected = NewTreeNode then Exit; Displaypath := ''; //20130327 修正報價單號會錯置的問題 S := TStringlist.Create; try ClearView(1); ShowText := CaseID+_Msg('檢核中,請稍候'); DataLoading(True,True); For i := 0 to NewTreeNode.Count -1 do begin v := posend('-',NewTreenode.Item[i].Text); CaseID := Copy(NewTreenode.Item[i].Text,1,v-1); ShowText := CaseID+_Msg('檢核中,請稍候'); DataLoading(True,True); if (NewTreenode.Item[i].ImageIndex <> 7) and (NewTreenode.Item[i].ImageIndex <> 5) then //檢核完成的不再檢核 begin If OMRCheckCase(CaseID) then //有成功 begin S.Add('Y'); S.SaveToFile(ImageSavePath+CaseID+'\OMRCheckOk.dat'); end; end; //MyTreeNode2ReFresh(CaseID); //原本是OMR單一案件,後改成OMR全部案件 所以這個要mark end; LoadImgFile; TreeView1Click(nil); DataLoading(False,False); finally S.Free; end; Showmessage(_Msg('檢核完成')); end; { ============================================================================== 方法名稱:SpeedButton14Click 引用相依:Rotate, TJpegGraphic, SaveQuality, LoadFromFile, SaveToFile 方法描述:處理工具列按鈕點擊,執行影像逆時針旋轉 90 度(即旋轉 270 度)。程序會重 新載入影像、執行旋轉、根據影像格式(JPG 則設定品質為 30)儲存回原檔案,最 後更新主顯示區與縮圖區,並重新調整縮圖佈局。 ============================================================================== } procedure TCB_IMGPSScanX.SpeedButton14Click(Sender: TObject); var Count : Integer; begin if not ISB1.Graphic.IsEmpty then begin ISB1.LoadFromFile(ISB1.FileName,1); Rotate(ISB1.Graphic,270); if ISB1.Graphic.ImageFormat <> ifBlackWhite then begin TJpegGraphic(ISB1.Graphic).SaveQuality := 30; TJpegGraphic(ISB1.Graphic).SaveToFile(ISB1.FileName); end Else ISB1.SaveToFile(ISB1.FileName); ISB1.Redraw(True); SelectISB.Graphic.Assign(ISB1.Graphic); SelectISB.Redraw(True); FitPreViewISB; ISBClick(SelectISB); end; end; { ============================================================================== 方法名稱:SpeedButton15Click 引用相依:Rotate, TJpegGraphic, SaveQuality, LoadFromFile, SaveToFile 方法描述:處理工具列按鈕點擊,執行影像旋轉 180 度。程序重新載入檔案後執行旋轉操 作,並依據格式存檔。完成後同步更新主畫面與預覽圖,確保顯示一致性。 ============================================================================== } procedure TCB_IMGPSScanX.SpeedButton15Click(Sender: TObject); begin if not ISB1.Graphic.IsEmpty then begin ISB1.LoadFromFile(ISB1.FileName,1); Rotate(ISB1.Graphic,180); if ISB1.Graphic.ImageFormat <> ifBlackWhite then begin TJpegGraphic(ISB1.Graphic).SaveQuality := 30; TJpegGraphic(ISB1.Graphic).SaveToFile(ISB1.FileName); end Else ISB1.SaveToFile(ISB1.FileName); ISB1.Redraw(True); SelectISB.Graphic.Assign(ISB1.Graphic); SelectISB.Redraw(True); FitPreViewISB; ISBClick(SelectISB); end; end; { ============================================================================== 方法名稱:SpeedButton16Click 引用相依:Rotate, TJpegGraphic, SaveQuality, LoadFromFile, SaveToFile 方法描述:處理工具列按鈕點擊,執行影像順時針旋轉 90 度。載入影像後執行旋轉並儲存 ,針對非黑白影像會設定 JPG 壓縮品質。最後重新繪製相關顯示元件並觸發點 擊事件。 ============================================================================== } procedure TCB_IMGPSScanX.SpeedButton16Click(Sender: TObject); begin if not ISB1.Graphic.IsEmpty then begin ISB1.LoadFromFile(ISB1.FileName,1); Rotate(ISB1.Graphic,90); if ISB1.Graphic.ImageFormat <> ifBlackWhite then begin TJpegGraphic(ISB1.Graphic).SaveQuality := 30; TJpegGraphic(ISB1.Graphic).SaveToFile(ISB1.FileName); end Else ISB1.SaveToFile(ISB1.FileName); ISB1.Redraw(True); SelectISB.Graphic.Assign(ISB1.Graphic); SelectISB.Redraw(True); FitPreViewISB; ISBClick(SelectISB); end; end; { ============================================================================== 方法名稱:SpeedButton17Click 引用相依: 方法描述:將主影像顯示區的縮放模式設定為「符合高度」(zmFitHeight)。 ============================================================================== } procedure TCB_IMGPSScanX.SpeedButton17Click(Sender: TObject); begin ISB1.ZoomMode := zmFitHeight; end; { ============================================================================== 方法名稱:SpeedButton18Click 引用相依: 方法描述:將主影像顯示區的縮放模式設定為「符合寬度」(zmFitWidth)。 ============================================================================== } procedure TCB_IMGPSScanX.SpeedButton18Click(Sender: TObject); begin ISB1.ZoomMode := zmFitWidth; end; { ============================================================================== 方法名稱:SpeedButton19Click 引用相依: 方法描述:將主影像顯示區的縮放模式設定為「原始大小」(zmOriginalSize)。 ============================================================================== } procedure TCB_IMGPSScanX.SpeedButton19Click(Sender: TObject); begin ISB1.ZoomMode := zmOriginalSize; end; { ============================================================================== 方法名稱:SpeedButton20Click 引用相依: 方法描述:將主影像顯示區的縮放模式設定為「符合頁面」(zmFittoPage)。 ============================================================================== } procedure TCB_IMGPSScanX.SpeedButton20Click(Sender: TObject); begin ISB1.ZoomMode := zmFittoPage; end; { ============================================================================== 方法名稱:SpeedButton21Click 引用相依: 方法描述:將主影像顯示區的縮放模式設定為自定義百分比,並將比例設為 50%。 ============================================================================== } procedure TCB_IMGPSScanX.SpeedButton21Click(Sender: TObject); begin ISB1.ZoomMode := zmPercent; ISB1.ZoomPercent := 50; end; { ============================================================================== 方法名稱:SpeedButton22Click 引用相依: 方法描述:將主影像顯示區的縮放模式設定為自定義百分比,並將比例設為 25%。 ============================================================================== } procedure TCB_IMGPSScanX.SpeedButton22Click(Sender: TObject); begin ISB1.ZoomMode := zmPercent; ISB1.ZoomPercent := 25; end; { ============================================================================== 方法名稱:SpeedButton3Click 引用相依: 方法描述:將主影像顯示區的縮放模式設定為「全頁顯示」(zmFullPage)。 ============================================================================== } procedure TCB_IMGPSScanX.SpeedButton3Click(Sender: TObject); begin ISB1.ZoomMode := zmFullPage; end; { ============================================================================== 方法名稱:TransBtnClick 引用相依:LoadFromFile 方法描述:處理工具列「上傳」按鈕的點擊事件。執行完整的前置檢查(包含案件配號、歸類、 收件時間限制等),接著遍歷所有案件執行 OMR 檢核與 ReSize,最後呼叫 Tran sCaseID 將案件封裝傳送至伺服器。上傳結束後會顯示成功/失敗的統計報告。 ============================================================================== } procedure TCB_IMGPSScanX.TransBtnClick(Sender: TObject); Var CaseID : String; i,n,v: Integer; ZipFileList : TStringlist; CaseTrans : Integer; //-1:失敗 0:可 1:不行 SuccessCount,ReCasecount,CheckErrCount : Integer; TransMsg : String; AreaStr : String; S : TStringlist; CheckStr : String; uploadMsg:String;//20171122 新增 配合不同mode下要秀不能上傳訊息 begin IF not InitialOk Then begin Showmessage(_msg('資訊尚未下載完成,請稍候或重新進入')); Exit; end; LogFile1.LogToFile(logTimeString+'按下上傳'); ClearView(1); CaseHelpBtn.Visible := False; DisplayPath := ''; ClearCaseIndex; RejectCase := False; uploadMsg:=''; if not CheckCaseID_OK then //檢查是否有未配號的案件 begin Showmessage(_Msg('尚有「無案件編號」之案件,無法上傳')); Exit; end; if not CheckCaseAttach_OK then //20170911檢查是否有未歸類的案件 begin Showmessage(_Msg('尚有未歸類文件,無法上傳')); Exit; end; if NewTreeNode.Count = 0 then begin Showmessage(_Msg('無影像需傳送')); Exit; end; SuccessCount := 0; ReCasecount := 0; CheckErrCount := 0; if (FMode = 'NSCAN') and (not CheckScanDenialTime) then begin if Messagedlg(Format(_Msg('己超過收件時間(%s),預定作業日為下個營業日,是否繼續上傳??'),[ScanDenialTime]),mtConfirmation,[mbyes,mbcancel],0)=mrcancel then Exit; end; ShowText := _Msg('資料上傳中,請稍候'); DataLoading(True,True); For i := 0 to NewTreeNode.Count -1 do begin v := posend('-',NewTreenode.Item[i].Text); CaseID := Copy(NewTreenode.Item[i].Text,1,v-1); ShowText := CaseID+_Msg('資料上傳中,請稍候'); DataLoading(True,True); CreateIn_WH(CaseID); //產生入庫文件文字檔 In_Wh.dat Case2upload(CaseID); //產生原影像結構 TransPath := ImageSavePath+CaseID+'\Upload\'; {if FMode = 'ESCAN' then //20140320 yuu說拿掉此檢查 begin S := TStringlist.Create; try S.LoadFromFile(TransPath + 'Context.dat'); if S.Count = 0 then begin Showmessage(_Msg('無影像檔無法傳送')); DataLoading(False,False); LoadImgFile; Exit; end; finally s.Free; end; end;} if (FMode = 'NSCAN') or (FMode = 'DSCAN') then //20170406 待掃瞄也要問一下 begin /////訊問是否可上傳///// CaseTrans := CaseAsk(CaseID); //Showmessage('記得改回來'); //CaseTrans := 0; /////訊問是否可上傳//// end Else ///不是新件、重掃件、異動件的不查 begin CaseTrans := 0; end; if CaseTrans = -1 then //失敗 begin Showmessage(_Msg('')+HttpErrStr+'.'); DataLoading(False,False); LoadImgFile; Exit; end; if CaseTrans = 1 then begin ////重複處理///// Inc(ReCasecount); ////重複處理///// Continue; end Else if CaseTrans = 0 then //可以傳送 begin ///////檢核////// 20100927 User改為搬至外面做 ///20101019 User又改回上傳要做 //if FMode = 'NSCAN' then //20101019改成讀設定那些模式要做那些檢核 //begin ///依十字定位點縮放//// CaseReSize(CaseID); //所以影像再做一次縮放 ////依十字定位點縮放/////// } if (FMode <> 'FSCAN') then begin if (NewTreenode.Item[i].ImageIndex <> 7) and (NewTreenode.Item[i].ImageIndex <> 5) then //檢核完成的不再檢核 begin ShowText := CaseID+_Msg('檢核中,請稍候'); DataLoading(True,True); If not OMRCheckCase(CaseID) then //進檢核 begin Inc(CheckErrCount); Continue; end; end; if (NewTreenode.Item[i].ImageIndex = 5) then begin Inc(CheckErrCount); Continue; end; end; //end; ///////檢核////// ShowText := CaseID+_Msg('資料上傳中,請稍候'); DataLoading(True,True); //ShowMessage('退出');DataLoading(False,False);Exit; If Not TransCaseID(TransPath,CaseID,True) Then //傳送案件 begin DataLoading(False,False); LoadImgFile; Exit; end; Inc(SuccessCount); end; end; DataLoading(False,False); TransMsg := Format(_Msg('成功件【%d】件'),[SuccessCount]); if ReCasecount > 0 then TransMsg := TransMsg + #13#10 + Format(_Msg('無法上傳件【%d】件'),[ReCasecount]); if CheckErrCount > 0 then begin TransMsg := TransMsg + #13#10 + Format(_Msg('檢核失敗件【%d】件,請先點選「案件編號」,再點選「問號」查看錯誤原因'),[CheckErrCount]); LogFile1.LogToFile(logTimeString+'檢核失敗原因:'+OMRErrini2ListForLog('')); end; if (FMode = 'DSCAN') and (SuccessCount = 1) then begin uploadMsg:=NowCaseNo+_Msg('影像上傳完成。此案已進入下一流程'); end; if (FMode='ESCAN') and (FModeName=_Msg('補件掃描')) and (SuccessCount = 1) then begin uploadMsg:=NowCaseNo+_Msg('影像已補件完成'); end; //ShowMessage('uploadMsg='+uploadMsg); if uploadMsg<>'' then begin ShowMessage(uploadMsg); end else begin Showmessage(_Msg('傳送完成')+#13#10+TransMsg); end; LoadImgFile; if (FMode = 'ESCAN') and (SuccessCount = 1) then begin if FEvents <> nil Then begin FEvents.OnClosePage; end; end; if (FMode = 'DSCAN') and (SuccessCount = 1) then begin if FEvents <> nil Then begin FEvents.OnClosePage; end; end; end;