From 0756bf12d10cf1b7f78c571de0a9ad69cbaeb7ca Mon Sep 17 00:00:00 2001
From: curtis <curtis@i-mps.com>
Date: 星期一, 30 三月 2026 14:24:17 +0800
Subject: [PATCH] fix: 更新內部引用方法參照

---
 reassemble/view/toolBar.pas | 1105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,105 insertions(+), 0 deletions(-)

diff --git a/reassemble/view/toolBar.pas b/reassemble/view/toolBar.pas
new file mode 100644
index 0000000..63e2f56
--- /dev/null
+++ b/reassemble/view/toolBar.pas
@@ -0,0 +1,1105 @@
+{ ==============================================================================
+  方法名稱: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
+  引用相依:BWTif2Jpg, FileExists, LoadFromFile, SaveToFile, StatrTwainScan, upF
+            ile
+  方法描述:處理「範本掃瞄」按鈕點擊。切換為範本模式並引導使用者輸入 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('<script type="text/javascript" src="scripts/CW00/login.js"></script>',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('<script type="text/javascript" src="scripts/CW00/login.js"></script>',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
+  引用相依:Scanner, SelectScanner, scanner.SelectScanner
+  方法描述:開啟系統掃瞄器選擇視窗。
+============================================================================== }
+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
+  引用相依:LoadFromFile, Rotate, SaveQuality, SaveToFile, TJpegGraphic
+  方法描述:處理工具列按鈕點擊,執行影像逆時針旋轉 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
+  引用相依:LoadFromFile, Rotate, SaveQuality, SaveToFile, TJpegGraphic
+  方法描述:處理工具列按鈕點擊,執行影像旋轉 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
+  引用相依:LoadFromFile, Rotate, SaveQuality, SaveToFile, TJpegGraphic
+  方法描述:處理工具列按鈕點擊,執行影像順時針旋轉 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;
+
+

--
Gitblit v1.8.0