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/popupMenu.pas | 2020 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 2,020 insertions(+), 0 deletions(-)

diff --git a/reassemble/view/popupMenu.pas b/reassemble/view/popupMenu.pas
new file mode 100644
index 0000000..9611e18
--- /dev/null
+++ b/reassemble/view/popupMenu.pas
@@ -0,0 +1,2020 @@
+{ ==============================================================================
+  方法名稱:PM401Click
+  引用相依:FileExists, GetNoNameCase, LoadFromFile, RenameFile, SaveToFile, Str
+            2Dir
+  方法描述:影像列表右鍵選單功能:從指定頁面分出新案。確認使用者選取的分案起點(不
+            能為第一頁)後,取得新的流水案號並建立目錄。將原案件中該頁碼之後的所有
+            影像檔案更名並搬移至新案目錄,同步更新原案與新案的 Context.dat 與 Cas
+            eIndex.dat。完成後重新載入影像列表並提示完成。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM401Click(Sender: TObject);
+var
+  i : Integer;
+  FromIndex : Integer;
+  CaseID : String;
+  NewPath : String;
+  OldName,NewName:String;
+  S : TStringlist;
+begin
+  S := TStringlist.Create;
+  try
+    FromIndex := PageLv.ItemIndex;
+    if FromIndex = 0 then
+    begin
+      Showmessage(_Msg('不能從第1頁分案'));
+      Exit;
+    end;
+
+    If MessageDlg(Format(_Msg('是否確定從%d頁分出新案'),[PageLV.ItemIndex+1]),Mtconfirmation,[mbyes,mbcancel],0) = mrcancel Then Exit;
+    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+    CaseID := GetNoNameCase(ImageSavePath);
+    NewPath := ImageSavePath + CaseID+'\';
+    Str2Dir(NewPath);
+    for i := FromIndex to ContextList.Count - 1 do
+    begin
+      OldName := ContextList.Strings[i];
+      //NewName := Add_Zoo(S.Count+1,3)+Copy(OldName,4,length(OldName)-3);
+      NewName := Add_Zoo(S.Count+1,3)+FileName2NoQuene_Filename(OldName);
+
+      ReNameFile(DisplayPath+OldName,NewPath+NewName);
+      S.Add(NewName);
+      S.SaveToFile(NewPath+'Context.dat');
+    end;
+    for i := ContextList.Count - 1 downto FromIndex do
+    begin
+      ContextList.Delete(i);
+      ContextList.SaveToFile(DisplayPath+'Context.dat');
+    end;
+    SetCaseList('I',MyTreeNode1.IndexOf(MyTreeNode2)+1,CaseID);
+    if FileExists(DisplayPath+'CaseIndex.dat') then  //把原經辦代號取出來再寫入新件裡
+    begin
+      S.LoadFromFile(DisplayPath+'CaseIndex.dat');
+    end;
+    DisplayPath := '';
+
+    ClearCaseIndex;
+    WriteCaseIndex(NewPath);
+  finally
+  S.Free;
+  end;
+  LoadImgFile;
+  Showmessage(_Msg('分案完成'));
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM402Click
+  引用相依:
+  方法描述:將影像列表(PageLV)中的所有項目設為選取狀態。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM402Click(Sender: TObject);
+var
+  i : Integer;
+begin
+  for i := 0 to PageLV.Items.Count - 1 do
+  begin
+    PageLV.Items.Item[i].Selected := True;
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM403Click
+  引用相依:
+  方法描述:將影像列表(PageLV)中的所有項目設為取消選取狀態。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM403Click(Sender: TObject);
+var
+  i : Integer;
+begin
+  for i := 0 to PageLV.Items.Count - 1 do
+  begin
+    PageLV.Items.Item[i].Selected := False;
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM404Click
+  引用相依:
+  方法描述:影像列表右鍵選單功能:文件歸類。開啟 TDocListForm 顯示可用的表單清單供
+            使用者選擇。確認後根據當前 TreeView 的選取層級(案件級別、文件級別或特
+            定表單),呼叫 PageReplaceFormID 將影像重新歸類至選定的表單類型。歸類完
+            成後重新繪製樹狀結構並清空檢核記錄,最後回到原先選取的節點。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM404Click(Sender: TObject);
+var
+  i : Integer;
+  DocListForm : TDocListForm;
+  OldName,NewName,Ext : String;
+  FormID,FormName : String;
+  PreNode2Name : String;
+begin
+  PreNode2Name := '';
+  if TreeView1.Selected.Parent = MyTreeNode1 then
+    PreNode2Name:= GetNode2Name(MyTreeNode2);
+  ShowText := _Msg('文件歸類中,請稍候');
+  DataLoading(True,True);
+  DocListForm := TDocListForm.Create(self);
+  try
+    InitialLanguage(PatchDlg); //載入多國語言
+    for i := 1 to FORM_INF_List.Count - 1 do
+    begin
+      FormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
+      FormName := GetSQLData(FORM_INF_List,'T1.FORM_DESC',i);
+      if (FormID <> NowFormCode) and FormIDExists(FormID,True,0) then
+      begin
+        DocListForm.FormIDList.Add(FormID+'#@#'+FormName);
+        With DocListForm.DocLV.Items.Add do
+        begin
+          Caption := FormID;
+          SubItems.Add(FormName);
+        end;
+      end;
+    end;
+
+    if DocListForm.ShowModal = mrOk then
+    begin
+      FormID := DocListForm.DocLV.Selected.Caption;
+      if (TreeView1.Selected.Level=1) then
+      begin
+        PageReplaceFormID(DisplayPath,'ALL',FormID);
+      end
+      Else if (TreeView1.Selected.Level=2) and (NowFormCode = '') then
+        PageReplaceFormID(DisplayPath,'',FormID)
+      Else
+      begin
+        PageReplaceFormID(DisplayPath,NowFormCode,FormID);
+      end;
+      //DrawDocItem(MytreeNode1,FORM_INF_List,NowCaseno);
+      //DrawDocItem1(MytreeNode1,Doc_Inf_List,NowCaseno);  //201408280改
+      DrawDocItem2(MytreeNode1,NowCaseno);
+      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+      //Showmessage(_Msg('歸類完成'));  //20101103 User要求拿掉
+      if PreNode2Name <> '' then  // 回到原本點選的文件節點上
+      begin
+        for i := 0 to MyTreeNode1.Count - 1 do
+        begin
+          if GetNode2Name(MyTreeNode1.Item[i]) = PreNode2Name then
+          begin
+            TreeView1.Selected := MyTreeNode1.Item[i];
+            Break;
+          end;
+        end;
+      end;
+      TreeView1click(self);
+    end;
+  finally
+  DocListForm.Free;
+  DataLoading(False,False);
+  end;
+
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM601Click
+  引用相依:CopyFile, DeleteImageFile, DirectoryExists, FileExists, LoadFromFile
+            , ReSortFileName, RenameFile, SaveToFile
+  方法描述:縮圖瀏覽區右鍵選單功能:文件歸類。針對所有被選取(由 Shape 標記)的影像,
+            開啟 TDocListForm 選擇目標表單。核心邏輯包含:判斷目標文件是否需要區分
+            份數、自動產生新的文件目錄或沿用既有目錄、根據檔案序號產生新檔名、執行
+            檔案複製並更新 ContextList。最後刪除原檔案、重新排序原目錄並重新繪製樹
+            狀結構。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM601Click(Sender: TObject);
+var
+  i : Integer;
+  DocListForm : TDocListForm;
+  OldName,NewName,Ext : String;
+  FormID,FormName,DocNo,DocDir : String;
+  PreNode2Name : String;
+  iFormID : String;
+  iISBName : String;
+  iISB : TImageScrollBox;
+  GoAtt : Boolean;
+  AttLv : Integer;
+  ST1 :TStringList;
+begin
+  PreNode2Name := '';
+  ST1:=TStringList.Create;
+  if TreeView1.Selected.Parent = MyTreeNode1 then
+    PreNode2Name:= GetNode2Name(MyTreeNode2);
+  ShowText := _Msg('文件歸類中,請稍候');
+LogFile1.LogToFile(logTimeString+'縮圖  歸類開始');
+  DataLoading(True,True);
+  GoAtt := False;
+  if (MytreeNode2 <> nil) and (Pos('Attach',MyTreeNode2.Text)>0) then
+  begin
+    AttLv := TreeView1.Selected.Level;
+    GoAtt := True;
+  end;
+  DocListForm := TDocListForm.Create(self);
+  try
+    InitialLanguage(DocListForm); //載入多國語言
+    //InitialLanguage(PatchDlg); //載入多國語言
+    DocListForm.CheckBox1.Visible:=False;
+    for i := 1 to FORM_INF_List.Count - 1 do
+    begin
+      FormID :=  GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
+      FormName := GetSQLData(FORM_INF_List,'T1.FORM_DESC',i);
+      DocNo := GetSQLData(FORM_INF_List,'T1.DOC_NO',i)+GetSQLData(FORM_INF_List,'T1.DOC_VERSION',i);
+      if not FormIDAppear(FormID) then Continue;   //20170816 先秀全部
+
+      //Showmessage(FORM_INF_List.Text);
+      //showmessage(inttostr(FORM_INF_List.Count)+#13+inttostr(self.Doc_Inf_List.Count));
+      if (FormID <> FileName2FormCode(DisplayISB.FileName)) and FormIDExists(FormID,False,i) then
+      begin
+        DocListForm.FormIDList.Add(FormID+'#@#'+FormName);
+        With DocListForm.DocLV.Items.Add do
+        begin
+          Caption := FormID;
+          SubItems.Add(FormName);
+        end;
+      end;
+    end;
+    if DocListForm.ShowModal = mrOk then
+    begin
+      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));
+          OldName := ExtractFileName(iISB.FileName);
+          Ext := ExtractFileExt(OldName);
+
+          if DocListForm.CheckBox1.Checked then
+          begin
+            FormID := DocListForm.Edit1.Text;
+            DocNo := GetNewCustomDocNo(DisplayPath,FormID);
+          end
+          else
+          begin
+            FormID := DocListForm.DocLV.Selected.Caption;
+            DocNo := FormCode2DocNo(FormID);
+          end;
+
+
+          if DocNoDir2DocNo(Path2DocDir(ExtractFilePath(iISB.FileName),NowCaseno)) = DocNo then
+            DocDir := Path2DocDir(ExtractFilePath(iISB.FileName),NowCaseNo)
+          Else
+            DocDir := FindLastestDocDir(NowCaseno,DocNo);
+
+//ShowMessage('DocNoNeedDiv(DocNo)='+BoolToStr(DocNoNeedDiv(DocNo),true));
+//ShowMessage('DocDir='+DocDir);
+
+          if DocNoNeedDiv(DocNo) then   //要分份數
+          begin
+            if ((FormCode2Page(FormID) = '01') and (GetDocDir_Page(NowCaseno,DocDir)>0)) or (DocDir = '') then
+            begin
+              DocDir := DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',DocNo);
+            end
+            else
+            begin //20171016  真對補件影響 所加的判斷
+              ST1.Clear;
+              if FileExists(ImageSavePath + NowCaseno+'\'+DocDir+'\Context.dat') then
+              begin
+                ST1.LoadFromFile(ImageSavePath + NowCaseno+'\'+DocDir+'\Context.dat');
+                if (ST1.Count > 0) and ISExistImg(ImageSavePath + NowCaseno+'\'+DocDir+'\'+ST1.Strings[0]) then   //20181210 多增加判斷ST1>0 否則會有機會出現List out of bound  Hong
+                begin
+                  DocDir := DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',DocNo);
+                end;
+              end;
+            end;
+          end
+          Else        //不分份數
+          begin
+            if DocNo <> '' then
+              DocDir := DocNo
+            else      //Attach 附件
+              DocDir := DocNo2DocNoDir(ImageSavePath + NowCaseno+'\',DocNo);
+          end;
+          if (not DirectoryExists(ImageSavePath + NowCaseno+'\'+DocDir+'\')) and (DocDir <> AttName) then
+            SetDocNoList('A',-1,NowCaseno,DocDir,'1');
+
+          {if DocDir = '' then
+          begin
+            DocDir := DocNo;
+            if DocNoNeedDiv(DocNo) then
+              DocDir:=DocNo2DocNoDir(ImageSavePath+NowCaseno+'\',DocNo);
+            SetDocNoList('A',-1,NowCaseno,DocDir);
+          end; }
+LogFile1.LogToFile(logTimeString+'縮圖  FormID='+FormID);
+          if Not DirectoryExists(ImageSavePath+NowCaseno+'\'+DocDir) then
+            Mkdir(ImageSavePath+NowCaseno+'\'+DocDir);
+          ContextList.Clear;
+          if FileExists(ImageSavePath+NowCaseno+'\'+DocDir+'\Context.dat') then
+            ContextList.LoadFromFile(ImageSavePath+NowCaseno+'\'+DocDir+'\Context.dat');
+          NewName := Add_Zoo(ContextList.Count+1,3)+'_'+FormID+Ext;
+          CopyFile(PWideChar(iISB.FileName),PwideChar(ImageSavePath+NowCaseno+'\'+DocDir+'\'+NewName),False);
+          {ContextList.Add(NewName);
+          ContextList.SaveToFile(ImageSavePath+NowCaseno+'\'+DocDir+'\Context.dat'); }
+          SetContextList('A',-1,NowCaseNo,DocDir,NewName);
+          DeleteImageFile(ExtractFilePath(iISB.FileName),ExtractFileName(iISB.FileName),NowCaseNo);
+          //RenameFile(iISB.FileName,ImageSavePath+NowCaseno+'\'+DocDir+'\'+NewName);
+          //ReNameContext(iISB.FileName,OldName,NewName);
+        end;
+      end;
+//ShowMessage('KKKK');
+      ReSortFileName(ExtractFilePath(iISB.FileName));
+      DrawDocItem2(MytreeNode1,NowCaseno);
+      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+
+      if GoAtt then
+      begin
+        GotoAttach(AttLv);
+      end;
+      TreeView1click(self);
+
+    end;
+  finally
+  DataLoading(False,False);
+  DocListForm.Free;
+  ST1.Free;
+  end;
+
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM602Click
+  引用相依:CopyFile, DeleteImageFile, FileExists, LoadFromFile, ReSortFileName,
+             SaveToFile, Str2Dir
+  方法描述:縮圖瀏覽區右鍵選單功能:歸類至自定義文件。彈出對話框要求使用者輸入新文
+            件名稱,檢核名稱是否重複後產生新的自定義文件編號。接著將所有選取的影像
+            複製到新建立的文件目錄下,更新 ContextList並刪除原檔案。最後重新排序並
+            刷新樹狀顯示。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM602Click(Sender: TObject);
+var
+  FileList:TStringlist;
+  SavePath : String;
+  DocDir : String;
+  CustomDocName : String;
+  CustomDocNo : String;
+  i : Integer;
+  OldName,NewName,Ext : String;
+  FormID,FormName,DocNo : String;
+  PreNode2Name : String;
+  iFormID : String;
+  iISBName : String;
+  iISB : TImageScrollBox;
+  GoAtt : Boolean;
+  AttLv : Integer;
+begin
+  GoAtt := False;
+  if (MytreeNode2 <> nil) and (Pos('Attach',MyTreeNode2.Text)>0) then
+  begin
+    AttLv := TreeView1.Selected.Level;
+    GoAtt := True;
+  end;
+
+  if InputQuery(_Msg('輸入其他文件名稱'),_Msg('文件名稱'),CustomDocName) then
+  begin
+    if FindCustomDocName(DisplayPath,CustomDocName) then
+    begin
+      Showmessage(Format(_Msg('文件名稱:"%s"己存在'),[CustomDocName]));
+      Exit;
+    end;
+    CustomDocNo := GetNewCustomDocNo(DisplayPath,CustomDocName);
+  end;
+  if CustomDocNo = '' then Exit;
+  DocDir := CustomDocNo;
+LogFile1.LogToFile(logTimeString+'縮圖 歸類自訂文件 DocDir='+DocDir);
+  SavePath := ImageSavePath+NowCaseNo+'\'+DocDir+'\';
+  Str2Dir(SavePath);
+  SetDocNoList('A',-1,NowCaseNo,DocDir,'1');
+  FileList := TStringlist.Create;
+  try
+  FileList.Clear;
+  if FileExists(SavePath+'Context.dat') then
+    FileList.LoadFromFile(SavePath+'Context.dat');
+
+    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));
+        OldName := ExtractFileName(iISB.FileName);
+        Ext := ExtractFileExt(OldName);
+        NewName := Add_Zoo(FileList.Count+1,3)+'_'+GetCustomFormID(ImageSavePath+NowCaseNo+'\',CustomDocNo)+ext;
+
+        //Showmessage(iISB.FileName+#13+ImageSavePath+NowCaseno+'\'+DocDir+'\'+NewName);
+        CopyFile(PWideChar(iISB.FileName),PwideChar(ImageSavePath+NowCaseno+'\'+DocDir+'\'+NewName),False);
+        SetContextList('A',-1,NowCaseno,DocDir,NewName);
+        FileList.Add(NewName);
+        {FileList.Add(NewName);
+        FileList.SaveToFile(ImageSavePath+NowCaseno+'\'+DocDir+'\Context.dat');}
+        DeleteImageFile(ExtractFilePath(iISB.FileName),ExtractFileName(iISB.FileName),NowCaseNo);
+      end;
+    end;
+  finally
+  FileList.Free;
+  end;
+  ReSortFileName(ExtractFilePath(iISB.FileName));
+  DrawDocItem2(MytreeNode1,NowCaseno);
+  ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+
+  if GoAtt then
+  begin
+    GotoAttach(AttLv);
+  end;
+  TreeView1click(self);
+  MyTreeNode1.Expand(True);
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM604Click
+  引用相依:DeskewImg, LoadFromFile, SaveToFile
+  方法描述:縮圖瀏覽區右鍵選單功能:自動去偏斜(Deskew)。遍歷所有選取的影像元件,對
+            其 Graphic 執行 DeskewImg 操作,重新繪製並將結果存回原檔案。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM604Click(Sender: TObject);
+var
+  i : Integer;
+  iISBName : String;
+  iISB : TImageScrollBox;
+begin
+  //Showmessage(inttostr(ComponentCount));
+  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));
+      DeskewImg(iISB.Graphic);
+      iISB.Redraw(True);
+      iISB.SaveToFile(iISB.FileName);
+      DisplayISB.LoadFromFile(DisplayISB.FileName,1);
+    end;
+  end;
+  //TreeView1Click(nil);
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM605Click
+  引用相依:DeleteImageFile, ReSortFileName
+  方法描述:縮圖瀏覽區右鍵選單功能:刪除影像。在使用者確認後,遍歷所有選取的影像元
+            件,呼叫 DeleteImageFile 刪除實際檔案。刪除完成後,執行檔案重新排序(ReS
+            ortFileName),更新樹狀結構上的頁數統計文字,並刷新顯示。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM605Click(Sender: TObject);
+var
+  i : Integer;
+  iISBName,OldName : String;
+  iISB : TImageScrollBox;
+begin
+  if MessageDlg(_Msg('是否確定刪除??'),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
+
+  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));
+//ShowMessage('iISB.FileName='+iISB.FileName);
+//ShowMessage(ExtractFilePath(iISB.FileName)+','+ExtractFileName(iISB.FileName)+','+NowCaseNo);
+//      if (FMode = 'ESCAN') and (FModeName<>'異動件') then
+//      begin
+//        if ISExistImg(iISB.FileName) then
+//        begin
+//          ShowMessage(_Msg('此圖為非當次掃瞄,不可刪除'));
+//          Exit;
+//        end;
+//      end;
+LogFile1.LogToFile(logTimeString+'縮圖刪除 iISB.FileName='+iISB.FileName);
+      DeleteImageFile(ExtractFilePath(iISB.FileName),ExtractFileName(iISB.FileName),NowCaseNo);
+    end;
+  end;
+//ShowMessage('iISB.FileName='+iISB.FileName);
+  ReSortFileName(ExtractFilePath(iISB.FileName));
+  DrawDocItem2(MytreeNode1,NowCaseno);
+  MyTreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
+  NewTreeNodeRefresh;
+  ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+  TreeView1click(self);
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM101Click
+  引用相依:DeleteDocNoFile, DirectoryExists, _DelTree
+  方法描述:處理樹狀結構(TreeView)的右鍵刪除選單。根據選取的節點類型(新掃瞄件、案
+            件、文件或表單)執行不同範圍的刪除:包含刪除實體目錄、清空影像清單、更新
+            案件索引及檢核記錄。針對異動模式(ESCAN),若刪除後無影像則會重建空案件
+            以維持結構。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM101Click(Sender: TObject);
+var
+  P,v,v1,v2,ln,i : Integer;
+  iDocDir,iDocNo : String;
+begin
+LogFile1.LogToFile(logTimeString+'Tree 按下刪除');
+  if TreeView1.Selected = NewTreeNode then  //全刪  //新掃描件
+  begin
+LogFile1.LogToFile(logTimeString+'Tree 全部刪除');
+    If Messagedlg(_Msg('是否刪除所有案件?'),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
+    clearView(1);
+    Application.ProcessMessages;
+    _DelTree(ImageSavePath);
+    if (FMode = 'ESCAN') then
+    begin
+      MkDir(ImageSavePath+FCaseID);
+      CreateEmptyCase(ImageSavePath,FCaseID);
+    end;
+    LoadImgFile;
+    Showmessage(_Msg('刪除完成'));
+  end
+  Else if TreeView1.Selected = MyTreeNode1 then       //案件編號
+  begin
+LogFile1.LogToFile(logTimeString+'Tree 案件編號刪除 NowCaseno='+NowCaseno);
+    If Messagedlg(Format(_Msg('編號(%s)是否刪除?'),[NowCaseno]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
+    clearView(1);
+    Application.ProcessMessages;
+    if (FMode = 'ESCAN') then
+    begin
+      for i := 0 to MyTreeNode1.Count - 1 do
+      begin
+        MyTreenode2 := MyTreeNode1.Item[i];
+        v := Posend('{',MyTreenode2.Text);
+        v1 := Posend('}',MyTreenode2.Text);
+        v2 := posend('-',MyTreenode2.Text);
+        ln := length(MyTreenode2.Text);
+        iDocDir := Copy(MyTreeNode2.Text,v+1,v1-v-1);
+        iDocNo := DocNoDir2DocNo(iDocDir);
+        _DelTree(ImageSavePath+NowCaseno+'\'+iDocDir);
+        SetUseCase('D',ImageSavePath+NowCaseno+'\',iDocDir,'','');
+        SetDocNoList('D',-1,NowCaseNo,iDocDir,'');
+        if (Copy(iDocNo,1,5)='ZZZZZ') then   //20140703 刪除自定文件時要刪ini檔資料
+          DeleteCustomDocDir(ImageSavePath+NowCaseno+'\',iDocDir);
+
+      end
+    end
+    Else
+    begin
+      _DelTree(DisplayPath);
+      SetCaseList('D',NewTreeNode.IndexOf(MyTreeNode1),'');
+    end;
+    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+
+    if (FMode = 'ESCAN') then
+    begin
+      if not DirectoryExists(ImageSavePath+FCaseID) then
+      begin
+        MkDir(ImageSavePath+FCaseID);
+        CreateEmptyCase(ImageSavePath,FCaseID);
+      end;
+    end;
+    LoadImgFile;
+  end
+  Else if TreeView1.Selected = MyTreeNode2 then       //文件層
+  begin
+    If Messagedlg(Format(_Msg('文件(%s)是否刪除?'),[DocNo2DocName(NowCaseno,NowDocNo)]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
+    ClearView(1);
+    Application.ProcessMessages;
+//ShowMessage(NowDocDir);
+LogFile1.LogToFile(logTimeString+'Tree 文件層號刪除 NowDocDir='+NowDocDir);
+    if (Length(NowDocDir)=8) or (NowDocDir=AttName) then
+    begin
+//ShowMessage('DeleteDocNoFileForESCAN');
+      DeleteDocNoFileForESCAN(ImageSavePath+NowCaseno+'\'+NowDocDir,NowDocDir);
+    end
+    else
+    begin
+      _DelTree(ImageSavePath+NowCaseno+'\'+NowDocDir);
+      SetDocNoList('D',-1,NowCaseNo,NowDocDir,'');
+    end;
+    SetUseCase('D',ImageSavePath+NowCaseno+'\',NowDocDir,'','');
+
+    if (Copy(NowDocNo,1,5)='ZZZZZ') then   //20140703 刪除自定文件時要刪ini檔資料
+      DeleteCustomDocDir(ImageSavePath+NowCaseno+'\',NowDocDir);
+
+    DrawDocItem2(MytreeNode1,NowCaseno);
+    MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
+    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+    NewTreeNodeRefresh;
+
+  end
+  Else if TreeView1.Selected = MyTreeNode3 then       //FormID層
+  begin
+    If Messagedlg(Format(_Msg('文件(%s)是否刪除?'),[NowFormName]),mtconfirmation,[mbyes,mbcancel],0) = mrcancel then Exit;
+LogFile1.LogToFile(logTimeString+'Tree FormID層號刪除 NowFormCode='+NowFormCode);
+    DeleteFormCodeFile(NowCaseNo,NowDocDir,NowFormCode);
+    SetRecordEditedDocDir('A',NowCaseNo,NowDocDir);
+    DrawDocItem2(MytreeNode1,NowCaseno);
+    MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,GetCasePage(ImageSavePath,NowCaseNo)]);
+    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+    NewTreeNodeRefresh;
+
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM102Click
+  引用相依:DirectoryExists, RenameFile
+  方法描述:處理「修改案件編號」右鍵選單。彈出輸入盒要求輸入新編號並驗證長度與是否
+            重複。確認修改後,先清空當前影像顯示,接著執行磁碟目錄更名並更新案件清
+            單文字。最後重新繪製該案件的文件樹狀結構並提示完成。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM102Click(Sender: TObject);
+var
+  NewCaseID,ShowNewCaseID,ShowNowCaseID : String;
+  i,P,v : Integer;
+  InputOk : Boolean;
+begin
+  VMode := 0;
+  GoViewMode;
+  ISB1.ZoomMode := zmFitWidth;
+
+  NewCaseID := InputBox(_Msg('修改案件編號'),_Msg('新案件編號'),'');
+  ShowNewCaseID := NewCaseID;
+  ShowNowCaseID := NowCaseno;
+
+  if NewCaseID = '' then Exit;
+
+  IF Length(NewCaseID)<>CaseIDLength Then
+  begin
+    Showmessage(_Msg('輸入格式錯誤'));
+    Exit;
+  end;
+
+  if DirectoryExists(ImageSavePath+NewCaseID) then
+  begin
+    Showmessage(NewCaseID+_Msg('己存在,無法修改'));
+    Exit;
+  end;
+
+  if Messagedlg(Format(_Msg('是否將%s改為%s'),[ShowNowCaseID,ShowNewCaseID]),Mtconfirmation,[mbyes,mbcancel],0) = mrcancel then
+    Exit;
+  ClearView(1);
+  RenameFile(ImageSavePath+NowCaseno,ImageSavePath+NewCaseID);
+  SetCaseList('E',NewTreeNode.IndexOf(MyTreeNode1),NewCaseID);
+
+  //P := ContextList.Count;
+  MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NewCaseID,GetCasePage(ImageSavePath,NewCaseID)]);
+  //DrawDocItem(MyTreeNode1,FORM_INF_List,NewCaseID);
+  DrawDocItem2(MytreeNode1,NewCaseID);
+  Showmessage(_Msg('修改完成'));
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM103Click
+  引用相依:
+  方法描述:處理樹狀結構的「掃瞄/追加掃瞄」右鍵選單。根據選取的節點層級,決定是啟動
+            全新的案件掃瞄程序(NewScanBtnClick)或是針對現有案件進行追加掃瞄(AddS
+            canBtnclick),並在日誌中記錄操作行為。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM103Click(Sender: TObject);
+begin
+  if TreeView1.Selected = nil then Exit;
+
+  {if Treeview1.Selected = NewTreeNode then
+  begin
+    ShowMessage('AAAAA');
+  end;
+  if Treeview1.Selected = MyTreeNode1 then
+  begin
+    ShowMessage('BBBBB');
+  end;
+
+  if Treeview1.Selected = MyTreeNode2 then
+  begin
+    ShowMessage('CCCCC');
+  end;
+
+  if Treeview1.Selected = MyTreeNode3 then
+  begin
+    ShowMessage('DDDDD');
+  end;
+  }
+  if (Treeview1.Selected = NewTreeNode) {or (Treeview1.Selected = MyTreeNode1)} then
+  begin
+//ShowMessage('NewScanBtnClick');
+LogFile1.LogToFile(logTimeString+'Tree NewScanBtnClick');
+    NewScanBtnClick(self)
+  end
+  Else
+  begin
+//ShowMessage('AddScanBtnclick');
+LogFile1.LogToFile(logTimeString+'Tree AddScanBtnclick');
+    AddScanBtnclick(self);
+  end;
+end;
+
+
+
+{ ==============================================================================
+  方法名稱:PM104Click
+  引用相依:CheckNeedCrop, ConvertToBW, ConvertToGray, CropImg, DeskewImg, Direc
+            toryExists, FJpgCompression, FileExists, FindFirst, GetNoNameCase, L
+            oadFromFile, MpsGetBarcode, Rotate, SaveQuality, SaveToFile, Str2Dir
+            , TJpegGraphic, TTiffGraphic, _DelTree, ifBlackWhite, ifColor25, ifG
+            ray256, ifTrueColor, tcGroup4, tcJpeg
+  方法描述:處理「匯入影像檔案」右鍵選單。開啟檔案對話框選取 TIF/JPG/PNG 檔,並檢查
+            檔案大小是否超過限制。核心流程包含:計算總頁數、逐頁載入、執行自動去偏斜
+            (Deskew)、條碼辨識以判斷 FormID、處理 A3 切圖(左右分割)、將影像轉換為對
+            應格式(黑白轉 TIF G4,彩色/灰階轉 JPG)並寫入磁碟,最後更新索引、樹狀結
+            構與頁數統計。
+============================================================================== }
+Procedure TCB_IMGPSScanX.PM104Click(Sender: TObject);
+Var
+  i, n, m, ii, P, v, v1, page, imageCount: Integer;
+  FName: String;
+  CaseID, DocNo, FormID: String;
+  DocDir: String;
+  SavePath, SaveFilename: String;
+  ISB: TImageScrollBox;
+  FileRec: TSearchrec;
+
+  iGraphic, iGraphic_First, iGraphic_sec: TTiffGraphic;
+  iRect : TRect;
+  JpgGr : TJpegGraphic;
+  SaveStream     : TFileStream;
+  SaveStreamA:TFileStream;
+  SaveStreamB:TFileStream;
+  cooom:integer;
+Begin
+  OpenDialog1.Filter := 'Image files|*.TIF;*.JPG;*.PNG';
+  If OpenDialog1.Execute Then
+  Begin
+    ISB := TImageScrollBox.Create(self);
+try
+    ShowText := _Msg('檔案加入中,請稍候');
+LogFile1.LogToFile(logTimeString+'檔案加入中開始');
+    DataLoading(True, True);
+    If TreeView1.Selected = Nil Then
+      Exit;
+    FName := OpenDialog1.FileName;
+
+    FindFirst(FName, faAnyfile, FileRec);
+
+    If FFileSizeLimit = 0 Then
+    Begin
+      FFileSizeLimit := 5 * 1024;
+    End;
+//FFileSizeLimit:=20*5*1024;
+//ShowMessage(IntToStr(FileRec.Size)+','+IntToStr(FFileSizeLimit * 1024));
+    If FileRec.Size > FFileSizeLimit * 1024 Then // 檢查檔案大小
+    Begin
+      ShowMessage(Format(_Msg('目前檔案大小為 %.3f MB,已超過單一檔案匯入限制%1.f MB'),[FileRec.Size / (1024*1024),FFileSizeLimit/1024]));
+      {ShowMessage(Format('目前檔案大小為 %.3f MB', [FileRec.Size / (1024*1024)]) +
+        ',已超過單一檔案匯入限制'+Format('%.1f',[FFileSizeLimit/1024])+'MB');}
+      FindClose(FileRec);
+      DataLoading(false, false);
+      Exit;
+    End;
+    //MessageDlg()
+    //cooom:=StrToInt(InputBox('輸入百分比','輸入百分比',''));
+    cooom:=FJpgCompression;//20171211彩色tif採jpg壓縮的比例
+
+    FindClose(FileRec);
+    CaseID := NowCaseno;
+    imageCount := 0;
+    P := ISB.ImageCountFromFile(OpenDialog1.FileName);
+    For i := 1 To P Do
+    Begin
+      ShowText := Format(_Msg('檔案加入中,請稍候(%d/%d)'),[i,p]);
+      //ShowText := _Msg('檔案加入中,請稍候')+'(' + inttostr(i) + '/' + inttostr(P) + ')';
+      DataLoading(True, True);
+      ISB.LoadFromFile(FName, i);
+      DeskewImg(ISB.Graphic);
+
+
+      ISB_BW.Graphic.Assign(ISB.Graphic); //20180104
+      If ISB.Graphic.ImageFormat <> ifBlackWhite Then   //20180104
+      begin
+        ConvertToBW(ISB_BW.Graphic);
+      end;
+      ///ISB_BW.SaveToFile('KKKKKKKK.tif');
+
+      iGraphic_First := TTiffGraphic.Create;
+      iGraphic_sec := TTiffGraphic.Create;
+
+
+      //ShowMessage(IntToStr(iGraphic_First.Palette.palNumEntries)); //彩色 會為0  黑白 為2
+
+      MpsGetBarcode(ISB_BW.Graphic, MpsBarcodeinf); //判斷A3 有用FormID 所以要先辨條碼
+      For n := 1 To MpsBarcodeinf.Count Do
+      Begin
+        If (MpsBarcodeinf.r180[n] <> 0) and (Length(MpsBarcodeinf.Text[n])=FormIDLength) Then // 依條碼角度轉影像
+        Begin
+          Rotate(ISB.Graphic, MpsBarcodeinf.r180[n]);
+          //MpsGetBarcode(iGraphic_First, MpsBarcodeinf);
+          Break;
+        End;
+      End;
+
+      iGraphic_First.Assign(ISB.Graphic);
+      //有必要的話先把影像轉正 再開始切圖
+      If CheckNeedCrop(iGraphic_First) Then
+      Begin
+        // 先取右邊的影像
+        iRect.Left := ISB.Graphic.Width Div 2;
+        iRect.Right := ISB.Graphic.Width;
+        iRect.Top := 0;
+        iRect.Bottom := ISB.Graphic.Height;
+        CropImg(iGraphic_First, iRect);
+
+        iGraphic_sec.Assign(ISB.Graphic);
+        // 再取左邊的影像
+        iRect.Left := 0;
+        iRect.Right := ISB.Graphic.Width Div 2;
+        iRect.Top := 0;
+        iRect.Bottom := ISB.Graphic.Height;
+        CropImg(iGraphic_sec, iRect);
+      End;
+      ISB.Graphic.Clear;  //20220711  Hong 覺得ISB後面沒有到了,先清掉減少記憶體使用
+      iGraphic := iGraphic_First;
+
+      While Not iGraphic.IsEmpty Do
+      Begin
+        If (TreeView1.Selected = NewTreeNode) Or
+          (TreeView1.Selected = MyTreeNode1) Then
+        Begin
+          SaveFilename := '';
+          ISB_BW.Graphic.Assign(iGraphic); //20180104
+          If iGraphic.ImageFormat <> ifBlackWhite Then   //20180104
+          begin
+            ConvertToBW(ISB_BW.Graphic);
+          end;
+          MpsGetBarcode(ISB_BW.Graphic, MpsBarcodeinf);
+//ShowMessage(IntToStr(MpsBarcodeinf.Count));
+          For n := 1 To MpsBarcodeinf.Count Do
+          Begin
+            If (MpsBarcodeinf.r180[n] <> 0) and (Length(MpsBarcodeinf.Text[n])=FormIDLength) Then // 依條碼角度轉影像
+            Begin
+              Rotate(iGraphic, MpsBarcodeinf.r180[n]);
+              MpsGetBarcode(ISB_BW.Graphic, MpsBarcodeinf);
+              Break;
+            End;
+          End;
+//ShowMessage('XXX '+IntToStr(MpsBarcodeinf.Count));
+          FormID := BarCode2FormID;
+//ShowMessage('FormID='+FormID);
+          // 取出FormID
+          SaveFilename := FormID;
+          If (TreeView1.Selected = NewTreeNode) Then
+          Begin
+            If FindDivFormCode(FormID) Then // 只找分案頁上的案件條碼
+            Begin
+              imageCount := 0;
+              ClearView(1);
+              ContextList.Clear;
+              CaseID := BarCode2CaseID;
+              If DirectoryExists(ImageSavePath + CaseID + '\') Then
+              Begin
+                _DelTree(ImageSavePath + CaseID + '\');
+                SetCaseList('D', -1, CaseID);
+              End;
+            End;
+            If CaseID = '' Then
+            Begin
+              CaseID := GetNoNameCase(ImageSavePath);
+              ContextList.Clear;
+            End;
+          End;
+          SavePath := ImageSavePath + CaseID + '\';
+          Str2Dir(SavePath);
+
+          DocNo := FormCode2DocNo(FormID);
+          DocDir := FindLastestDocDir(CaseID, DocNo);
+          if (FMode='ESCAN') and (FModeName=_Msg('補件掃描')) then
+          begin
+            DocDir := FindLastestDocDirForPage(CaseID, DocNo,FormID);
+//ShowMessage('DocDir='+DocDir);
+          end;
+
+          If DocNoNeedDiv(DocNo) Then // 要分份數
+          Begin
+            If ((FormCode2Page(FormID) = '01') And
+              (GetDocDir_Page(CaseID, DocDir) > 0)) Or (DocDir = '') Then
+              begin
+                DocDir := DocNo2DocNoDir(ImageSavePath + CaseID + '\', DocNo);
+              end;
+          End
+          Else // 不分份數
+          Begin
+            If DocNo <> '' Then
+              DocDir := DocNo
+            Else // Attach 附件
+              DocDir := DocNo2DocNoDir(ImageSavePath + CaseID + '\', DocNo);
+          End;
+
+          If (Not DirectoryExists(ImageSavePath + CaseID + '\' + DocDir + '\'))
+            And (DocDir <> AttName) Then
+            SetDocNoList('A', -1, CaseID, DocDir, '1');
+          SavePath := ImageSavePath + CaseID + '\' + DocDir + '\';
+          Str2Dir(SavePath);
+          ContextList.Clear;
+          If FileExists(SavePath + 'Context.dat') Then
+            ContextList.LoadFromFile(SavePath + 'Context.dat');
+
+          WriteCaseIndex(ImageSavePath + CaseID + '\');
+          // 寫入案件索引
+          If SaveFilename = '' Then // 附件
+            SaveFilename := Add_Zoo(ContextList.Count + 1, 3) + ext
+          Else
+            SaveFilename := Add_Zoo(ContextList.Count + 1, 3) + '_' +
+              SaveFilename + ext;
+
+          For n := 1 To MpsBarcodeinf.Count Do
+          Begin
+            If (MpsBarcodeinf.r180[n] <> 0) and (Length(MpsBarcodeinf.Text[n])=FormIDLength) Then // 依條碼角度轉影像
+            Begin
+              Rotate(iGraphic, MpsBarcodeinf.r180[n]);
+              MpsGetBarcode(ISB_BW.Graphic, MpsBarcodeinf);
+              Break;
+            End;
+          End;
+//ShowMessage(IntToStr(iGraphic.Palette.palNumEntries));
+          if iGraphic.ImageFormat = ifBlackWhite then   //20200806 出現無法匯入,是因color256無法壓JPEG,待報會後再開啟
+          begin
+            SaveFilename := changefileext(SaveFilename,'.tif');    //20240320 Hong 調整黑白存tif
+            iGraphic.Compression:=tcGroup4;
+          end
+          else if iGraphic.ImageFormat= ifColor256 then
+          begin
+            SaveFilename := changefileext(SaveFilename,'.jpg');    //20240320 Hong 調整Color256存jpg
+            ConverttoGray(iGraphic);
+            iGraphic.Compression:=tcJPEG;
+            iGraphic.JpegQuality:=cooom;
+          end
+          else if (iGraphic.ImageFormat = ifTrueColor) or (iGraphic.ImageFormat = ifGray256) then
+          begin
+            SaveFilename := changefileext(SaveFilename,'.jpg');    //20240320 Hong 調整彩色灰階存jpg
+            iGraphic.Compression:=tcJPEG;
+            iGraphic.JpegQuality:=cooom;
+          end
+          else
+          begin
+            iGraphic.Compression:=tcLZW;
+          end;
+
+          {if (iGraphic.Palette.palNumEntries = 0) or (iGraphic.Palette.palNumEntries = 256) then  //20171130 彩色 會為0  黑白 為2  灰階256     //20200806拿掉
+          begin
+            iGraphic.Compression:=tcJPEG;
+            iGraphic.JpegQuality:=cooom;
+          end;}
+
+          If LowerCase(ExtractFileExt(SavePath + SaveFilename)) = '.tif' Then
+          Begin
+            If FileExists(SavePath + SaveFilename) Then
+              SaveStream := TFileStream.Create(SavePath + SaveFilename, fmOpenReadWrite)
+            Else
+              SaveStream := TFileStream.Create(SavePath + SaveFilename, fmCreate);
+            Try
+              SaveStream.Seek(0, soFromBeginning);
+              iGraphic.AppendToStream(SaveStream);
+            Finally
+              SaveStream.Free;
+            End;
+          End
+          Else If LowerCase(ExtractFileExt(SavePath + SaveFilename)) = '.jpg' Then
+          Begin
+            If FileExists(SavePath + SaveFilename) Then
+              DeleteFile(SavePath + SaveFilename);
+            // SaveStream := TFileStream.Create( PEFileName ,fmCreate );
+            JpgGr := TJpegGraphic.Create;
+            Try
+              JpgGr.Assign(iGraphic);
+              JpgGr.SaveQuality := 30;
+              // JpgGr.AppendToStream(SaveStream);
+              JpgGr.SaveToFile(SavePath + SaveFilename);
+            Finally
+              JpgGr.Free;
+              // SaveStream.Free;
+            End;
+          End;
+
+          SetContextList('A', -1, CaseID, DocDir, SaveFilename);
+          If (TreeView1.Selected = NewTreeNode) Then
+          Begin
+            If imageCount = 0 Then
+            Begin
+              SetCaseList('A', -1, CaseID);
+              MyTreeNode1 := TreeView1.Items.AddChild(NewTreeNode, CaseID);
+              MyTreeNode1.ImageIndex := 2;
+              MyTreeNode1.SelectedIndex := 2;
+              Application.ProcessMessages;
+            End;
+          End;
+          inc(imageCount);
+          // DrawDocItem1(MytreeNode1,Doc_Inf_List,CaseID);
+          // DrawDocItem(MyTreeNode1,FORM_INF_List,CaseID);
+        End
+        Else If TreeView1.Selected = MyTreeNode3 Then
+        Begin
+          SavePath := ImageSavePath + CaseID + '\' + NowDocDir + '\';
+          ContextList.Clear;
+          If FileExists(ImageSavePath + CaseID + '\' + NowDocDir +
+            '\Context.dat') Then
+            ContextList.LoadFromFile(ImageSavePath + CaseID + '\' + NowDocDir +
+              '\Context.dat');
+          If NowFormCode <> '' Then
+            SaveFilename := Add_Zoo(ContextList.Count + 1, 3) + '_' +
+              NowFormCode + ext
+          Else
+            SaveFilename := Add_Zoo(ContextList.Count + 1, 3) + ext;
+
+          For n := 1 To MpsBarcodeinf.Count Do
+          Begin
+            If MpsBarcodeinf.r180[n] <> 0 Then // 依條碼角度轉影像
+            Begin
+              Rotate(iGraphic, MpsBarcodeinf.r180[n]);
+              MpsGetBarcode(iGraphic, MpsBarcodeinf);
+              Break;
+            End;
+          End;
+
+          if (iGraphic.Palette.palNumEntries = 0) or (iGraphic.Palette.palNumEntries = 256) then  //20171130 彩色 會為0  黑白 為2
+          begin
+            iGraphic.Compression:=tcJPEG;
+            iGraphic.JpegQuality:=cooom;
+          end;
+
+          If LowerCase(ExtractFileExt(SavePath + SaveFilename)) = '.tif' Then
+          Begin
+            If FileExists(SavePath + SaveFilename) Then
+              SaveStream := TFileStream.Create(SavePath + SaveFilename,
+                fmOpenReadWrite)
+            Else
+              SaveStream := TFileStream.Create(SavePath + SaveFilename,
+                fmCreate);
+            Try
+              SaveStream.Seek(0, soFromBeginning);
+              iGraphic.AppendToStream(SaveStream);
+            Finally
+              SaveStream.Free;
+            End;
+          End
+
+          Else
+          Begin
+            If LowerCase(ExtractFileExt(SavePath + SaveFilename)) = '.jpg' Then
+            Begin
+              If FileExists(SavePath + SaveFilename) Then
+                DeleteFile(SavePath + SaveFilename);
+              // SaveStream := TFileStream.Create( PEFileName ,fmCreate );
+              JpgGr := TJpegGraphic.Create;
+              Try
+                JpgGr.Assign(iGraphic);
+                JpgGr.SaveQuality := cooom;
+                // JpgGr.AppendToStream(SaveStream);
+                JpgGr.SaveToFile(SavePath + SaveFilename);
+              Finally
+                JpgGr.Free;
+                // SaveStream.Free;
+              End;
+            End;
+
+          End;
+          // ISB.SaveToFile(SavePath+SaveFilename);
+          ContextList.Add(SaveFilename);
+          ContextList.SaveToFile(SavePath + 'Context.dat');
+        End;
+
+        if iGraphic = iGraphic_First then
+          iGraphic := iGraphic_Sec
+        else
+          iGraphic.Assign(nil);
+
+      End //While 結束
+
+    End;
+    ClearErrini(CaseID, MyTreeNode1);
+    // 清掉檢核記錄
+    If (TreeView1.Selected = MyTreeNode1) Or
+      (TreeView1.Selected = NewTreeNode) Then
+    Begin
+      LoadImgFile;
+    End
+    Else
+    Begin
+      DrawDocItem2(MyTreeNode1, CaseID);
+      // 長出文件名稱的樹並傳回是否有申請書的影像
+      page := GetCasePage(ImageSavePath, CaseID);
+      // ShowMessage('page='+IntToStr(page));
+      MyTreeNode1.Text := Format(_Msg('%s-%d頁'), [CaseID, page]);
+    End;
+    // ShowMessage('AAAA');
+    NewTreeNodeRefresh;
+    Application.ProcessMessages;
+    DataLoading(false, false);
+
+
+finally
+ISB.Free;
+iGraphic_First.Free;
+iGraphic_sec.Free;
+end;
+
+
+  End;
+End;
+
+
+
+
+{ ==============================================================================
+  方法名稱:PM106Click
+  引用相依:CopyFile, LoadFromFile, SaveToFile
+  方法描述:處理「複製文件」右鍵選單。開啟對話框供使用者選擇來源文件與目標案件。使用
+            者確認後,遍歷目標案件並將符合條件的來源影像複製到目標目錄下,同步產生
+            新的序號檔名、更新目標案件的 Context.dat 並清空其檢核記錄。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM106Click(Sender: TObject);
+var
+  i,n,x,v,v1 : Integer;
+  CopyFormID,Copy2Caseno,CopyFileName : String;
+  S : TStringlist;
+begin
+  ShowText := _Msg('複製文件中,請稍候');
+  DataLoading(True,True);
+  DocCopyForm := TDocCopyForm.Create(Self);
+  S := TStringlist.Create;
+  try
+    InitialLanguage(DocCopyForm); //載入多國語言
+    DocCopyForm.CopyFromGB.Caption := NowCaseno+DocCopyForm.CopyFromGB.Caption;
+    IF NewTreenode.Count = 1 Then
+    begin
+      Showmessage(_Msg('沒有其他可複製的文件'));
+      Exit;
+    end;
+    For i := 0 to MyTreeNode1.Count -1 do
+    begin
+      v := Pos('-',MyTreeNode1.Item[i].Text);
+      v1 := pos('{',MyTreeNode1.Item[i].Text);
+      if V1 > 0 then
+      begin
+        CopyFormID := Copy(MyTreeNode1.Item[i].Text,1,v-1);
+        DocCopyForm.CheckListBox1.Items.Add(CopyFormID);
+      end;
+    end;
+    For i := 0 to NewTreenode.Count -1 do
+    begin
+      v := Posend('-',NewTreeNode.Item[i].Text);
+      Copy2Caseno := Copy(NewTreeNode.Item[i].Text,1,v-1);
+      IF Copy2Caseno <> NowCaseno Then
+      begin
+        DocCopyForm.CheckListBox2.Items.Add(Copy2Caseno);
+      end;
+    end;
+
+    if DocCopyForm.ShowModal = mrok then
+    begin
+      If MessageDlg(_Msg('是否確定要將勾選的文件複製到勾選的編號裡?'),MtConfirmation,[Mbyes,mbcancel],0) = mrCancel Then
+        Exit;
+      ShowText := _Msg('複製中,請稍候');
+      DataLoading(True,True);
+      For i := 0 to DocCopyForm.CheckListBox2.Count -1 do
+      begin
+        IF DocCopyForm.CheckListBox2.Checked[i] Then
+        begin
+          S.Clear;
+          Copy2Caseno := DocCopyForm.CheckListBox2.Items.Strings[i];
+          ClearErrini(Copy2Caseno,MyTreeNode1);  //清掉檢核記錄
+          S.LoadFromFile(ImageSavePath + Copy2Caseno +'\Context.dat');
+          For n := 0 to DocCopyForm.CheckListBox1.Count -1 do  //文件
+          begin
+            If DocCopyForm.CheckListBox1.Checked[n] Then
+            begin
+              //v:= Posend('{',DocCopyForm.CheckContextList.Strings[n]);
+              //v1 := Posend('}',DocCopyForm.CheckContextList.Strings[n]);
+              //CopyFormID := Copy(DocCopyForm.CheckContextList.Strings[n],1,v-1);
+              CopyFormID := DocCopyForm.CheckListBox1.Items.Strings[n];
+              IF v = 0 Then
+                CopyFormID := '';
+              For x := 0 to ContextList.Count -1 do
+              begin
+                //Showmessage(CopyFormCode);
+                //IF CopyFormID <> '' then   //有文件代號
+               // begin
+                  if FileName2FormCode(ContextList.Strings[x])=CopyFormID  then
+                  begin
+                    //CopyFileName := Add_Zoo(S.Count+1,3)+ Copy(ContextList.Strings[x],4,length(ContextList.Strings[x])-3);
+                    CopyFileName := Add_Zoo(S.Count+1,3)+ FileName2NoQuene_Filename(ContextList.Strings[x]);
+                    CopyFile(PWideChar(DisplayPath+ContextList.Strings[x]),PWidechar(ImageSavePath + Copy2Caseno+'\'+CopyFileName),False);
+                    S.Add(CopyFileName);
+                    S.SaveToFile(ImageSavePath + Copy2Caseno +'\Context.dat');
+                  end;
+               // end
+
+              end;
+            end;
+          end;
+
+        end;
+      end;
+      DataLoading(False,False);
+      Showmessage(_Msg('複製完成!!'));
+      LoadImgFile;
+    end;
+  finally
+  DocCopyForm.Free;
+  DataLoading(False,False);
+  S.Free;
+  end;
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM107Click
+  引用相依:
+  方法描述:觸發右鍵選單中的備註點擊事件。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM107Click(Sender: TObject);
+begin
+  WNoteBtnClick(nil);
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM108Click
+  引用相依:
+  方法描述:處理樹狀結構的「文件歸類」右鍵選單。開啟對話框顯示表單清單,使用者可選擇
+            歸類至既有文件或新增自定義文件。若為自定義,則驗證名稱後取得新編號。隨
+            後執行 FormIDReplace 搬移影像檔案、更新索引、清空檢核記錄並刷新樹狀結
+            構顯示。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM108Click(Sender: TObject);
+var
+  i : Integer;
+  DocListForm : TDocListForm;
+  OldName,NewName,Ext : String;
+  NewFormID,NewFormName,CustomDocNo : String;
+begin
+  DocListForm := TDocListForm.Create(self);
+  try
+LogFile1.LogToFile(logTimeString+'Tree 歸類開始');
+    InitialLanguage(DocListForm); //載入多國語言
+    DocListForm.CheckBox1.Visible:=True;
+    for i := 1 to FORM_INF_List.Count - 1 do
+    begin
+      NewFormID := GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
+      NewFormName := GetSQLData(FORM_INF_List,'T1.FORM_DESC',i);
+      if not FormIDAppear(NewFormID) then Continue;   //20170816 先秀全部的
+      if (NewFormID <> FileName2FormCode(DisplayISB.FileName)) and FormIDExists(NewFormID,False,i) then
+      begin
+        DocListForm.FormIDList.Add(NewFormID+'#@#'+NewFormName);
+        With DocListForm.DocLV.Items.Add do
+        begin
+          Caption := NewFormID;
+          SubItems.Add(GetSQLData(FORM_INF_List,'T1.FORM_DESC',i));
+        end;
+      end;
+    end;
+    if DocListForm.ShowModal = mrOk then
+    begin
+      if not (DocListForm.DocLV.Selected=nil) then
+         NewFormID := DocListForm.DocLV.Selected.Caption;
+      if DocListForm.CheckBox1.Checked then
+      begin
+        //歸類到自訂文件
+        NewFormID:=DocListForm.Edit1.Text;
+
+        if Trim(DocListForm.Edit1.Text)='' then
+        begin
+          Showmessage(_Msg('未輸入文件名稱'));
+          Exit;
+        end;
+        if FindCustomDocName(DisplayPath,NewFormID) then
+        begin
+          Showmessage(Format(_Msg('文件名稱:"%s"己存在'),[NewFormID]));
+          Exit;
+        end;
+        if NowFormCode <> AttName then
+        begin
+          If Messagedlg(Format(_Msg('是否將"%s"的所有影像歸類成"%s"'),[FormCode2FormName(NowCaseNo,NowFormCode),NewFormID]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel Then
+            Exit;
+        end
+        Else
+        begin
+          If Messagedlg(Format(_Msg('是否將"%s"的所有影像歸類成"%s"'),[_Msg('附件')+MyTreeNode3.Text,FormCode2FormName(NowCaseNo,NewFormID)]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel Then
+            Exit;
+        end;
+        CustomDocNo := GetNewCustomDocNo(DisplayPath,NewFormID);
+//ShowMessage('CustomDocNo='+CustomDocNo);
+LogFile1.LogToFile(logTimeString+'Tree 歸類到自訂文件 CustomDocNo='+CustomDocNo);
+        ShowText := _Msg('歸類中,請稍侯');
+        DataLoading(True,True);
+        FormIDReplace(NowCaseNo,NowDocDir,NowFormCode,CustomDocNo+'010101A');
+      end
+      else
+      begin
+        //歸類到既有文件
+        if NowFormCode <> AttName then
+        begin
+          If Messagedlg(Format(_Msg('是否將"%s"的所有影像歸類成"%s"'),[FormCode2FormName(NowCaseNo,NowFormCode),FormCode2FormName(NowCaseNo,NewFormID)]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel Then
+            Exit;
+        end
+        Else
+        begin
+          If Messagedlg(Format(_Msg('是否將"%s"的所有影像歸類成"%s"'),[_Msg('附件')+MyTreeNode3.Text,FormCode2FormName(NowCaseNo,NewFormID)]),MtConfirmation,[mbyes,mbcancel],0) = mrcancel Then
+            Exit;
+        end;
+        ShowText := _Msg('歸類中,請稍侯');
+        DataLoading(True,True);
+//ShowMessage('NowDocDir='+NowDocDir);
+LogFile1.LogToFile(logTimeString+'Tree 歸類到既有文件 NewFormID='+NewFormID);
+        FormIDReplace(NowCaseNo,NowDocDir,NowFormCode,NewFormID);
+
+      end;
+      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+      DrawDocItem2(MytreeNode1,NowCaseno);
+      DataLoading(False,False);
+      TreeView1.Selected := MyTreeNode1;
+      TreeView1Click(self);
+    end;
+
+  finally
+  DocListForm.Free;
+  end;
+
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM109Click
+  引用相依:SaveToFile
+  方法描述:處理「案件 OMR 檢核」右鍵選單。清空當前顯示並開啟檢核進度,呼叫 OMRCheck
+            Case 對案件執行光學劃記辨識檢核。若檢核成功則建立 OMRCheckOk.dat 標記
+            檔,最後重新載入影像、刷新樹狀結構並提示檢核完成。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM109Click(Sender: TObject);
+var
+  S : TStringlist;
+  CaseID : String;
+begin
+  //if TreeView1.Selected = nil then Exit;
+  //if TreeView1.Selected = NewTreeNode then Exit;
+  CaseID := NowCaseno;
+  S := TStringlist.Create;
+  try
+    ClearView(1);
+    ShowText := CaseID+_Msg('檢核中,請稍候');
+    DataLoading(True,True);
+    ShowText := CaseID+_Msg('檢核中,請稍候');
+    DataLoading(True,True);
+    If OMRCheckCase(CaseID) then  //有成功
+    begin
+      S.Add('Y');
+      S.SaveToFile(ImageSavePath+CaseID+'\OMRCheckOk.dat');
+    end;
+      //MyTreeNode2ReFresh(CaseID);
+    LoadImgFile;
+    TreeView1Click(nil);
+    DataLoading(False,False);
+  finally
+  S.Free;
+  end;
+  Showmessage(_Msg('檢核完成'));
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM110Click
+  引用相依:Str2Dir
+  方法描述:處理「新增其他文件」右鍵選單。彈出對話框要求輸入自定義名稱,驗證無誤後產
+            生新的文件編號並在案件目錄下建立實體子目錄。隨後將新目錄加入清單並重
+            新繪製樹狀結構,最後自動展開新建立的節點。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM110Click(Sender: TObject);
+var
+  CustomDocName : String;
+  CustomDocNo : String;
+  DocDir : String;
+  SavePath : String;
+  ST1:TStringList;
+begin
+  if InputQuery(_Msg('輸入其他文件名稱'),_Msg('文件名稱'),CustomDocName) then
+  begin
+    if CustomDocName <> '' then
+    begin
+      if FindCustomDocName(DisplayPath,CustomDocName) then
+      begin
+        Showmessage(Format('文件名稱:"%s"己存在',[CustomDocName]));
+        Exit;
+      end;
+      ST1:=TStringList.Create;
+      CustomDocNo := GetNewCustomDocNo(DisplayPath,CustomDocName);
+      DocDir := CustomDocNo;
+      SavePath := ImageSavePath+NowCaseNo+'\'+DocDir+'\';
+      Str2Dir(SavePath);
+      SetDocNoList('A',-1,NowCaseNo,DocDir,'1');
+      DrawDocItem2(MytreeNode1,NowCaseno);
+      MyTreeNode1.Expand(True);
+    end;
+  end;
+
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM111Click
+  引用相依:
+  方法描述:處理「修改文件份數」右鍵選單。取得當前份數並供使用者修改(範圍 1-9999)。
+            若份數有變動則執行驗證(如分份文件限制),確認後更新 SetDocDirCopies 設
+            定並標記文件已編輯,最後刷新樹狀結構統計。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM111Click(Sender: TObject);
+var
+  oldCopies,NewCopies : Integer;
+  copies : String;
+begin
+  oldCopies := GetDocDirCopies(NowCaseno,NowDocDir);
+  try
+    NewCopies := Strtoint(inputBox(_Msg('修改份數'),_Msg('請輸入修改後的份數'),inttostr(oldCopies)));
+  except
+    Showmessage(_Msg('輸入錯誤'));
+    Exit;
+  end;
+  if (NewCopies <= 0) and (NewCopies >= 10000) then
+  begin
+    Showmessage(_Msg('輸入範圍錯誤'));
+    Exit;
+  end;
+
+  if (oldCopies <> NewCopies) and (NewCopies > 0) and (NewCopies < 10000) then
+  begin
+    if DocNoNeedDiv(NowDocNo) and (NewCopies = 1) and (MessageDlg(_Msg('修改至1份後此文件將無法再進行份數修改,是否確定??'),mtConfirmation,[mbyes,mbcancel],0)= mrcancel) then
+      Exit;
+
+    SetDocDirCopies(NowCaseno,NowDocDir,NewCopies);
+    SetRecordEditedDocDir('A',NowCaseNo,NowDocDir);
+    DrawDocItem2(MytreeNode1,NowCaseno);
+    Showmessage(_Msg('修改完成'));
+  end;
+
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM301Click
+  引用相依:ifBlackWhite
+  方法描述:將掃瞄模式設定為黑白(ifBlackWhite)並指定副檔名為 .tif。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM301Click(Sender: TObject);
+begin
+  ScanColor := ifBlackWhite;
+  ScanDpi := Def_ScanDpi;
+  Ext := '.tif';
+  PM301.Checked := True;
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM302Click
+  引用相依:ifGray256
+  方法描述:將掃瞄模式設定為灰階(ifGray256)並指定副檔名為 .jpg。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM302Click(Sender: TObject);
+begin
+  ScanColor := ifGray256;
+  Ext := '.jpg';
+  ScanDpi := 200;
+  //Ext := '.tif';
+  PM302.Checked := True;
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM303Click
+  引用相依:ifTrueColor
+  方法描述:將掃瞄模式設定為全彩(ifTrueColor)並指定副檔名為 .jpg。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM303Click(Sender: TObject);
+begin
+  ScanColor := ifTrueColor;
+  Ext := '.jpg';     //20130326 yuu說理賠改存jpg
+  ScanDpi := 200;
+  //Ext := '.tif';
+  PM303.Checked := True;
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM501Click
+  引用相依:
+  方法描述:將影像縮放模式設為「符合寬度」並開啟反鋸齒。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM501Click(Sender: TObject);
+begin
+  DisplayISB.ZoomMode := zmFitWidth;
+  DisplayISB.AntiAliased := True;
+  SetScrollData(DisplayISB,DisplayISB.HorzScrollBar.Position,DisplayISB.VertScrollBar.Position,DisplayISB.ZoomPercent);
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM502Click
+  引用相依:
+  方法描述:將影像縮放模式設為「符合高度」並開啟反鋸齒。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM502Click(Sender: TObject);
+begin
+  DisplayISB.ZoomMode := zmFitHeight;
+  DisplayISB.AntiAliased := True;
+  SetScrollData(DisplayISB,DisplayISB.HorzScrollBar.Position,DisplayISB.VertScrollBar.Position,DisplayISB.ZoomPercent);
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM503Click
+  引用相依:
+  方法描述:將影像縮放模式設為「符合頁面」並開啟反鋸齒。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM503Click(Sender: TObject);
+begin
+  DisplayISB.ZoomMode := zmFittoPage;
+  DisplayISB.AntiAliased := True;
+  SetScrollData(DisplayISB,DisplayISB.HorzScrollBar.Position,DisplayISB.VertScrollBar.Position,DisplayISB.ZoomPercent);
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM504Click
+  引用相依:
+  方法描述:將影像縮放模式設為「原始大小」並開啟反鋸齒。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM504Click(Sender: TObject);
+begin
+  DisplayISB.ZoomMode := zmOriginalSize;
+  DisplayISB.AntiAliased := True;
+  SetScrollData(DisplayISB,DisplayISB.HorzScrollBar.Position,DisplayISB.VertScrollBar.Position,DisplayISB.ZoomPercent);
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM505Click
+  引用相依:StatrTwainScan
+  方法描述:處理「掃瞄替換此頁」右鍵選單。檢查當前影像後,設定掃瞄模式為 smReplace 
+            並指定儲存路徑與檔名為當前顯示之影像。啟動 StatrTwainScan 掃瞄以覆蓋
+            原檔案,完成後清空該案件的檢核記錄。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM505Click(Sender: TObject);
+begin
+  if DisplayISB.FileName = '' then Exit;
+  Panel1.Enabled := False;
+  Panel2.Enabled := False;
+  ScanMode := smReplace;
+  ScanInfo.ImageCount := 0;
+  ScanPath := DisplayPath;
+  ScanCaseno := '';
+  ScanSaveFilename := ExtractFileName(DisplayISB.FileName);
+  Try
+    StatrTwainScan;
+  Except
+    Panel1.Enabled := True;
+    Panel2.Enabled := True;
+  end;
+  Panel1.Enabled := True;
+  Panel2.Enabled := True;
+  ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM507Click
+  引用相依:RenameFile
+  方法描述:處理影像區域的「文件歸類」右鍵選單。彈出對話框供使用者選取目標表單,隨後
+            根據選取的 FormID 產生新的序號檔名。執行 RenameFile 進行實際更名並同
+            步更新 Context.dat。最後重新整理樹狀結構、清空檢核記錄並使焦點回到原文
+            件節點。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM507Click(Sender: TObject);
+var
+  i : Integer;
+  DocListForm : TDocListForm;
+  OldName,NewName,Ext : String;
+  FormID,FormName,DocNo : String;
+  PreNode2Name : String;
+  iFormID : String;
+begin
+  PreNode2Name := '';
+  if TreeView1.Selected.Parent = MyTreeNode1 then
+    PreNode2Name:= GetNode2Name(MyTreeNode2);
+  ShowText := _Msg('文件歸類中,請稍候');
+  DataLoading(True,True);
+  DocListForm := TDocListForm.Create(self);
+  try
+    InitialLanguage(PatchDlg); //載入多國語言
+    for i := 1 to FORM_INF_List.Count - 1 do
+    begin
+      FormID :=  GetSQLData(FORM_INF_List,'T1.FORM_ID',i);
+      FormName := GetSQLData(FORM_INF_List,'T1.FORM_DESC',i);
+      DocNo := GetSQLData(FORM_INF_List,'T1.DOC_NO',i)+GetSQLData(FORM_INF_List,'T1.DOC_VERSION',i);
+      //Showmessage(FORM_INF_List.Text);
+      //showmessage(inttostr(FORM_INF_List.Count)+#13+inttostr(self.Doc_Inf_List.Count));
+      if (FormID <> FileName2FormCode(DisplayISB.FileName)) and FormIDExists(FormID,False,i) then
+      begin
+        DocListForm.FormIDList.Add(FormID+'#@#'+FormName);
+        With DocListForm.DocLV.Items.Add do
+        begin
+          Caption := FormID;
+          SubItems.Add(FormName);
+        end;
+      end;
+    end;
+    if DocListForm.ShowModal = mrOk then
+    begin
+      OldName := ExtractFileName(DisplayISB.FileName);
+      Ext := ExtractFileExt(OldName);
+      //NewName := Copy(OldName,1,3)+'_'+TransRealFormID(DocListForm.DocLV.Selected.Caption)+Ext;
+      NewName := Add_Zoo(FileName2ScanPage(OldName),3)+'_'+DocListForm.DocLV.Selected.Caption+Ext;
+      RenameFile(DisplayPath+OldName,DisplayPath+NewName);
+      ReNameContext(DisplayPath,OldName,NewName);
+      //DrawDocItem1(MytreeNode1,Doc_Inf_List,NowCaseno);  //201408280改
+      DrawDocItem2(MytreeNode1,NowCaseno);
+      //DrawDocItem(MytreeNode1,FORM_INF_List,NowCaseno);
+      ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+      if PreNode2Name <> '' then  // 回到原本點選的文件節點上
+      begin
+        for i := 0 to MyTreeNode1.Count - 1 do
+        begin
+          if GetNode2Name(MyTreeNode1.Item[i]) = PreNode2Name then
+          begin
+            TreeView1.Selected := MyTreeNode1.Item[i];
+            Break;
+          end;
+        end;
+      end;
+      TreeView1click(self);
+      //Showmessage(_Msg('歸類完成')); //20101103 User要求拿掉
+    end;
+  finally
+  DataLoading(False,False);
+  DocListForm.Free;
+  end;
+
+end;
+
+
+
+{ ==============================================================================
+  方法名稱:PM508Click
+  引用相依:FileExists, LoadFromFile, ReSortFileName, SaveToFile, _DelTree
+  方法描述:處理影像區域的「刪除影像」右鍵選單。若案件僅剩一張影像則詢問是否刪除整
+            個案件目錄。否則,在確認後從影像清單中移除該項目、刪除實體檔案並呼叫 Re
+            SortFileName 重新排序。最後刷新樹狀統計文字、清空檢核記錄並更新顯示。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM508Click(Sender: TObject);
+var
+  P : Integer;
+  inx:Integer;
+begin
+  if DisplayISB.FileName = '' then Exit;
+  if (ContextList.Count = 1) and ((FMode = 'NSCAN') or (FMode = 'ASCAN') or (FMode = 'DSCAN') or (FMode = 'ISCAN') or (FMode = 'SSCAN') or (FMode = 'MSCAN') or (FMode = 'RI_SCAN')) then
+  begin
+    if Messagedlg(Format(_Msg('刪除後(%s)案件無影像,將刪除此案件,是否確定刪除?'),[NowCaseno]),mtconfirmation,[mbyes,mbcancel],0) = mrCancel then Exit;
+    _DelTree(DisplayPath);
+    SetCaseList('D',NewTreeNode.IndexOf(MyTreeNode1),'');
+    LoadImgFile;
+  end
+  Else
+  begin
+    if Messagedlg(_Msg('是否確定刪除?'),mtconfirmation,[mbyes,mbcancel],0) = mrCancel then Exit;
+    inx := ContextList.IndexOf(ExtractFileName(DisplayISB.FileName));
+    ContextList.Delete(inx);
+    ContextList.SaveToFile(ImageSavePath + NowCaseno+'\Context.dat');
+    Context_DocnoList.Delete(inx);
+    Context_DocnoList.SaveToFile(ImageSavePath + NowCaseno+'\Context_DocNo.dat');
+    DeleteFile(DisplayISB.FileName);
+    ReSortFileName(DisplayPath);
+    ContextList.LoadFromFile(ImageSavePath + NowCaseno+'\Context.dat');
+    Context_DocnoList.LoadFromFile(ImageSavePath + NowCaseno+'\Context_DocNo.dat');
+    if FileExists(ImageSavePath + NowCaseno+'\CustomDocNo.dat') then
+      Cust_DocNoList.LoadFromFile(ImageSavePath + NowCaseno+'\CustomDocNo.dat');
+    //DrawDocItem1(MytreeNode1,Doc_Inf_List,NowCaseno);  //201408280改
+    DrawDocItem2(MytreeNode1,NowCaseno);
+
+    //DrawDocItem(MytreeNode1,FORM_INF_List,NowCaseno);
+    P := ContextList.Count;
+    MytreeNode1.Text := Format(_Msg('%s-%d頁'),[NowCaseno,p]);
+    ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+    NewTreeNodeRefresh;
+    TreeView1Click(self);
+
+  end;
+  //Showmessage(_Msg('刪除完成'));  //20101101 User要求拿掉
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM509Click
+  引用相依:
+  方法描述:觸發「從此分案」功能,內部轉呼叫 PM401Click。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM509Click(Sender: TObject);
+begin
+  PM401Click(nil);
+end;
+
+
+{ ==============================================================================
+  方法名稱:PM510Click
+  引用相依:DeskewImg, SaveToFile
+  方法描述:對當前 Graphic 執行去偏斜處理後存回原檔案。
+============================================================================== }
+procedure TCB_IMGPSScanX.PM510Click(Sender: TObject);
+begin
+  DeskewImg(DisplayISB.Graphic);
+  DisplayISB.SaveToFile(DisplayISB.FileName);
+  ClearErrini(NowCaseno,MyTreeNode1);  //清掉檢核記錄
+end;
+
+
+{ ==============================================================================
+  方法名稱:PopupMenu1Popup
+  引用相依:
+  方法描述:處理樹狀結構右鍵選單彈出時的動態項目控制。根據選取節點的層級(根、案件、
+            文件、表單)與系統模式(如 FMode、FImgDelete 權限等)動態設定各項選單(刪
+            除、修改、掃瞄加入、歸類、檢核等)的可見度與可用性。例如在文件層會受影像引
+            用狀態限制刪除功能。
+============================================================================== }
+procedure TCB_IMGPSScanX.PopupMenu1Popup(Sender: TObject);
+begin
+  PM101.Visible := False;   //刪除
+  PM102.Visible := False;   //修改案件編號
+  PM103.Visible := False;   //掃瞄器加入影像
+  PM104.Visible := False;   //檔案加入影像
+  PM106.Visible := False;   //複製文件至其他編號
+  PM107.Visible := False;   //寫備註
+  PM108.Visible := False;   //歸類
+  PM109.Visible := False;   //檢核此筆
+  PM110.Visible := False;   //新增自訂文件
+  PM111.Visible := False;   //修改份數
+
+  if (FMode = 'SAMPLESCAN') then Exit;
+
+  if TreeView1.Selected = nil then Exit;
+  if TreeView1.Selected = NewTreeNode  then     //新掃瞄件
+  begin
+    if (FMode = 'NSCAN') then
+    begin
+//ShowMessage('AAAA');
+      PM101.Visible := True;   //刪除
+      PM103.Visible := True;   //掃瞄器加入影像
+      PM104.Visible := True;   //檔案加入影像
+    end;
+
+    if FModeName=_Msg('異動件') then
+    begin
+      PM101.Visible := True;
+    end;
+//    if FMode='ESCAN' then
+//    begin
+//      PM101.Visible := True;
+//    end;
+  end
+  Else if TreeView1.Selected = MyTreeNode1 then    //案件層
+  begin
+    PM101.Visible := True;   //刪除
+
+    if FImgDelete='Y' then
+    begin
+      PM101.Visible:=True;
+    end;
+    if FImgDelete='N' then
+    begin
+      PM101.Visible:=false;
+    end;
+
+    if FMode='ESCAN' then
+      PM101.Visible:=false;
+
+    if FModeName=_Msg('異動件') then
+    begin
+      PM101.Visible := True;
+    end;
+
+    if not CaseDelete_Enable(NowCaseno) then //
+      PM101.Enabled := False
+    else
+      PM101.Enabled := True;
+    PM103.Visible := True;   //掃瞄器加入影像
+    //PM107.Visible := True;   //寫備註
+    //PM109.Visible := True;   //檢核此筆
+//    if FCustDocYN <> 'N' Then
+//      PM110.Visible := True;   //新增自訂文件  20170914 先不在tree 中做自訂文件  讓user在縮圖做
+    PM104.Visible := True;   //檔案加入影像
+    if (FMode = 'NSCAN') then
+    begin
+      PM102.Visible := True;   //修改案件編號
+    end;
+//    if FMode='ESCAN' then
+//    begin
+//      PM101.Visible := True;
+//    end;
+  end
+  Else if TreeView1.Selected = MyTreeNode2 then    //文件層
+  begin
+    PM101.Visible := True;   //刪除
+    //PM107.Visible := True;   //寫備註
+    //PM109.Visible := True;   //檢核此筆
+//    if FCustDocYN <> 'N' Then
+//      PM110.Visible := True;   //新增自訂文件
+    if FImgDelete='Y' then
+    begin
+      PM101.Visible:=True;
+    end;
+    if FImgDelete='N' then
+    begin
+      PM101.Visible:=false;
+    end;
+
+    if FModeName=_Msg('異動件') then
+    begin
+      PM101.Visible := True;
+    end;
+
+    if GetUseCase('T',DisplayPath,NowDocDir) <> '' then   //沒有被引用走的
+      PM101.Enabled := False    //刪除
+    Else
+      PM101.Enabled := True;   //刪除
+    if ((GetDocDirCopies(NowCaseno,NowDocDir) > 1) or (not DocNoNeedDiv(NowDocNo)) or (Copy(NowDocNo,1,5)='ZZZZZ')) and (NowDocNo<> 'Attach') and (NowDocNo<> 'S_Attach') then
+      PM111.Visible := True;   //修改份數
+    if (FMode = 'NSCAN') then
+      PM102.Visible := True;   //修改案件編號
+//    if FMode='ESCAN' then
+//    begin
+//      PM101.Visible := True;
+//    end;
+  end
+  Else if TreeView1.Selected = MyTreeNode3 then    //表單層
+  begin
+    PM101.Visible := True;   //刪除
+    PM104.Visible := True;   //檔案加入影像
+    PM108.Visible := True;   //歸類
+    PM103.Visible := True;   //掃瞄器加入影像
+//    if FCustDocYN <> 'N' Then
+//      PM110.Visible := True;   //新增自訂文件
+    if GetFormIDPage(ContextList,NowFormCode) < 1 Then
+    begin
+      PM108.Visible := False;   //歸類
+    end;
+    if FImgDelete='Y' then
+    begin
+      PM101.Visible:=True;
+    end;
+    if FImgDelete='N' then
+    begin
+      PM101.Visible:=false;
+    end;
+
+    if FModeName=_Msg('異動件') then
+    begin
+      PM101.Visible := True;
+    end;
+
+    if GetUseCase('T',DisplayPath,NowDocDir) <> '' then   //被引用走的
+    begin
+      PM101.Enabled := False;   //刪除
+      PM104.Enabled := False;   //檔案加入影像
+      PM108.Enabled := False;   //歸類
+    end
+    Else
+    begin
+      PM101.Enabled := True;   //刪除
+      PM104.Enabled := True;   //檔案加入影像
+      PM108.Enabled := True;   //歸類
+    end;
+
+    if (FMode = 'NSCAN') then
+    begin
+      PM102.Visible := True;   //修改案件編號
+    end;
+  end;
+
+
+
+end;
+
+
+{ ==============================================================================
+  方法名稱:PopupMenu4Popup
+  引用相依:
+  方法描述:處理影像列表右鍵選單彈出邏輯。僅在樹狀結構選取文件或表單層級時顯示全
+            選、取消全選及歸類功能,並特別判斷「分出新案」在非重掃模式下才可見。
+============================================================================== }
+procedure TCB_IMGPSScanX.PopupMenu4Popup(Sender: TObject);
+begin
+  PM401.Visible := False;
+  PM402.Visible := False;
+  PM403.Visible := False;
+  PM404.Visible := False;
+  if FMode = 'SAMPLESCAN' then Exit;
+  if (TreeView1.Selected.Level =2) or (TreeView1.Selected.Level =3) then
+  begin
+    PM402.Visible := True;
+    PM403.Visible := True;
+    PM404.Visible := True;
+  end;
+  PM401.Visible := True;
+  if (TreeView1.Selected <> MyTreeNode2) or (FMode = 'RSCAN') then
+    PM401.Visible := False;
+end;
+
+
+{ ==============================================================================
+  方法名稱:PopupMenu5Popup
+  引用相依:
+  方法描述:處理影像顯示區域右鍵選單彈出邏輯。當有載入影像時啟用各類縮放選單項目,
+            並根據樹狀選取層級與掃瞄模式決定是否顯示「分出新案」功能。
+============================================================================== }
+procedure TCB_IMGPSScanX.PopupMenu5Popup(Sender: TObject);
+begin
+  PM501.Visible := False;
+  PM502.Visible := False;
+  PM503.Visible := False;
+  PM504.Visible := False;
+  PM505.Visible := False;
+  PM506.Visible := False;
+  PM507.Visible := False;
+  PM508.Visible := False;
+  PM509.Visible := False;
+  PM510.Visible := False;
+  if FMode = 'SAMPLESCAN' then Exit;
+  if (DisplayISB.FileName <> '') then
+  begin
+    PM501.Visible := True;
+    PM502.Visible := True;
+    PM503.Visible := True;
+    PM504.Visible := True;
+    //PM505.Visible := True;
+    //PM506.Visible := True;
+    //PM507.Visible := True;
+    //PM508.Visible := True;
+    //PM509.Visible := True;
+    //PM510.Visible := True;
+  end;
+  if (TreeView1.Selected <> MyTreeNode2) or (FMode = 'RSCAN') or (FMode = 'ESCAN') then
+    PM509.Visible := False;
+end;
+
+
+{ ==============================================================================
+  方法名稱:PopupMenu6Popup
+  引用相依:
+  方法描述:處理縮圖區右鍵選單彈出邏輯。動態設定歸類、自定義文件及刪除項目的可見度
+            。若選取附件目錄則開啟特殊功能。同時根據權限設定與影像引用狀態(UseCase
+            )限制歸類與刪除功能的可用性。
+============================================================================== }
+procedure TCB_IMGPSScanX.PopupMenu6Popup(Sender: TObject);
+begin
+  PM601.Visible := True;  //歸類
+  PM602.Visible := True;  //自行定義文件名稱
+  PM603.Visible := False;  //掃描替換此頁
+  PM604.Visible := False;  //歪斜矯正
+  PM605.Visible := True;  //刪除
+
+//  if FMode='ESCAN' then
+//  begin
+//    PM601.Visible := False;  //歸類
+//    PM602.Visible := False;  //自行定義文件名稱
+//    PM603.Visible := False;  //掃描替換此頁
+//    PM604.Visible := False;  //歪斜矯正
+//    PM605.Visible := False;  //刪除
+//  end;
+
+  if ((NowDocNo = 'Attach') or (NowDocNo = 'S_Attach')) and (FCustDocYN <> 'N') then
+  begin
+    PM602.Visible := True;  //自行定義文件名稱
+    //PM603.Visible := True;  //掃描替換此頁
+    PM604.Visible := True;  //歪斜矯正
+    PM601.Visible := True;  //歸類
+    PM605.Visible := True;  //刪除
+  end;
+
+  if  FModeName<>_Msg('異動件') then
+  begin
+    if (FImgDelete='Y') then
+    begin
+      PM605.Enabled:=True;
+    end;
+    if FImgDelete='N' then
+    begin
+      PM605.Enabled:=false;
+    end;
+  end;
+
+
+
+
+  if CheckSelectImg_UseCase(DisplayPath,NowCaseNo) then //選擇的影像不可有引用的
+  begin
+    PM601.Enabled := False;  //歸類
+    PM605.Enabled := False;  //刪除
+  end;
+
+
+end;
+
+

--
Gitblit v1.8.0